/*
  * Promote date to timestamp.
  *
- * On overflow error is thrown if 'overflow' is NULL.  Otherwise, '*overflow'
- * is set to -1 (+1) when result value exceed lower (upper) boundary and zero
- * returned.
+ * On successful conversion, *overflow is set to zero if it's not NULL.
+ *
+ * If the date is finite but out of the valid range for timestamp, then:
+ * if overflow is NULL, we throw an out-of-range error.
+ * if overflow is not NULL, we store +1 or -1 there to indicate the sign
+ * of the overflow, and return the appropriate timestamp infinity.
+ *
+ * Note: *overflow = -1 is actually not possible currently, since both
+ * datatypes have the same lower bound, Julian day zero.
  */
 Timestamp
 date2timestamp_opt_overflow(DateADT dateVal, int *overflow)
 {
    Timestamp   result;
 
+   if (overflow)
+       *overflow = 0;
+
    if (DATE_IS_NOBEGIN(dateVal))
        TIMESTAMP_NOBEGIN(result);
    else if (DATE_IS_NOEND(dateVal))
    else
    {
        /*
-        * Date's range is wider than timestamp's, so check for boundaries.
         * Since dates have the same minimum values as timestamps, only upper
         * boundary need be checked for overflow.
         */
            if (overflow)
            {
                *overflow = 1;
-               return (Timestamp) 0;
+               TIMESTAMP_NOEND(result);
+               return result;
            }
            else
            {
 }
 
 /*
- * Single-argument version of date2timestamp_opt_overflow().
+ * Promote date to timestamp, throwing error for overflow.
  */
 static TimestampTz
 date2timestamp(DateADT dateVal)
 /*
  * Promote date to timestamp with time zone.
  *
- * On overflow error is thrown if 'overflow' is NULL.  Otherwise, '*overflow'
- * is set to -1 (+1) when result value exceed lower (upper) boundary and zero
- * returned.
+ * On successful conversion, *overflow is set to zero if it's not NULL.
+ *
+ * If the date is finite but out of the valid range for timestamptz, then:
+ * if overflow is NULL, we throw an out-of-range error.
+ * if overflow is not NULL, we store +1 or -1 there to indicate the sign
+ * of the overflow, and return the appropriate timestamptz infinity.
  */
 TimestampTz
 date2timestamptz_opt_overflow(DateADT dateVal, int *overflow)
               *tm = &tt;
    int         tz;
 
+   if (overflow)
+       *overflow = 0;
+
    if (DATE_IS_NOBEGIN(dateVal))
        TIMESTAMP_NOBEGIN(result);
    else if (DATE_IS_NOEND(dateVal))
    else
    {
        /*
-        * Date's range is wider than timestamp's, so check for boundaries.
         * Since dates have the same minimum values as timestamps, only upper
         * boundary need be checked for overflow.
         */
            if (overflow)
            {
                *overflow = 1;
-               return (TimestampTz) 0;
+               TIMESTAMP_NOEND(result);
+               return result;
            }
            else
            {
            if (overflow)
            {
                if (result < MIN_TIMESTAMP)
+               {
                    *overflow = -1;
+                   TIMESTAMP_NOBEGIN(result);
+               }
                else
                {
-                   Assert(result >= END_TIMESTAMP);
                    *overflow = 1;
+                   TIMESTAMP_NOEND(result);
                }
-               return (TimestampTz) 0;
            }
            else
            {
 }
 
 /*
- * Single-argument version of date2timestamptz_opt_overflow().
+ * Promote date to timestamptz, throwing error for overflow.
  */
 static TimestampTz
 date2timestamptz(DateADT dateVal)
  * Crosstype comparison functions for dates
  */
 
+int32
+date_cmp_timestamp_internal(DateADT dateVal, Timestamp dt2)
+{
+   Timestamp   dt1;
+   int         overflow;
+
+   dt1 = date2timestamp_opt_overflow(dateVal, &overflow);
+   if (overflow > 0)
+   {
+       /* dt1 is larger than any finite timestamp, but less than infinity */
+       return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
+   }
+   Assert(overflow == 0);      /* -1 case cannot occur */
+
+   return timestamp_cmp_internal(dt1, dt2);
+}
+
 Datum
 date_eq_timestamp(PG_FUNCTION_ARGS)
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    Timestamp   dt2 = PG_GETARG_TIMESTAMP(1);
-   Timestamp   dt1;
-
-   dt1 = date2timestamp(dateVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) == 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) == 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    Timestamp   dt2 = PG_GETARG_TIMESTAMP(1);
-   Timestamp   dt1;
 
-   dt1 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) != 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) != 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    Timestamp   dt2 = PG_GETARG_TIMESTAMP(1);
-   Timestamp   dt1;
 
-   dt1 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) < 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) < 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    Timestamp   dt2 = PG_GETARG_TIMESTAMP(1);
-   Timestamp   dt1;
 
