lowka commented on code in PR #3377:
URL: https://github.com/apache/ignite-3/pull/3377#discussion_r1517860949
##########
modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/planner/IndexSearchBoundsPlannerTest.java:
##########
@@ -452,62 +459,180 @@ public void testBoundsTypeLimits(RelDataType type,
Object value, Predicate<Searc
assertBounds("SELECT * FROM test2 WHERE C2 = " + value, List.of(),
schema, bounds);
}
+ @ParameterizedTest
+ @MethodSource("indexTypeAndNumericsInBounds")
+ public void testCorrectNumericIndexInBounds(
+ Type indexType,
+ RelDataType columnType,
+ String valueExpr,
+ String boundExpr,
+ RelDataType boundExprType) throws Exception {
+
+ UnaryOperator<TableBuilder> tableB = tableB("TEST2", "C2", columnType);
+
+ IgniteSchema schema;
+ if (indexType == Type.HASH) {
+ schema = createSchemaFrom(tableB.andThen(addHashIndex("C2")));
+ } else {
+ schema = createSchemaFrom(tableB.andThen(addSortIndex("C2")));
+ }
+
+ assertBounds("SELECT * FROM test2 WHERE C2 = " + valueExpr, List.of(),
schema, searchBounds -> {
+ if (!(searchBounds instanceof ExactBounds)) {
+ log.info("SearchBound type does not match. Expected {} but got
{}", ExactBounds.class, searchBounds);
+ return false;
+ }
+
+ ExactBounds exactBounds = (ExactBounds) searchBounds;
+ RexNode rexNode = exactBounds.bound();
+
+ if (!SqlTypeUtil.equalSansNullability(boundExprType,
rexNode.getType())) {
+ log.info("Bound type does not match. Expected {} but got {}",
boundExprType, rexNode.getType());
+ return false;
+ }
+
+ if (!boundExpr.equals(rexNode.toString())) {
+ log.info("Bound expr does not match. Expected {} but got {}",
boundExpr, rexNode);
+ return false;
+ }
+
+ return true;
+ });
+ }
+
+ private static Stream<Arguments> indexTypeAndNumericsInBounds() {
+ Stream<Arguments> result = Stream.of();
+
+ for (Type type : Type.values()) {
+ Stream<Arguments> idx = numericsInBounds().map(a -> {
+ Object[] v = a.get();
+
+ Object[] newArgs = new Object[v.length + 1];
+ newArgs[0] = type;
+ System.arraycopy(v, 0, newArgs, 1, v.length);
+
+ return arguments(newArgs);
+ });
+ result = Stream.concat(result, idx);
+ }
+
+ return result;
+ }
+
+ private static Stream<Arguments> numericsInBounds() {
+ return Stream.of(
+ // Column type, expr to use in search condition, expected
expression in search bounds, expected that expression.
+
+ arguments(sqlType(SqlTypeName.TINYINT), "42", "42:TINYINT",
sqlType(SqlTypeName.TINYINT)),
+ arguments(sqlType(SqlTypeName.TINYINT), "CAST(42 AS TINYINT)",
"42:TINYINT", sqlType(SqlTypeName.TINYINT)),
+ arguments(sqlType(SqlTypeName.TINYINT), "CAST(42 AS
SMALLINT)", "42:TINYINT", sqlType(SqlTypeName.TINYINT)),
+ arguments(sqlType(SqlTypeName.TINYINT), "CAST(42 AS INTEGER)",
"42:TINYINT", sqlType(SqlTypeName.TINYINT)),
+ arguments(sqlType(SqlTypeName.TINYINT), "CAST(42 AS BIGINT)",
"42:TINYINT", sqlType(SqlTypeName.TINYINT)),
+
+ arguments(sqlType(SqlTypeName.SMALLINT), "42", "42:SMALLINT",
sqlType(SqlTypeName.SMALLINT)),
+ arguments(sqlType(SqlTypeName.SMALLINT), "CAST(42 AS
TINYINT)", "42:SMALLINT", sqlType(SqlTypeName.SMALLINT)),
+ arguments(sqlType(SqlTypeName.SMALLINT), "CAST(42 AS
SMALLINT)", "42:SMALLINT", sqlType(SqlTypeName.SMALLINT)),
+ arguments(sqlType(SqlTypeName.SMALLINT), "CAST(42 AS
INTEGER)", "42:SMALLINT", sqlType(SqlTypeName.SMALLINT)),
+ arguments(sqlType(SqlTypeName.SMALLINT), "CAST(42 AS BIGINT)",
"42:SMALLINT", sqlType(SqlTypeName.SMALLINT)),
+
+ arguments(sqlType(SqlTypeName.INTEGER), "42", "42",
sqlType(SqlTypeName.INTEGER)),
+ arguments(sqlType(SqlTypeName.INTEGER), "CAST(42 AS TINYINT)",
"42", sqlType(SqlTypeName.INTEGER)),
+ arguments(sqlType(SqlTypeName.INTEGER), "CAST(42 AS
SMALLINT)", "42", sqlType(SqlTypeName.INTEGER)),
+ arguments(sqlType(SqlTypeName.INTEGER), "CAST(42 AS INTEGER)",
"42", sqlType(SqlTypeName.INTEGER)),
+ arguments(sqlType(SqlTypeName.INTEGER), "CAST(42 AS BIGINT)",
"42", sqlType(SqlTypeName.INTEGER)),
+
+ arguments(sqlType(SqlTypeName.BIGINT), "42", "42:BIGINT",
sqlType(SqlTypeName.BIGINT)),
+ arguments(sqlType(SqlTypeName.BIGINT), "CAST(42 AS TINYINT)",
"42:BIGINT", sqlType(SqlTypeName.BIGINT)),
+ arguments(sqlType(SqlTypeName.BIGINT), "CAST(42 AS SMALLINT)",
"42:BIGINT", sqlType(SqlTypeName.BIGINT)),
+ arguments(sqlType(SqlTypeName.BIGINT), "CAST(42 AS INTEGER)",
"42:BIGINT", sqlType(SqlTypeName.BIGINT)),
+ arguments(sqlType(SqlTypeName.BIGINT), "CAST(42 AS BIGINT)",
"42:BIGINT", sqlType(SqlTypeName.BIGINT)),
+
+ arguments(sqlType(SqlTypeName.REAL), "42", "42:REAL",
sqlType(SqlTypeName.REAL)),
+ arguments(sqlType(SqlTypeName.DOUBLE), "42", "42:DOUBLE",
sqlType(SqlTypeName.DOUBLE))
+
+ // TODO https://issues.apache.org/jira/browse/IGNITE-19881
uncomment after this issue is fixed
+ // The optimizer selects TableScan instead of a IndexScan
(Real/double columns)
+ //arguments(sqlType(SqlTypeName.REAL), "CAST(42 AS DOUBLE)",
"42:REAL", sqlType(SqlTypeName.REAL)),
+ //arguments(sqlType(SqlTypeName.DOUBLE), "CAST(42 AS REAL)",
"42:DOUBLE", sqlType(SqlTypeName.DOUBLE)),
+
+ // TODO https://issues.apache.org/jira/browse/IGNITE-19882
uncomment after this issue is fixed
+ // The optimizer selects TableScan instead of a IndexScan
(Decimal columns)
+ //arguments(sqlType(SqlTypeName.DECIMAL, 5), "42",
"42:DECIMAL(10, 0)", sqlType(SqlTypeName.DECIMAL, 5, 0)),
+ //arguments(sqlType(SqlTypeName.DECIMAL, 10, 2), "42",
"42:DECIMAL(10, 2)", sqlType(SqlTypeName.DECIMAL, 10, 2)),
+ //arguments(sqlType(SqlTypeName.INTEGER), "CAST(42 AS
DECIMAL(10))", "42", sqlType(SqlTypeName.INTEGER)),
+ );
+ }
+
private static Stream<Arguments> boundsTypeLimits() {
- RelDataType tinyintType =
TYPE_FACTORY.createSqlType(SqlTypeName.TINYINT);
Review Comment:
Regroups tests for saturated bounds.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]