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);
         }