[Bug] Fix bug that push down logic error on semi join (#3481)
For SQL like: ``` select * from join1 left semi join join2 on join1.id = join2.id and join2.id > 1; ``` the predicate `join2.id > 1` can not be pushed down to table join1.
This commit is contained in:
@ -655,6 +655,61 @@ public class QueryPlanTest {
|
||||
System.out.println(explainString);
|
||||
Assert.assertTrue(explainString.contains("PREDICATES: `join1`.`id` > 1"));
|
||||
Assert.assertTrue(explainString.contains("PREDICATES: `join2`.`id` > 1"));
|
||||
|
||||
// test anti join, right table join predicate, only push to right table
|
||||
sql = "select *\n from join1\n" +
|
||||
"left anti join join2 on join1.id = join2.id\n" +
|
||||
"and join2.id > 1;";
|
||||
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql);
|
||||
System.out.println(explainString);
|
||||
Assert.assertTrue(explainString.contains("PREDICATES: `join2`.`id` > 1"));
|
||||
Assert.assertFalse(explainString.contains("PREDICATES: `join1`.`id` > 1"));
|
||||
|
||||
// test semi join, right table join predicate, only push to right table
|
||||
sql = "select *\n from join1\n" +
|
||||
"left semi join join2 on join1.id = join2.id\n" +
|
||||
"and join2.id > 1;";
|
||||
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql);
|
||||
System.out.println(explainString);
|
||||
Assert.assertTrue(explainString.contains("PREDICATES: `join2`.`id` > 1"));
|
||||
Assert.assertFalse(explainString.contains("PREDICATES: `join1`.`id` > 1"));
|
||||
|
||||
// test anti join, left table join predicate, left table couldn't push down
|
||||
sql = "select *\n from join1\n" +
|
||||
"left anti join join2 on join1.id = join2.id\n" +
|
||||
"and join1.id > 1;";
|
||||
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql);
|
||||
System.out.println(explainString);
|
||||
Assert.assertTrue(explainString.contains("other join predicates: `join1`.`id` > 1"));
|
||||
Assert.assertFalse(explainString.contains("PREDICATES: `join1`.`id` > 1"));
|
||||
|
||||
// test semi join, left table join predicate, only push to left table
|
||||
sql = "select *\n from join1\n" +
|
||||
"left semi join join2 on join1.id = join2.id\n" +
|
||||
"and join1.id > 1;";
|
||||
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql);
|
||||
System.out.println(explainString);
|
||||
Assert.assertTrue(explainString.contains("PREDICATES: `join1`.`id` > 1"));
|
||||
|
||||
// test anti join, left table where predicate, only push to left table
|
||||
sql = "select join1.id\n" +
|
||||
"from join1\n" +
|
||||
"left anti join join2 on join1.id = join2.id\n" +
|
||||
"where join1.id > 1;";
|
||||
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql);
|
||||
System.out.println(explainString);
|
||||
Assert.assertTrue(explainString.contains("PREDICATES: `join1`.`id` > 1"));
|
||||
Assert.assertFalse(explainString.contains("PREDICATES: `join2`.`id` > 1"));
|
||||
|
||||
// test semi join, left table where predicate, only push to left table
|
||||
sql = "select join1.id\n" +
|
||||
"from join1\n" +
|
||||
"left semi join join2 on join1.id = join2.id\n" +
|
||||
"where join1.id > 1;";
|
||||
explainString = UtFrameUtils.getSQLPlanOrErrorMsg(connectContext, "explain " + sql);
|
||||
System.out.println(explainString);
|
||||
Assert.assertTrue(explainString.contains("PREDICATES: `join1`.`id` > 1"));
|
||||
Assert.assertFalse(explainString.contains("PREDICATES: `join2`.`id` > 1"));
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user