You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ja...@apache.org on 2025/05/30 08:22:13 UTC
(iotdb) branch master updated: Perfect errMsg of unsupported join criteria in JoinNode
This is an automated email from the ASF dual-hosted git repository.
jackietien pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git
The following commit(s) were added to refs/heads/master by this push:
new 5a42c2e701e Perfect errMsg of unsupported join criteria in JoinNode
5a42c2e701e is described below
commit 5a42c2e701e58c7367df2772320c9965d13fa653
Author: Weihao Li <60...@users.noreply.github.com>
AuthorDate: Fri May 30 16:22:08 2025 +0800
Perfect errMsg of unsupported join criteria in JoinNode
---
.../it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java | 13 +++++++++++--
.../correlated/IoTDBCorrelatedExistsSubqueryIT.java | 5 ++---
.../correlated/IoTDBCorrelatedScalarSubqueryIT.java | 13 ++++++++-----
.../plan/relational/planner/optimizations/JoinUtils.java | 4 ++--
.../planner/optimizations/PushPredicateIntoTableScan.java | 6 +++---
5 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java
index 0397c05e707..185a58f0d94 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBMultiTAGsWithAttributesTableIT.java
@@ -41,7 +41,6 @@ import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinN
import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.INNER;
import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.LEFT;
import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.RIGHT;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.JoinUtils.ONLY_SUPPORT_EQUI_JOIN;
import static org.junit.Assert.fail;
/** In this IT, table has more than one TAGs and Attributes. */
@@ -2751,7 +2750,8 @@ public class IoTDBMultiTAGsWithAttributesTableIT {
@Test
public void exceptionTest() {
- String errMsg = TSStatusCode.SEMANTIC_ERROR.getStatusCode() + ": " + ONLY_SUPPORT_EQUI_JOIN;
+ String errMsg =
+ TSStatusCode.SEMANTIC_ERROR.getStatusCode() + ": " + "Unsupported Join creteria";
tableAssertTestFail(
"select * from table0 t0 full join table1 t1 on t0.num>t1.num", errMsg, DATABASE_NAME);
@@ -2773,6 +2773,15 @@ public class IoTDBMultiTAGsWithAttributesTableIT {
errMsg,
DATABASE_NAME);
+ tableAssertTestFail(
+ "select * from table0 t0 full join table1 t1 on t0.time=4000", errMsg, DATABASE_NAME);
+
+ tableAssertTestFail(
+ "select * from table0 t0 left join table1 t1 on t0.time=4000", errMsg, DATABASE_NAME);
+
+ tableAssertTestFail(
+ "select * from table0 t0 right join table1 t1 on t0.time=4000", errMsg, DATABASE_NAME);
+
tableAssertTestFail(
"select * from table0 asof (tolerance 1s) left join table1 on table0.time<=table1.time",
"Tolerance in ASOF JOIN only supports INNER type now",
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedExistsSubqueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedExistsSubqueryIT.java
index 495b93d3345..4951fd6670a 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedExistsSubqueryIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedExistsSubqueryIT.java
@@ -34,7 +34,6 @@ import org.junit.runner.RunWith;
import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData;
import static org.apache.iotdb.db.it.utils.TestUtils.tableAssertTestFail;
import static org.apache.iotdb.db.it.utils.TestUtils.tableResultSetEqualTest;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.JoinUtils.ONLY_SUPPORT_EQUI_JOIN;
import static org.apache.iotdb.relational.it.query.recent.subquery.SubqueryDataSetUtils.CREATE_SQLS;
import static org.apache.iotdb.relational.it.query.recent.subquery.SubqueryDataSetUtils.DATABASE_NAME;
import static org.apache.iotdb.relational.it.query.recent.subquery.SubqueryDataSetUtils.NUMERIC_MEASUREMENTS;
@@ -389,8 +388,8 @@ public class IoTDBCorrelatedExistsSubqueryIT {
@Test
public void testNonComparisonFilterInCorrelatedExistsSubquery() {
- String errMsg = TSStatusCode.SEMANTIC_ERROR.getStatusCode() + ": " + ONLY_SUPPORT_EQUI_JOIN;
- // Legality check: Correlated subquery with Non-equality comparison is not support for now.
+ String errMsg =
+ TSStatusCode.SEMANTIC_ERROR.getStatusCode() + ": " + "Unsupported Join creteria";
tableAssertTestFail(
"select s1 from table1 t1 where exists(select s1 from table3 t3 where t1.s1 > t3.s1)",
errMsg,
diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedScalarSubqueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedScalarSubqueryIT.java
index ef0921d9f38..071635f53f6 100644
--- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedScalarSubqueryIT.java
+++ b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/recent/subquery/correlated/IoTDBCorrelatedScalarSubqueryIT.java
@@ -23,6 +23,7 @@ import org.apache.iotdb.it.env.EnvFactory;
import org.apache.iotdb.it.framework.IoTDBTestRunner;
import org.apache.iotdb.itbase.category.TableClusterIT;
import org.apache.iotdb.itbase.category.TableLocalStandaloneIT;
+import org.apache.iotdb.rpc.TSStatusCode;
import org.junit.AfterClass;
import org.junit.BeforeClass;
@@ -369,26 +370,28 @@ public class IoTDBCorrelatedScalarSubqueryIT {
@Test
public void testNonEqualityComparisonFilterInCorrelatedScalarSubquery() {
+ String errMsg =
+ TSStatusCode.SEMANTIC_ERROR.getStatusCode() + ": " + "Unsupported Join creteria";
// Legality check: Correlated subquery with Non-equality comparison is not support for now.
tableAssertTestFail(
"select s1 from table1 t1 where s1 > (select max(s1) from table3 t3 where t1.s1 > t3.s1)",
- "For now, FullOuterJoin and LeftJoin only support EquiJoinClauses",
+ errMsg,
DATABASE_NAME);
tableAssertTestFail(
"select s1 from table1 t1 where s1 > (select max(s1) from table3 t3 where t1.s1 >= t3.s1)",
- "For now, FullOuterJoin and LeftJoin only support EquiJoinClauses",
+ errMsg,
DATABASE_NAME);
tableAssertTestFail(
"select s1 from table1 t1 where s1 > (select max(s1) from table3 t3 where t1.s1 < t3.s1)",
- "For now, FullOuterJoin and LeftJoin only support EquiJoinClauses",
+ errMsg,
DATABASE_NAME);
tableAssertTestFail(
"select s1 from table1 t1 where s1 > (select max(s1) from table3 t3 where t1.s1 <= t3.s1)",
- "For now, FullOuterJoin and LeftJoin only support EquiJoinClauses",
+ errMsg,
DATABASE_NAME);
tableAssertTestFail(
"select s1 from table1 t1 where s1 > (select max(s1) from table3 t3 where t1.s1 != t3.s1)",
- "For now, FullOuterJoin and LeftJoin only support EquiJoinClauses",
+ errMsg,
DATABASE_NAME);
}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/JoinUtils.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/JoinUtils.java
index 8f5c1973bf9..9e751d2dd4d 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/JoinUtils.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/JoinUtils.java
@@ -42,8 +42,8 @@ import static org.apache.iotdb.db.queryengine.plan.relational.planner.ir.IrUtils
import static org.apache.iotdb.db.queryengine.plan.relational.sql.ast.BooleanLiteral.TRUE_LITERAL;
public class JoinUtils {
- public static final String ONLY_SUPPORT_EQUI_JOIN =
- "For now, FullOuterJoin and LeftJoin only support EquiJoinClauses";
+ public static final String UNSUPPORTED_JOIN_CRITERIA =
+ "Unsupported Join creteria [%s] after predicate push down";
private JoinUtils() {}
diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
index dba42ec1d8c..ac3bbceffd5 100644
--- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
+++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/planner/optimizations/PushPredicateIntoTableScan.java
@@ -120,7 +120,7 @@ import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinN
import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.INNER;
import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.LEFT;
import static org.apache.iotdb.db.queryengine.plan.relational.planner.node.JoinNode.JoinType.RIGHT;
-import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.JoinUtils.ONLY_SUPPORT_EQUI_JOIN;
+import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.JoinUtils.UNSUPPORTED_JOIN_CRITERIA;
import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.JoinUtils.extractJoinPredicate;
import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.JoinUtils.joinEqualityExpression;
import static org.apache.iotdb.db.queryengine.plan.relational.planner.optimizations.JoinUtils.processInnerJoin;
@@ -753,11 +753,11 @@ public class PushPredicateIntoTableScan implements PlanOptimizer {
equiJoinClauses.add(new JoinNode.EquiJoinClause(leftSymbol, rightSymbol));
} else {
- if (conjunct.equals(TRUE_LITERAL)) {
+ if (conjunct.equals(TRUE_LITERAL) && node.getAsofCriteria().isPresent()) {
continue;
}
if (node.getJoinType() != INNER) {
- throw new SemanticException(ONLY_SUPPORT_EQUI_JOIN);
+ throw new SemanticException(String.format(UNSUPPORTED_JOIN_CRITERIA, conjunct));
}
joinFilterBuilder.add(conjunct);
}