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

Commit b64b857

Browse files
committed
Support for SSSSS datetime format pattern
SQL Standard 2016 defines SSSSS format pattern for seconds past midnight in jsonpath .datetime() method and CAST (... FORMAT ...) SQL clause. In our datetime parsing engine we currently support it with SSSS name. This commit adds SSSSS as an alias for SSSS. Alias is added in favor of upcoming jsonpath .datetime() method. But it's also supported in to_date()/ to_timestamp() as positive side effect. Discussion: https://postgr.es/m/CAPpHfdsZgYEra_PeCLGNoXOWYx6iU-S3wF8aX0ObQUcZU%2B4XTw%40mail.gmail.com Author: Nikita Glukhov, Alexander Korotkov Reviewed-by: Anastasia Lubennikova, Peter Eisentraut
1 parent d589f94 commit b64b857

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

doc/src/sgml/func.sgml

+1-1
Original file line numberDiff line numberDiff line change
@@ -6175,7 +6175,7 @@ SELECT regexp_match('abc01234xyz', '(?:(.*?)(\d+)(.*)){1,1}');
61756175
<entry>microsecond (000000-999999)</entry>
61766176
</row>
61776177
<row>
6178-
<entry><literal>SSSS</literal></entry>
6178+
<entry><literal>SSSS</literal>, <literal>SSSSS</literal></entry>
61796179
<entry>seconds past midnight (0-86399)</entry>
61806180
</row>
61816181
<row>

src/backend/utils/adt/formatting.c

