diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java index 89d799a66e..3f57d161ff 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Analyzer.java @@ -396,6 +396,8 @@ public class Analyzer { private final Map markTupleIdByInnerRef = Maps.newHashMap(); + private final Set markTupleIdsNotProcessed = Sets.newHashSet(); + public GlobalState(Env env, ConnectContext context) { this.env = env; this.context = context; @@ -672,12 +674,18 @@ public class Analyzer { tableRefMap.put(result.getId(), ref); - // for mark join + // for mark join, init three context + // 1. markTuples to records all tuples belong to mark slot + // 2. markTupleIdByInnerRef to records relationship between inner table of mark join and the mark tuple + // 3. markTupleIdsNotProcessed to records un-process mark tuple id. if an expr contains slot belong to + // the un-process mark tuple, it should not assign to current join node and should pop up its + // mark slot until all mark tuples in this expr has been processed. if (ref.getJoinOp() != null && ref.isMark()) { TupleDescriptor markTuple = getDescTbl().createTupleDescriptor(); markTuple.setAliases(new String[]{ref.getMarkTupleName()}, true); globalState.markTuples.put(ref.getMarkTupleName(), markTuple); globalState.markTupleIdByInnerRef.put(ref, markTuple.getId()); + globalState.markTupleIdsNotProcessed.add(markTuple.getId()); } return result; @@ -1592,12 +1600,38 @@ public class Analyzer { return result; } + public boolean needPopUpMarkTuple(TableRef ref) { + TupleId id = globalState.markTupleIdByInnerRef.get(ref); + if (id == null) { + return false; + } + List exprs = getAllConjuncts(id); + for (Expr expr : exprs) { + List tupleIds = Lists.newArrayList(); + expr.getIds(tupleIds, null); + if (tupleIds.stream().anyMatch(globalState.markTupleIdsNotProcessed::contains)) { + return true; + } + } + return false; + } + public List getMarkConjuncts(TableRef ref) { TupleId id = globalState.markTupleIdByInnerRef.get(ref); if (id == null) { return Collections.emptyList(); } - return getAllConjuncts(id); + globalState.markTupleIdsNotProcessed.remove(id); + List retExprs = Lists.newArrayList(); + List exprs = getAllConjuncts(id); + for (Expr expr : exprs) { + List tupleIds = Lists.newArrayList(); + expr.getIds(tupleIds, null); + if (tupleIds.stream().noneMatch(globalState.markTupleIdsNotProcessed::contains)) { + retExprs.add(expr); + } + } + return retExprs; } public TupleDescriptor getMarkTuple(TableRef ref) { diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java index a93c21692c..fd8a0710f7 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/StmtRewriter.java @@ -365,10 +365,15 @@ public class StmtRewriter { List subqueryExprInConjunct, List subqueryExprInDisjunct) { if (!(expr instanceof CompoundPredicate)) { if (expr.contains(Subquery.class)) { + // remove redundant sub-query by compare two sub-query with equals if (inDisjunct) { - subqueryExprInDisjunct.add(expr); + if (!subqueryExprInDisjunct.contains(expr)) { + subqueryExprInDisjunct.add(expr); + } } else { - subqueryExprInConjunct.add(expr); + if (!subqueryExprInConjunct.contains(expr)) { + subqueryExprInConjunct.add(expr); + } } } } else { @@ -432,10 +437,12 @@ public class StmtRewriter { * ON $a$1.a = T1.a * WHERE T1.c < 10; */ - // TODO(mark join) need support mark join private static void rewriteWhereClauseSubqueries(SelectStmt stmt, Analyzer analyzer) throws AnalysisException { int numTableRefs = stmt.fromClause.size(); + // we must use two same set structs to process conjuncts and disjuncts + // because the same sub-query could appear in both at the same time. + // if we use one ExprSubstitutionMap, the sub-query will be replaced by wrong expr. ArrayList exprsWithSubqueriesInConjuncts = Lists.newArrayList(); ArrayList exprsWithSubqueriesInDisjuncts = Lists.newArrayList(); ExprSubstitutionMap conjunctsSmap = new ExprSubstitutionMap(); @@ -445,7 +452,6 @@ public class StmtRewriter { List subqueryInDisjunct = Lists.newArrayList(); // Check if all the conjuncts in the WHERE clause that contain subqueries // can currently be rewritten as a join. - // TODO(mark join) traverse expr tree to process subquery. extractExprWithSubquery(false, stmt.whereClause, subqueryInConjunct, subqueryInDisjunct); for (Expr conjunct : subqueryInConjunct) { processOneSubquery(stmt, exprsWithSubqueriesInConjuncts, @@ -458,8 +464,7 @@ public class StmtRewriter { stmt.whereClause = stmt.whereClause.substitute(conjunctsSmap, disjunctsSmap, analyzer, false); boolean hasNewVisibleTuple = false; - // Recursively equal all the exprs that contain subqueries and merge them - // with 'stmt'. + // Recursively equal all the exprs that contain subqueries and merge them with 'stmt'. for (Expr expr : exprsWithSubqueriesInConjuncts) { if (mergeExpr(stmt, rewriteExpr(expr, analyzer), analyzer, null)) { hasNewVisibleTuple = true; @@ -515,7 +520,6 @@ public class StmtRewriter { // Replace all the supported exprs with subqueries with true BoolLiterals // using a smap. if (isMark) { - // TODO(mark join) if need mark join, we should replace a SlotRef instead of BoolLiteral TupleDescriptor markTuple = analyzer.getDescTbl().createTupleDescriptor(); markTuple.setAliases(new String[]{stmt.getTableAliasGenerator().getNextAlias()}, true); SlotDescriptor markSlot = analyzer.addSlotDescriptor(markTuple); @@ -840,9 +844,6 @@ public class StmtRewriter { && ((ExistsPredicate) expr).isNotExists()) { // For the case of a NOT IN with an eq join conjunct, replace the join // conjunct with a conjunct that uses the null-matching eq operator. - // TODO: mark join only works on nested loop join now, and NLJ do NOT support NULL_AWARE_LEFT_ANTI_JOIN - // remove markTuple == null when nested loop join support NULL_AWARE_LEFT_ANTI_JOIN - // or plan mark join on hash join if (expr instanceof InPredicate && markTuple == null) { joinOp = VectorizedUtil.isVectorized() ? JoinOperator.NULL_AWARE_LEFT_ANTI_JOIN : JoinOperator.LEFT_ANTI_JOIN; diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java index bf43f552ea..e081540ec9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableRef.java @@ -94,8 +94,11 @@ public class TableRef implements ParseNode, Writable { // Indicates whether this table ref is given an explicit alias, protected boolean hasExplicitAlias; protected JoinOperator joinOp; + // for mark join protected boolean isMark; + // we must record mark tuple name for re-analyze protected String markTupleName; + protected List usingColNames; protected ArrayList lateralViewRefs; protected Expr onClause; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java index 8a5818c3e9..c69a2310c5 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/HashJoinNode.java @@ -758,7 +758,7 @@ public class HashJoinNode extends JoinNodeBase { StringBuilder output = new StringBuilder().append(detailPrefix).append("join op: ").append(joinOp.toString()).append("(") .append(distrModeStr).append(")").append("[").append(colocateReason).append("]\n"); - + output.append(detailPrefix).append("is mark: ").append(isMarkJoin()).append("\n"); if (detailLevel == TExplainLevel.BRIEF) { output.append(detailPrefix).append( String.format("cardinality=%,d", cardinality)).append("\n"); diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/JoinNodeBase.java b/fe/fe-core/src/main/java/org/apache/doris/planner/JoinNodeBase.java index 2abb56f467..cfa2865d2a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/JoinNodeBase.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/JoinNodeBase.java @@ -114,7 +114,6 @@ public abstract class JoinNodeBase extends PlanNode { } protected void computeOutputTuple(Analyzer analyzer) throws UserException { - // TODO(mark join) if it is mark join use mark tuple instead? // 1. create new tuple vOutputTupleDesc = analyzer.getDescTbl().createTupleDescriptor(); boolean copyLeft = false; @@ -208,6 +207,15 @@ public abstract class JoinNodeBase extends PlanNode { } } } + + // add mark slot if needed + if (isMarkJoin() && analyzer.needPopUpMarkTuple(innerRef)) { + SlotDescriptor markSlot = analyzer.getMarkTuple(innerRef).getSlots().get(0); + SlotDescriptor outputSlotDesc = + analyzer.getDescTbl().copySlotDescriptor(vOutputTupleDesc, markSlot); + srcTblRefToOutputTupleSmap.put(new SlotRef(markSlot), new SlotRef(outputSlotDesc)); + } + // 2. compute srcToOutputMap vSrcToOutputSMap = ExprSubstitutionMap.subtraction(outputSmap, srcTblRefToOutputTupleSmap, analyzer); for (int i = 0; i < vSrcToOutputSMap.size(); i++) { @@ -220,6 +228,7 @@ public abstract class JoinNodeBase extends PlanNode { rSlotRef.getDesc().setIsMaterialized(true); } } + vOutputTupleDesc.computeStatAndMemLayout(); // 3. add tupleisnull in null-side Preconditions.checkState(srcTblRefToOutputTupleSmap.getLhs().size() == vSrcToOutputSMap.getLhs().size()); @@ -313,7 +322,7 @@ public abstract class JoinNodeBase extends PlanNode { } @Override - public void projectOutputTuple() throws NotImplementedException { + public void projectOutputTuple() { if (vOutputTupleDesc == null) { return; } @@ -343,15 +352,19 @@ public abstract class JoinNodeBase extends PlanNode { protected abstract void computeOtherConjuncts(Analyzer analyzer, ExprSubstitutionMap originToIntermediateSmap); - protected void computeIntermediateTuple(Analyzer analyzer, TupleDescriptor markTuple) throws AnalysisException { + protected void computeIntermediateTuple(Analyzer analyzer) throws AnalysisException { // 1. create new tuple TupleDescriptor vIntermediateLeftTupleDesc = analyzer.getDescTbl().createTupleDescriptor(); TupleDescriptor vIntermediateRightTupleDesc = analyzer.getDescTbl().createTupleDescriptor(); vIntermediateTupleDescList = new ArrayList<>(); vIntermediateTupleDescList.add(vIntermediateLeftTupleDesc); vIntermediateTupleDescList.add(vIntermediateRightTupleDesc); - if (markTuple != null) { - vIntermediateTupleDescList.add(markTuple); + // if join type is MARK, add mark tuple to intermediate tuple. mark slot will be generated after join. + if (isMarkJoin()) { + TupleDescriptor markTuple = analyzer.getMarkTuple(innerRef); + if (markTuple != null) { + vIntermediateTupleDescList.add(markTuple); + } } boolean leftNullable = false; boolean rightNullable = false; @@ -454,11 +467,7 @@ public abstract class JoinNodeBase extends PlanNode { public void finalize(Analyzer analyzer) throws UserException { super.finalize(analyzer); if (VectorizedUtil.isVectorized()) { - TupleDescriptor markTuple = null; - if (innerRef != null) { - markTuple = analyzer.getMarkTuple(innerRef); - } - computeIntermediateTuple(analyzer, markTuple); + computeIntermediateTuple(analyzer); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java index c4c471c65f..d49c06ce94 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/NestedLoopJoinNode.java @@ -228,6 +228,7 @@ public class NestedLoopJoinNode extends JoinNodeBase { StringBuilder output = new StringBuilder().append(detailPrefix).append("join op: ").append(joinOp.toString()).append("(") .append(distrModeStr).append(")\n"); + output.append(detailPrefix).append("is mark: ").append(isMarkJoin()).append("\n"); if (detailLevel == TExplainLevel.BRIEF) { output.append(detailPrefix).append( diff --git a/regression-test/data/correctness/test_subquery_in_disjunction.out b/regression-test/data/correctness/test_subquery_in_disjunction.out index 5225575b3d..98dcd6e439 100644 --- a/regression-test/data/correctness/test_subquery_in_disjunction.out +++ b/regression-test/data/correctness/test_subquery_in_disjunction.out @@ -58,3 +58,11 @@ 10 20 30 100 200 300 +-- !same_subquery_in_conjuncts -- +1 2 3 +10 20 30 + +-- !two_subquery_in_one_conjuncts -- +1 2 3 +10 20 30 + diff --git a/regression-test/data/tpcds_sf1_p1/sql/q10.out b/regression-test/data/tpcds_sf1_p1/sql/q10.out new file mode 100644 index 0000000000..c406a1ffdb --- /dev/null +++ b/regression-test/data/tpcds_sf1_p1/sql/q10.out @@ -0,0 +1,8 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q10 -- +F D Advanced Degree 1 3000 1 High Risk 1 2 1 4 1 5 1 +F D Unknown 1 1500 1 Good 1 6 1 5 1 4 1 +M D College 1 8500 1 Low Risk 1 3 1 0 1 1 1 +M D Primary 1 7000 1 Unknown 1 2 1 1 1 1 1 +M W Unknown 1 4500 1 Good 1 5 1 0 1 1 1 + diff --git a/regression-test/data/tpcds_sf1_p1/sql/q35.out b/regression-test/data/tpcds_sf1_p1/sql/q35.out new file mode 100644 index 0000000000..c75651704c --- /dev/null +++ b/regression-test/data/tpcds_sf1_p1/sql/q35.out @@ -0,0 +1,103 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q35 -- + F D 0 1 0 0 0.0 1 1 1 1 1.0 2 1 2 2 2.0 + F D 0 1 0 0 0.0 3 1 3 3 3.0 0 1 0 0 0.0 + F D 0 1 0 0 0.0 5 1 5 5 5.0 0 1 0 0 0.0 + F D 0 1 0 0 0.0 6 1 6 6 6.0 0 1 0 0 0.0 + F D 1 1 1 1 1.0 1 1 1 1 1.0 1 1 1 1 1.0 + F D 1 1 1 1 1.0 5 1 5 5 5.0 3 1 3 3 3.0 + F D 3 1 3 3 3.0 0 1 0 0 0.0 5 1 5 5 5.0 + F D 3 1 3 3 3.0 1 1 1 1 1.0 3 1 3 3 3.0 + F D 3 1 3 3 3.0 5 1 5 5 5.0 4 1 4 4 4.0 + F D 4 1 4 4 4.0 2 1 2 2 2.0 5 1 5 5 5.0 + F D 4 1 4 4 4.0 4 1 4 4 4.0 4 1 4 4 4.0 + F D 6 1 6 6 6.0 0 1 0 0 0.0 6 1 6 6 6.0 + F D 6 1 6 6 6.0 5 1 5 5 5.0 4 1 4 4 4.0 + F M 0 1 0 0 0.0 0 1 0 0 0.0 3 1 3 3 3.0 + F M 0 1 0 0 0.0 3 1 3 3 3.0 6 1 6 6 6.0 + F M 1 2 1 1 1.0 1 2 1 1 1.0 0 2 0 0 0.0 + F M 1 1 1 1 1.0 2 1 2 2 2.0 4 1 4 4 4.0 + F M 1 1 1 1 1.0 3 1 3 3 3.0 3 1 3 3 3.0 + F M 1 1 1 1 1.0 4 1 4 4 4.0 2 1 2 2 2.0 + F M 1 1 1 1 1.0 6 1 6 6 6.0 2 1 2 2 2.0 + F M 2 1 2 2 2.0 1 1 1 1 1.0 0 1 0 0 0.0 + F M 2 1 2 2 2.0 5 1 5 5 5.0 4 1 4 4 4.0 + F M 3 1 3 3 3.0 0 1 0 0 0.0 4 1 4 4 4.0 + F M 4 1 4 4 4.0 2 1 2 2 2.0 1 1 1 1 1.0 + F M 4 1 4 4 4.0 4 1 4 4 4.0 1 1 1 1 1.0 + F M 5 1 5 5 5.0 1 1 1 1 1.0 2 1 2 2 2.0 + F M 5 1 5 5 5.0 3 1 3 3 3.0 3 1 3 3 3.0 + F M 6 1 6 6 6.0 2 1 2 2 2.0 2 1 2 2 2.0 + F M 6 1 6 6 6.0 2 1 2 2 2.0 3 1 3 3 3.0 + F M 6 1 6 6 6.0 3 1 3 3 3.0 4 1 4 4 4.0 + F M 6 1 6 6 6.0 5 1 5 5 5.0 1 1 1 1 1.0 + F S 0 1 0 0 0.0 0 1 0 0 0.0 3 1 3 3 3.0 + F S 0 1 0 0 0.0 2 1 2 2 2.0 3 1 3 3 3.0 + F S 0 1 0 0 0.0 3 1 3 3 3.0 6 1 6 6 6.0 + F S 0 1 0 0 0.0 4 1 4 4 4.0 5 1 5 5 5.0 + F S 1 1 1 1 1.0 0 1 0 0 0.0 3 1 3 3 3.0 + F S 1 1 1 1 1.0 3 1 3 3 3.0 4 1 4 4 4.0 + F S 1 1 1 1 1.0 4 1 4 4 4.0 0 1 0 0 0.0 + F S 1 1 1 1 1.0 4 1 4 4 4.0 4 1 4 4 4.0 + F S 1 1 1 1 1.0 5 1 5 5 5.0 0 1 0 0 0.0 + F S 2 1 2 2 2.0 0 1 0 0 0.0 3 1 3 3 3.0 + F S 2 1 2 2 2.0 1 1 1 1 1.0 6 1 6 6 6.0 + F S 2 1 2 2 2.0 2 1 2 2 2.0 2 1 2 2 2.0 + F S 2 1 2 2 2.0 4 1 4 4 4.0 6 1 6 6 6.0 + F S 2 1 2 2 2.0 6 1 6 6 6.0 1 1 1 1 1.0 + F S 2 1 2 2 2.0 6 1 6 6 6.0 5 1 5 5 5.0 + F S 3 1 3 3 3.0 1 1 1 1 1.0 0 1 0 0 0.0 + F S 3 1 3 3 3.0 1 1 1 1 1.0 2 1 2 2 2.0 + F S 3 1 3 3 3.0 3 1 3 3 3.0 0 1 0 0 0.0 + F S 3 1 3 3 3.0 4 1 4 4 4.0 6 1 6 6 6.0 + F S 3 1 3 3 3.0 6 1 6 6 6.0 6 1 6 6 6.0 + F S 4 1 4 4 4.0 0 1 0 0 0.0 2 1 2 2 2.0 + F S 5 1 5 5 5.0 4 1 4 4 4.0 2 1 2 2 2.0 + F S 5 1 5 5 5.0 6 1 6 6 6.0 6 1 6 6 6.0 + F S 6 1 6 6 6.0 0 1 0 0 0.0 0 1 0 0 0.0 + F S 6 1 6 6 6.0 0 1 0 0 0.0 2 1 2 2 2.0 + F S 6 1 6 6 6.0 4 1 4 4 4.0 5 1 5 5 5.0 + F U 0 1 0 0 0.0 4 1 4 4 4.0 1 1 1 1 1.0 + F U 0 1 0 0 0.0 5 1 5 5 5.0 1 1 1 1 1.0 + F U 0 1 0 0 0.0 6 1 6 6 6.0 6 1 6 6 6.0 + F U 1 1 1 1 1.0 5 1 5 5 5.0 2 1 2 2 2.0 + F U 2 1 2 2 2.0 4 1 4 4 4.0 4 1 4 4 4.0 + F U 3 1 3 3 3.0 1 1 1 1 1.0 6 1 6 6 6.0 + F U 3 1 3 3 3.0 3 1 3 3 3.0 6 1 6 6 6.0 + F U 3 1 3 3 3.0 4 1 4 4 4.0 3 1 3 3 3.0 + F U 3 1 3 3 3.0 5 1 5 5 5.0 1 1 1 1 1.0 + F U 3 1 3 3 3.0 6 1 6 6 6.0 0 1 0 0 0.0 + F U 3 1 3 3 3.0 6 1 6 6 6.0 3 1 3 3 3.0 + F U 6 1 6 6 6.0 1 1 1 1 1.0 3 1 3 3 3.0 + F U 6 1 6 6 6.0 2 1 2 2 2.0 1 1 1 1 1.0 + F U 6 1 6 6 6.0 5 1 5 5 5.0 6 1 6 6 6.0 + F W 0 1 0 0 0.0 2 1 2 2 2.0 4 1 4 4 4.0 + F W 0 1 0 0 0.0 6 1 6 6 6.0 2 1 2 2 2.0 + F W 2 1 2 2 2.0 5 1 5 5 5.0 1 1 1 1 1.0 + F W 4 1 4 4 4.0 0 1 0 0 0.0 4 1 4 4 4.0 + F W 4 1 4 4 4.0 1 1 1 1 1.0 1 1 1 1 1.0 + F W 4 1 4 4 4.0 2 1 2 2 2.0 6 1 6 6 6.0 + F W 4 1 4 4 4.0 4 1 4 4 4.0 3 1 3 3 3.0 + F W 5 1 5 5 5.0 6 1 6 6 6.0 1 1 1 1 1.0 + F W 6 1 6 6 6.0 2 1 2 2 2.0 6 1 6 6 6.0 + F W 6 1 6 6 6.0 3 1 3 3 3.0 4 1 4 4 4.0 + F W 6 1 6 6 6.0 4 1 4 4 4.0 0 1 0 0 0.0 + F W 6 1 6 6 6.0 5 1 5 5 5.0 6 1 6 6 6.0 + M D 1 1 1 1 1.0 5 1 5 5 5.0 6 1 6 6 6.0 + M D 2 1 2 2 2.0 3 1 3 3 3.0 3 1 3 3 3.0 + M D 2 1 2 2 2.0 6 1 6 6 6.0 1 1 1 1 1.0 + M D 2 1 2 2 2.0 6 1 6 6 6.0 6 1 6 6 6.0 + M D 3 1 3 3 3.0 5 1 5 5 5.0 4 1 4 4 4.0 + M D 3 1 3 3 3.0 6 1 6 6 6.0 6 1 6 6 6.0 + M D 4 1 4 4 4.0 5 1 5 5 5.0 5 1 5 5 5.0 + M D 6 1 6 6 6.0 1 1 1 1 1.0 1 1 1 1 1.0 + M D 6 1 6 6 6.0 2 1 2 2 2.0 5 1 5 5 5.0 + M D 6 1 6 6 6.0 4 1 4 4 4.0 3 1 3 3 3.0 + M D 6 1 6 6 6.0 4 1 4 4 4.0 4 1 4 4 4.0 + M M 0 1 0 0 0.0 0 1 0 0 0.0 2 1 2 2 2.0 + M M 0 1 0 0 0.0 1 1 1 1 1.0 6 1 6 6 6.0 + M M 0 1 0 0 0.0 2 1 2 2 2.0 0 1 0 0 0.0 + M M 0 1 0 0 0.0 6 1 6 6 6.0 1 1 1 1 1.0 + M M 0 1 0 0 0.0 6 1 6 6 6.0 2 1 2 2 2.0 + M M 1 1 1 1 1.0 1 1 1 1 1.0 6 1 6 6 6.0 + diff --git a/regression-test/data/tpcds_sf1_p1/sql/q45.out b/regression-test/data/tpcds_sf1_p1/sql/q45.out new file mode 100644 index 0000000000..4ea716b0b3 --- /dev/null +++ b/regression-test/data/tpcds_sf1_p1/sql/q45.out @@ -0,0 +1,22 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !q45 -- +10150 Bunker Hill 20.250000000 +16098 Five Points 18.050000000 +28048 Salem 9.810000000 +29584 Oakdale 41.210000000 +31289 Lincoln 1.260000000 +34975 Kingston 56.670000000 +36971 Wilson 202.630000000 +38354 Sulphur Springs 25.680000000 +44975 Kingston 12.620000000 +62808 Hamilton 85.390000000 +62812 Shady Grove 48.770000000 +66557 Arlington 2.680000000 +68252 Maple Grove 11.370000000 +69583 Jackson 54.420000000 +73003 Hillcrest 36.030000000 +78222 Clinton 85.870000000 +83683 Plainview 43.820000000 +84536 Friendship 64.440000000 +88370 Oak Grove 52.420000000 + diff --git a/regression-test/suites/correctness/test_subquery_in_disjunction.groovy b/regression-test/suites/correctness/test_subquery_in_disjunction.groovy index 5b7fd84abf..42c5cc5ed8 100644 --- a/regression-test/suites/correctness/test_subquery_in_disjunction.groovy +++ b/regression-test/suites/correctness/test_subquery_in_disjunction.groovy @@ -112,4 +112,12 @@ suite("test_subquery_in_disjunction") { qt_hash_join_with_other_conjuncts8 """ SELECT * FROM test_sq_dj1 WHERE c1 NOT IN (SELECT c1 FROM test_sq_dj2 WHERE test_sq_dj1.c1 < test_sq_dj2.c2) OR c1 < 11 ORDER BY c1; """ + + qt_same_subquery_in_conjuncts """ + SELECT * FROM test_sq_dj1 WHERE c1 IN (SELECT c1 FROM test_sq_dj2) OR c1 IN (SELECT c1 FROM test_sq_dj2) OR c1 < 10 ORDER BY c1; + """ + + qt_two_subquery_in_one_conjuncts """ + SELECT * FROM test_sq_dj1 WHERE c1 IN (SELECT c1 FROM test_sq_dj2) OR c1 IN (SELECT c2 FROM test_sq_dj2) OR c1 < 10 ORDER BY c1; + """ } diff --git a/regression-test/suites/tpcds_sf1_p1/sql/q10.sql b/regression-test/suites/tpcds_sf1_p1/sql/q10.sql index f858219be1..c80ab6c0cd 100644 --- a/regression-test/suites/tpcds_sf1_p1/sql/q10.sql +++ b/regression-test/suites/tpcds_sf1_p1/sql/q10.sql @@ -1,4 +1,3 @@ -/* SELECT cd_gender , cd_marital_status @@ -54,4 +53,3 @@ WHERE (c.c_current_addr_sk = ca.ca_address_sk) GROUP BY cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count ORDER BY cd_gender ASC, cd_marital_status ASC, cd_education_status ASC, cd_purchase_estimate ASC, cd_credit_rating ASC, cd_dep_count ASC, cd_dep_employed_count ASC, cd_dep_college_count ASC LIMIT 100 -*/ diff --git a/regression-test/suites/tpcds_sf1_p1/sql/q35.sql b/regression-test/suites/tpcds_sf1_p1/sql/q35.sql index 1466c41c22..ed0d5c0f14 100644 --- a/regression-test/suites/tpcds_sf1_p1/sql/q35.sql +++ b/regression-test/suites/tpcds_sf1_p1/sql/q35.sql @@ -1,4 +1,3 @@ -/* SELECT ca_state , cd_gender @@ -57,4 +56,3 @@ WHERE (c.c_current_addr_sk = ca.ca_address_sk) GROUP BY ca_state, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count ORDER BY ca_state ASC, cd_gender ASC, cd_marital_status ASC, cd_dep_count ASC, cd_dep_employed_count ASC, cd_dep_college_count ASC LIMIT 100 -*/ diff --git a/regression-test/suites/tpcds_sf1_p1/sql/q45.sql b/regression-test/suites/tpcds_sf1_p1/sql/q45.sql index fe5bf82ef8..442f609879 100644 --- a/regression-test/suites/tpcds_sf1_p1/sql/q45.sql +++ b/regression-test/suites/tpcds_sf1_p1/sql/q45.sql @@ -1,4 +1,3 @@ -/* SELECT ca_zip , ca_city @@ -25,4 +24,3 @@ WHERE (ws_bill_customer_sk = c_customer_sk) GROUP BY ca_zip, ca_city ORDER BY ca_zip ASC, ca_city ASC LIMIT 100 -*/