From d639a4810762d4df296570bdff897ac407c817ea Mon Sep 17 00:00:00 2001 From: JaySon-Huang Date: Mon, 24 May 2021 16:24:10 +0800 Subject: [PATCH 1/3] Fix bug for str_to_date nullable input column Signed-off-by: JaySon-Huang --- dbms/src/Functions/FunctionsConversion.h | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dbms/src/Functions/FunctionsConversion.h b/dbms/src/Functions/FunctionsConversion.h index 4e90072cda0..7b66a02ab07 100644 --- a/dbms/src/Functions/FunctionsConversion.h +++ b/dbms/src/Functions/FunctionsConversion.h @@ -1677,8 +1677,13 @@ class FunctionStrToDate : public IFunction { if (input_column->isColumnNullable()) { - null_res[i] = input_column->isNullAt(i); - continue; + // For null input, just set the result as null + if (bool is_null = input_column->isNullAt(i); is_null) + { + null_res[i] = is_null; + continue; + } + // else fallthrough to parsing } const auto str_ref = col_from->getDataAt(i); From e35200c5a6578357a601e23c1084caacb01078e6 Mon Sep 17 00:00:00 2001 From: JaySon-Huang Date: Mon, 24 May 2021 19:43:49 +0800 Subject: [PATCH 2/3] make test case more clear Signed-off-by: JaySon-Huang --- tests/fullstack-test/expr/str_to_date.test | 27 ++++++++++++---------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/tests/fullstack-test/expr/str_to_date.test b/tests/fullstack-test/expr/str_to_date.test index 7bded2f0490..f9baeb89c27 100644 --- a/tests/fullstack-test/expr/str_to_date.test +++ b/tests/fullstack-test/expr/str_to_date.test @@ -11,30 +11,33 @@ func> wait_table test t # Note that we need to put `str_to_date` in group by to make sure it is pushed down ## Test suite 1 - Allow zero day -#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('0000/00/00', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by date order by a -mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('0000/00/00', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by date order by a +#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('00/00/0000', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by a,date order by a +mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('00/00/0000', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by a,date order by a +------------+------------+-----+ | a | date | cnt | +------------+------------+-----+ | 0/0/2012 | 2012-00-00 | 1 | -| 00/00/0000 | 0000-00-00 | 2 | +| 00/00/0000 | 0000-00-00 | 1 | | 13/05/2019 | 2019-05-13 | 1 | +| abc | 0000-00-00 | 1 | +------------+------------+-----+ ## Test suite 1 - Disallow zero day -#mysql> set sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE'; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('0000/00/00', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by date order by a -mysql> set sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE'; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('0000/00/00', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by date order by a +# The sql_mode does not effect the result set +#mysql> set sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE'; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('00/00/0000', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by a,date order by a +mysql> set sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE'; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, ifnull(str_to_date(a, '%d/%m/%Y'),str_to_date('00/00/0000', '%d/%m/%Y')) as date, count(*) as cnt from test.t where suite = 1 group by a,date order by a +------------+------------+-----+ | a | date | cnt | +------------+------------+-----+ | 0/0/2012 | NULL | 1 | -| 00/00/0000 | NULL | 2 | +| 00/00/0000 | NULL | 1 | | 13/05/2019 | 2019-05-13 | 1 | +| abc | NULL | 1 | +------------+------------+-----+ ## Test suite 2 - showing datetime with fractions -#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, str_to_date(a, '%d/%b/%Y %H:%i:%S.%f') as date from test.t where suite = 2 group by date order by a -mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select /*+ agg_to_cop() */ a, str_to_date(a, '%d/%b/%Y %H:%i:%S.%f') as date from test.t where suite = 2 group by date order by a +#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, str_to_date(a, '%d/%b/%Y %H:%i:%S.%f') as date from test.t where suite = 2 group by a,date order by a +mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, str_to_date(a, '%d/%b/%Y %H:%i:%S.%f') as date from test.t where suite = 2 group by a,date order by a +-----------------------------+----------------------------+ | a | date | +-----------------------------+----------------------------+ @@ -44,8 +47,8 @@ mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='t +-----------------------------+----------------------------+ ## Test suite 3 - showing datetime without fractions -#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, str_to_date(a, ' %d/%b/%Y %H:%i:%S') as date from test.t where suite = 3 group by date order by a -mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, str_to_date(a, ' %d/%b/%Y %H:%i:%S') as date from test.t where suite = 3 group by date order by a +#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, str_to_date(a, ' %d/%b/%Y %H:%i:%S') as date from test.t where suite = 3 group by a,date order by a +mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, str_to_date(a, ' %d/%b/%Y %H:%i:%S') as date from test.t where suite = 3 group by a,date order by a +-------------------------+---------------------+ | a | date | +-------------------------+---------------------+ @@ -54,8 +57,8 @@ mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='t +-------------------------+---------------------+ ## Test suite 4 - showing date -#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, str_to_date(a, '%d/%b/%Y ') as date from test.t where suite = 4 group by date order by a -mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, str_to_date(a, '%d/%b/%Y ') as date from test.t where suite = 4 group by date order by a +#mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; explain select a, str_to_date(a, '%d/%b/%Y ') as date from test.t where suite = 4 group by a,date order by a +mysql> set sql_mode=''; set tidb_allow_mpp=1; set tidb_isolation_read_engines='tiflash'; select a, str_to_date(a, '%d/%b/%Y ') as date from test.t where suite = 4 group by a,date order by a +---------------+------------+ | a | date | +---------------+------------+ From 959458b6a1550063a154abbee5f79ab32a27d21a Mon Sep 17 00:00:00 2001 From: JaySon-Huang Date: Mon, 24 May 2021 18:57:12 +0800 Subject: [PATCH 3/3] Remove unreasonable include Signed-off-by: JaySon-Huang --- dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.cpp | 3 ++- dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.h | 2 -- dbms/src/Storages/DeltaMerge/DeltaMergeStore.cpp | 1 + dbms/src/Storages/DeltaMerge/Index/MinMaxIndex.cpp | 2 ++ dbms/src/Storages/DeltaMerge/RowKeyRange.h | 1 + dbms/src/Storages/DeltaMerge/convertColumnTypeHelpers.cpp | 6 ++++++ 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.cpp b/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.cpp index 5b1cb728942..ed1ab3de3b0 100644 --- a/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.cpp +++ b/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.cpp @@ -1,3 +1,4 @@ +#include #include namespace DB @@ -101,4 +102,4 @@ void appendIntoHandleColumn(ColumnVector::Container & handle_column, con } } // namespace DM -} // namespace DB \ No newline at end of file +} // namespace DB diff --git a/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.h b/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.h index 793218376a4..efe0997530e 100644 --- a/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.h +++ b/dbms/src/Storages/DeltaMerge/DeltaMergeHelpers.h @@ -7,9 +7,7 @@ #include #include #include -#include #include -#include #include #include #include diff --git a/dbms/src/Storages/DeltaMerge/DeltaMergeStore.cpp b/dbms/src/Storages/DeltaMerge/DeltaMergeStore.cpp index b3b41f28a92..24d61fcc02c 100644 --- a/dbms/src/Storages/DeltaMerge/DeltaMergeStore.cpp +++ b/dbms/src/Storages/DeltaMerge/DeltaMergeStore.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/dbms/src/Storages/DeltaMerge/Index/MinMaxIndex.cpp b/dbms/src/Storages/DeltaMerge/Index/MinMaxIndex.cpp index 18089f84ac6..c6d2f4922a2 100644 --- a/dbms/src/Storages/DeltaMerge/Index/MinMaxIndex.cpp +++ b/dbms/src/Storages/DeltaMerge/Index/MinMaxIndex.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include #include #include #include diff --git a/dbms/src/Storages/DeltaMerge/RowKeyRange.h b/dbms/src/Storages/DeltaMerge/RowKeyRange.h index c82725100df..09ce340d9af 100644 --- a/dbms/src/Storages/DeltaMerge/RowKeyRange.h +++ b/dbms/src/Storages/DeltaMerge/RowKeyRange.h @@ -10,6 +10,7 @@ #include #include #include +#include namespace DB::DM { diff --git a/dbms/src/Storages/DeltaMerge/convertColumnTypeHelpers.cpp b/dbms/src/Storages/DeltaMerge/convertColumnTypeHelpers.cpp index b458fa79464..036794caf1c 100644 --- a/dbms/src/Storages/DeltaMerge/convertColumnTypeHelpers.cpp +++ b/dbms/src/Storages/DeltaMerge/convertColumnTypeHelpers.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include @@ -12,6 +13,11 @@ namespace DB { +namespace ErrorCodes +{ +extern const int BAD_ARGUMENTS; +} + namespace DM {