[fix](Nereids): just allow crossjoin empty condition. (#14893)

This commit is contained in:
jakevin
2022-12-10 15:32:49 +08:00
committed by GitHub
parent b7453f6f09
commit 6f9afbd74f
4 changed files with 25 additions and 10 deletions

View File

@ -1020,8 +1020,10 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
joinType = JoinType.LEFT_OUTER_JOIN;
} else if (join.joinType().RIGHT() != null) {
joinType = JoinType.RIGHT_OUTER_JOIN;
} else {
} else if (join.joinType().INNER() != null) {
joinType = JoinType.INNER_JOIN;
} else {
joinType = JoinType.CROSS_JOIN;
}
// TODO: natural join, lateral join, using join, union join
@ -1038,6 +1040,11 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
Collectors.toList());
return new LogicalJoin(JoinType.USING_JOIN, ids, last, plan(join.relationPrimary()));
}
} else {
// keep same with original planner, allow cross/inner join
if (!joinType.isInnerOrCrossJoin()) {
throw new ParseException("on mustn't be empty except for cross/inner join", join);
}
}
last = new LogicalJoin<>(joinType, ExpressionUtils.EMPTY_CONDITION,

View File

@ -170,7 +170,7 @@ public class NereidsParserTest extends ParserTestBase {
String innerJoin2 = "SELECT t1.a FROM t1 JOIN t2 ON t1.id = t2.id;";
logicalPlan = nereidsParser.parseSingle(innerJoin2);
logicalJoin = (LogicalJoin) logicalPlan.child(0);
Assertions.assertEquals(JoinType.INNER_JOIN, logicalJoin.getJoinType());
Assertions.assertEquals(JoinType.CROSS_JOIN, logicalJoin.getJoinType());
String leftJoin1 = "SELECT t1.a FROM t1 LEFT JOIN t2 ON t1.id = t2.id;";
logicalPlan = nereidsParser.parseSingle(leftJoin1);
@ -218,6 +218,18 @@ public class NereidsParserTest extends ParserTestBase {
Assertions.assertEquals(JoinType.CROSS_JOIN, logicalJoin.getJoinType());
}
@Test
void parseJoinEmptyConditionError() {
parsePlan("select * from t1 LEFT JOIN t2")
.assertThrowsExactly(ParseException.class)
.assertMessageEquals("\n"
+ "on mustn't be empty except for cross/inner join(line 1, pos 17)\n"
+ "\n"
+ "== SQL ==\n"
+ "select * from t1 LEFT JOIN t2\n"
+ "-----------------^^^\n");
}
@Test
public void parseDecimal() {
String f1 = "SELECT col1 * 0.267081789095306 FROM t";

View File

@ -27,7 +27,6 @@ import org.apache.doris.nereids.trees.expressions.EqualTo;
import org.apache.doris.nereids.trees.expressions.ExprId;
import org.apache.doris.nereids.trees.expressions.NamedExpressionUtil;
import org.apache.doris.nereids.trees.expressions.SlotReference;
import org.apache.doris.nereids.trees.plans.JoinType;
import org.apache.doris.nereids.trees.plans.physical.PhysicalPlan;
import org.apache.doris.nereids.types.BigIntType;
import org.apache.doris.nereids.util.FieldChecker;
@ -132,7 +131,7 @@ public class AnalyzeSubQueryTest extends TestWithFeService implements PatternMat
.applyTopDown(new LogicalSubQueryAliasToLogicalProject())
.matchesFromRoot(
logicalProject(
logicalJoin(
crossLogicalJoin(
logicalProject(
logicalOlapScan()
),
@ -147,7 +146,6 @@ public class AnalyzeSubQueryTest extends TestWithFeService implements PatternMat
new SlotReference(new ExprId(1), "score", BigIntType.INSTANCE, true, ImmutableList.of("TT2"))))
)
)
.when(FieldChecker.check("joinType", JoinType.INNER_JOIN))
.when(FieldChecker.check("otherJoinConjuncts",
ImmutableList.of(new EqualTo(
new SlotReference(new ExprId(2), "id", BigIntType.INSTANCE, true, ImmutableList.of("TT1")),
@ -169,13 +167,12 @@ public class AnalyzeSubQueryTest extends TestWithFeService implements PatternMat
.applyTopDown(new LogicalSubQueryAliasToLogicalProject())
.matchesFromRoot(
logicalProject(
logicalJoin(
crossLogicalJoin(
logicalOlapScan(),
logicalProject(
logicalOlapScan()
)
)
.when(FieldChecker.check("joinType", JoinType.INNER_JOIN))
.when(FieldChecker.check("otherJoinConjuncts", ImmutableList.of(new EqualTo(
new SlotReference(new ExprId(0), "id", BigIntType.INSTANCE, true, ImmutableList.of("default_cluster:test", "T1")),
new SlotReference(new ExprId(2), "id", BigIntType.INSTANCE, true, ImmutableList.of("T2")))))

View File

@ -236,15 +236,14 @@ public class RegisterCTETest extends TestWithFeService implements PatternMatchSu
.analyze(sql4)
.matchesFromRoot(
logicalProject(
logicalJoin(
crossLogicalJoin(
logicalSubQueryAlias(
logicalProject().when(p -> p.getProjects().equals(ImmutableList.of(skAlias)))
).when(a -> a.getAlias().equals("cte1")),
logicalSubQueryAlias(
logicalProject().when(p -> p.getProjects().equals(ImmutableList.of(skInCTE2)))
).when(a -> a.getAlias().equals("cte2"))
).when(FieldChecker.check("joinType", JoinType.INNER_JOIN))
.when(j -> j.getOtherJoinConjuncts().equals(ImmutableList.of(new EqualTo(skInCTE1, skInCTE2))))
).when(j -> j.getOtherJoinConjuncts().equals(ImmutableList.of(new EqualTo(skInCTE1, skInCTE2))))
).when(p -> p.getProjects().equals(ImmutableList.of(skInCTE1, skInCTE2)))
);
}