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

Reply via email to