修复date类型直接插入与使用TO_DATE函数行为不一致,是否要允许>9999值直接插入的问题
This commit is contained in:
@ -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;
|
||||
|
||||
10
src/test/regress/expected/insert_date_to_date.out
Normal file
10
src/test/regress/expected/insert_date_to_date.out
Normal file
@ -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;
|
||||
@ -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
|
||||
-----------
|
||||
|
||||
@ -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
|
||||
-----------
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
4
src/test/regress/sql/insert_date_to_date.sql
Normal file
4
src/test/regress/sql/insert_date_to_date.sql
Normal file
@ -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;
|
||||
Reference in New Issue
Block a user