diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java b/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java index 8d4af3648b..7c506d7371 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/RollupJobV2.java @@ -525,7 +525,7 @@ public class RollupJobV2 extends AlterJobV2 implements GsonPostProcessable { if (task.getFailedTimes() > 0) { task.setFinished(true); AgentTaskQueue.removeTask(task.getBackendId(), TTaskType.ALTER, task.getSignature()); - LOG.warn("rollup task failed after try three times: " + task.getErrorMsg()); + LOG.warn("rollup task failed: " + task.getErrorMsg()); if (!failedAgentTasks.containsKey(task.getTabletId())) { failedAgentTasks.put(task.getTabletId(), Lists.newArrayList(task)); } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java index b5a208cade..60b19e7f36 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java +++ b/fe/fe-core/src/main/java/org/apache/doris/alter/SchemaChangeJobV2.java @@ -518,10 +518,10 @@ public class SchemaChangeJobV2 extends AlterJobV2 { LOG.info("schema change tasks not finished. job: {}", jobId); List tasks = schemaChangeBatchTask.getUnfinishedTasks(2000); for (AgentTask task : tasks) { - if (task.getFailedTimes() >= 3) { + if (task.getFailedTimes() > 0) { task.setFinished(true); AgentTaskQueue.removeTask(task.getBackendId(), TTaskType.ALTER, task.getSignature()); - LOG.warn("schema change task failed after try three times: " + task.getErrorMsg()); + LOG.warn("schema change task failed: " + task.getErrorMsg()); if (!failedAgentTasks.containsKey(task.getTabletId())) { failedAgentTasks.put(task.getTabletId(), Lists.newArrayList(task)); } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java index 6de69386b0..5c3c117a71 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/CreateMaterializedViewStmt.java @@ -32,9 +32,11 @@ import org.apache.doris.common.DdlException; import org.apache.doris.common.FeConstants; import org.apache.doris.common.FeNameFormat; import org.apache.doris.common.UserException; +import org.apache.doris.rewrite.ExprRewriter; import org.apache.doris.rewrite.mvrewrite.CountFieldToSum; import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.apache.logging.log4j.LogManager; @@ -79,6 +81,9 @@ public class CreateMaterializedViewStmt extends DdlStmt { FN_NAME_TO_PATTERN.put(FunctionSet.HLL_UNION, new MVColumnHLLUnionPattern()); } + public static final ImmutableSet invalidFn = ImmutableSet.of("now", "current_time", "current_date", + "utc_timestamp", "uuid", "random", "unix_timestamp", "curdate"); + private String mvName; private SelectStmt selectStmt; private Map properties; @@ -158,14 +163,50 @@ public class CreateMaterializedViewStmt extends DdlStmt { return selectStmt.getWhereClause(); } + private void checkExprValidInMv(Expr expr, String functionName) throws AnalysisException { + if (!isReplay && expr.haveFunction(functionName)) { + throw new AnalysisException("The materialized view contain " + functionName + " is disallowed"); + } + } + + private void checkExprValidInMv(Expr expr) throws AnalysisException { + if (isReplay) { + return; + } + for (String function : invalidFn) { + checkExprValidInMv(expr, function); + } + } + + private void checkExprValidInMv() throws AnalysisException { + if (selectStmt.getWhereClause() != null) { + checkExprValidInMv(selectStmt.getWhereClause()); + } + SelectList selectList = selectStmt.getSelectList(); + for (SelectListItem selectListItem : selectList.getItems()) { + checkExprValidInMv(selectListItem.getExpr()); + } + } + @Override public void analyze(Analyzer analyzer) throws UserException { super.analyze(analyzer); + + checkExprValidInMv(); + FeNameFormat.checkTableName(mvName); rewriteToBitmapWithCheck(); // TODO(ml): The mv name in from clause should pass the analyze without error. selectStmt.forbiddenMVRewrite(); selectStmt.analyze(analyzer); + + ExprRewriter rewriter = analyzer.getExprRewriter(); + rewriter.reset(); + selectStmt.rewriteExprs(rewriter); + selectStmt.reset(); + analyzer = new Analyzer(analyzer.getEnv(), analyzer.getContext()); + selectStmt.analyze(analyzer); + if (selectStmt.getAggInfo() != null) { mvKeysType = KeysType.AGG_KEYS; } @@ -227,10 +268,6 @@ public class CreateMaterializedViewStmt extends DdlStmt { + selectListItemExpr.toSql()); } - if (!isReplay && selectListItemExpr.haveFunction("curdate")) { - throw new AnalysisException( - "The materialized view contain curdate is disallowed"); - } if (selectListItemExpr instanceof FunctionCallExpr && ((FunctionCallExpr) selectListItemExpr).isAggregateFunction()) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java index f7ace7ce4e..a45954a9b9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java @@ -51,7 +51,7 @@ public enum ExpressionFunctions { private static final Logger LOG = LogManager.getLogger(ExpressionFunctions.class); private ImmutableMultimap functions; - private static final Set unfixedFn = ImmutableSet.of( + public static final Set unfixedFn = ImmutableSet.of( "now", "current_time", "current_date", diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java index 45453f760d..52ba749cf6 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/AbstractSelectMaterializedIndexRule.java @@ -570,14 +570,6 @@ public abstract class AbstractSelectMaterializedIndexRule { return visit(aggregateFunction, context); } - @Override - public Expression visitAlias(Alias alias, Void context) { - if (mvNameToMvSlot.containsKey(alias.toSlot().toSql())) { - return mvNameToMvSlot.get(alias.toSlot().toSql()); - } - return visit(alias, context); - } - @Override public Expression visitScalarFunction(ScalarFunction scalarFunction, Void context) { List newChildrenWithoutCast = scalarFunction.children().stream() diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java index 108614e496..12fe7b75c9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/mv/SelectMaterializedIndexWithAggregate.java @@ -124,7 +124,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial .replace(agg.withChildren(mvPlan), mvPlan); } else { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -168,12 +168,12 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren(filter.withChildren(mvPlan)), mvPlan)); } else { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -226,7 +226,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial generateNewOutputsWithMvOutputs(mvPlan, newProjectList), scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId)); return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -271,7 +271,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren( project.withProjectsAndChild( @@ -285,7 +285,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial filter.withChildren(mvPlan)); return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -328,7 +328,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren( filter.withChildren( @@ -342,7 +342,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial generateNewOutputsWithMvOutputs(mvPlan, newProjectList), mvPlan); return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -374,7 +374,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren( repeat.withAggOutputAndChild( @@ -382,7 +382,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial ), mvPlan)); } else { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -428,7 +428,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren( repeat.withAggOutputAndChild( @@ -437,7 +437,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial )), mvPlan)); } else { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -480,7 +480,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren( repeat.withAggOutputAndChild( @@ -496,7 +496,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial generateNewOutputsWithMvOutputs(mvPlan, newProjectList), mvPlan); return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -545,7 +545,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren( repeat.withAggOutputAndChild( @@ -564,7 +564,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial filter.withChildren(mvPlan)); return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), @@ -611,7 +611,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial if (result.exprRewriteMap.isEmpty()) { return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( agg.withChildren( repeat.withAggOutputAndChild( @@ -630,7 +630,7 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial scan.withMaterializedIndexSelected(result.preAggStatus, result.indexId)); return new LogicalProject<>( - generateProjectsAlias(agg.getOutput(), slotContext), + generateProjectsAlias(agg.getOutputs(), slotContext), new ReplaceExpressions(slotContext).replace( new LogicalAggregate<>( agg.getGroupByExpressions(), diff --git a/fe/fe-core/src/main/java/org/apache/doris/task/AgentBatchTask.java b/fe/fe-core/src/main/java/org/apache/doris/task/AgentBatchTask.java index 3c12160610..aa654fcd21 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/task/AgentBatchTask.java +++ b/fe/fe-core/src/main/java/org/apache/doris/task/AgentBatchTask.java @@ -165,7 +165,12 @@ public class AgentBatchTask implements Runnable { client = ClientPool.backendPool.borrowObject(address); List agentTaskRequests = new LinkedList(); for (AgentTask task : tasks) { - agentTaskRequests.add(toAgentTaskRequest(task)); + try { + agentTaskRequests.add(toAgentTaskRequest(task)); + } catch (Exception e) { + task.failed(); + throw e; + } } client.submitTasks(agentTaskRequests); if (LOG.isDebugEnabled()) { diff --git a/regression-test/data/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.out b/regression-test/data/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.out new file mode 100644 index 0000000000..00e05ab400 --- /dev/null +++ b/regression-test/data/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.out @@ -0,0 +1,24 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !select_star -- +1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2023-06-09 shipmode name address city nation AMERICA phone mktsegment name address city nation AMERICA phone name MFGR#1 category brand color type 4 container +2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2023-06-09 shipmode name address city nation region phone mktsegment name address city nation region phone name mfgr category brand color type 4 container +19920101 1 1 1 1 1 1 1 1 1 1 100 1 1 1 2023-06-09 ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA ASIA MFGR#12 MFGR#12 brand color type 4 container +19930101 1 1 1 1 1 1 1 1 1 1 100 1 1 1 2023-06-09 shipmode name address city nation AMERICA phone mktsegment name address city nation AMERICA phone name MFGR#1 category brand color type 4 container +19930101 1 1 1 1 1 1 1 1 1 1 100 1 1 1 2023-06-09 shipmode name address city nation AMERICA phone mktsegment name address city nation AMERICA phone name MFGR#12 MFGR#12 brand color type 4 container +19930101 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2023-06-09 shipmode name address city nation region phone mktsegment name address city nation region phone name mfgr category brand color type 4 container +19930101 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2023-06-09 shipmode name address city nation region phone mktsegment name address city nation region phone name mfgr category brand color type 4 container +19930101 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2023-06-09 shipmode name address city nation region phone mktsegment name address city nation region phone name mfgr category brand color type 4 container + +-- !select_q_1_1 -- +12 + +-- !select_q_2_1 -- +1 1993 brand + +-- !select_q_3_1 -- +ASIA ASIA 1992 1 + +-- !select_q_4_1 -- +0 nation 0 +1993 nation 0 + diff --git a/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy b/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy new file mode 100644 index 0000000000..3e787d9aee --- /dev/null +++ b/regression-test/suites/mv_p0/ssb/multiple_ssb_between/multiple_ssb_between.groovy @@ -0,0 +1,244 @@ +// 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. + +import org.codehaus.groovy.runtime.IOGroovyMethods + +suite ("multiple_ssb_between") { + sql """ DROP TABLE IF EXISTS lineorder_flat; """ + sql """set enable_nereids_planner=true""" + sql """SET enable_fallback_to_original_planner=false""" + + sql """ + CREATE TABLE IF NOT EXISTS `lineorder_flat` ( + `LO_ORDERDATE` int(11) NOT NULL COMMENT "", + `LO_ORDERKEY` int(11) NOT NULL COMMENT "", + `LO_LINENUMBER` tinyint(4) NOT NULL COMMENT "", + `LO_CUSTKEY` int(11) NOT NULL COMMENT "", + `LO_PARTKEY` int(11) NOT NULL COMMENT "", + `LO_SUPPKEY` int(11) NOT NULL COMMENT "", + `LO_ORDERPRIORITY` varchar(100) NOT NULL COMMENT "", + `LO_SHIPPRIORITY` tinyint(4) NOT NULL COMMENT "", + `LO_QUANTITY` tinyint(4) NOT NULL COMMENT "", + `LO_EXTENDEDPRICE` int(11) NOT NULL COMMENT "", + `LO_ORDTOTALPRICE` int(11) NOT NULL COMMENT "", + `LO_DISCOUNT` tinyint(4) NOT NULL COMMENT "", + `LO_REVENUE` int(11) NOT NULL COMMENT "", + `LO_SUPPLYCOST` int(11) NOT NULL COMMENT "", + `LO_TAX` tinyint(4) NOT NULL COMMENT "", + `LO_COMMITDATE` date NOT NULL COMMENT "", + `LO_SHIPMODE` varchar(100) NOT NULL COMMENT "", + `C_NAME` varchar(100) NOT NULL COMMENT "", + `C_ADDRESS` varchar(100) NOT NULL COMMENT "", + `C_CITY` varchar(100) NOT NULL COMMENT "", + `C_NATION` varchar(100) NOT NULL COMMENT "", + `C_REGION` varchar(100) NOT NULL COMMENT "", + `C_PHONE` varchar(100) NOT NULL COMMENT "", + `C_MKTSEGMENT` varchar(100) NOT NULL COMMENT "", + `S_NAME` varchar(100) NOT NULL COMMENT "", + `S_ADDRESS` varchar(100) NOT NULL COMMENT "", + `S_CITY` varchar(100) NOT NULL COMMENT "", + `S_NATION` varchar(100) NOT NULL COMMENT "", + `S_REGION` varchar(100) NOT NULL COMMENT "", + `S_PHONE` varchar(100) NOT NULL COMMENT "", + `P_NAME` varchar(100) NOT NULL COMMENT "", + `P_MFGR` varchar(100) NOT NULL COMMENT "", + `P_CATEGORY` varchar(100) NOT NULL COMMENT "", + `P_BRAND` varchar(100) NOT NULL COMMENT "", + `P_COLOR` varchar(100) NOT NULL COMMENT "", + `P_TYPE` varchar(100) NOT NULL COMMENT "", + `P_SIZE` tinyint(4) NOT NULL COMMENT "", + `P_CONTAINER` varchar(100) NOT NULL COMMENT "" + ) ENGINE=OLAP + DUPLICATE KEY(`LO_ORDERDATE`, `LO_ORDERKEY`) + COMMENT "OLAP" + PARTITION BY RANGE(`LO_ORDERDATE`) + (PARTITION p1992 VALUES [("-2147483648"), ("19930101")), + PARTITION p1993 VALUES [("19930101"), ("19940101")), + PARTITION p1994 VALUES [("19940101"), ("19950101")), + PARTITION p1995 VALUES [("19950101"), ("19960101")), + PARTITION p1996 VALUES [("19960101"), ("19970101")), + PARTITION p1997 VALUES [("19970101"), ("19980101")), + PARTITION p1998 VALUES [("19980101"), ("19990101"))) + DISTRIBUTED BY HASH(`LO_ORDERKEY`) BUCKETS 48 + PROPERTIES ( + "replication_num" = "1", + "colocate_with" = "groupxx1", + "in_memory" = "false", + "storage_format" = "DEFAULT" + ); + """ + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE, C_NAME, C_ADDRESS, C_CITY, C_NATION, C_REGION, C_PHONE, C_MKTSEGMENT, S_NAME, S_ADDRESS, S_CITY, S_NATION, S_REGION, S_PHONE, P_NAME, P_MFGR, P_CATEGORY, P_BRAND, P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (19930101 , 1 , 1 , 1 , 1 , 1 , '1' , 1 , 1 , 1 , 1 , 100 , 1 , 1 , 1 , '2023-06-09' , 'shipmode' , 'name' , 'address' , 'city' , 'nation' , 'AMERICA' , 'phone' , 'mktsegment' , 'name' , 'address' , 'city' , 'nation' , 'AMERICA' ,'phone', 'name', 'MFGR#1', 'category', 'brand', 'color', 'type', 4 ,'container');""" + + test { + sql """create materialized view lineorder_q_1_1 as + SELECT LO_ORDERKEY, SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) + FROM lineorder_flat GROUP BY + LO_ORDERKEY, LO_ORDERDATE, LO_DISCOUNT, LO_QUANTITY;""" + exception "not in select list" + } + + createMV ("""create materialized view lineorder_q_1_1 as + SELECT LO_ORDERKEY, SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue + FROM lineorder_flat + WHERE + LO_ORDERDATE >= 19930101 + AND LO_ORDERDATE <= 19931231 + AND LO_DISCOUNT BETWEEN 1 AND 3 + AND LO_QUANTITY < 25 + GROUP BY + LO_ORDERKEY;""") + + createMV ("""create materialized view lineorder_q_2_1 as + SELECT + (LO_ORDERDATE DIV 10000) AS YEAR, + P_BRAND, + SUM(LO_REVENUE) + FROM lineorder_flat + WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' + GROUP BY YEAR, P_BRAND + ORDER BY YEAR, P_BRAND;""") + + createMV ("""create materialized view lineorder_q_3_1 as + SELECT + C_NATION, + S_NATION, (LO_ORDERDATE DIV 10000) AS YEAR, + SUM(LO_REVENUE) AS revenue + FROM lineorder_flat + WHERE + C_REGION = 'ASIA' + AND S_REGION = 'ASIA' + AND LO_ORDERDATE >= 19920101 + AND LO_ORDERDATE <= 19971231 + GROUP BY C_NATION, S_NATION, YEAR;""") + + createMV ("""create materialized view lineorder_q_4_1 as + SELECT (LO_ORDERDATE DIV 10000) AS YEAR, + C_NATION, + SUM(LO_REVENUE - LO_SUPPLYCOST) AS profit + FROM lineorder_flat + WHERE + C_REGION = 'AMERICA' + AND S_REGION = 'AMERICA' + AND P_MFGR IN ('MFGR#1', 'MFGR#2') + GROUP BY YEAR, C_NATION + ORDER BY YEAR ASC, C_NATION ASC;""") + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE,C_NAME,C_ADDRESS,C_CITY,C_NATION,C_REGION,C_PHONE,C_MKTSEGMENT,S_NAME,S_ADDRESS,S_CITY,S_NATION,S_REGION,S_PHONE,P_NAME,P_MFGR,P_CATEGORY,P_BRAND,P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (19930101 , 2 , 2 , 2 , 2 , 2 ,'2',2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,'2023-06-09','shipmode','name','address','city','nation','region','phone','mktsegment','name','address','city','nation','region','phone','name','mfgr','category','brand','color','type',4,'container');""" + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE, C_NAME, C_ADDRESS, C_CITY, C_NATION, C_REGION, C_PHONE, C_MKTSEGMENT, S_NAME, S_ADDRESS, S_CITY, S_NATION, S_REGION, S_PHONE, P_NAME, P_MFGR, P_CATEGORY, P_BRAND, P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (19930101 , 1 , 1 , 1 , 1 , 1 , '1' , 1 , 1 , 1 , 1 , 100 , 1 , 1 , 1 , '2023-06-09' , 'shipmode' , 'name' , 'address' , 'city' , 'nation' , 'AMERICA' , 'phone' , 'mktsegment' , 'name' , 'address' , 'city' , 'nation' , 'AMERICA' ,'phone', 'name', 'MFGR#12', 'MFGR#12', 'brand', 'color', 'type', 4 ,'container');""" + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE,C_NAME,C_ADDRESS,C_CITY,C_NATION,C_REGION,C_PHONE,C_MKTSEGMENT,S_NAME,S_ADDRESS,S_CITY,S_NATION,S_REGION,S_PHONE,P_NAME,P_MFGR,P_CATEGORY,P_BRAND,P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (19930101 , 2 , 2 , 2 , 2 , 2 ,'2',2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,'2023-06-09','shipmode','name','address','city','nation','region','phone','mktsegment','name','address','city','nation','region','phone','name','mfgr','category','brand','color','type',4,'container');""" + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE, C_NAME, C_ADDRESS, C_CITY, C_NATION, C_REGION, C_PHONE, C_MKTSEGMENT, S_NAME, S_ADDRESS, S_CITY, S_NATION, S_REGION, S_PHONE, P_NAME, P_MFGR, P_CATEGORY, P_BRAND, P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (19920101 , 1 , 1 , 1 , 1 , 1 , '1' , 1 , 1 , 1 , 1 , 100 , 1 , 1 , 1 , '2023-06-09' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' , 'ASIA' ,'ASIA', 'ASIA', 'MFGR#12', 'MFGR#12', 'brand', 'color', 'type', 4 ,'container');""" + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE,C_NAME,C_ADDRESS,C_CITY,C_NATION,C_REGION,C_PHONE,C_MKTSEGMENT,S_NAME,S_ADDRESS,S_CITY,S_NATION,S_REGION,S_PHONE,P_NAME,P_MFGR,P_CATEGORY,P_BRAND,P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (19930101 , 2 , 2 , 2 , 2 , 2 ,'2',2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,'2023-06-09','shipmode','name','address','city','nation','region','phone','mktsegment','name','address','city','nation','region','phone','name','mfgr','category','brand','color','type',4,'container');""" + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE,C_NAME,C_ADDRESS,C_CITY,C_NATION,C_REGION,C_PHONE,C_MKTSEGMENT,S_NAME,S_ADDRESS,S_CITY,S_NATION,S_REGION,S_PHONE,P_NAME,P_MFGR,P_CATEGORY,P_BRAND,P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (2 , 2 , 2 , 2 , 2 , 2 ,'2',2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,'2023-06-09','shipmode','name','address','city','nation','region','phone','mktsegment','name','address','city','nation','region','phone','name','mfgr','category','brand','color','type',4,'container');""" + + sql """INSERT INTO lineorder_flat (LO_ORDERDATE, LO_ORDERKEY, LO_LINENUMBER, LO_CUSTKEY, LO_PARTKEY, LO_SUPPKEY, LO_ORDERPRIORITY, LO_SHIPPRIORITY, LO_QUANTITY, LO_EXTENDEDPRICE, LO_ORDTOTALPRICE, LO_DISCOUNT, LO_REVENUE, LO_SUPPLYCOST, LO_TAX, LO_COMMITDATE, LO_SHIPMODE, C_NAME, C_ADDRESS, C_CITY, C_NATION, C_REGION, C_PHONE, C_MKTSEGMENT, S_NAME, S_ADDRESS, S_CITY, S_NATION, S_REGION, S_PHONE, P_NAME, P_MFGR, P_CATEGORY, P_BRAND, P_COLOR,P_TYPE,P_SIZE,P_CONTAINER) VALUES (1 , 1 , 1 , 1 , 1 , 1 , '1' , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , '2023-06-09' , 'shipmode' , 'name' , 'address' , 'city' , 'nation' , 'AMERICA' , 'phone' , 'mktsegment' , 'name' , 'address' , 'city' , 'nation' , 'AMERICA' ,'phone', 'name', 'MFGR#1', 'category', 'brand', 'color', 'type', 4 ,'container');""" + + qt_select_star "select * from lineorder_flat order by 1,2;" + + explain { + sql("""SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue + FROM lineorder_flat + WHERE + LO_ORDERDATE >= 19930101 + AND LO_ORDERDATE <= 19931231 + AND LO_DISCOUNT BETWEEN 1 AND 3 + AND LO_QUANTITY < 25;""") + contains "(lineorder_q_1_1)" + } + qt_select_q_1_1 """SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue + FROM lineorder_flat + WHERE + LO_ORDERDATE >= 19930101 + AND LO_ORDERDATE <= 19931231 + AND LO_DISCOUNT BETWEEN 1 AND 3 + AND LO_QUANTITY < 25;""" + + explain { + sql("""SELECT + SUM(LO_REVENUE), (LO_ORDERDATE DIV 10000) AS YEAR, + P_BRAND + FROM lineorder_flat + WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' + GROUP BY (LO_ORDERDATE DIV 10000), P_BRAND + ORDER BY YEAR, P_BRAND;""") + contains "(lineorder_q_2_1)" + } + qt_select_q_2_1 """SELECT + SUM(LO_REVENUE), (LO_ORDERDATE DIV 10000) AS YEAR, + P_BRAND + FROM lineorder_flat + WHERE P_CATEGORY = 'MFGR#12' AND S_REGION = 'AMERICA' + GROUP BY YEAR, P_BRAND + ORDER BY YEAR, P_BRAND;""" + + explain { + sql("""SELECT + C_NATION, + S_NATION, (LO_ORDERDATE DIV 10000) AS YEAR, + SUM(LO_REVENUE) AS revenue + FROM lineorder_flat + WHERE + C_REGION = 'ASIA' + AND S_REGION = 'ASIA' + AND LO_ORDERDATE >= 19920101 + AND LO_ORDERDATE <= 19971231 + GROUP BY C_NATION, S_NATION, YEAR + ORDER BY YEAR ASC, revenue DESC;""") + contains "(lineorder_q_3_1)" + } + qt_select_q_3_1 """SELECT + C_NATION, + S_NATION, (LO_ORDERDATE DIV 10000) AS YEAR, + SUM(LO_REVENUE) AS revenue + FROM lineorder_flat + WHERE + C_REGION = 'ASIA' + AND S_REGION = 'ASIA' + AND LO_ORDERDATE >= 19920101 + AND LO_ORDERDATE <= 19971231 + GROUP BY C_NATION, S_NATION, YEAR + ORDER BY YEAR ASC, revenue DESC;""" + + explain { + sql("""SELECT (LO_ORDERDATE DIV 10000) AS YEAR, + C_NATION, + SUM(LO_REVENUE - LO_SUPPLYCOST) AS profit + FROM lineorder_flat + WHERE + C_REGION = 'AMERICA' + AND S_REGION = 'AMERICA' + AND P_MFGR IN ('MFGR#1', 'MFGR#2') + GROUP BY YEAR, C_NATION + ORDER BY YEAR ASC, C_NATION ASC;""") + contains "(lineorder_q_4_1)" + } + qt_select_q_4_1 """SELECT (LO_ORDERDATE DIV 10000) AS YEAR, + C_NATION, + SUM(LO_REVENUE - LO_SUPPLYCOST) AS profit + FROM lineorder_flat + WHERE + C_REGION = 'AMERICA' + AND S_REGION = 'AMERICA' + AND P_MFGR IN ('MFGR#1', 'MFGR#2') + GROUP BY YEAR, C_NATION + ORDER BY YEAR ASC, C_NATION ASC;""" +}