Yingyi Bu has uploaded a new change for review. https://asterix-gerrit.ics.uci.edu/1125
Change subject: ASTERIXDB-1581: fix subquery decorrelation. ...................................................................... ASTERIXDB-1581: fix subquery decorrelation. Change-Id: Ia2fa4b5b836eafee1975bd1164ae7c22199a4af0 --- M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java M asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java M asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1018.plan M asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.adm M asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml M hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java 22 files changed, 734 insertions(+), 132 deletions(-) git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/25/1125/1 diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java index b061066..3139d6e 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineAllNtsInSubplanVisitor.java @@ -25,8 +25,8 @@ import java.util.Iterator; import java.util.List; import java.util.Map; -import java.util.Map.Entry; import java.util.Set; +import java.util.Map.Entry; import org.apache.asterix.lang.common.util.FunctionUtil; import org.apache.asterix.om.base.AString; @@ -66,7 +66,6 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.MaterializeOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.PartitioningSplitOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ProjectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.ReplicateOperator; @@ -78,6 +77,7 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnionAllOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestMapOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.UnnestOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.LogicalOperatorDeepCopyWithNewVariablesVisitor; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities; import org.apache.hyracks.algebricks.core.algebra.plan.ALogicalPlanImpl; @@ -154,7 +154,7 @@ /** * @param context * the optimization context - * @param subplanInputOperator + * @param subplanOperator * the input operator to the target subplan operator, which is to * be inlined. * @throws AlgebricksException @@ -625,8 +625,6 @@ * * @param op * the logical operator for aggregate or running aggregate. - * @param keyVarsToEnforce - * the set of variables that needs to preserve. * @return the wrapped group-by operator if {@code keyVarsToEnforce} is not * empty, and {@code op} otherwise. * @throws AlgebricksException @@ -637,7 +635,8 @@ return op; } GroupByOperator gbyOp = new GroupByOperator(); - for (LogicalVariable keyVar : correlatedKeyVars) { + List<LogicalVariable> copyOfCorrelatedKeyVars = new ArrayList<>(correlatedKeyVars); + for (LogicalVariable keyVar : copyOfCorrelatedKeyVars) { // This limits the visitor can only be applied to a nested logical // plan inside a Subplan operator, // where the keyVarsToEnforce forms a candidate key which can diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java index 1881461..c6566cb 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/InlineSubplanInputForNestedTupleSourceRule.java @@ -48,9 +48,9 @@ import org.apache.hyracks.algebricks.core.algebra.operators.logical.LeftOuterJoinOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.NestedTupleSourceOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SelectOperator; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities; import org.apache.hyracks.algebricks.core.algebra.plan.ALogicalPlanImpl; import org.apache.hyracks.algebricks.core.algebra.util.OperatorManipulationUtil; @@ -275,10 +275,12 @@ private Pair<Boolean, Map<LogicalVariable, LogicalVariable>> rewriteSubplanOperator(Mutable<ILogicalOperator> opRef, IOptimizationContext context) throws AlgebricksException { AbstractLogicalOperator op = (AbstractLogicalOperator) opRef.getValue(); + Pair<Boolean, Map<LogicalVariable, LogicalVariable>> changedAndVarMap = traverseNonSubplanOperator(op, context); if (op.getOperatorTag() != LogicalOperatorTag.SUBPLAN) { // Traverses non-subplan operators. - return traverseNonSubplanOperator(op, context); + return changedAndVarMap; } + /** * Apply the special join-based rewriting. */ @@ -290,7 +292,11 @@ */ result = applyGeneralFlattening(opRef, context); } - return result; + Map<LogicalVariable, LogicalVariable> returnedMap = new HashMap<>(); + returnedMap.putAll(changedAndVarMap.second); + returnedMap.putAll(result.second); + return new Pair<Boolean, Map<LogicalVariable, LogicalVariable>>((result.first || changedAndVarMap.first), + returnedMap); } /*** @@ -356,8 +362,9 @@ return traverseNonSubplanOperator(subplanOp, context); } - Mutable<ILogicalOperator> rightInputOpRef = subplanOp.getNestedPlans().get(0).getRoots().get(0).getValue() - .getInputs().get(0); + Mutable<ILogicalOperator> lowestAggregateRefInSubplan = SubplanFlatteningUtil + .findLowestAggregate(subplanOp.getNestedPlans().get(0).getRoots().get(0)); + Mutable<ILogicalOperator> rightInputOpRef = lowestAggregateRefInSubplan.getValue().getInputs().get(0); ILogicalOperator rightInputOp = rightInputOpRef.getValue(); // Creates a variable to indicate whether a left input tuple is killed in the plan rooted at rightInputOp. @@ -413,15 +420,14 @@ // Sets up the nested plan for the groupby operator. Mutable<ILogicalOperator> aggOpRef = subplanOp.getNestedPlans().get(0).getRoots().get(0); - aggOpRef.getValue().getInputs().clear(); - - Mutable<ILogicalOperator> currentOpRef = aggOpRef; + lowestAggregateRefInSubplan.getValue().getInputs().clear(); // Clears the input of the lowest aggregate. + Mutable<ILogicalOperator> currentOpRef = lowestAggregateRefInSubplan; // Adds an optional order operator. List<Pair<IOrder, Mutable<ILogicalExpression>>> orderExprs = varMapAndOrderExprs.second; if (!orderExprs.isEmpty()) { OrderOperator orderOp = new OrderOperator(orderExprs); currentOpRef = new MutableObject<ILogicalOperator>(orderOp); - aggOpRef.getValue().getInputs().add(currentOpRef); + lowestAggregateRefInSubplan.getValue().getInputs().add(currentOpRef); } // Adds a select operator into the nested plan for group-by to remove tuples with NULL on {@code assignVar}, i.e., @@ -549,4 +555,5 @@ replacedVarMap.putAll(result.second); return new Pair<Boolean, Map<LogicalVariable, LogicalVariable>>(true, replacedVarMap); } + } diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java index 6d91923..4c51c53 100644 --- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java +++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/optimizer/rules/subplan/SubplanFlatteningUtil.java @@ -31,8 +31,8 @@ import org.apache.hyracks.algebricks.core.algebra.base.IOptimizationContext; import org.apache.hyracks.algebricks.core.algebra.base.LogicalOperatorTag; import org.apache.hyracks.algebricks.core.algebra.base.LogicalVariable; -import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.SubplanOperator; +import org.apache.hyracks.algebricks.core.algebra.operators.logical.OrderOperator.IOrder; import org.apache.hyracks.algebricks.core.algebra.operators.logical.visitors.VariableUtilities; import org.apache.hyracks.algebricks.core.algebra.util.OperatorManipulationUtil; @@ -62,7 +62,7 @@ InlineAllNtsInSubplanVisitor visitor = new InlineAllNtsInSubplanVisitor(context, subplanOp); // Rewrites the query plan. - ILogicalOperator topOp = subplanOp.getNestedPlans().get(0).getRoots().get(0).getValue(); + ILogicalOperator topOp = findLowestAggregate(subplanOp.getNestedPlans().get(0).getRoots().get(0)).getValue(); ILogicalOperator opToVisit = topOp.getInputs().get(0).getValue(); ILogicalOperator result = opToVisit.accept(visitor, null); topOp.getInputs().get(0).setValue(result); @@ -143,6 +143,44 @@ } /** + * Whether the query plan rooted {@code currentOp} contains a data source scan operator, + * with considering nested subplans. + * + * @param currentOp + * the current operator + * @return true if {@code currentOp} contains a data source scan operator; false otherwise. + */ + public static boolean containsOperatorsInternal(ILogicalOperator currentOp, + Set<LogicalOperatorTag> interestedOperatorTags) { + if (interestedOperatorTags.contains(currentOp.getOperatorTag())) { + return true; + } + if (currentOp.getOperatorTag() == LogicalOperatorTag.SUBPLAN) { + if (containsOperators((SubplanOperator) currentOp, interestedOperatorTags)) { + return true; + } + } + for (Mutable<ILogicalOperator> childRef : currentOp.getInputs()) { + if (containsOperatorsInternal(childRef.getValue(), interestedOperatorTags)) { + return true; + } + } + return false; + } + + public static Mutable<ILogicalOperator> findLowestAggregate(Mutable<ILogicalOperator> currentOpRef) { + ILogicalOperator currentOp = currentOpRef.getValue(); + if (currentOp.getInputs().size() != 1 || currentOp.getOperatorTag() == LogicalOperatorTag.DATASOURCESCAN) { + return null; + } + Mutable<ILogicalOperator> childReturn = findLowestAggregate(currentOp.getInputs().get(0)); + if (childReturn == null) { + return currentOp.getOperatorTag() == LogicalOperatorTag.AGGREGATE ? currentOpRef : null; + } + return childReturn; + } + + /** * Determine whether a subplan could be rewritten as a join-related special case. * The conditions include: * a. there is a join (let's call it J1.) in the nested plan, @@ -172,32 +210,6 @@ } } return new Pair<Boolean, ILogicalOperator>(true, visitor.getQualifiedNts()); - } - - /** - * Whether the query plan rooted {@code currentOp} contains a data source scan operator, - * with considering nested subplans. - * - * @param currentOp - * the current operator - * @return true if {@code currentOp} contains a data source scan operator; false otherwise. - */ - private static boolean containsOperatorsInternal(ILogicalOperator currentOp, - Set<LogicalOperatorTag> interestedOperatorTags) { - if (interestedOperatorTags.contains(currentOp.getOperatorTag())) { - return true; - } - if (currentOp.getOperatorTag() == LogicalOperatorTag.SUBPLAN) { - if (containsOperators((SubplanOperator) currentOp, interestedOperatorTags)) { - return true; - } - } - for (Mutable<ILogicalOperator> childRef : currentOp.getInputs()) { - if (containsOperatorsInternal(childRef.getValue(), interestedOperatorTags)) { - return true; - } - } - return false; } } diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1018.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1018.plan index 3eb81d9..2d37e1f 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1018.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1018.plan @@ -4,69 +4,70 @@ -- ASSIGN |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- HYBRID_HASH_JOIN [$$35][$$48] |PARTITIONED| + -- HYBRID_HASH_JOIN [$$35][$$50] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- DATASOURCE_SCAN |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- EMPTY_TUPLE_SOURCE |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$48] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$50] |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- PRE_CLUSTERED_GROUP_BY[$$52, $$24, $$53] |PARTITIONED| + -- PRE_CLUSTERED_GROUP_BY[$$43, $$49] |PARTITIONED| { -- AGGREGATE |LOCAL| -- STREAM_SELECT |LOCAL| -- NESTED_TUPLE_SOURCE |LOCAL| } -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$52(ASC), $$24(ASC), $$53(ASC)] |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$52, $$24, $$53] |PARTITIONED| + -- STABLE_SORT [$$43(ASC), $$49(ASC)] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$43, $$49] |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- NESTED_LOOP |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- PRE_CLUSTERED_GROUP_BY[$$36, $$47] |PARTITIONED| - { - -- AGGREGATE |LOCAL| - -- STREAM_SELECT |LOCAL| - -- NESTED_TUPLE_SOURCE |LOCAL| - } - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$36(ASC), $$47(ASC)] |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$36, $$47] |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- HYBRID_HASH_JOIN [$$45][$$39] |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$45] |PARTITIONED| - -- NESTED_LOOP |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| - -- BROADCAST_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$39] |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_CLUSTERED_GROUP_BY[$$36, $$48] |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- STREAM_SELECT |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$36(ASC), $$48(ASC)] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$36, $$48] |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- HYBRID_HASH_JOIN [$$46][$$39] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$46] |PARTITIONED| + -- NESTED_LOOP |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$39] |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| -- BROADCAST_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan index b910acf..ed40740 100644 --- a/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan +++ b/asterixdb/asterix-app/src/test/resources/optimizerts/results/udfs/query-ASTERIXDB-1019.plan @@ -12,69 +12,70 @@ -- ASSIGN |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- HYBRID_HASH_JOIN [$$39][$$52] |PARTITIONED| + -- HYBRID_HASH_JOIN [$$39][$$54] |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- DATASOURCE_SCAN |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- EMPTY_TUPLE_SOURCE |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$52] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$54] |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- PRE_CLUSTERED_GROUP_BY[$$57, $$24, $$56] |PARTITIONED| + -- PRE_CLUSTERED_GROUP_BY[$$47, $$53] |PARTITIONED| { -- AGGREGATE |LOCAL| -- STREAM_SELECT |LOCAL| -- NESTED_TUPLE_SOURCE |LOCAL| } -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$57(ASC), $$24(ASC), $$56(ASC)] |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$57, $$24, $$56] |PARTITIONED| + -- STABLE_SORT [$$47(ASC), $$53(ASC)] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$47, $$53] |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| -- NESTED_LOOP |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_SELECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- PRE_CLUSTERED_GROUP_BY[$$51, $$40] |PARTITIONED| - { - -- AGGREGATE |LOCAL| - -- STREAM_SELECT |LOCAL| - -- NESTED_TUPLE_SOURCE |LOCAL| - } - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STABLE_SORT [$$51(ASC), $$40(ASC)] |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$51, $$40] |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- HYBRID_HASH_JOIN [$$49][$$43] |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$49] |PARTITIONED| - -- NESTED_LOOP |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| - -- BROADCAST_EXCHANGE |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| - -- HASH_PARTITION_EXCHANGE [$$43] |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ASSIGN |PARTITIONED| - -- STREAM_PROJECT |PARTITIONED| - -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- DATASOURCE_SCAN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- STREAM_SELECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- PRE_CLUSTERED_GROUP_BY[$$40, $$52] |PARTITIONED| + { + -- AGGREGATE |LOCAL| + -- STREAM_SELECT |LOCAL| + -- NESTED_TUPLE_SOURCE |LOCAL| + } + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STABLE_SORT [$$40(ASC), $$52(ASC)] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$40, $$52] |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- HYBRID_HASH_JOIN [$$50][$$43] |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$50] |PARTITIONED| + -- NESTED_LOOP |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| -- ONE_TO_ONE_EXCHANGE |PARTITIONED| - -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- BROADCAST_EXCHANGE |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| + -- HASH_PARTITION_EXCHANGE [$$43] |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ASSIGN |PARTITIONED| + -- STREAM_PROJECT |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- DATASOURCE_SCAN |PARTITIONED| + -- ONE_TO_ONE_EXCHANGE |PARTITIONED| + -- EMPTY_TUPLE_SOURCE |PARTITIONED| -- BROADCAST_EXCHANGE |PARTITIONED| -- STREAM_PROJECT |PARTITIONED| -- ASSIGN |PARTITIONED| diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.ddl.sqlpp new file mode 100644 index 0000000..2e4844e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.ddl.sqlpp @@ -0,0 +1,82 @@ +/* + * 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. + */ + + +drop dataverse tpcds if exists; +create dataverse tpcds; + +use tpcds; + +create type tpcds.store_sales_type as closed { + ss_sold_date_sk: int64?, + ss_sold_time_sk: int64?, + ss_item_sk: int64, + ss_customer_sk: int64?, + ss_cdemo_sk: int64?, + ss_hdemo_sk: int64?, + ss_addr_sk: int64?, + ss_store_sk: int64?, + ss_promo_sk: int64?, + ss_ticket_number: int64, + ss_quantity: int64?, + ss_wholesale_cost: double?, + ss_list_price: double?, + ss_sales_price: double?, + ss_ext_discount_amt: double?, + ss_ext_sales_price: double?, + ss_ext_wholesale_cost: double?, + ss_ext_list_price: double?, + ss_ext_tax: double?, + ss_coupon_amt: double?, + ss_net_paid: double?, + ss_net_paid_inc_tax: double?, + ss_net_profit: double? +} + + +create type tpcds.item_type as closed { + i_item_sk: int64, + i_item_id: string, + i_rec_start_date: string?, + i_rec_end_date: string?, + i_item_desc: string?, + i_current_price: double?, + i_wholesale_cost: double?, + i_brand_id: int64? , + i_brand: string?, + i_class_id: int64? , + i_class: string?, + i_category_id: int64? , + i_category: string?, + i_manufact_id: int64? , + i_manufact: string?, + i_size: string?, + i_formulation: string?, + i_color: string?, + i_units: string?, + i_container: string?, + i_manager_id: int64?, + i_product_name: string? +} + +create dataset store_sales (store_sales_type) +primary key ss_item_sk, ss_ticket_number; + +create dataset item (item_type) +primary key i_item_sk; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.2.update.sqlpp new file mode 100644 index 0000000..bf0a6f7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.2.update.sqlpp @@ -0,0 +1,26 @@ +/* + * 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. + */ + +use tpcds; + +load dataset store_sales using localfs ((`path`=`asterix_nc1://data/tpcds/store_sales.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); + +load dataset item using localfs ((`path`=`asterix_nc1://data/tpcds/item.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.3.query.sqlpp new file mode 100644 index 0000000..329ac5e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.3.query.sqlpp @@ -0,0 +1,33 @@ +/* + * 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. + */ + +use tpcds; + +select case when (select value count(ss) + from store_sales ss + where ss_quantity >= 1 and ss_quantity <= 20)[0] < 25437 + then (select avg(ss_ext_discount_amt) + from store_sales + where ss_quantity >= 1 and ss_quantity <= 20) + else (select avg(ss_net_profit) + from store_sales + where ss_quantity >= 1 and ss_quantity <= 20) + end bucket1 +from item +where i_item_sk = 1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.1.ddl.sqlpp new file mode 100644 index 0000000..2e4844e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.1.ddl.sqlpp @@ -0,0 +1,82 @@ +/* + * 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. + */ + + +drop dataverse tpcds if exists; +create dataverse tpcds; + +use tpcds; + +create type tpcds.store_sales_type as closed { + ss_sold_date_sk: int64?, + ss_sold_time_sk: int64?, + ss_item_sk: int64, + ss_customer_sk: int64?, + ss_cdemo_sk: int64?, + ss_hdemo_sk: int64?, + ss_addr_sk: int64?, + ss_store_sk: int64?, + ss_promo_sk: int64?, + ss_ticket_number: int64, + ss_quantity: int64?, + ss_wholesale_cost: double?, + ss_list_price: double?, + ss_sales_price: double?, + ss_ext_discount_amt: double?, + ss_ext_sales_price: double?, + ss_ext_wholesale_cost: double?, + ss_ext_list_price: double?, + ss_ext_tax: double?, + ss_coupon_amt: double?, + ss_net_paid: double?, + ss_net_paid_inc_tax: double?, + ss_net_profit: double? +} + + +create type tpcds.item_type as closed { + i_item_sk: int64, + i_item_id: string, + i_rec_start_date: string?, + i_rec_end_date: string?, + i_item_desc: string?, + i_current_price: double?, + i_wholesale_cost: double?, + i_brand_id: int64? , + i_brand: string?, + i_class_id: int64? , + i_class: string?, + i_category_id: int64? , + i_category: string?, + i_manufact_id: int64? , + i_manufact: string?, + i_size: string?, + i_formulation: string?, + i_color: string?, + i_units: string?, + i_container: string?, + i_manager_id: int64?, + i_product_name: string? +} + +create dataset store_sales (store_sales_type) +primary key ss_item_sk, ss_ticket_number; + +create dataset item (item_type) +primary key i_item_sk; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.2.update.sqlpp new file mode 100644 index 0000000..bf0a6f7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.2.update.sqlpp @@ -0,0 +1,26 @@ +/* + * 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. + */ + +use tpcds; + +load dataset store_sales using localfs ((`path`=`asterix_nc1://data/tpcds/store_sales.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); + +load dataset item using localfs ((`path`=`asterix_nc1://data/tpcds/item.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.3.query.sqlpp new file mode 100644 index 0000000..5a745e3 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-3/query-ASTERIXDB-1581-3.3.query.sqlpp @@ -0,0 +1,31 @@ +/* + * 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. + */ + +use tpcds; + +select case when i_brand_id > 1 + then (select avg(ss_ext_discount_amt) + from store_sales + where ss_quantity >= 1 and ss_quantity <= 20) + else (select avg(ss_net_profit) + from store_sales + where ss_quantity >= 1 and ss_quantity <= 20) + end bucket1 +from item +where i_item_sk = 1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.ddl.sqlpp new file mode 100644 index 0000000..2e4844e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.ddl.sqlpp @@ -0,0 +1,82 @@ +/* + * 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. + */ + + +drop dataverse tpcds if exists; +create dataverse tpcds; + +use tpcds; + +create type tpcds.store_sales_type as closed { + ss_sold_date_sk: int64?, + ss_sold_time_sk: int64?, + ss_item_sk: int64, + ss_customer_sk: int64?, + ss_cdemo_sk: int64?, + ss_hdemo_sk: int64?, + ss_addr_sk: int64?, + ss_store_sk: int64?, + ss_promo_sk: int64?, + ss_ticket_number: int64, + ss_quantity: int64?, + ss_wholesale_cost: double?, + ss_list_price: double?, + ss_sales_price: double?, + ss_ext_discount_amt: double?, + ss_ext_sales_price: double?, + ss_ext_wholesale_cost: double?, + ss_ext_list_price: double?, + ss_ext_tax: double?, + ss_coupon_amt: double?, + ss_net_paid: double?, + ss_net_paid_inc_tax: double?, + ss_net_profit: double? +} + + +create type tpcds.item_type as closed { + i_item_sk: int64, + i_item_id: string, + i_rec_start_date: string?, + i_rec_end_date: string?, + i_item_desc: string?, + i_current_price: double?, + i_wholesale_cost: double?, + i_brand_id: int64? , + i_brand: string?, + i_class_id: int64? , + i_class: string?, + i_category_id: int64? , + i_category: string?, + i_manufact_id: int64? , + i_manufact: string?, + i_size: string?, + i_formulation: string?, + i_color: string?, + i_units: string?, + i_container: string?, + i_manager_id: int64?, + i_product_name: string? +} + +create dataset store_sales (store_sales_type) +primary key ss_item_sk, ss_ticket_number; + +create dataset item (item_type) +primary key i_item_sk; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.2.update.sqlpp new file mode 100644 index 0000000..bf0a6f7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.2.update.sqlpp @@ -0,0 +1,26 @@ +/* + * 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. + */ + +use tpcds; + +load dataset store_sales using localfs ((`path`=`asterix_nc1://data/tpcds/store_sales.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); + +load dataset item using localfs ((`path`=`asterix_nc1://data/tpcds/item.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.3.query.sqlpp new file mode 100644 index 0000000..03ba13e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.3.query.sqlpp @@ -0,0 +1,31 @@ +/* + * 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. + */ + +use tpcds; + +select case when (select value count(ss) + from store_sales ss + where ss_quantity >= 1 and ss_quantity <= 20)[0] > 25437 + then 1.0 + else (select value avg(ss_ext_discount_amt) + from store_sales + where ss_quantity >= 1 and ss_quantity <= 20)[0] + end bucket1 +from item +where i_item_sk = 1; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.ddl.sqlpp new file mode 100644 index 0000000..2e4844e --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.ddl.sqlpp @@ -0,0 +1,82 @@ +/* + * 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. + */ + + +drop dataverse tpcds if exists; +create dataverse tpcds; + +use tpcds; + +create type tpcds.store_sales_type as closed { + ss_sold_date_sk: int64?, + ss_sold_time_sk: int64?, + ss_item_sk: int64, + ss_customer_sk: int64?, + ss_cdemo_sk: int64?, + ss_hdemo_sk: int64?, + ss_addr_sk: int64?, + ss_store_sk: int64?, + ss_promo_sk: int64?, + ss_ticket_number: int64, + ss_quantity: int64?, + ss_wholesale_cost: double?, + ss_list_price: double?, + ss_sales_price: double?, + ss_ext_discount_amt: double?, + ss_ext_sales_price: double?, + ss_ext_wholesale_cost: double?, + ss_ext_list_price: double?, + ss_ext_tax: double?, + ss_coupon_amt: double?, + ss_net_paid: double?, + ss_net_paid_inc_tax: double?, + ss_net_profit: double? +} + + +create type tpcds.item_type as closed { + i_item_sk: int64, + i_item_id: string, + i_rec_start_date: string?, + i_rec_end_date: string?, + i_item_desc: string?, + i_current_price: double?, + i_wholesale_cost: double?, + i_brand_id: int64? , + i_brand: string?, + i_class_id: int64? , + i_class: string?, + i_category_id: int64? , + i_category: string?, + i_manufact_id: int64? , + i_manufact: string?, + i_size: string?, + i_formulation: string?, + i_color: string?, + i_units: string?, + i_container: string?, + i_manager_id: int64?, + i_product_name: string? +} + +create dataset store_sales (store_sales_type) +primary key ss_item_sk, ss_ticket_number; + +create dataset item (item_type) +primary key i_item_sk; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.2.update.sqlpp new file mode 100644 index 0000000..bf0a6f7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.2.update.sqlpp @@ -0,0 +1,26 @@ +/* + * 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. + */ + +use tpcds; + +load dataset store_sales using localfs ((`path`=`asterix_nc1://data/tpcds/store_sales.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); + +load dataset item using localfs ((`path`=`asterix_nc1://data/tpcds/item.csv`), +(`format`=`delimited-text`), (`delimiter`=`|`)); diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.3.query.sqlpp new file mode 100644 index 0000000..cb9a030 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.3.query.sqlpp @@ -0,0 +1,29 @@ +/* + * 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. + */ + +use tpcds; + +select case when (select value count(ss) + from store_sales ss + where ss_quantity >= 1 and ss_quantity <= 20)[0] > 25437 + then 1.0 + else 2.0 + end bucket1 +from item +where i_item_sk = 1; diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.adm new file mode 100644 index 0000000..c7a4707 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-2/query-ASTERIXDB-1581-2.1.adm @@ -0,0 +1 @@ +{ "bucket1": [ { "$1": 2.16 } ] } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.adm new file mode 100644 index 0000000..92de03a --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581-4/query-ASTERIXDB-1581-4.1.adm @@ -0,0 +1 @@ +{ "bucket1": 2.16 } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.adm new file mode 100644 index 0000000..faed854 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/tpcds/query-ASTERIXDB-1581/query-ASTERIXDB-1581.1.adm @@ -0,0 +1 @@ +{ "bucket1": 2.0 } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index b48a99c..9a7f346 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -5825,6 +5825,26 @@ </compilation-unit> </test-case> <test-case FilePath="tpcds"> + <compilation-unit name="query-ASTERIXDB-1581"> + <output-dir compare="Text">query-ASTERIXDB-1581</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="tpcds"> + <compilation-unit name="query-ASTERIXDB-1581-2"> + <output-dir compare="Text">query-ASTERIXDB-1581-2</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="tpcds"> + <compilation-unit name="query-ASTERIXDB-1581-3"> + <output-dir compare="Text">query-ASTERIXDB-1581-2</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="tpcds"> + <compilation-unit name="query-ASTERIXDB-1581-4"> + <output-dir compare="Text">query-ASTERIXDB-1581-4</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="tpcds"> <compilation-unit name="query-ASTERIXDB-1596"> <output-dir compare="Text">query-ASTERIXDB-1596</output-dir> </compilation-unit> diff --git a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java index d07544b..93c9b77 100644 --- a/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java +++ b/hyracks-fullstack/algebricks/algebricks-rewriter/src/main/java/org/apache/hyracks/algebricks/rewriter/rules/EnforceStructuralPropertiesRule.java @@ -68,10 +68,8 @@ import org.apache.hyracks.algebricks.core.algebra.prettyprint.PlanPrettyPrinter; import org.apache.hyracks.algebricks.core.algebra.properties.FunctionalDependency; import org.apache.hyracks.algebricks.core.algebra.properties.ILocalStructuralProperty; -import org.apache.hyracks.algebricks.core.algebra.properties.ILocalStructuralProperty.PropertyType; import org.apache.hyracks.algebricks.core.algebra.properties.INodeDomain; import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty; -import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty.PartitioningType; import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningRequirementsCoordinator; import org.apache.hyracks.algebricks.core.algebra.properties.IPhysicalPropertiesVector; import org.apache.hyracks.algebricks.core.algebra.properties.LocalGroupingProperty; @@ -83,6 +81,8 @@ import org.apache.hyracks.algebricks.core.algebra.properties.RandomPartitioningProperty; import org.apache.hyracks.algebricks.core.algebra.properties.StructuralPropertiesVector; import org.apache.hyracks.algebricks.core.algebra.properties.UnorderedPartitionedProperty; +import org.apache.hyracks.algebricks.core.algebra.properties.ILocalStructuralProperty.PropertyType; +import org.apache.hyracks.algebricks.core.algebra.properties.IPartitioningProperty.PartitioningType; import org.apache.hyracks.algebricks.core.algebra.util.OperatorPropertiesUtil; import org.apache.hyracks.algebricks.core.config.AlgebricksConfig; import org.apache.hyracks.algebricks.core.rewriter.base.IAlgebraicRewriteRule; @@ -428,15 +428,18 @@ IPhysicalPropertiesVector diffPropertiesVector, IPhysicalPropertiesVector required, IPhysicalPropertiesVector deliveredByChild, INodeDomain domain, boolean nestedPlan, IOptimizationContext context) throws AlgebricksException { - IPartitioningProperty pp = diffPropertiesVector.getPartitioningProperty(); if (pp == null || pp.getPartitioningType() == PartitioningType.UNPARTITIONED) { addLocalEnforcers(op, childIndex, diffPropertiesVector.getLocalProperties(), nestedPlan, context); IPhysicalPropertiesVector deliveredByNewChild = ((AbstractLogicalOperator) op.getInputs().get(0).getValue()).getDeliveredPhysicalProperties(); - addPartitioningEnforcers(op, childIndex, pp, required, deliveredByNewChild, domain, context); + if (!nestedPlan) { + addPartitioningEnforcers(op, childIndex, pp, required, deliveredByNewChild, domain, context); + } } else { - addPartitioningEnforcers(op, childIndex, pp, required, deliveredByChild, pp.getNodeDomain(), context); + if (!nestedPlan) { + addPartitioningEnforcers(op, childIndex, pp, required, deliveredByChild, pp.getNodeDomain(), context); + } AbstractLogicalOperator newChild = (AbstractLogicalOperator) op.getInputs().get(childIndex).getValue(); IPhysicalPropertiesVector newDiff = newPropertiesDiff(newChild, required, true, context); AlgebricksConfig.ALGEBRICKS_LOGGER.finest(">>>> New properties diff: " + newDiff + "\n"); -- To view, visit https://asterix-gerrit.ics.uci.edu/1125 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ia2fa4b5b836eafee1975bd1164ae7c22199a4af0 Gerrit-PatchSet: 1 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Yingyi Bu <buyin...@gmail.com>