mirror of
https://github.com/postgres/postgres.git
synced 2025-07-31 00:01:41 -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->vartype == var->vartype &&
|
||||
pvar->vartypmod == var->vartypmod &&
|
||||
pvar->varcollid == var->varcollid)
|
||||
pvar->varcollid == var->varcollid &&
|
||||
bms_equal(pvar->varnullingrels, var->varnullingrels))
|
||||
return pitem->paramId;
|
||||
}
|
||||
}
|
||||
|
@ -2966,8 +2966,16 @@ timestamp_pl_interval(PG_FUNCTION_ARGS)
|
||||
(errcode(ERRCODE_DATETIME_VALUE_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);
|
||||
|
||||
if (tm2timestamp(tm, fsec, NULL, ×tamp) != 0)
|
||||
@ -3080,8 +3088,19 @@ timestamptz_pl_interval_internal(TimestampTz timestamp,
|
||||
(errcode(ERRCODE_DATETIME_VALUE_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);
|
||||
|
||||
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
|
||||
(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";
|
||||
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
|
||||
(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";
|
||||
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 '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 '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";
|
||||
|
||||
-- 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 '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 '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 'tomorrow' - interval '1 day')) as "True";
|
||||
|
Loading…
x
Reference in New Issue
Block a user