From 2ca4db82b75abe067c7dcd98d7d9233de8a2ddda Mon Sep 17 00:00:00 2001 From: yuchao Date: Tue, 27 Aug 2024 17:12:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8Ddate=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E6=8F=92=E5=85=A5=E4=B8=8E=E4=BD=BF=E7=94=A8?= =?UTF-8?q?TO=5FDATE=E5=87=BD=E6=95=B0=E8=A1=8C=E4=B8=BA=E4=B8=8D=E4=B8=80?= =?UTF-8?q?=E8=87=B4=EF=BC=8C=E6=98=AF=E5=90=A6=E8=A6=81=E5=85=81=E8=AE=B8?= =?UTF-8?q?>9999=E5=80=BC=E7=9B=B4=E6=8E=A5=E6=8F=92=E5=85=A5=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/utils/adt/timestamp.cpp | 8 +++++- .../regress/expected/insert_date_to_date.out | 10 +++++++ .../regress/expected/mot/single_node_date.out | 27 +++++++++---------- .../regress/expected/single_node_date.out | 27 +++++++++---------- .../regress/output/cstore_cmpr_date.source | 24 ++++------------- src/test/regress/parallel_schedule0 | 2 +- src/test/regress/sql/insert_date_to_date.sql | 4 +++ 7 files changed, 51 insertions(+), 51 deletions(-) create mode 100644 src/test/regress/expected/insert_date_to_date.out create mode 100644 src/test/regress/sql/insert_date_to_date.sql diff --git a/src/common/backend/utils/adt/timestamp.cpp b/src/common/backend/utils/adt/timestamp.cpp index 0039c3a44..993072e7b 100644 --- a/src/common/backend/utils/adt/timestamp.cpp +++ b/src/common/backend/utils/adt/timestamp.cpp @@ -234,8 +234,14 @@ bool TimestampTypeCheck(char* str, bool can_ignore, struct pg_tm* tm, Timestamp if (tm2timestamp(tm, fsec, NULL, &result) != 0) ereport(ERROR, (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), errmsg("timestamp out of range: \"%s\"", str))); - break; + if (tm->tm_year < MIN_VALUE_YEAR || tm->tm_year > MAX_VALUE_YEAR || tm->tm_year == 0) { + ereport(ERROR, + (errcode(ERRCODE_DATETIME_VALUE_OUT_OF_RANGE), + errmsg("invalid data for \"year = %d\", value must be between -4712 and 9999," \ + " and not be 0", tm->tm_year))); + } + break; case DTK_EPOCH: result = SetEpochTimestamp(); break; diff --git a/src/test/regress/expected/insert_date_to_date.out b/src/test/regress/expected/insert_date_to_date.out new file mode 100644 index 000000000..0c29066c7 --- /dev/null +++ b/src/test/regress/expected/insert_date_to_date.out @@ -0,0 +1,10 @@ +create table tt(col1 date); +insert into tt values('10000-01-28'); +ERROR: invalid data for "year = 10000", value must be between -4712 and 9999, and not be 0 +LINE 1: insert into tt values('10000-01-28'); + ^ +CONTEXT: referenced column: col1 +insert into tt values(TO_DATE('10000-01-28','yyyy-mm-dd')); +ERROR: invalid data for "year = 10000" ,value must be between 1 and 9999, and not be 0 +CONTEXT: referenced column: col1 +drop table tt; diff --git a/src/test/regress/expected/mot/single_node_date.out b/src/test/regress/expected/mot/single_node_date.out index 807196b57..186bea396 100644 --- a/src/test/regress/expected/mot/single_node_date.out +++ b/src/test/regress/expected/mot/single_node_date.out @@ -955,11 +955,10 @@ SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 (1 row) SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 - date_part ------------ - -1 -(1 row) - +ERROR: invalid data for "year = 0", value must be between -4712 and 9999, and not be 0 +LINE 1: SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); + ^ +CONTEXT: referenced column: date_part SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 date_part ----------- @@ -1006,11 +1005,10 @@ SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true -- millennium -- SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 - date_part ------------ - -1 -(1 row) - +ERROR: invalid data for "year = 0", value must be between -4712 and 9999, and not be 0 +LINE 1: SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); + ^ +CONTEXT: referenced column: date_part SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 date_part ----------- @@ -1070,11 +1068,10 @@ SELECT EXTRACT(DECADE FROM DATE '0009-12-31'); -- 0 (1 row) SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0 - date_part ------------ - 0 -(1 row) - +ERROR: invalid data for "year = 0", value must be between -4712 and 9999, and not be 0 +LINE 1: SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); + ^ +CONTEXT: referenced column: date_part SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 date_part ----------- diff --git a/src/test/regress/expected/single_node_date.out b/src/test/regress/expected/single_node_date.out index 38ff20225..03b7a9efe 100644 --- a/src/test/regress/expected/single_node_date.out +++ b/src/test/regress/expected/single_node_date.out @@ -954,11 +954,10 @@ SELECT EXTRACT(CENTURY FROM DATE '0100-12-31 BC'); -- -1 (1 row) SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); -- -1 - date_part ------------ - -1 -(1 row) - +ERROR: invalid data for "year = 0", value must be between -4712 and 9999, and not be 0 +LINE 1: SELECT EXTRACT(CENTURY FROM DATE '0001-12-31 BC'); + ^ +CONTEXT: referenced column: date_part SELECT EXTRACT(CENTURY FROM DATE '0001-01-01'); -- 1 date_part ----------- @@ -1005,11 +1004,10 @@ SELECT EXTRACT(CENTURY FROM CURRENT_DATE)>=21 AS True; -- true -- millennium -- SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); -- -1 - date_part ------------ - -1 -(1 row) - +ERROR: invalid data for "year = 0", value must be between -4712 and 9999, and not be 0 +LINE 1: SELECT EXTRACT(MILLENNIUM FROM DATE '0001-12-31 BC'); + ^ +CONTEXT: referenced column: date_part SELECT EXTRACT(MILLENNIUM FROM DATE '0001-01-01 AD'); -- 1 date_part ----------- @@ -1069,11 +1067,10 @@ SELECT EXTRACT(DECADE FROM DATE '0009-12-31'); -- 0 (1 row) SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); -- 0 - date_part ------------ - 0 -(1 row) - +ERROR: invalid data for "year = 0", value must be between -4712 and 9999, and not be 0 +LINE 1: SELECT EXTRACT(DECADE FROM DATE '0001-01-01 BC'); + ^ +CONTEXT: referenced column: date_part SELECT EXTRACT(DECADE FROM DATE '0002-12-31 BC'); -- -1 date_part ----------- diff --git a/src/test/regress/output/cstore_cmpr_date.source b/src/test/regress/output/cstore_cmpr_date.source index 4bc4f1237..5a3843656 100644 --- a/src/test/regress/output/cstore_cmpr_date.source +++ b/src/test/regress/output/cstore_cmpr_date.source @@ -43,25 +43,11 @@ CREATE TABLE colcmpr_date_01 c date ) with (orientation = column) ; COPY colcmpr_date_01 FROM '@abs_srcdir@/data/colcmpr_date_01.data'; +ERROR: invalid data for "year = 294276", value must be between -4712 and 9999, and not be 0 +CONTEXT: COPY colcmpr_date_01, line 5, column c: "294276-01-01 AD" SELECT * FROM colcmpr_date_01; - distkey | a | b | c ----------+------------------------+------------------------+----------------------- - 1 | 4713-01-01 00:00:00 BC | 4713-01-01 00:00:00 BC | 0001-01-01 00:00:00 - 1 | 4713-01-01 00:00:00 BC | 4713-01-02 00:00:00 BC | 0001-01-02 00:00:00 - 1 | 4713-01-01 00:00:00 BC | 4713-01-03 00:00:00 BC | 0001-01-03 00:00:00 - 1 | 4713-01-01 00:00:00 BC | 4713-01-04 00:00:00 BC | 0001-01-04 00:00:00 - 1 | 4713-01-01 00:00:00 BC | 4713-01-05 00:00:00 BC | 294276-01-01 00:00:00 - 1 | 4713-01-01 00:00:00 BC | 4712-01-01 00:00:00 BC | 294276-02-01 00:00:00 - 1 | 4713-01-01 00:00:00 BC | 4711-01-01 00:00:00 BC | 294276-03-01 00:00:00 - 1 | 4713-12-31 00:00:00 BC | 4710-01-01 00:00:00 BC | 294276-04-01 00:00:00 - 1 | 294276-01-01 00:00:00 | 0001-01-01 00:00:00 | 294276-05-01 00:00:00 - 1 | 294276-01-01 00:00:00 | 0001-01-01 00:00:00 BC | 294276-07-01 00:00:00 - 1 | 294276-01-01 00:00:00 | 0001-01-02 00:00:00 BC | 294276-08-01 00:00:00 - 1 | 294276-01-01 00:00:00 | 0001-01-03 00:00:00 BC | 294276-09-01 00:00:00 - 1 | 294276-01-01 00:00:00 | 0001-01-04 00:00:00 BC | 294276-10-01 00:00:00 - 1 | 294276-01-01 00:00:00 | 0001-01-02 00:00:00 | 294276-11-01 00:00:00 - 1 | 294276-01-01 00:00:00 | 0001-01-03 00:00:00 | 294276-12-01 00:00:00 - 1 | 294276-12-31 00:00:00 | 0001-01-04 00:00:00 | 294276-12-31 00:00:00 -(16 rows) + distkey | a | b | c +---------+---+---+--- +(0 rows) DROP TABLE colcmpr_date_01; diff --git a/src/test/regress/parallel_schedule0 b/src/test/regress/parallel_schedule0 index 921478c21..d77a3cf58 100644 --- a/src/test/regress/parallel_schedule0 +++ b/src/test/regress/parallel_schedule0 @@ -45,7 +45,7 @@ test: spm_adaptive_gplan test: smp smp_cursor parallel_enable_function test: alter_hw_package test: hw_grant_package gsc_func gsc_db -test: uppercase_attribute_name decode_compatible_with_o outerjoin_bugfix chr_gbk +test: uppercase_attribute_name decode_compatible_with_o outerjoin_bugfix chr_gbk insert_date_to_date test: replace_func_with_two_args trunc_func_for_date nlssort_pinyin updatable_views test_cursor_arg_defexpr # test multiple statistics diff --git a/src/test/regress/sql/insert_date_to_date.sql b/src/test/regress/sql/insert_date_to_date.sql new file mode 100644 index 000000000..60fae22db --- /dev/null +++ b/src/test/regress/sql/insert_date_to_date.sql @@ -0,0 +1,4 @@ +create table tt(col1 date); +insert into tt values('10000-01-28'); +insert into tt values(TO_DATE('10000-01-28','yyyy-mm-dd')); +drop table tt;