[fix](planner)infer predicate generate infered predicate using wrong information from another scope (#10519)

This PR fix a bug in predicate inference.

The original predicate inference compare two slot without SlotId. This will arise an error when a query has SetOperand and more than one SetOperand's child use same table alias. e.g.

```
select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 
union
select * from tb1 inner join tb2 on tb1.k2 = tb2.k2 where tb1.k1 = 3;
```

in this case, we infer a predicate `tb2.k1 = 3` on table 'tbl2' of SetOperand's second child by mistake.
This commit is contained in:
morrySnow
2022-07-02 22:41:04 +08:00
committed by GitHub
parent 078cb3b4db
commit 848e0c5987
3 changed files with 97 additions and 58 deletions

View File

@ -305,7 +305,7 @@ public class SlotRef extends Expr {
if ((col == null) != (other.col == null)) {
return false;
}
if (col != null && !col.toLowerCase().equals(other.col.toLowerCase())) {
if (col != null && !col.equalsIgnoreCase(other.col)) {
return false;
}
return true;

View File

@ -43,6 +43,8 @@ import java.util.Set;
/**
* The function of this rule is to derive a new predicate based on the current predicate.
*
* <pre>
* eg.
* t1.id = t2.id and t2.id = t3.id and t3.id = 100;
* -->
@ -51,8 +53,9 @@ import java.util.Set;
* 1. Register a new rule InferFiltersRule and add it to GlobalState.
* 2. Traverse Conjunct to construct on/where equivalence connection, numerical connection and isNullPredicate.
* 3. Use Warshall to infer all equivalence connections.
* details:https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
* details: <a href="url">https://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm</a>
* 4. Construct additional numerical connections and isNullPredicate.
* </pre>
*/
public class InferFiltersRule implements ExprRewriteRule {
private static final Logger LOG = LogManager.getLogger(InferFiltersRule.class);
@ -127,10 +130,10 @@ public class InferFiltersRule implements ExprRewriteRule {
if (!newExprWithState.isEmpty()) {
Expr rewriteExpr = expr;
for (int index = 0; index < newExprWithState.size(); index++) {
if (newExprWithState.get(index).second) {
rewriteExpr = new CompoundPredicate(CompoundPredicate.Operator.AND,
rewriteExpr, newExprWithState.get(index).first);
for (Pair<Expr, Boolean> exprBooleanPair : newExprWithState) {
if (exprBooleanPair.second) {
rewriteExpr = new CompoundPredicate(CompoundPredicate.Operator.AND, rewriteExpr,
exprBooleanPair.first);
}
}
return rewriteExpr;
@ -171,7 +174,7 @@ public class InferFiltersRule implements ExprRewriteRule {
if (conjunct instanceof BinaryPredicate
&& conjunct.getChild(0) != null
&& conjunct.getChild(1) != null) {
if (conjunct.getChild(0).unwrapSlotRef() instanceof SlotRef
if (conjunct.getChild(0).unwrapSlotRef() != null
&& conjunct.getChild(1) instanceof LiteralExpr) {
Pair<Expr, Expr> pair = new Pair<>(conjunct.getChild(0).unwrapSlotRef(), conjunct.getChild(1));
if (!slotToLiteralDeDuplication.contains(pair)) {
@ -184,8 +187,8 @@ public class InferFiltersRule implements ExprRewriteRule {
analyzer.registerGlobalSlotToLiteralDeDuplication(pair);
}
} else if (((BinaryPredicate) conjunct).getOp().isEquivalence()
&& conjunct.getChild(0).unwrapSlotRef() instanceof SlotRef
&& conjunct.getChild(1).unwrapSlotRef() instanceof SlotRef) {
&& conjunct.getChild(0).unwrapSlotRef() != null
&& conjunct.getChild(1).unwrapSlotRef() != null) {
Pair<Expr, Expr> pair = new Pair<>(conjunct.getChild(0).unwrapSlotRef(),
conjunct.getChild(1).unwrapSlotRef());
Pair<Expr, Expr> eqPair = new Pair<>(conjunct.getChild(1).unwrapSlotRef(),
@ -202,7 +205,7 @@ public class InferFiltersRule implements ExprRewriteRule {
}
} else if (conjunct instanceof IsNullPredicate
&& conjunct.getChild(0) != null
&& conjunct.getChild(0).unwrapSlotRef() instanceof SlotRef) {
&& conjunct.getChild(0).unwrapSlotRef() != null) {
if (!isNullDeDuplication.contains(conjunct.getChild(0).unwrapSlotRef())
&& ((IsNullPredicate) conjunct).isNotNull()) {
isNullDeDuplication.add(conjunct.getChild(0).unwrapSlotRef());
@ -214,7 +217,7 @@ public class InferFiltersRule implements ExprRewriteRule {
}
} else if (conjunct instanceof InPredicate
&& conjunct.getChild(0) != null
&& conjunct.getChild(0).unwrapSlotRef() instanceof SlotRef) {
&& conjunct.getChild(0).unwrapSlotRef() != null) {
if (!inDeDuplication.contains(conjunct.getChild(0).unwrapSlotRef())) {
inDeDuplication.add(conjunct.getChild(0).unwrapSlotRef());
inExpr.add(conjunct);
@ -234,10 +237,10 @@ public class InferFiltersRule implements ExprRewriteRule {
* old expr:t1.id = t2.id and t2.id = t3.id and t3.id = t4.id
* new expr:t1.id = t2.id and t2.id = t3.id and t3.id = t4.id and t1.id = t3.id and t1.id = t4.id and t2.id = t4.id
*
* @param slotEqSlotExpr
* @param slotEqSlotDeDuplication
* @param slotEqSlotExpr slot to slot exprs
* @param slotEqSlotDeDuplication set pairs in slot = slot exprs
* @param exprToWarshallArraySubscript: A Map the key is Expr, the value is int
* @param warshallArraySubscriptToExpr: A Map the key is int, the value is exper
* @param warshallArraySubscriptToExpr: A Map the key is int, the value is expr
*/
private void genNewSlotEqSlotPredicate(List<Expr> slotEqSlotExpr,
Set<Pair<Expr, Expr>> slotEqSlotDeDuplication,
@ -268,9 +271,9 @@ public class InferFiltersRule implements ExprRewriteRule {
*
* @param warshall: Two-dimensional array
* @param arrayMaxSize: slotEqSlotExpr.size() * 2
* @param slotEqSlotExpr
* @param exprToWarshallArraySubscript
* @param warshallArraySubscriptToExpr
* @param slotEqSlotExpr slot to slot exprs
* @param exprToWarshallArraySubscript expr to offset in Warshall array
* @param warshallArraySubscriptToExpr offset in Warshall array to expr
* @return needGenWarshallArray. True:needGen; False:don't needGen
*/
private boolean initWarshallArray(int[][] warshall,
@ -281,8 +284,8 @@ public class InferFiltersRule implements ExprRewriteRule {
boolean needGenWarshallArray = false;
int index = 0;
for (Expr slotEqSlot : slotEqSlotExpr) {
int row = 0;
int column = 0;
int row;
int column;
if (!exprToWarshallArraySubscript.containsKey(slotEqSlot.getChild(0))) {
exprToWarshallArraySubscript.put(slotEqSlot.getChild(0), index);
warshallArraySubscriptToExpr.put(index, slotEqSlot.getChild(0));
@ -303,7 +306,7 @@ public class InferFiltersRule implements ExprRewriteRule {
if (row >= arrayMaxSize
|| column >= arrayMaxSize) {
LOG.debug("Error row or column", row, column, arrayMaxSize);
LOG.debug("Error row {} or column {}, but max size is {}.", row, column, arrayMaxSize);
needGenWarshallArray = false;
break;
} else {
@ -391,18 +394,18 @@ public class InferFiltersRule implements ExprRewriteRule {
Analyzer analyzer,
ExprRewriter.ClauseType clauseType) {
SlotRef checkSlot = slotToLiteral.getChild(0).unwrapSlotRef();
if (checkSlot instanceof SlotRef) {
if (checkSlot != null) {
for (Expr conjunct : slotEqSlotExpr) {
SlotRef leftSlot = conjunct.getChild(0).unwrapSlotRef();
SlotRef rightSlot = conjunct.getChild(1).unwrapSlotRef();
if (leftSlot instanceof SlotRef && rightSlot instanceof SlotRef) {
if (checkSlot.notCheckDescIdEquals(leftSlot)) {
if (leftSlot != null && rightSlot != null) {
if (checkSlot.equals(leftSlot)) {
addNewBinaryPredicate(genNewBinaryPredicate(slotToLiteral, rightSlot),
slotToLiteralDeDuplication, newExprWithState,
isNeedInfer(rightSlot, leftSlot, analyzer, clauseType),
analyzer, clauseType);
} else if (checkSlot.notCheckDescIdEquals(rightSlot)) {
} else if (checkSlot.equals(rightSlot)) {
addNewBinaryPredicate(genNewBinaryPredicate(slotToLiteral, leftSlot),
slotToLiteralDeDuplication, newExprWithState,
isNeedInfer(leftSlot, rightSlot, analyzer, clauseType),
@ -426,17 +429,15 @@ public class InferFiltersRule implements ExprRewriteRule {
boolean ret = false;
TupleId newTid = newSlot.getDesc().getParent().getRef().getId();
TupleId checkTid = checkSlot.getDesc().getParent().getRef().getId();
boolean needChange = false;
Pair<TupleId, TupleId> tids = new Pair<>(newTid, checkTid);
if (analyzer.isContainTupleIds(tids)) {
JoinOperator joinOperator = analyzer.getAnyTwoTablesJoinOp(tids);
ret = checkNeedInfer(joinOperator, needChange, clauseType);
ret = checkNeedInfer(joinOperator, false, clauseType);
} else {
Pair<TupleId, TupleId> changeTids = new Pair<>(checkTid, newTid);
if (analyzer.isContainTupleIds(changeTids)) {
needChange = true;
JoinOperator joinOperator = analyzer.getAnyTwoTablesJoinOp(changeTids);
ret = checkNeedInfer(joinOperator, needChange, clauseType);
ret = checkNeedInfer(joinOperator, true, clauseType);
}
}
return ret;
@ -474,8 +475,7 @@ public class InferFiltersRule implements ExprRewriteRule {
private Expr genNewBinaryPredicate(Expr oldExpr, Expr newSlot) {
if (oldExpr instanceof BinaryPredicate) {
BinaryPredicate oldBP = (BinaryPredicate) oldExpr;
BinaryPredicate newBP = new BinaryPredicate(oldBP.getOp(), newSlot, oldBP.getChild(1));
return newBP;
return new BinaryPredicate(oldBP.getOp(), newSlot, oldBP.getChild(1));
}
return oldExpr;
}
@ -534,16 +534,16 @@ public class InferFiltersRule implements ExprRewriteRule {
if (expr instanceof IsNullPredicate) {
IsNullPredicate isNullPredicate = (IsNullPredicate) expr;
SlotRef checkSlot = isNullPredicate.getChild(0).unwrapSlotRef();
if (checkSlot instanceof SlotRef) {
if (checkSlot != null) {
for (Expr conjunct : slotEqSlotExpr) {
SlotRef leftSlot = conjunct.getChild(0).unwrapSlotRef();
SlotRef rightSlot = conjunct.getChild(1).unwrapSlotRef();
if (leftSlot instanceof SlotRef && rightSlot instanceof SlotRef) {
if (checkSlot.notCheckDescIdEquals(leftSlot) && isNullPredicate.isNotNull()) {
if (leftSlot != null && rightSlot != null) {
if (checkSlot.equals(leftSlot) && isNullPredicate.isNotNull()) {
addNewIsNotNullPredicate(genNewIsNotNullPredicate(isNullPredicate, rightSlot),
isNullDeDuplication, newExprWithState, analyzer, clauseType);
} else if (checkSlot.notCheckDescIdEquals(rightSlot)) {
} else if (checkSlot.equals(rightSlot)) {
addNewIsNotNullPredicate(genNewIsNotNullPredicate(isNullPredicate, leftSlot),
isNullDeDuplication, newExprWithState, analyzer, clauseType);
}
@ -558,11 +558,7 @@ public class InferFiltersRule implements ExprRewriteRule {
* @return new IsNullPredicate.
*/
private Expr genNewIsNotNullPredicate(IsNullPredicate oldExpr, Expr newSlot) {
if (oldExpr instanceof IsNullPredicate) {
IsNullPredicate newExpr = new IsNullPredicate(newSlot, oldExpr.isNotNull());
return newExpr;
}
return oldExpr;
return oldExpr != null ? new IsNullPredicate(newSlot, oldExpr.isNotNull()) : null;
}
/**
@ -614,18 +610,18 @@ public class InferFiltersRule implements ExprRewriteRule {
if (inExpr instanceof InPredicate) {
InPredicate inpredicate = (InPredicate) inExpr;
SlotRef checkSlot = inpredicate.getChild(0).unwrapSlotRef();
if (checkSlot instanceof SlotRef) {
if (checkSlot != null) {
for (Expr conjunct : slotEqSlotExpr) {
SlotRef leftSlot = conjunct.getChild(0).unwrapSlotRef();
SlotRef rightSlot = conjunct.getChild(1).unwrapSlotRef();
if (leftSlot instanceof SlotRef && rightSlot instanceof SlotRef) {
if (checkSlot.notCheckDescIdEquals(leftSlot)) {
if (leftSlot != null && rightSlot != null) {
if (checkSlot.equals(leftSlot)) {
addNewInPredicate(genNewInPredicate(inpredicate, rightSlot),
inDeDuplication, newExprWithState,
isNeedInfer(rightSlot, leftSlot, analyzer, clauseType),
analyzer, clauseType);
} else if (checkSlot.notCheckDescIdEquals(rightSlot)) {
} else if (checkSlot.equals(rightSlot)) {
addNewInPredicate(genNewInPredicate(inpredicate, leftSlot),
inDeDuplication, newExprWithState,
isNeedInfer(leftSlot, rightSlot, analyzer, clauseType),
@ -644,8 +640,7 @@ public class InferFiltersRule implements ExprRewriteRule {
private Expr genNewInPredicate(Expr oldExpr, Expr newSlot) {
if (oldExpr instanceof InPredicate) {
InPredicate oldBP = (InPredicate) oldExpr;
InPredicate newBP = new InPredicate(newSlot, oldBP.getListChildren(), oldBP.isNotIn());
return newBP;
return new InPredicate(newSlot, oldBP.getListChildren(), oldBP.isNotIn());
}
return oldExpr;
}

View File

@ -30,8 +30,8 @@ import org.junit.Test;
import java.util.UUID;
public class InferFiltersRuleTest {
private static String baseDir = "fe";
private static String runningDir = baseDir + "/mocked/InferFiltersRuleTest/"
private static final String baseDir = "fe";
private static final String runningDir = baseDir + "/mocked/InferFiltersRuleTest/"
+ UUID.randomUUID() + "/";
private static DorisAssert dorisAssert;
private static final String DB_NAME = "db1";
@ -55,7 +55,8 @@ public class InferFiltersRuleTest {
+ "distributed by hash(k1) buckets 3 properties('replication_num' = '1');";
dorisAssert.withTable(createTableSQL);
createTableSQL = "create table " + DB_NAME + "." + TABLE_NAME_3
+ " (k1 tinyint, k2 smallint, k3 int, k4 bigint, k5 largeint, k6 date, k7 datetime, k8 float, k9 double) "
+ " (k1 tinyint, k2 smallint, k3 int, k4 bigint,"
+ " k5 largeint, k6 date, k7 datetime, k8 float, k9 double) "
+ "distributed by hash(k1) buckets 3 properties('replication_num' = '1');";
dorisAssert.withTable(createTableSQL);
}
@ -101,7 +102,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 inner join tb3 where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String query = "select * from tb1 inner join tb2 inner join tb3"
+ " where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb2`.`k1` = 1"));
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
@ -152,7 +154,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1 and tb2.k1 = 1";
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1"
+ " right outer join tb3 on tb2.k1 = tb3.k1 and tb2.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
Assert.assertFalse(planString.contains("`tb3`.`k1` = 1"));
@ -163,7 +166,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1 and tb3.k1 = 1";
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1"
+ " right outer join tb3 on tb2.k1 = tb3.k1 and tb3.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb2`.`k1` = 1"));
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
@ -174,7 +178,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1 where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb2.k1 = 1";
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1"
+ " where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb2.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
Assert.assertTrue(planString.contains("`tb3`.`k1` = 1"));
@ -217,7 +222,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 inner join tb3 where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String query = "select * from tb1 inner join tb2 inner join tb3"
+ " where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb2`.`k1` = 1"));
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
@ -228,7 +234,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 left outer join tb3 on tb3.k1 = tb2.k1 where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String query = "select * from tb1 inner join tb2 left outer join tb3 on tb3.k1 = tb2.k1"
+ " where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb2`.`k1` = 1"));
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
@ -239,7 +246,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 left outer join tb3 on tb3.k1 = tb2.k1 where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb2.k1 = 1";
String query = "select * from tb1 inner join tb2 left outer join tb3 on tb3.k1 = tb2.k1"
+ " where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb2.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
Assert.assertFalse(planString.contains("`tb3`.`k1` = 1"));
@ -250,7 +258,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1 where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb2.k1 = 1";
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1"
+ " where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb2.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb1`.`k1` = 1"));
Assert.assertTrue(planString.contains("`tb3`.`k1` = 1"));
@ -261,7 +270,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1 where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1 right outer join tb3 on tb2.k1 = tb3.k1"
+ " where tb1.k1 = tb2.k1 and tb2.k1 = tb3.k1 and tb3.k1 = 1";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertFalse(planString.contains("`tb2`.`k1` = 1"));
Assert.assertFalse(planString.contains("`tb1`.`k1` = 1"));
@ -272,7 +282,8 @@ public class InferFiltersRuleTest {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 inner join tb3 where tb1.k1 = tb3.k1 and tb2.k1 = tb3.k1 and tb1.k1 is not null";
String query = "select * from tb1 inner join tb2 inner join tb3"
+ " where tb1.k1 = tb3.k1 and tb2.k1 = tb3.k1 and tb1.k1 is not null";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb3`.`k1` IS NOT NULL"));
Assert.assertTrue(planString.contains("`tb2`.`k1` IS NOT NULL"));
@ -338,4 +349,37 @@ public class InferFiltersRuleTest {
String planString = dorisAssert.query(query).explainQuery();
Assert.assertTrue(planString.contains("`tb2`.`k1` = 1"));
}
@Test
public void testSameAliasWithSlotEqualToLiteralInDifferentUnionChildren() throws Exception {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1"
+ " union select * from tb1 inner join tb2 on tb1.k2 = tb2.k2 where tb1.k1 = 3";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertFalse(planString.contains("`tb2`.`k1` = 3"));
}
@Test
public void testSameAliasWithSlotInPredicateInDifferentUnionChildren() throws Exception {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1"
+ " union select * from tb1 inner join tb2 on tb1.k2 = tb2.k2 where tb1.k1 in (3, 4, 5)";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertFalse(planString.contains("`tb2`.`k1` IN (3, 4, 5)"));
}
@Test
public void testSameAliasWithSlotIsNullInDifferentUnionChildren() throws Exception {
SessionVariable sessionVariable = dorisAssert.getSessionVariable();
sessionVariable.setEnableInferPredicate(true);
Assert.assertTrue(sessionVariable.isEnableInferPredicate());
String query = "select * from tb1 inner join tb2 on tb1.k1 = tb2.k1"
+ " union select * from tb1 inner join tb2 on tb1.k2 = tb2.k2 where tb1.k1 is not null";
String planString = dorisAssert.query(query).explainQuery();
Assert.assertFalse(planString.contains("`tb2`.`k1` IS NOT NULL"));
}
}