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

ppa pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new e3981e618ff IGNITE-27635 Sql. Fixed a confusing error message when 
validating an INSERT with incorrect number of arguments in the VALUES statement 
(#7662)
e3981e618ff is described below

commit e3981e618ff9dc1c3866a49487a9e78bfe3b6452
Author: Max Zhuravkov <[email protected]>
AuthorDate: Thu Feb 26 16:50:48 2026 +0200

    IGNITE-27635 Sql. Fixed a confusing error message when validating an INSERT 
with incorrect number of arguments in the VALUES statement (#7662)
---
 .../ignite/internal/sql/engine/ItDmlTest.java      | 29 ++++++++++++++++++++++
 .../sql/engine/prepare/IgniteSqlValidator.java     | 10 +++++++-
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
index 1e39144ac78..f2011008192 100644
--- 
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
+++ 
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDmlTest.java
@@ -1150,6 +1150,35 @@ public class ItDmlTest extends BaseSqlIntegrationTest {
                 .check();
     }
 
+    @Test
+    public void rejectInvalidColumnNumberOnInsert() {
+        sql("CREATE TABLE test1(id INT PRIMARY KEY, val INT);");
+
+        assertThrowsSqlException(
+                Sql.STMT_VALIDATION_ERR,
+                "Number of INSERT target columns (2) does not equal number of 
source items (1)",
+                () -> sql("INSERT INTO test1 VALUES (1)")
+        );
+
+        assertThrowsSqlException(
+                Sql.STMT_VALIDATION_ERR,
+                "Number of INSERT target columns (2) does not equal number of 
source items (3)",
+                () -> sql("INSERT INTO test1 VALUES (1, 2, 3)")
+        );
+
+        assertThrowsSqlException(
+                Sql.STMT_VALIDATION_ERR,
+                "Number of INSERT target columns (1) does not equal number of 
source items (2)",
+                () -> sql("INSERT INTO test1(val) VALUES (1, 2)")
+        );
+
+        assertThrowsSqlException(
+                Sql.STMT_VALIDATION_ERR,
+                "Number of INSERT target columns (2) does not equal number of 
source items (3)",
+                () -> sql("INSERT INTO test1(id, val) VALUES (1, 2, 3)")
+        );
+    }
+
     private static Stream<Arguments> decimalLimits() {
         return Stream.of(
                 arguments(SqlTypeName.BIGINT.getName(), Long.MAX_VALUE, 
Long.MIN_VALUE),
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
index 93df10bd58d..3d37d43b425 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteSqlValidator.java
@@ -241,9 +241,17 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         super.validateQuery(node, scope, targetRowType);
 
         if (node.getKind() == SqlKind.VALUES) {
+            // The type must have been derived at this point.
+            RelDataType valuesType = getValidatedNodeTypeIfKnown(node);
+            if (valuesType == null) {
+                throw new AssertionError("Type for a VALUEs row should have 
been resolved");
+            }
+            if (valuesType.getFieldList().size() != 
targetRowType.getFieldList().size()) {
+                // If rows do not match, a validation error will be risen 
later.
+                return;
+            }
             // Row type for VALUES node derived as least restrictive type 
among all the tuples.
             // We have to make sure that all the tuples indeed match the 
derived type.
-            RelDataType valuesType = deriveType(scope, node);
             for (int i = 0; i < targetRowType.getFieldCount(); i++) {
                 getTypeCoercion().rowTypeCoercion(scope, node, i, 
valuesType.getFieldList().get(i).getType());
             }

Reply via email to