You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2022/12/20 09:01:35 UTC

[ignite] branch master updated: IGNITE-18401 SQL Calcite: Fix numeric literal deserialization - Fixes #10447.

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 61dcd83a606 IGNITE-18401 SQL Calcite: Fix numeric literal deserialization - Fixes #10447.
61dcd83a606 is described below

commit 61dcd83a60668700d99208b3bd3078151cd587c4
Author: Aleksey Plekhanov <pl...@gmail.com>
AuthorDate: Tue Dec 20 11:58:11 2022 +0300

    IGNITE-18401 SQL Calcite: Fix numeric literal deserialization - Fixes #10447.
    
    Signed-off-by: Aleksey Plekhanov <pl...@gmail.com>
---
 .../query/calcite/externalize/RelJson.java         |   3 +
 .../query/calcite/planner/PlannerTest.java         | 216 +++++----------------
 2 files changed, 49 insertions(+), 170 deletions(-)

diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
index 57048ad6c7c..bfb14e02b88 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/externalize/RelJson.java
@@ -72,6 +72,7 @@ import org.apache.calcite.rex.RexVariable;
 import org.apache.calcite.rex.RexWindow;
 import org.apache.calcite.rex.RexWindowBound;
 import org.apache.calcite.rex.RexWindowBounds;
+import org.apache.calcite.runtime.SqlFunctions;
 import org.apache.calcite.sql.JoinConditionType;
 import org.apache.calcite.sql.JoinType;
 import org.apache.calcite.sql.SqlAggFunction;
@@ -531,6 +532,8 @@ class RelJson {
                     literal = toEnum(literal);
                 else if (type.getSqlTypeName().getFamily() == SqlTypeFamily.BINARY)
                     literal = toByteString(literal);
+                else if (type.getSqlTypeName().getFamily() == SqlTypeFamily.NUMERIC && literal instanceof Number)
+                    literal = SqlFunctions.toBigDecimal((Number)literal);
 
                 return rexBuilder.makeLiteral(literal, type, true);
             }
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java
index 8387c0727e7..63f86823a71 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/planner/PlannerTest.java
@@ -142,41 +142,15 @@ public class PlannerTest extends AbstractPlannerTest {
         publicSchema.addTable("DEVELOPER", developer);
         publicSchema.addTable("PROJECT", project);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT d.id, d.name, d.projectId, p.id0, p.ver0 " +
             "FROM PUBLIC.Developer d JOIN (" +
             "SELECT pp.id as id0, pp.ver as ver0 FROM PUBLIC.Project pp" +
             ") p " +
             "ON d.id = p.id0";
 
-        PlanningContext ctx = PlanningContext.builder()
-            .parentContext(BaseQueryContext.builder()
-                .logger(log)
-                .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
-                    .defaultSchema(schema)
-                    .build())
-                .build())
-            .query(sql)
-            .parameters(2)
-            .build();
-
-        assertNotNull(ctx);
-
-        IgniteRel phys = physicalPlan(ctx);
-
-        assertNotNull(phys);
-
-        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
-
-        assertNotNull(plan);
-
-        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
-
-        assertNotNull(plan);
+        IgniteRel phys = physicalPlan(sql, publicSchema);
 
-        assertEquals(2, plan.fragments().size());
+        assertEquals(2, splitPlan(phys).fragments().size());
     }
 
     /**
@@ -249,9 +223,6 @@ public class PlannerTest extends AbstractPlannerTest {
         publicSchema.addTable("DEVELOPER", developer);
         publicSchema.addTable("PROJECT", project);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT d.id, d.name, d.projectId, p.name0, p.ver0 " +
             "FROM PUBLIC.Developer d JOIN (" +
             "SELECT pp.id as id0, pp.name as name0, pp.ver as ver0 FROM PUBLIC.Project pp" +
@@ -259,7 +230,7 @@ public class PlannerTest extends AbstractPlannerTest {
             "ON d.projectId = p.id0 " +
             "WHERE (d.projectId + 1) > ?";
 
-        List<Object[]> res = executeQuery(schema, sql, -10);
+        List<Object[]> res = executeQuery(publicSchema, sql, -10);
 
         assertFalse(res.isEmpty());
 
@@ -321,12 +292,9 @@ public class PlannerTest extends AbstractPlannerTest {
 
         publicSchema.addTable("TEST_TABLE", testTbl);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT (ID0 + ID1) AS RES FROM PUBLIC.TEST_TABLE";
 
-        List<Object[]> res = executeQuery(schema, sql, -10);
+        List<Object[]> res = executeQuery(publicSchema, sql, -10);
 
         assertFalse(res.isEmpty());
 
@@ -337,7 +305,10 @@ public class PlannerTest extends AbstractPlannerTest {
     }
 
     /** */
