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 fbe35cc641 IGNITE-20725 Sql. Fix TRUNCATE function (#2887)
fbe35cc641 is described below
commit fbe35cc64165fa4e45e172130d1d6f3a8afee71b
Author: Max Zhuravkov <[email protected]>
AuthorDate: Mon Dec 4 16:25:48 2023 +0200
IGNITE-20725 Sql. Fix TRUNCATE function (#2887)
---
.../internal/sql/engine/ItFunctionsTest.java | 66 +++++++++-
.../internal/sql/engine/ItSqlOperatorsTest.java | 3 +-
.../sql/engine/exec/exp/IgniteSqlFunctions.java | 97 ++++++++++++++-
.../internal/sql/engine/exec/exp/RexImpTable.java | 11 +-
.../sql/engine/sql/fun/IgniteSqlOperatorTable.java | 51 ++++----
.../internal/sql/engine/util/IgniteMethod.java | 7 +-
.../engine/exec/exp/IgniteSqlFunctionsTest.java | 133 ++++++++++++++++++++-
7 files changed, 333 insertions(+), 35 deletions(-)
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
index ee103610b8..e947a3f80a 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
@@ -359,7 +359,7 @@ public class ItFunctionsTest extends BaseSqlIntegrationTest
{
@ParameterizedTest(name = "{0}")
@MethodSource("integralTypes")
- public void testIntType(ParseNum parse, MetadataMatcher matcher) {
+ public void testRoundIntTypes(ParseNum parse, MetadataMatcher matcher) {
String v1 = parse.value("42");
String v2 = parse.value("45");
String v3 = parse.value("47");
@@ -393,9 +393,13 @@ public class ItFunctionsTest extends
BaseSqlIntegrationTest {
@MethodSource("nonIntegerTypes")
public void testRoundNonIntegralTypes(ParseNum parse, MetadataMatcher
round1, MetadataMatcher round2) {
String v1 = parse.value("42.123");
- String v2 = parse.value("45.123");
+ String v2 = parse.value("45.000");
String v3 = parse.value("47.123");
+ assertQuery(format("SELECT ROUND(1.5::{})", parse.typeName))
+ .returns(parse.apply("2"))
+ .check();
+
assertQuery(format("SELECT ROUND({}), ROUND({}, 0)", v1, v1))
.returns(parse.apply("42"), parse.apply("42.000"))
.columnMetadata(round1, round2)
@@ -421,6 +425,64 @@ public class ItFunctionsTest extends
BaseSqlIntegrationTest {
.check();
}
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("integralTypes")
+ public void testTruncateIntTypes(ParseNum parse, MetadataMatcher matcher) {
+ String v1 = parse.value("42");
+ String v2 = parse.value("45");
+ String v3 = parse.value("47");
+
+ assertQuery(format("SELECT TRUNCATE({}), TRUNCATE({}, 0)", v1, v1))
+ .returns(parse.apply("42"), parse.apply("42"))
+ .columnMetadata(matcher, matcher)
+ .check();
+
+ String query = format(
+ "SELECT TRUNCATE({}, -2), TRUNCATE({}, -1), TRUNCATE({}, -1),
TRUNCATE({}, -1)",
+ v1, v1, v2, v3);
+
+ assertQuery(query)
+ .returns(parse.apply("0"), parse.apply("40"),
parse.apply("40"), parse.apply("40"))
+ .columnMetadata(matcher, matcher, matcher, matcher)
+ .check();
+ }
+
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("nonIntegerTypes")
+ public void testTruncateNonIntegralTypes(ParseNum parse, MetadataMatcher
round1, MetadataMatcher round2) {
+ String v1 = parse.value("42.123");
+ String v2 = parse.value("45.000");
+ String v3 = parse.value("47.123");
+
+ assertQuery(format("SELECT TRUNCATE(1.6::{})", parse.typeName))
+ .returns(parse.apply("1"))
+ .check();
+
+ assertQuery(format("SELECT TRUNCATE({}), TRUNCATE({}, 0)", v1, v1))
+ .returns(parse.apply("42"), parse.apply("42.000"))
+ .columnMetadata(round1, round2)
+ .check();
+
+ assertQuery(format("SELECT TRUNCATE({}, -2), TRUNCATE({}, -1),
TRUNCATE({}, -1), TRUNCATE({}, -1)", v1, v1, v2, v3))
+ .returns(parse.apply("0.000"), parse.apply("40.000"),
parse.apply("40.000"), parse.apply("40.000"))
+ .columnMetadata(round2, round2, round2, round2)
+ .check();
+
+ String v4 = parse.value("1.123");
+
+ assertQuery(format("SELECT TRUNCATE({}, s) FROM (VALUES (-2), (-1),
(0), (1), (2), (3), (4), (100) ) t(s)", v4))
+ .returns(parse.apply("0.000"))
+ .returns(parse.apply("0.000"))
+ .returns(parse.apply("1.000"))
+ .returns(parse.apply("1.100"))
+ .returns(parse.apply("1.120"))
+ .returns(parse.apply("1.123"))
+ .returns(parse.apply("1.123"))
+ .returns(parse.apply("1.123"))
+ .columnMetadata(round2)
+ .check();
+ }
+
private static Stream<Arguments> nonIntegerTypes() {
MetadataMatcher matchFloat = new
MetadataMatcher().type(ColumnType.FLOAT);
MetadataMatcher matchDouble = new
MetadataMatcher().type(ColumnType.DOUBLE);
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
index add835868e..420b7046a4 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
@@ -200,8 +200,7 @@ public class ItSqlOperatorsTest extends
BaseSqlIntegrationTest {
assertExpression("SINH(1)").returns(Math.sinh(1)).check();
assertExpression("TAN(1)").returns(Math.tan(1)).check();
assertExpression("TANH(1)").returns(Math.tanh(1)).check();
- // TODO https://issues.apache.org/jira/browse/IGNITE-20725
- //
assertExpression("TRUNCATE(1.7)").returns(BigDecimal.valueOf(1)).check();
+
assertExpression("TRUNCATE(1.7)").returns(BigDecimal.valueOf(1)).check();
assertExpression("PI").returns(Math.PI).check();
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
index da90432e0f..cbf1f537c5 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java
@@ -220,7 +220,6 @@ public class IgniteSqlFunctions {
/** SQL {@code ROUND} operator applied to BigDecimal values. */
public static BigDecimal sround(BigDecimal b0, int b1) {
- // b0.movePointRight(b1).setScale(0,
RoundingMode.DOWN).movePointLeft(b1);
int originalScale = b0.scale();
if (b1 >= originalScale) {
@@ -232,6 +231,99 @@ public class IgniteSqlFunctions {
return roundedValue.setScale(originalScale, RoundingMode.UNNECESSARY);
}
+ // TRUNCATE function
+
+ /** SQL {@code TRUNCATE} operator applied to byte values. */
+ public static byte struncate(byte b0) {
+ return (byte) struncate(b0, 0);
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to byte values. */
+ public static byte struncate(byte b0, int b1) {
+ return (byte) struncate((int) b0, b1);
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to short values. */
+ public static byte struncate(short b0) {
+ return (byte) struncate(b0, 0);
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to short values. */
+ public static short struncate(short b0, int b1) {
+ return (short) struncate((int) b0, b1);
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to int values. */
+ public static int struncate(int b0) {
+ return sround(b0, 0);
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to int values. */
+ public static int struncate(int b0, int b1) {
+ if (b1 == 0) {
+ return b0;
+ } else if (b1 > 0) {
+ return b0;
+ } else {
+ return (int) struncate((long) b0, b1);
+ }
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to long values. */
+ public static long struncate(long b0) {
+ return sround(b0, 0);
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to long values. */
+ public static long struncate(long b0, int b1) {
+ if (b1 == 0) {
+ return b0;
+ } else if (b1 > 0) {
+ return b0;
+ } else {
+ long abs = (long) Math.pow(10, Math.abs(b1));
+ return divide(b0, abs, RoundingMode.DOWN) * abs;
+ }
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to double values. */
+ public static double struncate(double b0) {
+ return struncate(BigDecimal.valueOf(b0)).doubleValue();
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to double values. */
+ public static double struncate(double b0, int b1) {
+ return struncate(BigDecimal.valueOf(b0), b1).doubleValue();
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to float values. */
+ public static float struncate(float b0) {
+ return struncate(BigDecimal.valueOf(b0)).floatValue();
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to float values. */
+ public static float struncate(float b0, int b1) {
+ return struncate(BigDecimal.valueOf(b0), b1).floatValue();
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to BigDecimal values. */
+ public static BigDecimal struncate(BigDecimal b0) {
+ return b0.setScale(0, RoundingMode.DOWN);
+ }
+
+ /** SQL {@code TRUNCATE} operator applied to BigDecimal values. */
+ public static BigDecimal struncate(BigDecimal b0, int b1) {
+ int originalScale = b0.scale();
+
+ if (b1 >= originalScale) {
+ return b0;
+ }
+
+ BigDecimal roundedValue = b0.setScale(b1, RoundingMode.DOWN);
+ // Pad with zeros to match the original scale
+ return roundedValue.setScale(originalScale, RoundingMode.UNNECESSARY);
+ }
+
/** CAST(DOUBLE AS DECIMAL). */
public static BigDecimal toBigDecimal(double val, int precision, int
scale) {
return toBigDecimal((Double) val, precision, scale);
@@ -554,6 +646,9 @@ public class IgniteSqlFunctions {
increment = cmpRemToHalfDivisor > 0; // closer to the UP
value
}
break;
+ case DOWN:
+ increment = false;
+ break;
default:
throw new AssertionError();
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
index 4a6e3011c3..6038764d19 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java
@@ -432,6 +432,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
* Changes in comparison with original code:
* 1. AbstractRexCallImplementor#genValueStatement() -> append op instanceof
SqlTableFunction)
* 2. populateIgnite()
+ * 3. Replaces implementation of ROUND, TRUNCATE operators and removes TRUNC
operator.
*
* <p>Immutable.
*/
@@ -599,7 +600,8 @@ public class RexImpTable {
defineMethod(DEGREES, "degrees", NullPolicy.STRICT);
defineMethod(POW, "power", NullPolicy.STRICT);
defineMethod(RADIANS, "radians", NullPolicy.STRICT);
-// defineMethod(ROUND, "sround", NullPolicy.STRICT);
+ // Uses ignite version
+ //defineMethod(ROUND, "sround", NullPolicy.STRICT);
defineMethod(SEC, "sec", NullPolicy.STRICT);
defineMethod(SECH, "sech", NullPolicy.STRICT);
defineMethod(SIGN, "sign", NullPolicy.STRICT);
@@ -607,8 +609,10 @@ public class RexImpTable {
defineMethod(SINH, "sinh", NullPolicy.STRICT);
defineMethod(TAN, "tan", NullPolicy.STRICT);
defineMethod(TANH, "tanh", NullPolicy.STRICT);
- defineMethod(TRUNC, "struncate", NullPolicy.STRICT);
- defineMethod(TRUNCATE, "struncate", NullPolicy.STRICT);
+ // Removed.
+ //defineMethod(TRUNC, "struncate", NullPolicy.STRICT);
+ // Uses ignite version
+ //defineMethod(TRUNCATE, "struncate", NullPolicy.STRICT);
map.put(PI, new PiImplementor());
return populate2();
@@ -996,6 +1000,7 @@ public class RexImpTable {
defineMethod(IgniteSqlOperatorTable.OCTET_LENGTH,
IgniteMethod.OCTET_LENGTH.method(), NullPolicy.STRICT);
defineMethod(SUBSTR, IgniteMethod.SUBSTR.method(), NullPolicy.STRICT);
defineMethod(ROUND, IgniteMethod.ROUND.method(), NullPolicy.STRICT);
+ defineMethod(TRUNCATE, IgniteMethod.TRUNCATE.method(),
NullPolicy.STRICT);
map.put(TYPEOF, systemFunctionImplementor);
map.put(NULL_BOUND, systemFunctionImplementor);
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
index d667371faa..bc572b27aa 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java
@@ -169,26 +169,13 @@ public class IgniteSqlOperatorTable extends
ReflectiveSqlOperatorTable {
/** The {@code ROUND(numeric [, numeric])} function. */
public static final SqlFunction ROUND = SqlBasicFunction.create("ROUND",
- new SqlReturnTypeInference() {
- @Override
- public @Nullable RelDataType
inferReturnType(SqlOperatorBinding opBinding) {
- RelDataType operandType = opBinding.getOperandType(0);
-
- // If there is only one argument and it supports precision
and scale, set scale 0.
- if (opBinding.getOperandCount() == 1 &&
operandType.getSqlTypeName().allowsPrecScale(true, true)) {
- int precision = operandType.getPrecision();
- IgniteTypeFactory typeFactory = Commons.typeFactory();
-
- RelDataType returnType =
typeFactory.createSqlType(operandType.getSqlTypeName(), precision, 0);
- // Preserve nullability
- boolean nullable = operandType.isNullable();
-
- return
typeFactory.createTypeWithNullability(returnType, nullable);
- } else {
- return operandType;
- }
- }
- },
+ new SetScaleToZeroIfSingleArgument(),
+ OperandTypes.NUMERIC_OPTIONAL_INTEGER,
+ SqlFunctionCategory.NUMERIC);
+
+ /** The {@code TRUNCATE(numeric [, numeric])} function. */
+ public static final SqlFunction TRUNCATE =
SqlBasicFunction.create("TRUNCATE",
+ new SetScaleToZeroIfSingleArgument(),
OperandTypes.NUMERIC_OPTIONAL_INTEGER,
SqlFunctionCategory.NUMERIC);
@@ -334,7 +321,7 @@ public class IgniteSqlOperatorTable extends
ReflectiveSqlOperatorTable {
register(SqlLibraryOperators.SINH); // Hyperbolic sine.
register(SqlStdOperatorTable.TAN); // Tangent.
register(SqlLibraryOperators.TANH); // Hyperbolic tangent.
- register(SqlStdOperatorTable.TRUNCATE);
+ register(TRUNCATE); // Fixes return type scale.
register(SqlStdOperatorTable.PI);
// Date and time.
@@ -471,4 +458,26 @@ public class IgniteSqlOperatorTable extends
ReflectiveSqlOperatorTable {
register(RAND_UUID);
register(GEN_RANDOM_UUID);
}
+
+ /** Sets scale to {@code 0} for single argument variants of ROUND/TRUNCATE
operators. */
+ private static class SetScaleToZeroIfSingleArgument implements
SqlReturnTypeInference {
+ @Override
+ public @Nullable RelDataType inferReturnType(SqlOperatorBinding
opBinding) {
+ RelDataType operandType = opBinding.getOperandType(0);
+
+ // If there is only one argument and it supports precision and
scale, set scale 0.
+ if (opBinding.getOperandCount() == 1 &&
operandType.getSqlTypeName().allowsPrecScale(true, true)) {
+ int precision = operandType.getPrecision();
+ IgniteTypeFactory typeFactory = Commons.typeFactory();
+
+ RelDataType returnType =
typeFactory.createSqlType(operandType.getSqlTypeName(), precision, 0);
+ // Preserve nullability
+ boolean nullable = operandType.isNullable();
+
+ return typeFactory.createTypeWithNullability(returnType,
nullable);
+ } else {
+ return operandType;
+ }
+ }
+ }
}
diff --git
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
index a36da794d2..44f82932d4 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/IgniteMethod.java
@@ -117,7 +117,12 @@ public enum IgniteMethod {
SUBSTR(SqlFunctions.class, "substring", String.class, int.class,
int.class),
/** ROUND function. See {@link IgniteSqlFunctions#sround(double)}, {@link
IgniteSqlFunctions#sround(double, int)} and variants. */
- ROUND(IgniteSqlFunctions.class, "sround", true);
+ ROUND(IgniteSqlFunctions.class, "sround", true),
+
+ /**
+ * TRUNCATE function. See {@link IgniteSqlFunctions#struncate(double)},
{@link IgniteSqlFunctions#struncate(double, int)} and variants.
+ */
+ TRUNCATE(IgniteSqlFunctions.class, "struncate", true);
private final Method method;
diff --git
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctionsTest.java
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctionsTest.java
index 024a10dc18..596b510f0d 100644
---
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctionsTest.java
+++
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/exp/IgniteSqlFunctionsTest.java
@@ -250,10 +250,11 @@ public class IgniteSqlFunctionsTest {
@Test
public void testRound() {
assertEquals(new BigDecimal("1"), IgniteSqlFunctions.sround(new
BigDecimal("1.000")));
- assertEquals(new BigDecimal("1"), IgniteSqlFunctions.sround(new
BigDecimal("1.123")));
+ assertEquals(new BigDecimal("2"), IgniteSqlFunctions.sround(new
BigDecimal("1.5")));
assertEquals(1, IgniteSqlFunctions.sround(1), "int");
assertEquals(1L, IgniteSqlFunctions.sround(1L), "long");
- assertEquals(1.0d, IgniteSqlFunctions.sround(1.123d), "double");
+ assertEquals(2.0f, IgniteSqlFunctions.sround(1.5f), "float");
+ assertEquals(2.0d, IgniteSqlFunctions.sround(1.5d), "double");
}
/** Tests for ROUND(x, s) function, where x is a BigDecimal value. */
@@ -263,17 +264,19 @@ public class IgniteSqlFunctionsTest {
"1.123, 0, 1.000",
"1.123, 1, 1.100",
"1.123, 2, 1.120",
- "1.127, 2, 1.130",
+ "1.125, 2, 1.130",
"1.123, 3, 1.123",
"1.123, 4, 1.123",
"10.123, 0, 10.000",
+ "10.500, 0, 11.000",
+ "10.800, 0, 11.000",
"10.123, -1, 10.000",
"10.123, -2, 0.000",
"10.123, 3, 10.123",
"10.123, 4, 10.123",
})
public void testRound2Decimal(String input, int scale, String result) {
- assertEquals(new BigDecimal(result), IgniteSqlFunctions.sround(new
BigDecimal(result), scale));
+ assertEquals(new BigDecimal(result), IgniteSqlFunctions.sround(new
BigDecimal(input), scale));
}
/** Tests for ROUND(x, s) function, where x is a double value. */
@@ -281,9 +284,11 @@ public class IgniteSqlFunctionsTest {
@CsvSource({
"1.123, 3, 1.123",
"1.123, 2, 1.12",
- "1.127, 2, 1.13",
+ "1.125, 2, 1.13",
"1.245, 1, 1.2",
"1.123, 0, 1.0",
+ "1.500, 0, 2.0",
+ "1.800, 0, 2.0",
"1.123, -1, 0.0",
"10.123, 0, 10.000",
"10.123, -1, 10.000",
@@ -358,4 +363,122 @@ public class IgniteSqlFunctionsTest {
public void testRound2LongType(long input, int scale, long result) {
assertEquals(result, IgniteSqlFunctions.sround(input, scale));
}
+
+ /** Tests for TRUNCATE(x) function. */
+ @Test
+ public void testTruncate() {
+ assertEquals(new BigDecimal("1"), IgniteSqlFunctions.struncate(new
BigDecimal("1.000")));
+ assertEquals(new BigDecimal("1"), IgniteSqlFunctions.struncate(new
BigDecimal("1.5")));
+ assertEquals(1, IgniteSqlFunctions.struncate(1), "int");
+ assertEquals(1L, IgniteSqlFunctions.struncate(1L), "long");
+ assertEquals(1.0d, IgniteSqlFunctions.struncate(1.5d), "double");
+ assertEquals(1.0f, IgniteSqlFunctions.struncate(1.5f), "float");
+ }
+
+ /** Tests for TRUNCATE(x, s) function, where x is a BigDecimal value. */
+ @ParameterizedTest
+ @CsvSource({
+ "1.123, -1, 0.000",
+ "1.123, 0, 1.000",
+ "1.123, 1, 1.100",
+ "1.123, 2, 1.120",
+ "1.125, 2, 1.120",
+ "1.123, 3, 1.123",
+ "1.123, 4, 1.123",
+ "10.123, 0, 10.000",
+ "10.500, 0, 10.000",
+ "10.800, 0, 10.000",
+ "10.123, -1, 10.000",
+ "10.123, -2, 0.000",
+ "10.123, 3, 10.123",
+ "10.123, 4, 10.123",
+ })
+ public void testTruncate2Decimal(String input, int scale, String result) {
+ assertEquals(new BigDecimal(result), IgniteSqlFunctions.struncate(new
BigDecimal(input), scale));
+ }
+
+ /** Tests for TRUNCATE(x, s) function, where x is a double value. */
+ @ParameterizedTest
+ @CsvSource({
+ "1.123, 3, 1.123",
+ "1.123, 2, 1.12",
+ "1.125, 2, 1.12",
+ "1.245, 1, 1.2",
+ "1.123, 0, 1.0",
+ "1.500, 0, 1.0",
+ "1.800, 0, 1.0",
+ "1.123, -1, 0.0",
+ "10.123, 0, 10.000",
+ "10.123, -1, 10.000",
+ "10.123, -2, 0.000",
+ "10.123, 3, 10.123",
+ "10.123, 4, 10.123",
+ })
+ public void testTruncate2Double(double input, int scale, double result) {
+ assertEquals(result, IgniteSqlFunctions.struncate(input, scale));
+ }
+
+ /** Tests for TRUNCATE(x, s) function, where x is an byte. */
+ @ParameterizedTest
+ @CsvSource({
+ "42, -2, 0",
+ "42, -1, 40",
+ "47, -1, 40",
+ "42, 0, 42",
+ "42, 1, 42",
+ "42, 2, 42",
+ "-42, -1, -40",
+ "-47, -1, -40",
+ })
+ public void testTruncate2ByteType(byte input, int scale, byte result) {
+ assertEquals(result, IgniteSqlFunctions.struncate(input, scale));
+ }
+
+ /** Tests for TRUNCATE(x, s) function, where x is an short. */
+ @ParameterizedTest
+ @CsvSource({
+ "42, -2, 0",
+ "42, -1, 40",
+ "47, -1, 40",
+ "42, 0, 42",
+ "42, 1, 42",
+ "42, 2, 42",
+ "-42, -1, -40",
+ "-47, -1, -40",
+ })
+ public void testTruncateShortType(short input, int scale, short result) {
+ assertEquals(result, IgniteSqlFunctions.struncate(input, scale));
+ }
+
+ /** Tests for TRUNCATE(x, s) function, where x is an int. */
+ @ParameterizedTest
+ @CsvSource({
+ "42, -2, 0",
+ "42, -1, 40",
+ "47, -1, 40",
+ "42, 0, 42",
+ "42, 1, 42",
+ "42, 2, 42",
+ "-42, -1, -40",
+ "-47, -1, -40",
+ })
+ public void testTruncate2IntType(int input, int scale, int result) {
+ assertEquals(result, IgniteSqlFunctions.struncate(input, scale));
+ }
+
+ /** Tests for TRUNCATE(x, s) function, where x is a long. */
+ @ParameterizedTest
+ @CsvSource({
+ "42, -2, 0",
+ "42, -1, 40",
+ "47, -1, 40",
+ "42, 0, 42",
+ "42, 1, 42",
+ "42, 2, 42",
+ "-42, -1, -40",
+ "-47, -1, -40",
+ })
+ public void testTruncate2LongType(long input, int scale, long result) {
+ assertEquals(result, IgniteSqlFunctions.struncate(input, scale));
+ }
}