This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0-beta in repository https://gitbox.apache.org/repos/asf/doris.git
commit eb044d8b752e830c5b823f8b46a08736321017ae Author: mch_ucchi <[email protected]> AuthorDate: Mon Jun 5 19:06:50 2023 +0800 [Fix](Planner)fix cast date/datev2/datetime to float/double return null. (#20008) --- fe/fe-core/src/main/cup/sql_parser.cup | 6 ++-- .../java/org/apache/doris/analysis/ExprTest.java | 10 +++++++ .../sql/dateTimeOperatorsAccessible.out | 2 +- .../suites/query_p0/cast/test_cast.groovy | 34 ++++++++++++++++++++++ 4 files changed, 48 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/cup/sql_parser.cup b/fe/fe-core/src/main/cup/sql_parser.cup index 6542ad40e4..3a85b99dd4 100644 --- a/fe/fe-core/src/main/cup/sql_parser.cup +++ b/fe/fe-core/src/main/cup/sql_parser.cup @@ -6421,11 +6421,11 @@ non_pred_expr ::= | function_call_expr:e {: RESULT = e; :} | KW_DATE STRING_LITERAL:l - {: RESULT = new StringLiteral(l); :} + {: RESULT = new CastExpr(Type.DATE, new StringLiteral(l)); :} | KW_DATEV2 STRING_LITERAL:l - {: RESULT = new StringLiteral(l); :} + {: RESULT = new CastExpr(Type.DATEV2, new StringLiteral(l)); :} | KW_TIMESTAMP STRING_LITERAL:l - {: RESULT = new StringLiteral(l); :} + {: RESULT = new CastExpr(Type.DATETIME, new StringLiteral(l)); :} | KW_EXTRACT LPAREN function_name:fn_name KW_FROM func_arg_list:exprs RPAREN {: RESULT = new FunctionCallExpr(fn_name, exprs); :} //| function_name:fn_name LPAREN RPAREN diff --git a/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java b/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java index 475d9dc8fb..5262a29034 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/analysis/ExprTest.java @@ -127,6 +127,16 @@ public class ExprTest { Assert.assertEquals(0, castLiteral.getMinute()); Assert.assertEquals(0, castLiteral.getSecond()); + DateLiteral srcDate = new DateLiteral("2020-01-01", Type.DATE); + DateLiteral srcDateV2 = new DateLiteral("2020-01-01", Type.DATEV2); + DateLiteral srcDateTime = new DateLiteral("2020-01-01 12:34:45", Type.DATETIME); + Assert.assertEquals(20200101L, ((FloatLiteral) (new CastExpr(Type.FLOAT, srcDate) + .castTo(Type.FLOAT)).getResultValue(false)).getLongValue()); + Assert.assertEquals(20200101L, ((FloatLiteral) new CastExpr(Type.FLOAT, srcDateV2) + .castTo(Type.FLOAT).getResultValue(false)).getLongValue()); + Assert.assertEquals(20200101123445L, ((FloatLiteral) new CastExpr(Type.FLOAT, srcDateTime) + .castTo(Type.FLOAT).getResultValue(false)).getLongValue()); + // float FloatLiteral floatLiteral = new FloatLiteral(0.1, Type.FLOAT); Assert.assertEquals(floatLiteral.getType(), Type.FLOAT); diff --git a/regression-test/data/query_p0/sql_functions/horology_functions/sql/dateTimeOperatorsAccessible.out b/regression-test/data/query_p0/sql_functions/horology_functions/sql/dateTimeOperatorsAccessible.out index bfac26aba9..a6071694b7 100644 --- a/regression-test/data/query_p0/sql_functions/horology_functions/sql/dateTimeOperatorsAccessible.out +++ b/regression-test/data/query_p0/sql_functions/horology_functions/sql/dateTimeOperatorsAccessible.out @@ -1,4 +1,4 @@ -- This file is automatically generated. You should know what you did if you want to edit this -- !dateTimeOperatorsAccessible -- -2012-08-10T00:00 2012-08-09T06:00 2012-11-30T01:00 2012-08-06T00:00 2012-08-06T20:00 2012-09-30T01:00 +2012-08-10 2012-08-09T06:00 2012-11-30T01:00 2012-08-06 2012-08-06T20:00 2012-09-30T01:00 diff --git a/regression-test/suites/query_p0/cast/test_cast.groovy b/regression-test/suites/query_p0/cast/test_cast.groovy new file mode 100644 index 0000000000..bfe4a87989 --- /dev/null +++ b/regression-test/suites/query_p0/cast/test_cast.groovy @@ -0,0 +1,34 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +suite('test_cast') { + def date = "date '2020-01-01'" + def datev2 = "datev2 '2020-01-01'" + def datetime = "timestamp '2020-01-01 12:34:45'" + test { + sql "select cast(${date} as int), cast(${date} as bigint), cast(${date} as float), cast(${date} as double)" + result([[20200101, 20200101l, ((float) 20200101), ((double) 20200101)]]) + } + test { + sql "select cast(${datev2} as int), cast(${datev2} as bigint), cast(${datev2} as float), cast(${datev2} as double)" + result([[20200101, 20200101l, ((float) 20200101), ((double) 20200101)]]) + } + test { + sql "select cast(${datetime} as int), cast(${datetime} as bigint), cast(${datetime} as float), cast(${datetime} as double)" + result([[869930357, 20200101123445l, ((float) 20200101123445l), ((double) 20200101123445l)]]) + } +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