-    private List<Object[]> executeQuery(SchemaPlus schema, String sql, Object... parameters) throws Exception {
+    private List<Object[]> executeQuery(IgniteSchema publicSchema, String sql, Object... parameters) throws Exception {
+        SchemaPlus schema = createRootSchema(false)
+            .add("PUBLIC", publicSchema);
+
         BaseQueryContext qctx = BaseQueryContext.builder()
             .logger(log)
             .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
@@ -353,13 +324,7 @@ public class PlannerTest extends AbstractPlannerTest {
 
         IgniteRel phys = physicalPlan(ctx);
 
-        assertNotNull(phys);
-
-        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
-
-        assertNotNull(plan);
-
-        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
+        MultiStepPlan plan = splitPlan(phys);
 
         List<Fragment> fragments = plan.fragments();
         assertEquals(2, fragments.size());
@@ -403,6 +368,19 @@ public class PlannerTest extends AbstractPlannerTest {
         return res;
     }
 
+    /** */
+    private MultiStepPlan splitPlan(IgniteRel phys) {
+        assertNotNull(phys);
+
+        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
+
+        assertNotNull(plan);
+
+        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
+
+        return plan;
+    }
+
     /**
      * Transforms fragment to the execution node.
      */
@@ -508,9 +486,6 @@ public class PlannerTest extends AbstractPlannerTest {
         publicSchema.addTable("DEVELOPER", developer);
         publicSchema.addTable("PROJECT", project);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT d.id, (d.id + 1) as id2, d.name, d.projectId, p.id0, p.ver0 " +
             "FROM PUBLIC.Developer d JOIN (" +
             "SELECT pp.id as id0, pp.ver as ver0 FROM PUBLIC.Project pp" +
@@ -518,30 +493,9 @@ public class PlannerTest extends AbstractPlannerTest {
             "ON d.id = p.id0 " +
             "WHERE (d.projectId + 1) > ?";
 
-        PlanningContext ctx = PlanningContext.builder()
-            .parentContext(BaseQueryContext.builder()
-                .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
-                    .defaultSchema(schema)
-                    .build())
-                .logger(log)
-                .build())
-            .query(sql)
-            .parameters(2)
-            .build();
-
-        IgniteRel phys = physicalPlan(ctx);
-
-        assertNotNull(phys);
-
-        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
-
-        assertNotNull(plan);
+        IgniteRel phys = physicalPlan(sql, publicSchema);
 
-        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
-
-        assertNotNull(plan);
-
-        assertEquals(1, plan.fragments().size());
+        assertEquals(1, splitPlan(phys).fragments().size());
     }
 
     /**
@@ -591,9 +545,6 @@ public class PlannerTest extends AbstractPlannerTest {
         publicSchema.addTable("DEVELOPER", developer);
         publicSchema.addTable("PROJECT", project);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT d.id, d.name, d.projectId, p.id0, p.ver0 " +
             "FROM PUBLIC.Developer d JOIN (" +
             "SELECT pp.id as id0, pp.ver as ver0 FROM PUBLIC.Project pp" +
@@ -601,28 +552,9 @@ public class PlannerTest extends AbstractPlannerTest {
             "ON d.id = p.id0 " +
             "WHERE (d.projectId + 1) > ?";
 
-        PlanningContext ctx = PlanningContext.builder()
-            .parentContext(BaseQueryContext.builder()
-                .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
-                    .defaultSchema(schema)
-                    .build())
-                .logger(log)
-                .build())
-            .query(sql)
-            .parameters(2)
-            .build();
-
-        IgniteRel phys = physicalPlan(ctx);
-
-        assertNotNull(phys);
-
-        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
+        IgniteRel phys = physicalPlan(sql, publicSchema);
 
-        assertNotNull(plan);
-
-        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
-
-        assertEquals(3, plan.fragments().size());
+        assertEquals(3, splitPlan(phys).fragments().size());
     }
 
     /**
@@ -671,9 +603,6 @@ public class PlannerTest extends AbstractPlannerTest {
         publicSchema.addTable("DEVELOPER", developer);
         publicSchema.addTable("PROJECT", project);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT d.id, d.name, d.projectId, p.id0, p.ver0 " +
             "FROM PUBLIC.Developer d JOIN (" +
             "SELECT pp.id as id0, pp.ver as ver0 FROM PUBLIC.Project pp" +
@@ -681,30 +610,9 @@ public class PlannerTest extends AbstractPlannerTest {
             "ON d.projectId = p.id0 " +
             "WHERE (d.projectId + 1) > ?";
 
-        PlanningContext ctx = PlanningContext.builder()
-            .parentContext(BaseQueryContext.builder()
-                .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
-                    .defaultSchema(schema)
-                    .build())
-                .logger(log)
-                .build())
-            .query(sql)
-            .parameters(2)
-            .build();
-
-        IgniteRel phys = physicalPlan(ctx);
-
-        assertNotNull(phys);
-
-        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
-
-        assertNotNull(plan);
-
-        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
-
-        assertNotNull(plan);
+        IgniteRel phys = physicalPlan(sql, publicSchema);
 
-        assertEquals(3, plan.fragments().size());
+        assertEquals(3, splitPlan(phys).fragments().size());
     }
 
     /**
@@ -753,9 +661,6 @@ public class PlannerTest extends AbstractPlannerTest {
         publicSchema.addTable("DEVELOPER", developer);
         publicSchema.addTable("PROJECT", project);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT d.id, d.name, d.projectId, p.id0, p.ver0 " +
             "FROM PUBLIC.Developer d JOIN (" +
             "SELECT pp.id as id0, pp.ver as ver0 FROM PUBLIC.Project pp" +
@@ -763,28 +668,9 @@ public class PlannerTest extends AbstractPlannerTest {
             "ON d.projectId = p.id0 " +
             "WHERE (d.projectId + 1) > ?";
 
-        PlanningContext ctx = PlanningContext.builder()
-            .parentContext(BaseQueryContext.builder()
-                .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
-                    .defaultSchema(schema)
-                    .build())
-                .logger(log)
-                .build())
-            .query(sql)
-            .parameters(2)
-            .build();
-
-        IgniteRel phys = physicalPlan(ctx);
-
-        assertNotNull(phys);
-
-        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
-
-        assertNotNull(plan);
-
-        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
+        IgniteRel phys = physicalPlan(sql, publicSchema);
 
-        assertEquals(3, plan.fragments().size());
+        assertEquals(3, splitPlan(phys).fragments().size());
     }
 
     /**
@@ -829,9 +715,6 @@ public class PlannerTest extends AbstractPlannerTest {
         publicSchema.addTable("DEVELOPER", developer);
         publicSchema.addTable("PROJECT", project);
 
-        SchemaPlus schema = createRootSchema(false)
-            .add("PUBLIC", publicSchema);
-
         String sql = "SELECT p.id0, d.id " +
             "FROM PUBLIC.Developer d JOIN (" +
             "SELECT pp.id as id0, pp.ver as ver0 FROM PUBLIC.Project pp" +
@@ -839,30 +722,9 @@ public class PlannerTest extends AbstractPlannerTest {
             "ON d.projectId = p.ver0 " +
             "WHERE (d.projectId + 1) > ?";
 
-        PlanningContext ctx = PlanningContext.builder()
-            .parentContext(BaseQueryContext.builder()
-                .logger(log)
-                .frameworkConfig(newConfigBuilder(FRAMEWORK_CONFIG)
-                    .defaultSchema(schema)
-                    .build())
-                .build())
-            .query(sql)
-            .parameters(2)
-            .build();
-
-        IgniteRel phys = physicalPlan(ctx);
-
-        assertNotNull(phys);
-
-        MultiStepPlan plan = new MultiStepQueryPlan(new QueryTemplate(new Splitter().go(phys)), null, null);
-
-        assertNotNull(plan);
-
-        plan.init(this::intermediateMapping, Commons.mapContext(F.first(nodes), AffinityTopologyVersion.NONE));
-
-        assertNotNull(plan);
+        IgniteRel phys = physicalPlan(sql, publicSchema);
 
-        assertEquals(2, plan.fragments().size());
+        assertEquals(2, splitPlan(phys).fragments().size());
     }
 
     /**
@@ -1122,4 +984,18 @@ public class PlannerTest extends AbstractPlannerTest {
 
         checkSplitAndSerialization(phys, publicSchema);
     }
+
+    /** */
+    @Test
+    public void testFloatSerialization() throws Exception {
+        IgniteSchema publicSchema = new IgniteSchema("PUBLIC");
+
+        IgniteRel phys = physicalPlan("SELECT " + Integer.MAX_VALUE + "::FLOAT, " +
+            Long.MAX_VALUE + "::FLOAT" +
+            "-17014118346046923173168730371588410572::FLOAT" +
+            "-17014118346046923173.168730371588410572::FLOAT",
+            publicSchema);
+
+        checkSplitAndSerialization(phys, publicSchema);
+    }
 }