From 3ed26a547926d2e7752c66c90ee1066fc64f0c49 Mon Sep 17 00:00:00 2001 From: yujiang Date: Mon, 3 Aug 2020 14:21:52 +0800 Subject: [PATCH] fix the issue: the process crashs when an interval parition table is created with integer interval value Signed-off-by: yujiang --- src/common/backend/parser/parse_utilcmd.cpp | 3 ++- .../hw_partition_interval_check_syntax.out | 24 +++++++++++++++++++ src/test/regress/parallel_schedule18 | 1 + .../hw_partition_interval_check_syntax.sql | 23 ++++++++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 src/test/regress/expected/hw_partition_interval_check_syntax.out create mode 100644 src/test/regress/sql/hw_partition_interval_check_syntax.sql diff --git a/src/common/backend/parser/parse_utilcmd.cpp b/src/common/backend/parser/parse_utilcmd.cpp index 14ee9a447f..b9cae1919f 100644 --- a/src/common/backend/parser/parse_utilcmd.cpp +++ b/src/common/backend/parser/parse_utilcmd.cpp @@ -4199,7 +4199,8 @@ void checkPartitionSynax(CreateStmt* stmt) errmsg("Range partitioned table with INTERVAL clause has more than one column"), errhint("Only support one partition key for interval partition"))); } - if (!IsA(stmt->partTableState->intervalPartDef->partInterval, A_Const)) { + if (!IsA(stmt->partTableState->intervalPartDef->partInterval, A_Const) || + ((A_Const*)stmt->partTableState->intervalPartDef->partInterval)->val.type != T_String) { ereport(ERROR, (errcode(ERRCODE_INVALID_DATETIME_FORMAT), // errmsg("invalid input syntax for type %s: \"%s\"", datatype, str))); diff --git a/src/test/regress/expected/hw_partition_interval_check_syntax.out b/src/test/regress/expected/hw_partition_interval_check_syntax.out new file mode 100644 index 0000000000..ee0080b4ab --- /dev/null +++ b/src/test/regress/expected/hw_partition_interval_check_syntax.out @@ -0,0 +1,24 @@ +create table partiton_table_001( +COL_1 bigint, +COL_2 TIMESTAMP WITHOUT TIME ZONE, +COL_3 bool, +COL_4 decimal +) +PARTITION BY RANGE (COL_4) +INTERVAL (10000) +( +PARTITION partiton_table_001_p1 VALUES LESS THAN (1000) +); +ERROR: invalid input syntax for type interval +create table partiton_table_001( +COL_1 bigint, +COL_2 TIMESTAMP WITHOUT TIME ZONE, +COL_3 bool, +COL_4 decimal +) +PARTITION BY RANGE (COL_2) +INTERVAL ('2018-1-1') +( +PARTITION partiton_table_001_p1 VALUES LESS THAN ('2020-03-01') +); +ERROR: invalid input syntax for type interval: "2018-1-1" diff --git a/src/test/regress/parallel_schedule18 b/src/test/regress/parallel_schedule18 index acc596dfb3..d26cd6bde2 100644 --- a/src/test/regress/parallel_schedule18 +++ b/src/test/regress/parallel_schedule18 @@ -17,6 +17,7 @@ test: hw_partition_interval_parallel_prepare test: hw_partition_interval_parallel_insert hw_partition_interval_parallel_insert_01 hw_partition_interval_parallel_insert_02 test: hw_partition_interval_parallel_end test: hw_partition_interval_select +test: hw_partition_interval_check_syntax #test: hw_partition_lock #test: hw_partition_llt # FIXME: move me back to the parallel test when the refcnt issue is fixed diff --git a/src/test/regress/sql/hw_partition_interval_check_syntax.sql b/src/test/regress/sql/hw_partition_interval_check_syntax.sql new file mode 100644 index 0000000000..5b054545f2 --- /dev/null +++ b/src/test/regress/sql/hw_partition_interval_check_syntax.sql @@ -0,0 +1,23 @@ +create table partiton_table_001( +COL_1 bigint, +COL_2 TIMESTAMP WITHOUT TIME ZONE, +COL_3 bool, +COL_4 decimal +) +PARTITION BY RANGE (COL_4) +INTERVAL (10000) +( +PARTITION partiton_table_001_p1 VALUES LESS THAN (1000) +); + +create table partiton_table_001( +COL_1 bigint, +COL_2 TIMESTAMP WITHOUT TIME ZONE, +COL_3 bool, +COL_4 decimal +) +PARTITION BY RANGE (COL_2) +INTERVAL ('2018-1-1') +( +PARTITION partiton_table_001_p1 VALUES LESS THAN ('2020-03-01') +); -- Gitee