This is an automated email from the ASF dual-hosted git repository.
amashenkov 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 2241692cb2 IGNITE-19668 Sql. Fix
testLengthExpressionWithDynamicParameter (#2223)
2241692cb2 is described below
commit 2241692cb2572a0101a4f4ad04434a03bf567fb6
Author: Evgeniy Stanilovskiy <[email protected]>
AuthorDate: Wed Jun 28 16:10:12 2023 +0300
IGNITE-19668 Sql. Fix testLengthExpressionWithDynamicParameter (#2223)
---
.../varbinary/ItVarBinaryExpressionTest.java | 33 ++++++++++++++++++----
.../sql/engine/exec/exp/IgniteSqlFunctions.java | 7 +++++
.../internal/sql/engine/exec/exp/RexImpTable.java | 2 ++
.../sql/engine/prepare/IgniteConvertletTable.java | 3 --
.../sql/engine/sql/fun/IgniteSqlOperatorTable.java | 2 +-
.../internal/sql/engine/util/IgniteMethod.java | 2 ++
6 files changed, 40 insertions(+), 9 deletions(-)
diff --git
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryExpressionTest.java
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryExpressionTest.java
index 01c94c1bce..90218d97c3 100644
---
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryExpressionTest.java
+++
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/datatypes/varbinary/ItVarBinaryExpressionTest.java
@@ -19,11 +19,14 @@ package
org.apache.ignite.internal.sql.engine.datatypes.varbinary;
import static org.apache.ignite.internal.sql.engine.util.VarBinary.varBinary;
+import java.math.BigDecimal;
import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.sql.validate.SqlValidatorException;
import org.apache.ignite.internal.sql.engine.datatypes.DataTypeTestSpecs;
import
org.apache.ignite.internal.sql.engine.datatypes.tests.BaseExpressionDataTypeTest;
import org.apache.ignite.internal.sql.engine.datatypes.tests.DataTypeTestSpec;
import org.apache.ignite.internal.sql.engine.util.VarBinary;
+import org.apache.ignite.internal.testframework.IgniteTestUtils;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
@@ -31,6 +34,10 @@ import org.junit.jupiter.api.Test;
* Tests for expressions for {@link SqlTypeName#VARBINARY} type.
*/
public class ItVarBinaryExpressionTest extends
BaseExpressionDataTypeTest<VarBinary> {
+ @Override
+ protected int nodes() {
+ return 1;
+ }
/** Bit-string literal. */
@Test
@@ -67,19 +74,27 @@ public class ItVarBinaryExpressionTest extends
BaseExpressionDataTypeTest<VarBin
.check();
}
- /** {@code LENGTH} expression. */
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-19668")
+ /** {@code LENGTH} and {@code OCTET_LENGTH} expression. */
@Test
public void testLengthExpression() {
checkQuery("SELECT LENGTH(x'010203')")
- .withParams(varBinary(new byte[]{2}))
+ .returns(3).check();
+
+ checkQuery("SELECT OCTET_LENGTH(x'010203')")
.returns(3).check();
}
- /** {@code LENGTH} expression. */
- @Disabled("https://issues.apache.org/jira/browse/IGNITE-19668")
+ /** {@code LENGTH} and {@code OCTET_LENGTH} expression with dynamic
params. */
@Test
public void testLengthExpressionWithDynamicParameter() {
+ checkQuery("SELECT OCTET_LENGTH(?)")
+ .withParams(varBinary(new byte[]{1, 2, 3}))
+ .returns(3).check();
+
+ checkQuery("SELECT OCTET_LENGTH(?)")
+ .withParams(varBinary(new byte[0]))
+ .returns(0).check();
+
checkQuery("SELECT LENGTH(?)")
.withParams(varBinary(new byte[]{1, 2, 3}))
.returns(3).check();
@@ -89,6 +104,14 @@ public class ItVarBinaryExpressionTest extends
BaseExpressionDataTypeTest<VarBin
.returns(0).check();
}
+ /** Throws correct exception. */
+ @Test
+ public void testErroneousParamToLegth() {
+ IgniteTestUtils.assertThrowsWithCause(() -> checkQuery("SELECT
LENGTH(?)")
+ .withParams(new BigDecimal(1)).check(),
SqlValidatorException.class,
+ "Values passed to LENGTH operator must have compatible types");
+ }
+
/**
* {@code CAST} to {@code VARBINARY} with different length.
*/
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 a7f6e91caa..a00007f172 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
@@ -19,6 +19,8 @@ package org.apache.ignite.internal.sql.engine.exec.exp;
import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE;
import static java.time.format.DateTimeFormatter.ISO_LOCAL_TIME;
+import static org.apache.calcite.runtime.SqlFunctions.charLength;
+import static org.apache.calcite.runtime.SqlFunctions.octetLength;
import static org.apache.ignite.lang.ErrorGroups.Sql.QUERY_INVALID_ERR;
import java.math.BigDecimal;
@@ -119,6 +121,11 @@ public class IgniteSqlFunctions {
return b == null ? null : new String(b.getBytes(),
Commons.typeFactory().getDefaultCharset());
}
+ /** LENGTH(VARBINARY|VARCHAR). */
+ public static int length(Object b) {
+ return b instanceof ByteString ? octetLength((ByteString) b) :
charLength((String) b);
+ }
+
private static BigDecimal setScale(int precision, int scale, BigDecimal
decimal) {
return precision ==
IgniteTypeSystem.INSTANCE.getDefaultPrecision(SqlTypeName.DECIMAL)
? decimal : decimal.setScale(scale, RoundingMode.HALF_UP);
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 38f5e7cc3a..c60cdebe05 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
@@ -377,6 +377,7 @@ import static
org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTab
import static
org.apache.ignite.internal.sql.engine.util.IgniteMethod.GEN_RANDOM_UUID;
import static
org.apache.ignite.internal.sql.engine.util.IgniteMethod.GREATEST2;
import static org.apache.ignite.internal.sql.engine.util.IgniteMethod.LEAST2;
+import static org.apache.ignite.internal.sql.engine.util.IgniteMethod.LENGTH;
import static
org.apache.ignite.internal.sql.engine.util.IgniteMethod.RAND_UUID;
/**
@@ -854,6 +855,7 @@ public class RexImpTable {
defineMethod(IgniteSqlOperatorTable.GEN_RANDOM_UUID,
GEN_RANDOM_UUID.method(), NullPolicy.NONE);
defineMethod(IS_NOT_DISTINCT_FROM,
IgniteMethod.IS_NOT_DISTINCT_FROM.method(), NullPolicy.NONE);
defineMethod(IgniteSqlOperatorTable.LEAST2, LEAST2.method(),
NullPolicy.NONE);
+ defineMethod(IgniteSqlOperatorTable.LENGTH, LENGTH.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/prepare/IgniteConvertletTable.java
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteConvertletTable.java
index 62285a899b..0d1c39d3a7 100644
---
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteConvertletTable.java
+++
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/prepare/IgniteConvertletTable.java
@@ -36,7 +36,6 @@ import org.apache.calcite.sql2rel.SqlRexContext;
import org.apache.calcite.sql2rel.SqlRexConvertlet;
import org.apache.calcite.sql2rel.SqlRexConvertletTable;
import org.apache.calcite.sql2rel.StandardConvertletTable;
-import org.apache.ignite.internal.sql.engine.sql.fun.IgniteSqlOperatorTable;
/**
* Implementation of {@link SqlRexConvertletTable}.
@@ -47,8 +46,6 @@ public class IgniteConvertletTable extends
ReflectiveConvertletTable {
private IgniteConvertletTable() {
// Replace Calcite's convertlet with our own.
registerOp(SqlStdOperatorTable.TIMESTAMP_DIFF, new
TimestampDiffConvertlet());
-
- addAlias(IgniteSqlOperatorTable.LENGTH,
SqlStdOperatorTable.CHAR_LENGTH);
}
/** {@inheritDoc} */
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 055265578d..2dd7132ed8 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
@@ -39,7 +39,7 @@ public class IgniteSqlOperatorTable extends
ReflectiveSqlOperatorTable {
SqlKind.OTHER_FUNCTION,
ReturnTypes.INTEGER_NULLABLE,
null,
- OperandTypes.CHARACTER,
+ OperandTypes.CHARACTER.or(OperandTypes.BINARY),
SqlFunctionCategory.NUMERIC);
public static final SqlFunction SYSTEM_RANGE = new
SqlSystemRangeFunction();
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 2dd11f7a3b..b661146f09 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
@@ -98,6 +98,8 @@ public enum IgniteMethod {
/** See {@link UUID#randomUUID()}. */
RAND_UUID(UUID.class, "randomUUID"),
+ LENGTH(IgniteSqlFunctions.class, "length", Object.class),
+
/** See {@link IgniteSqlFunctions#genRandomUuid()}. */
// TODO This function should removed when
https://issues.apache.org/jira/browse/IGNITE-19103 is complete.
GEN_RANDOM_UUID(IgniteSqlFunctions.class, "genRandomUuid"),