mirror of
https://github.com/postgres/postgres.git
synced 2025-08-01 00:03:44 -04:00
Compare commits
2 Commits
60ba7cae7c
...
807369d803
Author | SHA1 | Date | |
---|---|---|---|
|
807369d803 | ||
|
7204aea835 |
@ -90,7 +90,8 @@ assign_param_for_var(PlannerInfo *root, Var *var)
|
|||||||
pvar->varattno == var->varattno &&
|
pvar->varattno == var->varattno &&
|
||||||
pvar->vartype == var->vartype &&
|
pvar->vartype == var->vartype &&
|
||||||
pvar->vartypmod == var->vartypmod &&
|
pvar->vartypmod == var->vartypmod &&
|
||||||
pvar->varcollid == var->varcollid)
|
pvar->varcollid == var->varcollid &&
|
||||||
|
bms_equal(pvar->varnullingrels, var->varnullingrels))
|
||||||
return pitem->paramId;
|
return pitem->paramId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2966,8 +2966,16 @@ timestamp_pl_interval(PG_FUNCTION_ARGS)
|
|||||||
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
||||||
errmsg("timestamp out of range")));
|
errmsg("timestamp out of range")));
|
||||||
|
|
||||||
/* Add days by converting to and from Julian */
|
/*
|
||||||
julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + span->day;
|
* Add days by converting to and from Julian. We need an overflow
|
||||||
|
* check here since j2date expects a non-negative integer input.
|
||||||
|
*/
|
||||||
|
julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday);
|
||||||
|
if (pg_add_s32_overflow(julian, span->day, &julian) ||
|
||||||
|
julian < 0)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
||||||
|
errmsg("timestamp out of range")));
|
||||||
j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
||||||
|
|
||||||
if (tm2timestamp(tm, fsec, NULL, ×tamp) != 0)
|
if (tm2timestamp(tm, fsec, NULL, ×tamp) != 0)
|
||||||
@ -3080,8 +3088,19 @@ timestamptz_pl_interval_internal(TimestampTz timestamp,
|
|||||||
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
||||||
errmsg("timestamp out of range")));
|
errmsg("timestamp out of range")));
|
||||||
|
|
||||||
/* Add days by converting to and from Julian */
|
/*
|
||||||
julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday) + span->day;
|
* Add days by converting to and from Julian. We need an overflow
|
||||||
|
* check here since j2date expects a non-negative integer input.
|
||||||
|
* In practice though, it will give correct answers for small
|
||||||
|
* negative Julian dates; we should allow -1 to avoid
|
||||||
|
* timezone-dependent failures, as discussed in timestamp.h.
|
||||||
|
*/
|
||||||
|
julian = date2j(tm->tm_year, tm->tm_mon, tm->tm_mday);
|
||||||
|
if (pg_add_s32_overflow(julian, span->day, &julian) ||
|
||||||
|
julian < -1)
|
||||||
|
ereport(ERROR,
|
||||||
|
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
|
||||||
|
errmsg("timestamp out of range")));
|
||||||
j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
j2date(julian, &tm->tm_year, &tm->tm_mon, &tm->tm_mday);
|
||||||
|
|
||||||
tz = DetermineTimeZoneOffset(tm, attimezone);
|
tz = DetermineTimeZoneOffset(tm, attimezone);
|
||||||
|
@ -482,6 +482,8 @@ SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days'
|
|||||||
Sun Dec 31 00:00:00 294276
|
Sun Dec 31 00:00:00 294276
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT timestamp without time zone '2000-01-01' - interval '2483590 days' AS "out of range";
|
||||||
|
ERROR: timestamp out of range
|
||||||
SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days";
|
SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days";
|
||||||
106751991 Days
|
106751991 Days
|
||||||
------------------
|
------------------
|
||||||
@ -742,6 +744,8 @@ SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS
|
|||||||
Fri Dec 31 23:59:59 1999 PST
|
Fri Dec 31 23:59:59 1999 PST
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT timestamp with time zone '2000-01-01' - interval '2483590 days' AS "out of range";
|
||||||
|
ERROR: timestamp out of range
|
||||||
SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True";
|
SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True";
|
||||||
True
|
True
|
||||||
------
|
------
|
||||||
|
@ -120,6 +120,7 @@ SELECT timestamp without time zone '1999-12-01' + interval '1 month - 1 second'
|
|||||||
SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506";
|
SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '106000000 days' AS "Feb 23, 285506";
|
||||||
SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244";
|
SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '107000000 days' AS "Jan 20, 288244";
|
||||||
SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276";
|
SELECT timestamp without time zone 'Jan 1, 4713 BC' + interval '109203489 days' AS "Dec 31, 294276";
|
||||||
|
SELECT timestamp without time zone '2000-01-01' - interval '2483590 days' AS "out of range";
|
||||||
SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days";
|
SELECT timestamp without time zone '12/31/294276' - timestamp without time zone '12/23/1999' AS "106751991 Days";
|
||||||
|
|
||||||
-- Shorthand values
|
-- Shorthand values
|
||||||
@ -151,6 +152,7 @@ SELECT timestamp with time zone '1996-03-01' - interval '1 second' AS "Feb 29";
|
|||||||
SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28";
|
SELECT timestamp with time zone '1999-03-01' - interval '1 second' AS "Feb 28";
|
||||||
SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29";
|
SELECT timestamp with time zone '2000-03-01' - interval '1 second' AS "Feb 29";
|
||||||
SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31";
|
SELECT timestamp with time zone '1999-12-01' + interval '1 month - 1 second' AS "Dec 31";
|
||||||
|
SELECT timestamp with time zone '2000-01-01' - interval '2483590 days' AS "out of range";
|
||||||
|
|
||||||
SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True";
|
SELECT (timestamp with time zone 'today' = (timestamp with time zone 'yesterday' + interval '1 day')) as "True";
|
||||||
SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True";
|
SELECT (timestamp with time zone 'today' = (timestamp with time zone 'tomorrow' - interval '1 day')) as "True";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user