-   dt1 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) > 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) > 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    Timestamp   dt2 = PG_GETARG_TIMESTAMP(1);
-   Timestamp   dt1;
 
-   dt1 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) <= 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) <= 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    Timestamp   dt2 = PG_GETARG_TIMESTAMP(1);
-   Timestamp   dt1;
 
-   dt1 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) >= 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt2) >= 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    Timestamp   dt2 = PG_GETARG_TIMESTAMP(1);
-   Timestamp   dt1;
 
-   dt1 = date2timestamp(dateVal);
+   PG_RETURN_INT32(date_cmp_timestamp_internal(dateVal, dt2));
+}
 
-   PG_RETURN_INT32(timestamp_cmp_internal(dt1, dt2));
+int32
+date_cmp_timestamptz_internal(DateADT dateVal, TimestampTz dt2)
+{
+   TimestampTz dt1;
+   int         overflow;
+
+   dt1 = date2timestamptz_opt_overflow(dateVal, &overflow);
+   if (overflow > 0)
+   {
+       /* dt1 is larger than any finite timestamp, but less than infinity */
+       return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
+   }
+   if (overflow < 0)
+   {
+       /* dt1 is less than any finite timestamp, but more than -infinity */
+       return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
+   }
+
+   return timestamptz_cmp_internal(dt1, dt2);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) == 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) == 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) != 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) != 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) < 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) < 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) > 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) > 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) <= 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) <= 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) >= 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt2) >= 0);
 }
 
 Datum
 {
    DateADT     dateVal = PG_GETARG_DATEADT(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
-
-   dt1 = date2timestamptz(dateVal);
 
-   PG_RETURN_INT32(timestamptz_cmp_internal(dt1, dt2));
+   PG_RETURN_INT32(date_cmp_timestamptz_internal(dateVal, dt2));
 }
 
 Datum
 {
    Timestamp   dt1 = PG_GETARG_TIMESTAMP(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   Timestamp   dt2;
 
-   dt2 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) == 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) == 0);
 }
 
 Datum
 {
    Timestamp   dt1 = PG_GETARG_TIMESTAMP(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   Timestamp   dt2;
-
-   dt2 = date2timestamp(dateVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) != 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) != 0);
 }
 
 Datum
 {
    Timestamp   dt1 = PG_GETARG_TIMESTAMP(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   Timestamp   dt2;
 
-   dt2 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) < 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) > 0);
 }
 
 Datum
 {
    Timestamp   dt1 = PG_GETARG_TIMESTAMP(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   Timestamp   dt2;
-
-   dt2 = date2timestamp(dateVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) > 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) < 0);
 }
 
 Datum
 {
    Timestamp   dt1 = PG_GETARG_TIMESTAMP(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   Timestamp   dt2;
 
-   dt2 = date2timestamp(dateVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) <= 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) >= 0);
 }
 
 Datum
 {
    Timestamp   dt1 = PG_GETARG_TIMESTAMP(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   Timestamp   dt2;
-
-   dt2 = date2timestamp(dateVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) >= 0);
+   PG_RETURN_BOOL(date_cmp_timestamp_internal(dateVal, dt1) <= 0);
 }
 
 Datum
 {
    Timestamp   dt1 = PG_GETARG_TIMESTAMP(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   Timestamp   dt2;
 
-   dt2 = date2timestamp(dateVal);
-
-   PG_RETURN_INT32(timestamp_cmp_internal(dt1, dt2));
+   PG_RETURN_INT32(-date_cmp_timestamp_internal(dateVal, dt1));
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   TimestampTz dt2;
-
-   dt2 = date2timestamptz(dateVal);
 
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) == 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) == 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   TimestampTz dt2;
 
-   dt2 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) != 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) != 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   TimestampTz dt2;
-
-   dt2 = date2timestamptz(dateVal);
 
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) < 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) > 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   TimestampTz dt2;
 
-   dt2 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) > 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) < 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   TimestampTz dt2;
-
-   dt2 = date2timestamptz(dateVal);
 
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) <= 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) >= 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   TimestampTz dt2;
 
