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 <kor...@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