Reject nonzero day fields in AT TIME ZONE INTERVAL functions.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 31 Jan 2013 17:12:23 +0000 (12:12 -0500)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 31 Jan 2013 17:12:23 +0000 (12:12 -0500)
It's not sensible for an interval that's used as a time zone value to be
larger than a day.  When we changed the interval type to contain a separate
day field, check_timezone() was adjusted to reject nonzero day values, but
timetz_izone(), timestamp_izone(), and timestamptz_izone() evidently were
overlooked.

While at it, make the error messages for these three cases consistent.

src/backend/utils/adt/date.c
src/backend/utils/adt/timestamp.c

index 4e4832415a1f062493ff44076721741152ce0aa5..57391c30edf1b65aa7ea48b60352bad4471916b7 100644 (file)
@@ -2696,10 +2696,10 @@ timetz_izone(PG_FUNCTION_ARGS)
    TimeTzADT  *result;
    int         tz;
 
-   if (zone->month != 0)
+   if (zone->month != 0 || zone->day != 0)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                errmsg("\"interval\" time zone \"%s\" not valid",
+                errmsg("interval time zone \"%s\" must not include months or days",
                        DatumGetCString(DirectFunctionCall1(interval_out,
                                                  PointerGetDatum(zone))))));
 
index f870491e1faf5478e4f22ced57f5284f0f94b9da..451f4dae70c04e452e58400cc6d60329d342a374 100644 (file)
@@ -4604,10 +4604,10 @@ timestamp_izone(PG_FUNCTION_ARGS)
    if (TIMESTAMP_NOT_FINITE(timestamp))
        PG_RETURN_TIMESTAMPTZ(timestamp);
 
-   if (zone->month != 0)
+   if (zone->month != 0 || zone->day != 0)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                errmsg("interval time zone \"%s\" must not specify month",
+                errmsg("interval time zone \"%s\" must not include months or days",
                        DatumGetCString(DirectFunctionCall1(interval_out,
                                                  PointerGetDatum(zone))))));
 
@@ -4777,10 +4777,10 @@ timestamptz_izone(PG_FUNCTION_ARGS)
    if (TIMESTAMP_NOT_FINITE(timestamp))
        PG_RETURN_TIMESTAMP(timestamp);
 
-   if (zone->month != 0)
+   if (zone->month != 0 || zone->day != 0)
        ereport(ERROR,
                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                errmsg("interval time zone \"%s\" must not specify month",
+                errmsg("interval time zone \"%s\" must not include months or days",
                        DatumGetCString(DirectFunctionCall1(interval_out,
                                                  PointerGetDatum(zone))))));