You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by tl...@apache.org on 2021/04/29 12:00:21 UTC

[ignite] branch sql-calcite updated: IGNITE-14543 Calcite engine. Supports aggregate functions on scalar values

This is an automated email from the ASF dual-hosted git repository.

tledkov pushed a commit to branch sql-calcite
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/sql-calcite by this push:
     new aed0833  IGNITE-14543 Calcite engine. Supports aggregate functions on scalar values
aed0833 is described below

commit aed083346eb16da1bcb23f3249ed15c5f5195cf9
Author: korlov42 <ko...@gridgain.com>
AuthorDate: Thu Apr 29 14:59:55 2021 +0300

    IGNITE-14543 Calcite engine. Supports aggregate functions on scalar values
---
 .../query/calcite/exec/exp/agg/Accumulators.java   |   2 +
 .../calcite/exec/exp/agg/AccumulatorsFactory.java  |   5 +-
 .../query/calcite/AggregatesIntegrationTest.java   |   1 +
 .../aggregates/test_aggregate_types_scalar.test    |  45 ++++++---
 .../test_aggregate_types_scalar.test_ignored       | 112 +++++++++++++++++++++
 .../test/sql/aggregate/aggregates/test_avg.test    |  11 +-
 .../{test_avg.test => test_avg.test_ignored}       |  25 ++++-
 .../test/sql/aggregate/aggregates/test_count.test  |   6 +-
 .../aggregate/aggregates/test_count.test_ignore    |   1 -
 9 files changed, 184 insertions(+), 24 deletions(-)

diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java
index f9a0511..332d731 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/Accumulators.java
@@ -120,6 +120,7 @@ public class Accumulators {
                 return DecimalMinMax.MIN_FACTORY;
             case INTEGER:
                 return IntMinMax.MIN_FACTORY;
+            case CHAR:
             case VARCHAR:
                 return VarCharMinMax.MIN_FACTORY;
             case BIGINT:
@@ -139,6 +140,7 @@ public class Accumulators {
                 return DecimalMinMax.MAX_FACTORY;
             case INTEGER:
                 return IntMinMax.MAX_FACTORY;
+            case CHAR:
             case VARCHAR:
                 return VarCharMinMax.MAX_FACTORY;
             case BIGINT:
diff --git a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java
index afc803c..3b8e5a6 100644
--- a/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java
+++ b/modules/calcite/src/main/java/org/apache/ignite/internal/processors/query/calcite/exec/exp/agg/AccumulatorsFactory.java
@@ -97,9 +97,12 @@ public class AccumulatorsFactory<Row> implements Supplier<List<AccumulatorWrappe
         Class<?> fromType = Primitives.wrap((Class<?>)typeFactory.getJavaClass(from));
         Class<?> toType = Primitives.wrap((Class<?>)typeFactory.getJavaClass(to));
 
-        if (fromType == toType)
+        if (toType.isAssignableFrom(fromType))
             return Function.identity();
 
+        if (Void.class == toType)
+            return o -> null;
+
         return compileCast(typeFactory, from, to);
     }
 
diff --git a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java
index 5eb8649..f55d5d8 100644
--- a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java
+++ b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/AggregatesIntegrationTest.java
@@ -31,6 +31,7 @@ public class AggregatesIntegrationTest extends AbstractBasicIntegrationTest {
         assertQuery("select count(name) from person").returns(4L).check();
         assertQuery("select count(*) from person").returns(5L).check();
         assertQuery("select count(1) from person").returns(5L).check();
+        assertQuery("select count(null) from person").returns(0L).check();
 
         assertQuery("select count(*) from person where salary < 0").returns(0L).check();
         assertQuery("select count(*) from person where salary < 0 and salary > 0").returns(0L).check();
diff --git a/modules/calcite/src/test/sql/aggregate/aggregates/test_aggregate_types_scalar.test b/modules/calcite/src/test/sql/aggregate/aggregates/test_aggregate_types_scalar.test
index 9d9015b..89e5910 100644
--- a/modules/calcite/src/test/sql/aggregate/aggregates/test_aggregate_types_scalar.test
+++ b/modules/calcite/src/test/sql/aggregate/aggregates/test_aggregate_types_scalar.test
@@ -2,10 +2,29 @@
 # description: Test scalar aggregates with many different types
 # group: [aggregates]
 
+query IIIII
+SELECT COUNT(1), COUNT(*), COUNT(NULL), COUNT('hello'), COUNT(DATE '1992-02-02')
+----
+1
+1
+0
+1
+1
+
 statement error
 SELECT COUNT(1, 2)
 
 statement error
+SELECT COUNT()
+
+query RRR
+SELECT SUM(1), SUM(NULL), SUM(33.3)
+----
+1.000000
+NULL
+33.300000
+
+statement error
 SELECT SUM(True)
 
 statement error
@@ -20,23 +39,32 @@ SELECT SUM()
 statement error
 SELECT SUM(1, 2)
 
+query IIRTTTT
+SELECT MIN(1), MIN(NULL), MIN(33.3), MIN('hello'), MIN(True), MIN(DATE '1992-02-02'), MIN(TIMESTAMP '2008-01-01 00:00:01')
+----
+1	NULL	33.300000	hello	true	1992-02-02	2008-01-01 00:00:01.0
+
 statement error
 SELECT MIN()
 
 statement error
 SELECT MIN(1, 2)
 
+query IIRTTTT
+SELECT MAX(1), MAX(NULL), MAX(33.3), MAX('hello'), MAX(True), MAX(DATE '1992-02-02'), MAX(TIMESTAMP '2008-01-01 00:00:01')
+----
+1	NULL	33.300000	hello	true	1992-02-02	2008-01-01 00:00:01.0
+
 statement error
 SELECT MAX()
 
 statement error
 SELECT MAX(1, 2)
 
-statement error
-SELECT FIRST()
-
-statement error
-SELECT FIRST(1, 2)
+query RRR
+SELECT AVG(1), AVG(NULL), AVG(33.3)
+----
+1.000000	NULL	33.300000
 
 statement error
 SELECT AVG(True)
@@ -52,10 +80,3 @@ SELECT AVG()
 
 statement error
 SELECT AVG(1, 2)
-
-statement error
-SELECT STRING_AGG()
-
-statement error
-SELECT STRING_AGG(1, 2, 3)
-
diff --git a/modules/calcite/src/test/sql/aggregate/aggregates/test_aggregate_types_scalar.test_ignored b/modules/calcite/src/test/sql/aggregate/aggregates/test_aggregate_types_scalar.test_ignored
new file mode 100644
index 0000000..0c5156f
--- /dev/null
+++ b/modules/calcite/src/test/sql/aggregate/aggregates/test_aggregate_types_scalar.test_ignored
@@ -0,0 +1,112 @@
+# name: test/sql/aggregate/aggregates/test_aggregate_types_scalar.test
+# description: Test scalar aggregates with many different types
+# group: [aggregates]
+# Ignore: https://issues.apache.org/jira/browse/IGNITE-14597
+# Ignore: https://issues.apache.org/jira/browse/IGNITE-14636
+
+query IIIII
+SELECT COUNT(1), COUNT(*), COUNT(NULL), COUNT('hello'), COUNT(DATE '1992-02-02')
+----
+1
+1
+0
+1
+1
+
+statement error
+SELECT COUNT(1, 2)
+
+statement error
+SELECT COUNT()
+
+query RRR
+SELECT SUM(1), SUM(NULL), SUM(33.3)
+----
+1.000000
+NULL
+33.300000
+
+statement error
+SELECT SUM(True)
+
+statement error
+SELECT SUM('hello')
+
+statement error
+SELECT SUM(DATE '1992-02-02')
+
+statement error
+SELECT SUM()
+
+statement error
+SELECT SUM(1, 2)
+
+query IIRTTTT
+SELECT MIN(1), MIN(NULL), MIN(33.3), MIN('hello'), MIN(True), MIN(DATE '1992-02-02'), MIN(TIMESTAMP '2008-01-01 00:00:01')
+----
+1	NULL	33.300000	hello	true	1992-02-02	2008-01-01 00:00:01.0
+
+statement error
+SELECT MIN()
+
+statement error
+SELECT MIN(1, 2)
+
+query IIRTTTT
+SELECT MAX(1), MAX(NULL), MAX(33.3), MAX('hello'), MAX(True), MAX(DATE '1992-02-02'), MAX(TIMESTAMP '2008-01-01 00:00:01')
+----
+1	NULL	33.300000	hello	true	1992-02-02	2008-01-01 00:00:01.0
+
+statement error
+SELECT MAX()
+
+statement error
+SELECT MAX(1, 2)
+
+query IIRTTTT
+SELECT FIRST(1), FIRST(NULL), FIRST(33.3), FIRST('hello'), FIRST(True), FIRST(DATE '1992-02-02'), FIRST(TIMESTAMP '2008-01-01 00:00:01')
+----
+1	NULL	33.300000	hello	true	1992-02-02	2008-01-01 00:00:01.0
+
+statement error
+SELECT FIRST()
+
+statement error
+SELECT FIRST(1, 2)
+
+query RRR
+SELECT AVG(1), AVG(NULL), AVG(33.3)
+----
+1.000000	NULL	33.300000
+
+statement error
+SELECT AVG(True)
+
+statement error
+SELECT AVG('hello')
+
+statement error
+SELECT AVG(DATE '1992-02-02')
+
+statement error
+SELECT AVG()
+
+statement error
+SELECT AVG(1, 2)
+
+query T
+SELECT STRING_AGG('hello')
+----
+hello
+
+query TTTTT
+SELECT STRING_AGG('hello', ' '), STRING_AGG('hello', NULL), STRING_AGG(NULL, ' '), STRING_AGG(NULL, NULL), STRING_AGG('', '')
+----
+hello	NULL	NULL	NULL	(empty)
+
+statement error
+SELECT STRING_AGG()
+
+statement error
+SELECT STRING_AGG(1, 2, 3)
+
diff --git a/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test b/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test
index f181816..de36129 100644
--- a/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test
+++ b/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test
@@ -3,10 +3,11 @@
 # group: [aggregates]
 
 # scalar average
-query R
-SELECT AVG(3)
+query RR
+SELECT AVG(3), AVG(NULL)
 ----
 3
+NULL
 
 statement ok
 CREATE TABLE integers(i INTEGER);
@@ -14,11 +15,13 @@ CREATE TABLE integers(i INTEGER);
 statement ok
 INSERT INTO integers VALUES (1), (2), (3)
 
-query RR
-SELECT AVG(i), AVG(1) FROM integers
+query RRRR
+SELECT AVG(i), AVG(1), AVG(DISTINCT i), AVG(NULL) FROM integers
 ----
 2
 1
+2
+NULL
 
 query R
 SELECT AVG(i) FROM integers WHERE i > 100
diff --git a/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test b/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test_ignored
similarity index 64%
copy from modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test
copy to modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test_ignored
index f181816..bf32a26 100644
--- a/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test
+++ b/modules/calcite/src/test/sql/aggregate/aggregates/test_avg.test_ignored
@@ -3,10 +3,25 @@
 # group: [aggregates]
 
 # scalar average
-query R
-SELECT AVG(3)
+query RR
+SELECT AVG(3), AVG(NULL)
 ----
 3
+NULL
+
+# test average on sequence
+statement ok
+CREATE SEQUENCE seq;
+
+query R
+SELECT AVG(nextval('seq'))
+----
+1
+
+query R
+SELECT AVG(nextval('seq'))
+----
+2
 
 statement ok
 CREATE TABLE integers(i INTEGER);
@@ -14,11 +29,13 @@ CREATE TABLE integers(i INTEGER);
 statement ok
 INSERT INTO integers VALUES (1), (2), (3)
 
-query RR
-SELECT AVG(i), AVG(1) FROM integers
+query RRRR
+SELECT AVG(i), AVG(1), AVG(DISTINCT i), AVG(NULL) FROM integers
 ----
 2
 1
+2
+NULL
 
 query R
 SELECT AVG(i) FROM integers WHERE i > 100
diff --git a/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test b/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test
index aa4bd5c..d7de275 100644
--- a/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test
+++ b/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test
@@ -3,12 +3,14 @@
 # group: [aggregates]
 
 # test counts on scalar values
-query III
-SELECT COUNT(1), COUNT(100), COUNT(DISTINCT 1)
+query IIIII
+SELECT COUNT(*), COUNT(1), COUNT(100), COUNT(NULL), COUNT(DISTINCT 1)
 ----
 1
 1
 1
+0
+1
 
 # test counts on a set of values
 statement ok
diff --git a/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test_ignore b/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test_ignore
index 1d63f01..e3d5b22 100644
--- a/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test_ignore
+++ b/modules/calcite/src/test/sql/aggregate/aggregates/test_count.test_ignore
@@ -1,7 +1,6 @@
 # name: test/sql/aggregate/aggregates/test_count.test
 # description: Test COUNT operator
 # group: [aggregates]
-# Ignored: https://issues.apache.org/jira/browse/IGNITE-14543
 # Ignored: https://issues.apache.org/jira/browse/IGNITE-14544
 
 # test counts on scalar values