-   dt2 = date2timestamptz(dateVal);
-
-   PG_RETURN_BOOL(timestamptz_cmp_internal(dt1, dt2) >= 0);
+   PG_RETURN_BOOL(date_cmp_timestamptz_internal(dateVal, dt1) <= 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    DateADT     dateVal = PG_GETARG_DATEADT(1);
-   TimestampTz dt2;
-
-   dt2 = date2timestamptz(dateVal);
 
-   PG_RETURN_INT32(timestamptz_cmp_internal(dt1, dt2));
+   PG_RETURN_INT32(-date_cmp_timestamptz_internal(dateVal, dt1));
 }
 
 /*
    Timestamp   valStamp;
    Timestamp   baseStamp;
 
+   /* XXX we could support out-of-range cases here, perhaps */
    valStamp = date2timestamp(val);
    baseStamp = date2timestamp(base);
 
 
    return DirectFunctionCall1(time_timetz, time);
 }
 
-/*---
- * Compares 'ts1' and 'ts2' timestamp, assuming that ts1 might be overflowed
- * during cast from another datatype.
- *
- * 'overflow1' specifies overflow of 'ts1' value:
- *  0 - no overflow,
- * -1 - exceed lower boundary,
- *  1 - exceed upper boundary.
- */
-static int
-cmpTimestampWithOverflow(Timestamp ts1, int overflow1, Timestamp ts2)
-{
-   /*
-    * All the timestamps we deal with in jsonpath are produced by
-    * to_datetime() method.  So, they should be valid.
-    */
-   Assert(IS_VALID_TIMESTAMP(ts2));
-
-   /*
-    * Timestamp, which exceed lower (upper) bound, is always lower (higher)
-    * than any valid timestamp except minus (plus) infinity.
-    */
-   if (overflow1)
-   {
-       if (overflow1 < 0)
-       {
-           if (TIMESTAMP_IS_NOBEGIN(ts2))
-               return 1;
-           else
-               return -1;
-       }
-       if (overflow1 > 0)
-       {
-           if (TIMESTAMP_IS_NOEND(ts2))
-               return -1;
-           else
-               return 1;
-       }
-   }
-
-   return timestamp_cmp_internal(ts1, ts2);
-}
-
 /*
- * Compare date to timestamptz without throwing overflow error during cast.
+ * Compare date to timestamp.
+ * Note that this doesn't involve any timezone considerations.
  */
 static int
 cmpDateToTimestamp(DateADT date1, Timestamp ts2, bool useTz)
 {
-   TimestampTz ts1;
-   int         overflow = 0;
-
-   ts1 = date2timestamp_opt_overflow(date1, &overflow);
-
-   return cmpTimestampWithOverflow(ts1, overflow, ts2);
+   return date_cmp_timestamp_internal(date1, ts2);
 }
 
 /*
- * Compare date to timestamptz without throwing overflow error during cast.
+ * Compare date to timestamptz.
  */
 static int
 cmpDateToTimestampTz(DateADT date1, TimestampTz tstz2, bool useTz)
 {
-   TimestampTz tstz1;
-   int         overflow = 0;
-
    checkTimezoneIsUsedForCast(useTz, "date", "timestamptz");
 
-   tstz1 = date2timestamptz_opt_overflow(date1, &overflow);
-
-   return cmpTimestampWithOverflow(tstz1, overflow, tstz2);
+   return date_cmp_timestamptz_internal(date1, tstz2);
 }
 
 /*
- * Compare timestamp to timestamptz without throwing overflow error during cast.
+ * Compare timestamp to timestamptz.
  */
 static int
 cmpTimestampToTimestampTz(Timestamp ts1, TimestampTz tstz2, bool useTz)
 {
-   TimestampTz tstz1;
-   int         overflow = 0;
-
    checkTimezoneIsUsedForCast(useTz, "timestamp", "timestamptz");
 
-   tstz1 = timestamp2timestamptz_opt_overflow(ts1, &overflow);
-
-   return cmpTimestampWithOverflow(tstz1, overflow, tstz2);
+   return timestamp_cmp_timestamptz_internal(ts1, tstz2);
 }
 
 /*
 
  * Cross-type comparison functions for timestamp vs timestamptz
  */
 
