This is an automated email from the ASF dual-hosted git repository.
zstan 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 2edaa01d00 IGNITE-22698 Sql. Extend test coverage for numeric
comparison with literal wider than numeric type (#4063)
2edaa01d00 is described below
commit 2edaa01d008752a82f05a823ff785abab55fbc63
Author: Evgeniy Stanilovskiy <[email protected]>
AuthorDate: Wed Jul 10 16:40:47 2024 +0300
IGNITE-22698 Sql. Extend test coverage for numeric comparison with literal
wider than numeric type (#4063)
---
.../internal/sql/engine/ItDataTypesTest.java | 149 ++++++++++++++++++++-
1 file changed, 146 insertions(+), 3 deletions(-)
diff --git
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
index 9e75263fe1..98b5004017 100644
---
a/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
+++
b/modules/sql-engine/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItDataTypesTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.sql.engine;
import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
import static
org.apache.ignite.internal.sql.engine.util.SqlTestUtils.assertThrowsSqlException;
+import static org.apache.ignite.lang.ErrorGroups.Sql.RUNTIME_ERR;
import static org.apache.ignite.lang.ErrorGroups.Sql.STMT_VALIDATION_ERR;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsString;
@@ -42,6 +43,7 @@ import org.apache.calcite.sql.type.SqlTypeUtil;
import org.apache.ignite.internal.sql.BaseSqlIntegrationTest;
import org.apache.ignite.internal.sql.engine.util.Commons;
import org.apache.ignite.internal.sql.engine.util.QueryChecker;
+import org.apache.ignite.internal.testframework.WithSystemProperty;
import org.apache.ignite.lang.ErrorGroups.Sql;
import org.apache.ignite.lang.IgniteException;
import org.junit.jupiter.api.AfterEach;
@@ -115,6 +117,147 @@ public class ItDataTypesTest extends
BaseSqlIntegrationTest {
}
}
+ @Test
+ @SuppressWarnings("ThrowableNotThrown")
+ public void exactWithApproxComparison() {
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ "Invalid input syntax for type INTEGER",
+ () -> sql("SELECT '1.1' > 2"));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ "Invalid input syntax for type INTEGER",
+ () -> sql("SELECT '1.1'::INTEGER > 2"));
+
+ assertQuery("SELECT '1.1' > 2.2").returns(false).check();
+
+ assertQuery("SELECT 1.1::INTEGER > 2").returns(false).check();
+ assertQuery("SELECT 2 < 1.1::INTEGER").returns(false).check();
+
+ assertQuery("SELECT 1.1::BIGINT > 2").returns(false).check();
+ assertQuery("SELECT 2 < 1.1::BIGINT").returns(false).check();
+
+ assertQuery("SELECT 1.1::float > 2").returns(false).check();
+ assertQuery("SELECT '1.1'::float > 2").returns(false).check();
+ }
+
+ @WithSystemProperty(key = "IMPLICIT_PK_ENABLED", value = "true")
+ @ParameterizedTest()
+ @MethodSource("exactDecimalTypes")
+ public void testFilterTypeWiderThanColumnExprErr(SqlTypeName typeName,
Class<?> clazz, Number upper, String strUpper) {
+ sql(format("create table tbl(v {});", typeName));
+ sql(format("insert into tbl values({});", upper));
+
+ BigDecimal moreThanUpperBoundApprox = new BigDecimal(strUpper).add(new
BigDecimal(1.1));
+
+ String errMsg = typeName == SqlTypeName.BIGINT ? "BIGINT out of range"
: "Invalid input syntax for type " + typeName;
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v = '{}'",
moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v = {}::VARCHAR",
moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v < '{}'",
moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v > '{}'",
moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v <> '{}'",
moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v != ' {} '",
moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v NOT IN ('1',
'{}')", moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ errMsg,
+ () -> sql(format("SELECT * FROM tbl WHERE v NOT IN ('1',
{}::VARCHAR)", moreThanUpperBoundApprox)));
+
+ assertThrowsSqlException(
+ RUNTIME_ERR,
+ "out of range",
+ () -> sql(format("SELECT * FROM tbl WHERE v IN ('1', (SELECT
{}))", moreThanUpperBoundApprox)));
+ }
+
+ @WithSystemProperty(key = "IMPLICIT_PK_ENABLED", value = "true")
+ @ParameterizedTest()
+ @MethodSource("exactDecimalTypes")
+ public void testFilterTypeWiderThanColumn(SqlTypeName typeName, Class<?>
clazz, Number upper, String strUpper) {
+ sql(format("create table tbl(v {});", typeName));
+ sql(format("insert into tbl values({});", upper));
+
+ Number checkReturn = (Number) clazz.cast(upper);
+
+ BigDecimal moreThanUpperBoundApprox = new BigDecimal(strUpper).add(new
BigDecimal(1.1));
+ BigDecimal lessUpper = new BigDecimal(strUpper).add(new
BigDecimal(-1));
+
+ // -------------------------------------------------------- //
+
+ assertQuery(format("SELECT * FROM tbl WHERE v = {}",
upper)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE {} = v",
upper)).returns(checkReturn).check();
+
+ assertQuery(format("SELECT * FROM tbl WHERE v = '{}'",
strUpper)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE '{}' = v",
upper)).returns(checkReturn).check();
+
+ assertQuery(format("SELECT * FROM tbl WHERE v != {}",
moreThanUpperBoundApprox)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE {} != v",
moreThanUpperBoundApprox)).returns(checkReturn).check();
+
+ assertQuery(format("SELECT * FROM tbl WHERE v < {}",
moreThanUpperBoundApprox)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE {} > v",
moreThanUpperBoundApprox)).returns(checkReturn).check();
+
+ assertQuery(format("SELECT * FROM tbl WHERE v < (SELECT {})",
moreThanUpperBoundApprox)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE v = (SELECT {})",
strUpper)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE v = (SELECT {})::varchar",
strUpper)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE v = ' {} '",
strUpper)).returns(checkReturn).check();
+
+ assertQuery(format("SELECT * FROM tbl WHERE v IN (' {}' + '1', '0')",
lessUpper)).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE v IN ((SELECT v FROM tbl
WHERE v = {}), '0')", strUpper))
+ .returns(checkReturn).check();
+
+ assertQuery(format("SELECT * FROM tbl WHERE v IN ('{}'::{} + 1, '0')",
lessUpper, typeName)).returns(checkReturn).check();
+
+ assertQuery("SELECT * FROM tbl WHERE v IN (? + 1,
'0')").withParam(lessUpper).returns(checkReturn).check();
+ assertQuery(format("SELECT * FROM tbl WHERE v NOT IN ('{}' - '1',
'0')", strUpper)).returns(checkReturn).check();
+ assertQuery("SELECT * FROM tbl WHERE v NOT IN (? - '1',
'0')").withParam(checkReturn).returns(checkReturn).check();
+
+ // TODO: https://issues.apache.org/jira/browse/IGNITE-22519 Comparison
on BIGINT cast brings overflow
+ // BigDecimal moreThanUpperBoundExact = new
BigDecimal(strUpper).add(new BigDecimal(1));
+ // assertQuery(format("SELECT * FROM tbl WHERE v < {}::DECIMAL(19,
0)", moreThanUpperBoundExact)).returns(checkReturn).check();
+
+ assertQuery("SELECT * FROM tbl WHERE v >
OCTET_LENGTH('TEST')").returns(checkReturn).check();
+ assertQuery(format("SELECT NULLIF((select {}), 100)",
moreThanUpperBoundApprox))
+ .returns(moreThanUpperBoundApprox).check();
+ }
+
+ private static Stream<Arguments> exactDecimalTypes() {
+ return Stream.of(
+ arguments(SqlTypeName.BIGINT, Long.class, Long.MAX_VALUE,
Long.toString(Long.MAX_VALUE)),
+ arguments(SqlTypeName.INTEGER, Integer.class,
Integer.MAX_VALUE, Integer.toString(Integer.MAX_VALUE)),
+ arguments(SqlTypeName.SMALLINT, Short.class, Short.MAX_VALUE,
Short.toString(Short.MAX_VALUE)),
+ arguments(SqlTypeName.TINYINT, Byte.class, Byte.MAX_VALUE,
Byte.toString(Byte.MAX_VALUE))
+ );
+ }
+
/** Tests NOT NULL and DEFAULT column constraints. */
@Test
public void testCheckDefaultsAndNullables() {
@@ -452,9 +595,9 @@ public class ItDataTypesTest extends BaseSqlIntegrationTest
{
@MethodSource("decimalOverflows")
public void testCalcOpOverflow(SqlTypeName type, String expr, Object
param) {
if (param == EMPTY_PARAM) {
- assertThrowsSqlException(Sql.RUNTIME_ERR, type.getName() + " out
of range", () -> sql(expr));
+ assertThrowsSqlException(RUNTIME_ERR, type.getName() + " out of
range", () -> sql(expr));
} else {
- assertThrowsSqlException(Sql.RUNTIME_ERR, type.getName() + " out
of range", () -> sql(expr, param));
+ assertThrowsSqlException(RUNTIME_ERR, type.getName() + " out of
range", () -> sql(expr, param));
}
}
@@ -517,7 +660,7 @@ public class ItDataTypesTest extends BaseSqlIntegrationTest
{
@MethodSource("decimalOverflowsValidation")
public void testCastDecimalOverflows(SqlTypeName type, String expr,
Boolean withException) {
if (withException) {
- assertThrowsSqlException(Sql.RUNTIME_ERR, type + " out of range",
() -> sql(expr));
+ assertThrowsSqlException(RUNTIME_ERR, type + " out of range", ()
-> sql(expr));
} else {
sql(expr);
}