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

Reply via email to