add test for bindExpr (#24032)

add unit test for bindExpression rule
This commit is contained in:
谢健
2023-09-12 11:00:57 +08:00
committed by GitHub
parent 1aa4b3c5a8
commit 5ab2aea8af

View File

@ -0,0 +1,161 @@
// 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.
package org.apache.doris.nereids.rules.analysis;
import org.apache.doris.nereids.pattern.GeneratedPlanPatterns;
import org.apache.doris.nereids.rules.RulePromise;
import org.apache.doris.nereids.trees.expressions.Expression;
import org.apache.doris.nereids.trees.plans.JoinType;
import org.apache.doris.nereids.util.PlanChecker;
import org.apache.doris.utframe.TestWithFeService;
import org.junit.jupiter.api.Test;
class BindExpressionTest extends TestWithFeService implements GeneratedPlanPatterns {
@Override
protected void runBeforeAll() throws Exception {
createDatabase("test");
connectContext.setDatabase("default_cluster:test");
createTables(
"CREATE TABLE t1 (col1 date, col2 int) DISTRIBUTED BY HASH(col2)\n" + "BUCKETS 1\n" + "PROPERTIES(\n"
+ " \"replication_num\"=\"1\"\n" + ");",
"CREATE TABLE t2 (col1 date, col2 int) DISTRIBUTED BY HASH(col2)\n" + "BUCKETS 1\n" + "PROPERTIES(\n"
+ " \"replication_num\"=\"1\"\n" + ");"
);
}
@Test
void testJoin() {
for (JoinType joinType : JoinType.values()) {
String sql = String.format("select * from t1 %s t2 on t1.col2 = t2.col2",
joinType.toString().replace("_", " "));
if (joinType.isCrossJoin()) {
sql = String.format("select * from t1 %s t2",
joinType.toString().replace("_", " "));
}
if (joinType.isNullAwareLeftAntiJoin()) {
continue;
}
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
}
@Test
void testAggHaving() {
String sql = "select sum(col2) from t1 group by col1";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
sql = "select sum(col2) from t1 group by col2";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
sql = "select sum(col2) from t1 group by col2, col1 having col1 > 0";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
@Test
void testFilter() {
String sql = "select * from t1 where t1.col1 = 1";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
@Test
void testSubquery() {
String sql = "select * from t1 where t1.col2 = (select sum(col2) from t2)";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
@Test
void testFilterSort() {
String sql = "select * from t1 where t1.col2 = 1 order by col2";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
sql = "select * from t1 where t1.col2 = 1 order by col1";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
@Test
void testOneRealation() {
String sql = "select 1 + 2";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
@Test
void testSetOperation() {
String sql = "select * from t1 union all select * from t2";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
sql = "select * from t1 union select * from t2";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
sql = "select * from t1 intersect select * from t2";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
@Test
void testRepeat() {
String sql = "select repeat(\"a\", 3)";
PlanChecker.from(connectContext)
.analyze(sql)
.nonMatch(any()
.when(e -> e.getExpressions().stream().anyMatch(Expression::hasUnbound)));
}
@Override
public RulePromise defaultPromise() {
return RulePromise.REWRITE;
}
}