This is an automated email from the ASF dual-hosted git repository.

starocean999 pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.0 by this push:
     new fa7c1f77803 [fix](nereids)move ReplaceVariableByLiteral rule to 
analyze phase (#34023)
fa7c1f77803 is described below

commit fa7c1f778032adb1fb3fff6d439872862a0fe1c7
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Thu Apr 25 18:51:14 2024 +0800

    [fix](nereids)move ReplaceVariableByLiteral rule to analyze phase (#34023)
---
 .../doris/nereids/jobs/executor/Analyzer.java      | 12 ++++++++
 .../nereids/rules/analysis/VariableToLiteral.java  | 35 +++++++++++++---------
 .../rules/expression/ExpressionNormalization.java  |  2 --
 .../suites/nereids_p0/test_user_var.groovy         | 28 +++++++++++++++++
 4 files changed, 61 insertions(+), 16 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 78fdd17a7a6..2432661a568 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
@@ -41,6 +41,7 @@ import 
org.apache.doris.nereids.rules.analysis.ProjectWithDistinctToAggregate;
 import org.apache.doris.nereids.rules.analysis.ReplaceExpressionByChildOutput;
 import 
org.apache.doris.nereids.rules.analysis.ResolveOrdinalInOrderByAndGroupBy;
 import org.apache.doris.nereids.rules.analysis.SubqueryToApply;
+import org.apache.doris.nereids.rules.analysis.VariableToLiteral;
 import org.apache.doris.nereids.rules.rewrite.JoinCommute;
 import org.apache.doris.nereids.rules.rewrite.MergeProjects;
 
@@ -150,6 +151,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 51%
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 f54e139632d..912310ea32b 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,18 +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"
+package org.apache.doris.nereids.rules.analysis;
 
-    qt_select1 'select @a1, @a2, @a3;'
-    qt_select2 'select @b1, @b2, @b3;'
-    qt_select3 'select @c1, @c2;'
-    qt_select4 'select @d1, @d2;'
-    qt_select5 'select @f1, @f2;'
-}
\ 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(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 6cff3553b43..b6fff54b297 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
@@ -23,7 +23,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;
@@ -42,7 +41,6 @@ public class ExpressionNormalization extends 
ExpressionRewrite {
     // from_unixtime(timestamp, 'yyyyMMdd') to 'yyyyMMdd'
     public static final List<ExpressionRewriteRule> NORMALIZE_REWRITE_RULES = 
ImmutableList.of(
             SupportJavaDateFormatter.INSTANCE,
-            ReplaceVariableByLiteral.INSTANCE,
             NormalizeBinaryPredicatesRule.INSTANCE,
             InPredicateDedup.INSTANCE,
             InPredicateToEqualToRule.INSTANCE,
diff --git a/regression-test/suites/nereids_p0/test_user_var.groovy 
b/regression-test/suites/nereids_p0/test_user_var.groovy
index f54e139632d..81b611b5c15 100644
--- a/regression-test/suites/nereids_p0/test_user_var.groovy
+++ b/regression-test/suites/nereids_p0/test_user_var.groovy
@@ -18,6 +18,7 @@
 suite("test_user_var") {
     sql "SET enable_nereids_planner=true"
     sql "SET enable_fallback_to_original_planner=false"
+    sql "SET enable_fold_constant_by_be=true;"
     sql "SET @a1=1, @a2=0, @a3=-1"
     sql "SET @b1=1.1, @b2=0.0, @b3=-1.1"
     sql "SET @c1='H', @c2=''"
@@ -29,4 +30,31 @@ suite("test_user_var") {
     qt_select3 'select @c1, @c2;'
     qt_select4 'select @d1, @d2;'
     qt_select5 'select @f1, @f2;'
+
+    sql """drop table if exists dwd_login_ttt;"""
+    sql """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");"""
+    sql """drop view if exists dwd_login_ttt_view;"""
+    sql """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;"""
+    sql """set @t_day='2024-02-01';"""
+    sql """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

Reply via email to