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 83462822182 IGNITE-24378 SQL Calcite: Fix query validation failure 
with a dynamic parameter - Fixes #11846.
83462822182 is described below

commit 8346282218210e64720c149fc60809550efd4d03
Author: Vladimir Steshin <[email protected]>
AuthorDate: Tue Feb 11 17:21:28 2025 +0300

    IGNITE-24378 SQL Calcite: Fix query validation failure with a dynamic 
parameter - Fixes #11846.
    
    Signed-off-by: Aleksey Plekhanov <[email protected]>
---
 .../query/calcite/prepare/IgniteSqlValidator.java         | 15 ++++++++++-----
 .../integration/DynamicParametersIntegrationTest.java     |  9 +++++++++
 .../processors/query/h2/sql/GridQueryParsingTest.java     |  3 +++
 3 files changed, 22 insertions(+), 5 deletions(-)

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 91fe45db4b3..bff504653c4 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
@@ -105,6 +105,9 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
     /** Dynamic parameters. */
     @Nullable private final Object[] parameters;
 
+    /** */
+    private final RelDataType nullType;
+
     /**
      * Creates a validator.
      *
@@ -124,6 +127,8 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
         super(opTab, catalogReader, typeFactory, cfg);
 
         this.parameters = parameters;
+
+        nullType = typeFactory.createSqlType(SqlTypeName.NULL);
     }
 
     /** {@inheritDoc} */
@@ -543,7 +548,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
     /** {@inheritDoc} */
     @Override public RelDataType deriveType(SqlValidatorScope scope, SqlNode 
expr) {
         if (expr instanceof SqlDynamicParam) {
-            RelDataType type = 
deriveDynamicParameterType((SqlDynamicParam)expr);
+            RelDataType type = 
deriveDynamicParameterType((SqlDynamicParam)expr, nullType);
 
             if (type != null)
                 return type;
@@ -553,7 +558,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
     }
 
     /** @return A derived type or {@code null} if unable to determine. */
-    @Nullable private RelDataType deriveDynamicParameterType(SqlDynamicParam 
node) {
+    @Nullable private RelDataType deriveDynamicParameterType(SqlDynamicParam 
node, RelDataType nullValType) {
         RelDataType type = getValidatedNodeTypeIfKnown(node);
 
         // Do not clarify the widest type for any value.
@@ -569,7 +574,7 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
             return type;
 
         type = val == null
-            ? typeFactory.createSqlType(SqlTypeName.NULL)
+            ? typeFactory().createTypeWithNullability(nullValType, true)
             : 
typeFactory().createTypeWithNullability(typeFactory().toSql(typeFactory().createType(val.getClass())),
 true);
 
         setValidatedNodeType(node, type);
@@ -579,8 +584,8 @@ public class IgniteSqlValidator extends SqlValidatorImpl {
 
     /** {@inheritDoc} */
     @Override protected void inferUnknownTypes(RelDataType inferredType, 
SqlValidatorScope scope, SqlNode node) {
-        if (node instanceof SqlDynamicParam && unknownType.equals(inferredType)
-            && deriveDynamicParameterType((SqlDynamicParam)node) != null)
+        if (node instanceof SqlDynamicParam && !(inferredType instanceof 
OtherType)
+            && deriveDynamicParameterType((SqlDynamicParam)node, 
unknownType.equals(inferredType) ? nullType : inferredType) != null)
             return;
 
         if (node instanceof SqlCall) {
diff --git 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/DynamicParametersIntegrationTest.java
 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/DynamicParametersIntegrationTest.java
index cbfc657123e..af3f92dd25b 100644
--- 
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/DynamicParametersIntegrationTest.java
+++ 
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/DynamicParametersIntegrationTest.java
@@ -105,6 +105,15 @@ public class DynamicParametersIntegrationTest extends 
AbstractBasicIntegrationTe
     /** */
     @Test
     public void testDynamicParameters() {
+        assertQuery("select 1 + ?").withParams(1).returns(2).check();
+        assertQuery("select ? + 1").withParams(1).returns(2).check();
+        assertQuery("select 1 + CAST(? AS 
INTEGER)").withParams(2L).returns(3).check();
+        assertQuery("select CAST(? AS INTEGER) + 
1").withParams(2L).returns(3).check();
+        assertQuery("select 1 + ?").withParams(1L).returns(2L).check();
+        assertQuery("select ? + 1").withParams(1L).returns(2L).check();
+        assertQuery("select 1 + ?").withParams(new 
BigDecimal("2")).returns(new BigDecimal(3)).check();
+        assertQuery("select ? + 1").withParams(new 
BigDecimal("2")).returns(new BigDecimal(3)).check();
+
         assertQuery("SELECT COALESCE(?, ?)").withParams("a", 
10).returns("a").check();
         assertQuery("SELECT COALESCE(null, 
?)").withParams(13).returns(13).check();
         assertQuery("SELECT 
LOWER(?)").withParams("ASD").returns("asd").check();
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
index ec08ff5dac1..71f290d54cf 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/sql/GridQueryParsingTest.java
@@ -145,6 +145,9 @@ public class GridQueryParsingTest extends 
AbstractIndexingCommonTest {
         checkQuery("select (select 1)");
         checkQuery("select (select 1, select ?)");
         checkQuery("select ((select 1), select ? + ?)");
+        checkQuery("select 1 + ?");
+        checkQuery("select ? + 1");
+        checkQuery("select ? + ?");
         checkQuery("select CURRENT_DATE");
         checkQuery("select CURRENT_DATE()");
 

Reply via email to