You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2022/12/30 12:23:54 UTC

[ignite] branch master updated: IGNITE-18458 SQL Calcite: Fix NPE on DML on non-existed table - Fixes #10464.

This is an automated email from the ASF dual-hosted git repository.

alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 6c9f56c838f IGNITE-18458 SQL Calcite: Fix NPE on DML on non-existed table - Fixes #10464.
6c9f56c838f is described below

commit 6c9f56c838f7c6247b6a15dd07fd75be1e8c061c
Author: Ilhom Ulmasov <il...@gmail.com>
AuthorDate: Fri Dec 30 15:20:42 2022 +0300

    IGNITE-18458 SQL Calcite: Fix NPE on DML on non-existed table - Fixes #10464.
    
    Signed-off-by: Aleksey Plekhanov <pl...@gmail.com>
---
 .../query/calcite/prepare/IgnitePlanner.java       |  2 +-
 .../query/calcite/prepare/IgniteSqlValidator.java  |  7 +++++
 .../integration/TableDmlIntegrationTest.java       | 34 ++++++++++++++++++++++
 3 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java
index db7d66e9575..475d6ba3269 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgnitePlanner.java
@@ -180,7 +180,7 @@ public class IgnitePlanner implements Planner, RelOptTable.ViewExpander {
             return validator().validate(sqlNode);
         }
         catch (RuntimeException e) {
-            throw new ValidationException(e);
+            throw new ValidationException(e.getMessage(), e);
         }
     }
 
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
index 74143e198d2..09b2b240cb6 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/prepare/IgniteSqlValidator.java
@@ -61,6 +61,7 @@ import org.apache.calcite.sql.validate.SqlValidatorNamespace;
 import org.apache.calcite.sql.validate.SqlValidatorScope;
 import org.apache.calcite.sql.validate.SqlValidatorTable;
 import org.apache.calcite.sql.validate.SqlValidatorUtil;
+import org.apache.calcite.util.Static;
 import org.apache.ignite.internal.processors.query.QueryUtils;
 import org.apache.ignite.internal.processors.query.calcite.schema.CacheTableDescriptor;
 import org.apache.ignite.internal.processors.query.calcite.schema.IgniteCacheTable;
@@ -153,6 +154,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
     private void validateTableModify(SqlNode table) {
         final SqlValidatorTable targetTable = getCatalogReader().getTable(((SqlIdentifier)table).names);
 
+        if (targetTable == null)
+            throw newValidationError(table, Static.RESOURCE.objectNotFound(table.toString()));
+
         if (!targetTable.unwrap(IgniteTable.class).isModifiable())
             throw newValidationError(table, IgniteResource.INSTANCE.modifyTableNotSupported(table.toString()));
     }
@@ -169,6 +173,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         final SqlIdentifier targetTable = (SqlIdentifier)call.getTargetTable();
         final SqlValidatorTable table = getCatalogReader().getTable(targetTable.names);
 
+        if (table == null)
+            throw newValidationError(call, Static.RESOURCE.objectNotFound(targetTable.toString()));
+
         SqlIdentifier alias = call.getAlias() != null ? call.getAlias() :
             new SqlIdentifier(deriveAlias(targetTable, 0), SqlParserPos.ZERO);
 
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDmlIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDmlIntegrationTest.java
index 5e1e76f21a9..06f5b58a142 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDmlIntegrationTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/TableDmlIntegrationTest.java
@@ -458,6 +458,40 @@ public class TableDmlIntegrationTest extends AbstractBasicIntegrationTest {
             "Failed to MERGE some keys due to keys conflict");
     }
 
+    /**
+     * Ensure that DML operations fails with proper errors on non-existent table
+     */
+    @Test
+    public void testFailureOnNonExistentTable() {
+        assertThrows("INSERT INTO NON_EXISTENT_TABLE(ID, NAME) VALUES (1, 'Name')",
+            IgniteSQLException.class,
+            "Object 'NON_EXISTENT_TABLE' not found");
+
+        assertThrows("UPDATE NON_EXISTENT_TABLE SET NAME ='NAME' WHERE ID = 1",
+            IgniteSQLException.class,
+            "Object 'NON_EXISTENT_TABLE' not found");
+
+        assertThrows("DELETE FROM NON_EXISTENT_TABLE WHERE ID = 1",
+            IgniteSQLException.class,
+            "Object 'NON_EXISTENT_TABLE' not found");
+
+        executeSql("CREATE TABLE PERSON(ID INT, PRIMARY KEY(id), NAME VARCHAR)");
+
+        assertThrows("" +
+                "MERGE INTO PERSON DST USING NON_EXISTENT_TABLE SRC ON DST.ID = SRC.ID" +
+                "    WHEN MATCHED THEN UPDATE SET NAME = SRC.NAME" +
+                "    WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (SRC.ID, SRC.NAME)",
+            IgniteSQLException.class,
+            "Object 'NON_EXISTENT_TABLE' not found");
+
+        assertThrows("" +
+                "MERGE INTO NON_EXISTENT_TABLE DST USING PERSON SRC ON DST.ID = SRC.ID" +
+                "    WHEN MATCHED THEN UPDATE SET NAME = SRC.NAME" +
+                "    WHEN NOT MATCHED THEN INSERT (ID, NAME) VALUES (SRC.ID, SRC.NAME)",
+            IgniteSQLException.class,
+            "Object 'NON_EXISTENT_TABLE' not found");
+    }
+
     /** */
     @Test
     public void testInsertDefaultValue() {