Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 258ee1b

Browse files
committed
Move DTK_ISODOW DTK_DOW and DTK_DOY to be type UNITS rather than
RESERV. RESERV is meant for tokens like "now" and having them in that category throws errors like these when used as an input date: stark=# SELECT 'doy'::timestamptz; ERROR: unexpected dtype 33 while parsing timestamptz "doy" LINE 1: SELECT 'doy'::timestamptz; ^ stark=# SELECT 'dow'::timestamptz; ERROR: unexpected dtype 32 while parsing timestamptz "dow" LINE 1: SELECT 'dow'::timestamptz; ^ Found by LLVM's Libfuzzer
1 parent 9270d8d commit 258ee1b

File tree

2 files changed

+43
-43
lines changed

2 files changed

+43
-43
lines changed

src/backend/utils/adt/datetime.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,8 @@ static const datetkn datetktbl[] = {
103103
{"d", UNITS, DTK_DAY}, /* "day of month" for ISO input */
104104
{"dec", MONTH, 12},
105105
{"december", MONTH, 12},
106-
{"dow", RESERV, DTK_DOW}, /* day of week */
107-
{"doy", RESERV, DTK_DOY}, /* day of year */
106+
{"dow", UNITS, DTK_DOW}, /* day of week */
107+
{"doy", UNITS, DTK_DOY}, /* day of year */
108108
{"dst", DTZMOD, SECS_PER_HOUR},
109109
{EPOCH, RESERV, DTK_EPOCH}, /* "epoch" reserved for system epoch time */
110110
{"feb", MONTH, 2},
@@ -114,7 +114,7 @@ static const datetkn datetktbl[] = {
114114
{"h", UNITS, DTK_HOUR}, /* "hour" */
115115
{LATE, RESERV, DTK_LATE}, /* "infinity" reserved for "late time" */
116116
{INVALID, RESERV, DTK_INVALID}, /* "invalid" reserved for bad time */
117-
{"isodow", RESERV, DTK_ISODOW}, /* ISO day of week, Sunday == 7 */
117+
{"isodow", UNITS, DTK_ISODOW}, /* ISO day of week, Sunday == 7 */
118118
{"isoyear", UNITS, DTK_ISOYEAR}, /* year in terms of the ISO week date */
119119
{"j", UNITS, DTK_JULIAN},
120120
{"jan", MONTH, 1},

src/backend/utils/adt/timestamp.c

+40-40
Original file line numberDiff line numberDiff line change
@@ -4458,6 +4458,26 @@ timestamp_part(PG_FUNCTION_ARGS)
44584458
result = date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday);
44594459
break;
44604460

4461+
case DTK_DOW:
4462+
case DTK_ISODOW:
4463+
if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
4464+
ereport(ERROR,
4465+
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4466+
errmsg("timestamp out of range")));
4467+
result = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
4468+
if (val == DTK_ISODOW && result == 0)
4469+
result = 7;
4470+
break;
4471+
4472+
case DTK_DOY:
4473+
if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
4474+
ereport(ERROR,
4475+
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4476+
errmsg("timestamp out of range")));
4477+
result = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)
4478+
- date2j(tm->tm_year, 1, 1) + 1);
4479+
break;
4480+
44614481
case DTK_TZ:
44624482
case DTK_TZ_MINUTE:
44634483
case DTK_TZ_HOUR:
@@ -4481,26 +4501,6 @@ timestamp_part(PG_FUNCTION_ARGS)
44814501
#endif
44824502
break;
44834503

4484-
case DTK_DOW:
4485-
case DTK_ISODOW:
4486-
if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
4487-
ereport(ERROR,
4488-
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4489-
errmsg("timestamp out of range")));
4490-
result = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
4491-
if (val == DTK_ISODOW && result == 0)
4492-
result = 7;
4493-
break;
4494-
4495-
case DTK_DOY:
4496-
if (timestamp2tm(timestamp, NULL, tm, &fsec, NULL, NULL) != 0)
4497-
ereport(ERROR,
4498-
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4499-
errmsg("timestamp out of range")));
4500-
result = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)
4501-
- date2j(tm->tm_year, 1, 1) + 1);
4502-
break;
4503-
45044504
default:
45054505
ereport(ERROR,
45064506
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -4672,6 +4672,26 @@ timestamptz_part(PG_FUNCTION_ARGS)
46724672
result = date2isoyear(tm->tm_year, tm->tm_mon, tm->tm_mday);
46734673
break;
46744674

4675+
case DTK_DOW:
4676+
case DTK_ISODOW:
4677+
if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
4678+
ereport(ERROR,
4679+
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4680+
errmsg("timestamp out of range")));
4681+
result = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
4682+
if (val == DTK_ISODOW && result == 0)
4683+
result = 7;
4684+
break;
4685+
4686+
case DTK_DOY:
4687+
if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
4688+
ereport(ERROR,
4689+
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4690+
errmsg("timestamp out of range")));
4691+
result = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)
4692+
- date2j(tm->tm_year, 1, 1) + 1);
4693+
break;
4694+
46754695
default:
46764696
ereport(ERROR,
46774697
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
@@ -4693,26 +4713,6 @@ timestamptz_part(PG_FUNCTION_ARGS)
46934713
#endif
46944714
break;
46954715

4696-
case DTK_DOW:
4697-
case DTK_ISODOW:
4698-
if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
4699-
ereport(ERROR,
4700-
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4701-
errmsg("timestamp out of range")));
4702-
result = j2day(date2j(tm->tm_year, tm->tm_mon, tm->tm_mday));
4703-
if (val == DTK_ISODOW && result == 0)
4704-
result = 7;
4705-
break;
4706-
4707-
case DTK_DOY:
4708-
if (timestamp2tm(timestamp, &tz, tm, &fsec, NULL, NULL) != 0)
4709-
ereport(ERROR,
4710-
(errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE),
4711-
errmsg("timestamp out of range")));
4712-
result = (date2j(tm->tm_year, tm->tm_mon, tm->tm_mday)
4713-
- date2j(tm->tm_year, 1, 1) + 1);
4714-
break;
4715-
47164716
default:
47174717
ereport(ERROR,
47184718
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),

0 commit comments

Comments
 (0)