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()");