diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
new file mode 100644
index a61b40e..ae4e9e7
*** a/src/backend/utils/adt/datetime.c
--- b/src/backend/utils/adt/datetime.c
*************** DecodeInterval(char **field, int *ftype,
*** 2976,2981 ****
--- 2976,2983 ----
  					type = DTK_MONTH;
  					if (*field[i] == '-')
  						val2 = -val2;
+ 					if (((float)val * MONTHS_PER_YEAR + val2) > INT_MAX)
+ 						return DTERR_FIELD_OVERFLOW;
  					val = val * MONTHS_PER_YEAR + val2;
  					fval = 0;
  				}
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
new file mode 100644
index 4581862..a751593
*** a/src/backend/utils/adt/timestamp.c
--- b/src/backend/utils/adt/timestamp.c
*************** recalc:
*** 1725,1730 ****
--- 1725,1732 ----
  int
  tm2interval(struct pg_tm * tm, fsec_t fsec, Interval *span)
  {
+ 	if ((float)tm->tm_year * MONTHS_PER_YEAR + tm->tm_mon > INT_MAX)
+ 		return -1;
  	span->month = tm->tm_year * MONTHS_PER_YEAR + tm->tm_mon;
  	span->day = tm->tm_mday;
  #ifdef HAVE_INT64_TIMESTAMP
diff --git a/src/interfaces/ecpg/pgtypeslib/interval.c b/src/interfaces/ecpg/pgtypeslib/interval.c
new file mode 100644
index efa775d..e1307e3
*** a/src/interfaces/ecpg/pgtypeslib/interval.c
--- b/src/interfaces/ecpg/pgtypeslib/interval.c
*************** recalc:
*** 1036,1041 ****
--- 1036,1043 ----
  static int
  tm2interval(struct tm * tm, fsec_t fsec, interval * span)
  {
+ 	if ((float)tm->tm_year * MONTHS_PER_YEAR + tm->tm_mon > INT_MAX)
+ 		return -1;
  	span->month = tm->tm_year * MONTHS_PER_YEAR + tm->tm_mon;
  #ifdef HAVE_INT64_TIMESTAMP
  	span->time = (((((((tm->tm_mday * INT64CONST(24)) +
