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 77d5ce85579 IGNITE-15559 SQL Calcite: Fixed cast numbers to boolean
error - Fixes #10412.
77d5ce85579 is described below
commit 77d5ce85579220c4044e964285d6bb1978b89081
Author: Aleksey Plekhanov <[email protected]>
AuthorDate: Fri Dec 2 10:20:53 2022 +0300
IGNITE-15559 SQL Calcite: Fixed cast numbers to boolean error - Fixes
#10412.
Signed-off-by: Aleksey Plekhanov <[email protected]>
---
.../query/calcite/exec/exp/ConverterUtils.java | 13 ++
.../query/calcite/type/IgniteTypeFactory.java | 7 +
.../query/calcite/integration/FunctionsTest.java | 25 ++++
.../src/test/sql/cast/test_boolean_cast.test | 21 +++
.../test/sql/cast/test_boolean_cast.test_ignore | 160 ---------------------
5 files changed, 66 insertions(+), 160 deletions(-)
diff --git
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java
index acaec2154b8..6ddf9855a85 100644
---
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java
+++
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/ConverterUtils.java
@@ -262,6 +262,19 @@ public class ConverterUtils {
}
}
if (toPrimitive != null) {
+ if (toPrimitive == Primitive.BOOLEAN) {
+ if (fromPrimitive != null)
+ return Expressions.notEqual(operand,
Expressions.constant(0));
+
+ if (fromNumber) {
+ // Construct "SqlFunctions.ne(val, Number.valueOf(0))"
expression.
+ return Expressions.call(SqlFunctions.class, "ne", operand,
+ Expressions.call(fromType, "valueOf",
Expressions.constant(0)));
+ }
+
+ return Expressions.call(SqlFunctions.class, "toBoolean",
operand);
+ }
+
if (fromPrimitive != null) {
// E.g. from "float" to "double"
return Expressions.convert_(
diff --git
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeFactory.java
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeFactory.java
index d2ca9a6b3ca..744fea9c052 100644
---
a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeFactory.java
+++
b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/type/IgniteTypeFactory.java
@@ -333,4 +333,11 @@ public class IgniteTypeFactory extends JavaTypeFactoryImpl
{
return true;
}
+
+ /** {@inheritDoc} */
+ @Override public RelDataType createUnknownType() {
+ // TODO workaround for
https://issues.apache.org/jira/browse/CALCITE-5297
+ // Remove this after update to Calcite 1.33.
+ return createTypeWithNullability(super.createUnknownType(), true);
+ }
}
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java
index 7d27d4a156e..c6939c31d92 100644
---
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java
+++
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/integration/FunctionsTest.java
@@ -289,4 +289,29 @@ public class FunctionsTest extends
AbstractBasicIntegrationTest {
assertQuery("SELECT ?").withParams("asd").returns("asd").check();
assertQuery("SELECT coalesce(?, ?)").withParams("a",
10).returns("a").check();
}
+
+ /** */
+ @Test
+ public void testCastToBoolean() {
+ assertQuery("SELECT CAST(CAST(null AS DOUBLE) AS
BOOLEAN)").returns(NULL_RESULT).check();
+ assertQuery("SELECT CAST(CAST('1' AS DOUBLE) AS
BOOLEAN)").returns(true).check();
+ assertQuery("SELECT CAST(1.0 AS BOOLEAN)").returns(true).check();
+ assertQuery("SELECT CAST(0.1 AS BOOLEAN)").returns(true).check();
+ assertQuery("SELECT CAST(1 AS BOOLEAN)").returns(true).check();
+ assertQuery("SELECT CAST(CAST('0' AS DOUBLE) AS
BOOLEAN)").returns(false).check();
+ assertQuery("SELECT CAST(0.0 AS BOOLEAN)").returns(false).check();
+ assertQuery("SELECT CAST(0 AS BOOLEAN)").returns(false).check();
+ assertQuery("SELECT CAST(CAST(? AS INT) AS
BOOLEAN)").withParams(0).returns(false).check();
+ assertQuery("SELECT CAST(CAST(? AS INT) AS
BOOLEAN)").withParams(1).returns(true).check();
+ assertQuery("SELECT CAST(CAST(? AS INT) AS
BOOLEAN)").withParams(NULL_RESULT).returns(NULL_RESULT).check();
+ assertQuery("SELECT CAST(CAST(? AS DOUBLE) AS
BOOLEAN)").withParams(0.0d).returns(false).check();
+ assertQuery("SELECT CAST(CAST(? AS DOUBLE) AS
BOOLEAN)").withParams(1.0d).returns(true).check();
+ assertQuery("SELECT CAST(CAST(? AS DOUBLE) AS
BOOLEAN)").withParams(NULL_RESULT).returns(NULL_RESULT).check();
+ assertQuery("SELECT CAST(CAST(? AS DECIMAL(2, 1)) AS BOOLEAN)")
+ .withParams(BigDecimal.valueOf(0, 1)).returns(false).check();
+ assertQuery("SELECT CAST(CAST(? AS DECIMAL(2, 1)) AS BOOLEAN)")
+ .withParams(BigDecimal.valueOf(10, 1)).returns(true).check();
+ assertQuery("SELECT CAST(CAST(? AS DECIMAL(2, 1)) AS BOOLEAN)")
+ .withParams(NULL_RESULT).returns(NULL_RESULT).check();
+ }
}
diff --git a/modules/calcite/src/test/sql/cast/test_boolean_cast.test
b/modules/calcite/src/test/sql/cast/test_boolean_cast.test
index d72fde4f144..5f79699099b 100644
--- a/modules/calcite/src/test/sql/cast/test_boolean_cast.test
+++ b/modules/calcite/src/test/sql/cast/test_boolean_cast.test
@@ -128,3 +128,24 @@ query T
SELECT CAST(CAST('0' AS decimal(38,0)) AS BOOLEAN)
----
false
+
+query T
+SELECT CAST(CAST('1' AS float) AS BOOLEAN)
+----
+true
+
+query T
+SELECT CAST(CAST('0' AS float) AS BOOLEAN)
+----
+false
+
+query T
+SELECT CAST(CAST('1' AS double) AS BOOLEAN)
+----
+true
+
+query T
+SELECT CAST(CAST('0' AS double) AS BOOLEAN)
+----
+false
+
diff --git a/modules/calcite/src/test/sql/cast/test_boolean_cast.test_ignore
b/modules/calcite/src/test/sql/cast/test_boolean_cast.test_ignore
deleted file mode 100644
index 79812020a6f..00000000000
--- a/modules/calcite/src/test/sql/cast/test_boolean_cast.test_ignore
+++ /dev/null
@@ -1,160 +0,0 @@
-# name: test/sql/cast/test_boolean_cast.test
-# description: Test boolean casts
-# group: [cast]
-# Ignored with https://issues.apache.org/jira/browse/IGNITE-15559
-
-statement ok
-PRAGMA enable_verification
-
-query T
-SELECT CAST(1=1 AS VARCHAR)
-----
-TRUE
-
-query T
-SELECT CAST(1=0 AS VARCHAR)
-----
-FALSE
-
-query T
-SELECT CAST('true' AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST('TRUE' AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST('false' AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST('FALSE' AS BOOLEAN)
-----
-false
-
-statement error
-SELECT CAST('12345' AS BOOLEAN)
-
-query T
-SELECT CAST(CAST('12345' AS INTEGER) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS INTEGER) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS tinyint) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS tinyint) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS smallint) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS smallint) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS integer) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS integer) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS bigint) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS bigint) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS decimal) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS decimal) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS decimal(1,0)) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS decimal(1,0)) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS decimal(9,0)) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS decimal(9,0)) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS decimal(38,0)) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS decimal(38,0)) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS float) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS float) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS double) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS double) AS BOOLEAN)
-----
-false
-
-query T
-SELECT CAST(CAST('1' AS HUGEINT) AS BOOLEAN)
-----
-true
-
-query T
-SELECT CAST(CAST('0' AS HUGEINT) AS BOOLEAN)
-----
-false