This is an automated email from the ASF dual-hosted git repository.
ppa pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 92f90927fa IGNITE-23713 Sql. Preserve scale of result type in SUM0
accumulator for DECIMAL type (#4754)
92f90927fa is described below
commit 92f90927faf10abe1738509a4d1433bceef33224
Author: Max Zhuravkov <[email protected]>
AuthorDate: Fri Nov 22 16:30:11 2024 +0200
IGNITE-23713 Sql. Preserve scale of result type in SUM0 accumulator for
DECIMAL type (#4754)
---
.../sql/engine/exec/exp/agg/Accumulators.java | 23 ++++++++++++++++------
.../engine/exec/exp/agg/SumAccumulatorTest.java | 19 ++++++++++++++----
.../exec/exp/agg/SumIsZeroAccumulatorTest.java | 19 ++++++++++++++----
3 files changed, 47 insertions(+), 14 deletions(-)
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java
index ad63934889..f08f73c4b5 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/Accumulators.java
@@ -35,6 +35,8 @@ import org.apache.calcite.avatica.util.ByteString;
import org.apache.calcite.rel.core.AggregateCall;
import org.apache.calcite.rel.type.RelDataType;
import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.ignite.internal.catalog.commands.CatalogUtils;
+import org.apache.ignite.internal.sql.engine.exec.exp.IgniteSqlFunctions;
import org.apache.ignite.internal.sql.engine.type.IgniteCustomType;
import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory;
import org.apache.ignite.internal.sql.engine.util.IgniteMath;
@@ -118,7 +120,7 @@ public class Accumulators {
switch (call.type.getSqlTypeName()) {
case BIGINT:
case DECIMAL:
- return () -> new Sum(new DecimalSumEmptyIsZero());
+ return () -> new Sum(new
DecimalSumEmptyIsZero(call.type.getScale()));
case DOUBLE:
case REAL:
@@ -143,7 +145,7 @@ public class Accumulators {
// Used by REDUCE phase of COUNT aggregate.
return LongSumEmptyIsZero.FACTORY;
case DECIMAL:
- return DecimalSumEmptyIsZero.FACTORY;
+ return () ->
DecimalSumEmptyIsZero.FACTORY.apply(call.type.getScale());
case DOUBLE:
case REAL:
@@ -431,7 +433,6 @@ public class Accumulators {
result.set(null);
}
}
-
}
/** {@inheritDoc} */
@@ -625,7 +626,16 @@ public class Accumulators {
/** SUM(DECIMAL) accumulator. */
public static class DecimalSumEmptyIsZero implements Accumulator {
- public static final Supplier<Accumulator> FACTORY =
DecimalSumEmptyIsZero::new;
+ public static final IntFunction<Accumulator> FACTORY =
DecimalSumEmptyIsZero::new;
+
+ private final int precision;
+
+ private final int scale;
+
+ private DecimalSumEmptyIsZero(int scale) {
+ this.precision = CatalogUtils.MAX_DECIMAL_PRECISION;
+ this.scale = scale;
+ }
/** {@inheritDoc} */
@Override
@@ -650,7 +660,8 @@ public class Accumulators {
if (!state.hasValue()) {
result.set(BigDecimal.ZERO);
} else {
- result.set(state.get());
+ BigDecimal value = (BigDecimal) state.get();
+ result.set(IgniteSqlFunctions.toBigDecimal(value, precision,
scale));
}
}
@@ -663,7 +674,7 @@ public class Accumulators {
/** {@inheritDoc} */
@Override
public RelDataType returnType(IgniteTypeFactory typeFactory) {
- return
typeFactory.createTypeWithNullability(typeFactory.createSqlType(DECIMAL),
false);
+ return
typeFactory.createTypeWithNullability(typeFactory.createSqlType(DECIMAL,
precision, scale), false);
}
}
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumAccumulatorTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumAccumulatorTest.java
index a9a87b1caf..01a7b49930 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumAccumulatorTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumAccumulatorTest.java
@@ -54,8 +54,19 @@ public class SumAccumulatorTest extends
BaseIgniteAbstractTest {
return Stream.of(
Arguments.of(namedAccumulator(DoubleSumEmptyIsZero.FACTORY),
4.0d, new Object[]{3.0d, 1.0d}),
Arguments.of(namedAccumulator(LongSumEmptyIsZero.FACTORY), 4L,
new Object[]{3L, 1L}),
- Arguments.of(namedAccumulator(DecimalSumEmptyIsZero.FACTORY),
new BigDecimal("3.4"),
- new Object[]{new BigDecimal("1.3"), new
BigDecimal("2.1")})
+
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)), new BigDecimal("3.4"),
+ new Object[]{new BigDecimal("1.3"), new
BigDecimal("2.1")}),
+
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)), new BigDecimal("3.4"),
+ new Object[]{new BigDecimal("1.31"), new
BigDecimal("2.13")}),
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)), new BigDecimal("3.5"),
+ new Object[]{new BigDecimal("1.32"), new
BigDecimal("2.13")}),
+
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(2)), new BigDecimal("3.44"),
+ new Object[]{new BigDecimal("1.31"), new
BigDecimal("2.13")}),
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(2)), new BigDecimal("3.45"),
+ new Object[]{new BigDecimal("1.32"), new
BigDecimal("2.13")})
);
}
@@ -71,7 +82,7 @@ public class SumAccumulatorTest extends
BaseIgniteAbstractTest {
return Stream.of(
Arguments.of(namedAccumulator(DoubleSumEmptyIsZero.FACTORY)),
Arguments.of(namedAccumulator(LongSumEmptyIsZero.FACTORY)),
- Arguments.of(namedAccumulator(DecimalSumEmptyIsZero.FACTORY))
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)))
);
}
@@ -81,6 +92,6 @@ public class SumAccumulatorTest extends
BaseIgniteAbstractTest {
private static Named<Accumulator> namedAccumulator(Supplier<Accumulator>
supplier) {
Accumulator accumulator = supplier.get();
- return Named.of(accumulator.getClass().getName(), accumulator);
+ return Named.of(accumulator.getClass().getSimpleName(), accumulator);
}
}
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumIsZeroAccumulatorTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumIsZeroAccumulatorTest.java
index f27db0c851..b08a3a521b 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumIsZeroAccumulatorTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/agg/SumIsZeroAccumulatorTest.java
@@ -54,8 +54,19 @@ public class SumIsZeroAccumulatorTest extends
BaseIgniteAbstractTest {
return Stream.of(
Arguments.of(namedAccumulator(DoubleSumEmptyIsZero.FACTORY),
4.0d, new Object[]{3.0d, 1.0d}),
Arguments.of(namedAccumulator(LongSumEmptyIsZero.FACTORY), 4L,
new Object[]{3L, 1L}),
- Arguments.of(namedAccumulator(DecimalSumEmptyIsZero.FACTORY),
new BigDecimal("3.4"),
- new Object[]{new BigDecimal("1.3"), new
BigDecimal("2.1")})
+
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)), new BigDecimal("3.4"),
+ new Object[]{new BigDecimal("1.3"), new
BigDecimal("2.1")}),
+
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)), new BigDecimal("3.4"),
+ new Object[]{new BigDecimal("1.31"), new
BigDecimal("2.13")}),
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)), new BigDecimal("3.5"),
+ new Object[]{new BigDecimal("1.32"), new
BigDecimal("2.13")}),
+
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(2)), new BigDecimal("3.44"),
+ new Object[]{new BigDecimal("1.31"), new
BigDecimal("2.13")}),
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(2)), new BigDecimal("3.45"),
+ new Object[]{new BigDecimal("1.32"), new
BigDecimal("2.13")})
);
}
@@ -71,7 +82,7 @@ public class SumIsZeroAccumulatorTest extends
BaseIgniteAbstractTest {
return Stream.of(
Arguments.of(namedAccumulator(DoubleSumEmptyIsZero.FACTORY),
0.0d),
Arguments.of(namedAccumulator(LongSumEmptyIsZero.FACTORY), 0L),
- Arguments.of(namedAccumulator(DecimalSumEmptyIsZero.FACTORY),
BigDecimal.ZERO)
+ Arguments.of(namedAccumulator(() ->
DecimalSumEmptyIsZero.FACTORY.apply(1)), BigDecimal.ZERO)
);
}
@@ -81,6 +92,6 @@ public class SumIsZeroAccumulatorTest extends
BaseIgniteAbstractTest {
private static Named<Accumulator> namedAccumulator(Supplier<Accumulator>
supplier) {
Accumulator accumulator = supplier.get();
- return Named.of(accumulator.getClass().getName(), accumulator);
+ return Named.of(accumulator.getClass().getSimpleName(), accumulator);
}
}