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"),

Reply via email to