This is an automated email from the ASF dual-hosted git repository. starocean999 pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 05e734a8e6b [fix](nereids)move ReplaceVariableByLiteral rule to analyze phase (#33997) 05e734a8e6b is described below commit 05e734a8e6b033d11caf9d4f03e624554e23ec7c Author: starocean999 <40539150+starocean...@users.noreply.github.com> AuthorDate: Fri Apr 26 09:36:05 2024 +0800 [fix](nereids)move ReplaceVariableByLiteral rule to analyze phase (#33997) --- .../doris/nereids/jobs/executor/Analyzer.java | 12 +++++++ .../nereids/rules/analysis/VariableToLiteral.java | 37 ++++++++++++---------- .../rules/expression/ExpressionNormalization.java | 2 -- .../suites/nereids_p0/test_user_var.groovy | 35 ++++++++++++++++++++ 4 files changed, 68 insertions(+), 18 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java index a0431e066be..ac0a4421071 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Analyzer.java @@ -44,6 +44,7 @@ import org.apache.doris.nereids.rules.analysis.ProjectToGlobalAggregate; import org.apache.doris.nereids.rules.analysis.ProjectWithDistinctToAggregate; import org.apache.doris.nereids.rules.analysis.ReplaceExpressionByChildOutput; import org.apache.doris.nereids.rules.analysis.SubqueryToApply; +import org.apache.doris.nereids.rules.analysis.VariableToLiteral; import org.apache.doris.nereids.rules.rewrite.MergeProjects; import org.apache.doris.nereids.rules.rewrite.SemiJoinCommute; import org.apache.doris.nereids.rules.rewrite.SimplifyAggGroupBy; @@ -157,6 +158,17 @@ public class Analyzer extends AbstractBatchJobExecutor { new NormalizeRepeat() ), bottomUp(new AdjustAggregateNullableForEmptySet()), + // consider sql with user defined var @t_zone + // set @t_zone='GMT'; + // SELECT + // DATE_FORMAT(convert_tz(dt, time_zone, @t_zone),'%Y-%m-%d') day + // FROM + // t + // GROUP BY + // 1; + // @t_zone must be replaced as 'GMT' before EliminateGroupByConstant and NormalizeAggregate rule. + // So need run VariableToLiteral rule before the two rules. + topDown(new VariableToLiteral()), // run CheckAnalysis before EliminateGroupByConstant in order to report error message correctly like bellow // select SUM(lo_tax) FROM lineorder group by 1; // errCode = 2, detailMessage = GROUP BY expression must not contain aggregate functions: sum(lo_tax) diff --git a/regression-test/suites/nereids_p0/test_user_var.groovy b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/VariableToLiteral.java similarity index 50% copy from regression-test/suites/nereids_p0/test_user_var.groovy copy to fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/VariableToLiteral.java index d5eb164e3f9..c7ba1bfe6a7 100644 --- a/regression-test/suites/nereids_p0/test_user_var.groovy +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/VariableToLiteral.java @@ -15,20 +15,25 @@ // specific language governing permissions and limitations // under the License. -suite("test_user_var") { - sql "SET enable_nereids_planner=true" - sql "SET enable_fallback_to_original_planner=false" - sql "SET @a1=1, @a2=0, @a3=-1" - sql "SET @b1=1.1, @b2=0.0, @b3=-1.1" - sql "SET @c1='H', @c2=''" - sql "SET @d1=true, @d2=false" - sql "SET @f1=null" - sql "set @func_1=(abs(1) + 1) * 2" +package org.apache.doris.nereids.rules.analysis; - qt_integer 'select @a1, @a2, @a3;' - qt_decimal 'select @b1, @b2, @b3;' - qt_string 'select @c1, @c2;' - qt_boolean 'select @d1, @d2;' - qt_null_literal 'select @f1, @f2;' - qt_function 'select @func_1' -} \ No newline at end of file +import org.apache.doris.nereids.rules.expression.ExpressionRewrite; +import org.apache.doris.nereids.rules.expression.ExpressionRewriteRule; +import org.apache.doris.nereids.rules.expression.ExpressionRuleExecutor; +import org.apache.doris.nereids.rules.expression.rules.ReplaceVariableByLiteral; + +import com.google.common.collect.ImmutableList; + +import java.util.List; + +/** + * replace Variable To Literal + */ +public class VariableToLiteral extends ExpressionRewrite { + public static final List<ExpressionRewriteRule> NORMALIZE_REWRITE_RULES = + ImmutableList.of(bottomUp(ReplaceVariableByLiteral.INSTANCE)); + + public VariableToLiteral() { + super(new ExpressionRuleExecutor(NORMALIZE_REWRITE_RULES)); + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java index adf0cb90a95..f63ab2eee5f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/ExpressionNormalization.java @@ -24,7 +24,6 @@ import org.apache.doris.nereids.rules.expression.rules.FoldConstantRule; import org.apache.doris.nereids.rules.expression.rules.InPredicateDedup; import org.apache.doris.nereids.rules.expression.rules.InPredicateToEqualToRule; import org.apache.doris.nereids.rules.expression.rules.NormalizeBinaryPredicatesRule; -import org.apache.doris.nereids.rules.expression.rules.ReplaceVariableByLiteral; import org.apache.doris.nereids.rules.expression.rules.SimplifyArithmeticComparisonRule; import org.apache.doris.nereids.rules.expression.rules.SimplifyArithmeticRule; import org.apache.doris.nereids.rules.expression.rules.SimplifyCastRule; @@ -43,7 +42,6 @@ public class ExpressionNormalization extends ExpressionRewrite { // from_unixtime(timestamp, 'yyyyMMdd') to 'yyyyMMdd' public static final List<ExpressionRewriteRule> NORMALIZE_REWRITE_RULES = ImmutableList.of( bottomUp( - ReplaceVariableByLiteral.INSTANCE, SupportJavaDateFormatter.INSTANCE, NormalizeBinaryPredicatesRule.INSTANCE, InPredicateDedup.INSTANCE, diff --git a/regression-test/suites/nereids_p0/test_user_var.groovy b/regression-test/suites/nereids_p0/test_user_var.groovy index d5eb164e3f9..8a7db373682 100644 --- a/regression-test/suites/nereids_p0/test_user_var.groovy +++ b/regression-test/suites/nereids_p0/test_user_var.groovy @@ -31,4 +31,39 @@ suite("test_user_var") { qt_boolean 'select @d1, @d2;' qt_null_literal 'select @f1, @f2;' qt_function 'select @func_1' + + multi_sql( + """ + drop table if exists dwd_login_ttt; + + CREATE TABLE `dwd_login_ttt` ( + `game_code` varchar(100) NOT NULL DEFAULT "-" , + `plat_code` varchar(100) NOT NULL DEFAULT "-" , + `userid` varchar(255) NULL DEFAULT "-" , + `dt` datetime NOT NULL, + `time_zone` varchar(100) NULL + ) ENGINE=OLAP + UNIQUE KEY(`game_code`, `plat_code`) + DISTRIBUTED BY HASH(`game_code`) BUCKETS 16 + PROPERTIES("replication_num" = "1"); + + drop view if exists dwd_login_ttt_view; + + create view dwd_login_ttt_view as + SELECT game_code,plat_code,time_zone,DATE_FORMAT(convert_tz(dt,time_zone,@t_zone),'%Y-%m-%d') day,count(distinct userid) + from dwd_login_ttt + where dt>=convert_tz(@t_day,'Asia/Shanghai',@t_zone) + and dt<convert_tz(date_add(@t_day,1),'Asia/Shanghai',@t_zone) + GROUP by 1,2,3,4; + + set @t_day='2024-02-01'; + set @t_zone='GMT'; + """ + ) + + explain { + sql("shape plan select * from dwd_login_ttt_view where day='2024-04-01';") + contains "dt < '2024-02-01 16:00:00'" + contains "dt >= '2024-01-31 16:00:00'" + } } \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org