+8-4
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,7 @@ typedef enum
626626
DCH_PM,
627627
DCH_Q,
628628
DCH_RM,
629+
DCH_SSSSS,
629630
DCH_SSSS,
630631
DCH_SS,
631632
DCH_TZH,
@@ -678,6 +679,7 @@ typedef enum
678679
DCH_pm,
679680
DCH_q,
680681
DCH_rm,
682+
DCH_sssss,
681683
DCH_ssss,
682684
DCH_ss,
683685
DCH_tz,
@@ -787,7 +789,8 @@ static const KeyWord DCH_keywords[] = {
787789
{"PM", 2, DCH_PM, false, FROM_CHAR_DATE_NONE},
788790
{"Q", 1, DCH_Q, true, FROM_CHAR_DATE_NONE}, /* Q */
789791
{"RM", 2, DCH_RM, false, FROM_CHAR_DATE_GREGORIAN}, /* R */
790-
{"SSSS", 4, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, /* S */
792+
{"SSSSS", 5, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, /* S */
793+
{"SSSS", 4, DCH_SSSS, true, FROM_CHAR_DATE_NONE},
791794
{"SS", 2, DCH_SS, true, FROM_CHAR_DATE_NONE},
792795
{"TZH", 3, DCH_TZH, false, FROM_CHAR_DATE_NONE}, /* T */
793796
{"TZM", 3, DCH_TZM, true, FROM_CHAR_DATE_NONE},
@@ -839,7 +842,8 @@ static const KeyWord DCH_keywords[] = {
839842
{"pm", 2, DCH_pm, false, FROM_CHAR_DATE_NONE},
840843
{"q", 1, DCH_Q, true, FROM_CHAR_DATE_NONE}, /* q */
841844
{"rm", 2, DCH_rm, false, FROM_CHAR_DATE_GREGORIAN}, /* r */
842-
{"ssss", 4, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, /* s */
845+
{"sssss", 5, DCH_SSSS, true, FROM_CHAR_DATE_NONE}, /* s */
846+
{"ssss", 4, DCH_SSSS, true, FROM_CHAR_DATE_NONE},
843847
{"ss", 2, DCH_SS, true, FROM_CHAR_DATE_NONE},
844848
{"tz", 2, DCH_tz, false, FROM_CHAR_DATE_NONE}, /* t */
845849
{"us", 2, DCH_US, true, FROM_CHAR_DATE_NONE}, /* u */
@@ -920,10 +924,10 @@ static const int DCH_index[KeyWord_INDEX_SIZE] = {
920924
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
921925
-1, -1, -1, -1, -1, DCH_A_D, DCH_B_C, DCH_CC, DCH_DAY, -1,
922926
DCH_FF1, -1, DCH_HH24, DCH_IDDD, DCH_J, -1, -1, DCH_MI, -1, DCH_OF,
923-
DCH_P_M, DCH_Q, DCH_RM, DCH_SSSS, DCH_TZH, DCH_US, -1, DCH_WW, -1, DCH_Y_YYY,
927+
DCH_P_M, DCH_Q, DCH_RM, DCH_SSSSS, DCH_TZH, DCH_US, -1, DCH_WW, -1, DCH_Y_YYY,
924928
-1, -1, -1, -1, -1, -1, -1, DCH_a_d, DCH_b_c, DCH_cc,
925929
DCH_day, -1, DCH_ff1, -1, DCH_hh24, DCH_iddd, DCH_j, -1, -1, DCH_mi,
926-
-1, -1, DCH_p_m, DCH_q, DCH_rm, DCH_ssss, DCH_tz, DCH_us, -1, DCH_ww,
930+
-1, -1, DCH_p_m, DCH_q, DCH_rm, DCH_sssss, DCH_tz, DCH_us, -1, DCH_ww,
927931
-1, DCH_y_yyy, -1, -1, -1, -1
928932

929933
/*---- chars over 126 are skipped ----*/

src/test/regress/expected/horology.out

+20
Original file line numberDiff line numberDiff line change
@@ -3077,6 +3077,14 @@ SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSS'); -- ok
30773077

30783078
SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSS');
30793079
ERROR: date/time field value out of range: "2015-02-11 86400"
3080+
SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSSS'); -- ok
3081+
to_timestamp
3082+
------------------------------
3083+
Wed Feb 11 23:53:20 2015 PST
3084+
(1 row)
3085+
3086+
SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSSS');
3087+
ERROR: date/time field value out of range: "2015-02-11 86400"
30803088
SELECT to_date('2016-13-10', 'YYYY-MM-DD');
30813089
ERROR: date/time field value out of range: "2016-13-10"
30823090
SELECT to_date('2016-02-30', 'YYYY-MM-DD');
@@ -3140,4 +3148,16 @@ SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ');
31403148
2012-12-12 12:00:00 -01:30
31413149
(1 row)
31423150

3151+
SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSS');
3152+
to_char
3153+
------------------
3154+
2012-12-12 43200
3155+
(1 row)
3156+
3157+
SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSSS');
3158+
to_char
3159+
------------------
3160+
2012-12-12 43200
3161+
(1 row)
3162+
31433163
RESET TIME ZONE;

src/test/regress/sql/horology.sql

+4
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,8 @@ SELECT to_timestamp('2016-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS'); -- ok
480480
SELECT to_timestamp('2015-02-29 15:50:55', 'YYYY-MM-DD HH24:MI:SS');
481481
SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSS'); -- ok
482482
SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSS');
483+
SELECT to_timestamp('2015-02-11 86000', 'YYYY-MM-DD SSSSS'); -- ok
484+
SELECT to_timestamp('2015-02-11 86400', 'YYYY-MM-DD SSSSS');
483485
SELECT to_date('2016-13-10', 'YYYY-MM-DD');
484486
SELECT to_date('2016-02-30', 'YYYY-MM-DD');
485487
SELECT to_date('2016-02-29', 'YYYY-MM-DD'); -- ok
@@ -503,5 +505,7 @@ SELECT '2012-12-12 12:00'::timestamptz;
503505
SELECT '2012-12-12 12:00 America/New_York'::timestamptz;
504506

505507
SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD HH:MI:SS TZ');
508+
SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSS');
509+
SELECT to_char('2012-12-12 12:00'::timestamptz, 'YYYY-MM-DD SSSSS');
506510

507511
RESET TIME ZONE;

0 commit comments

Comments
 (0)