+int32
+timestamp_cmp_timestamptz_internal(Timestamp timestampVal, TimestampTz dt2)
+{
+   TimestampTz dt1;
+   int         overflow;
+
+   dt1 = timestamp2timestamptz_opt_overflow(timestampVal, &overflow);
+   if (overflow > 0)
+   {
+       /* dt1 is larger than any finite timestamp, but less than infinity */
+       return TIMESTAMP_IS_NOEND(dt2) ? -1 : +1;
+   }
+   if (overflow < 0)
+   {
+       /* dt1 is less than any finite timestamp, but more than -infinity */
+       return TIMESTAMP_IS_NOBEGIN(dt2) ? +1 : -1;
+   }
+
+   return timestamptz_cmp_internal(dt1, dt2);
+}
+
 Datum
 timestamp_eq_timestamptz(PG_FUNCTION_ARGS)
 {
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
-
-   dt1 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) == 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) == 0);
 }
 
 Datum
 {
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = timestamp2timestamptz(timestampVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) != 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) != 0);
 }
 
 Datum
 {
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
-
-   dt1 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) < 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) < 0);
 }
 
 Datum
 {
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
-
-   dt1 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) > 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) > 0);
 }
 
 Datum
 {
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
-
-   dt1 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) <= 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) <= 0);
 }
 
 Datum
 {
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
-
-   dt1 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) >= 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt2) >= 0);
 }
 
 Datum
 {
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(0);
    TimestampTz dt2 = PG_GETARG_TIMESTAMPTZ(1);
-   TimestampTz dt1;
 
-   dt1 = timestamp2timestamptz(timestampVal);
-
-   PG_RETURN_INT32(timestamp_cmp_internal(dt1, dt2));
+   PG_RETURN_INT32(timestamp_cmp_timestamptz_internal(timestampVal, dt2));
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(1);
-   TimestampTz dt2;
-
-   dt2 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) == 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) == 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(1);
-   TimestampTz dt2;
-
-   dt2 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) != 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) != 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(1);
-   TimestampTz dt2;
 
-   dt2 = timestamp2timestamptz(timestampVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) < 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) > 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(1);
-   TimestampTz dt2;
-
-   dt2 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) > 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) < 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(1);
-   TimestampTz dt2;
-
-   dt2 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) <= 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) >= 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(1);
-   TimestampTz dt2;
 
-   dt2 = timestamp2timestamptz(timestampVal);
-
-   PG_RETURN_BOOL(timestamp_cmp_internal(dt1, dt2) >= 0);
+   PG_RETURN_BOOL(timestamp_cmp_timestamptz_internal(timestampVal, dt1) <= 0);
 }
 
 Datum
 {
    TimestampTz dt1 = PG_GETARG_TIMESTAMPTZ(0);
    Timestamp   timestampVal = PG_GETARG_TIMESTAMP(1);
-   TimestampTz dt2;
-
-   dt2 = timestamp2timestamptz(timestampVal);
 
-   PG_RETURN_INT32(timestamp_cmp_internal(dt1, dt2));
+   PG_RETURN_INT32(-timestamp_cmp_timestamptz_internal(timestampVal, dt1));
 }
 
 
 /*
  * Convert timestamp to timestamp with time zone.
  *
- * On overflow error is thrown if 'overflow' is NULL.  Otherwise, '*overflow'
- * is set to -1 (+1) when result value exceed lower (upper) boundary and zero
- * returned.
+ * On successful conversion, *overflow is set to zero if it's not NULL.
+ *
+ * If the timestamp is finite but out of the valid range for timestamptz, then:
+ * if overflow is NULL, we throw an out-of-range error.
+ * if overflow is not NULL, we store +1 or -1 there to indicate the sign
+ * of the overflow, and return the appropriate timestamptz infinity.
  */
 TimestampTz
 timestamp2timestamptz_opt_overflow(Timestamp timestamp, int *overflow)
    fsec_t      fsec;
    int         tz;
 
+   if (overflow)
+       *overflow = 0;
+
    if (TIMESTAMP_NOT_FINITE(timestamp))
        return timestamp;
 
-   if (!timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL))
+   /* We don't expect this to fail, but check it pro forma */
+   if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) == 0)
    {
        tz = DetermineTimeZoneOffset(tm, session_timezone);
 
        else if (overflow)
        {
            if (result < MIN_TIMESTAMP)
+           {
                *overflow = -1;
+               TIMESTAMP_NOBEGIN(result);
+           }
            else
            {
-               Assert(result >= END_TIMESTAMP);
                *overflow = 1;
+               TIMESTAMP_NOEND(result);
            }
-           return (TimestampTz) 0;
+           return result;
        }
    }
 
 }
 
 /*
- * Single-argument version of timestamp2timestamptz_opt_overflow().
+ * Promote timestamp to timestamptz, throwing error for overflow.
  */
 static TimestampTz
 timestamp2timestamptz(Timestamp timestamp)