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);
+ }
}