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 889c5f4614 IGNITE-20660 SQL: Fix broken behaviour of OCTET_LENGTH 
function (#2769)
889c5f4614 is described below

commit 889c5f46140254f631687afc6d0882fdf7d7c6a2
Author: Andrew V. Mashenkov <[email protected]>
AuthorDate: Thu Nov 2 12:46:17 2023 +0300

    IGNITE-20660 SQL: Fix broken behaviour of OCTET_LENGTH function (#2769)
---
 .../apache/ignite/internal/sql/engine/ItFunctionsTest.java |  8 ++++++++
 .../ignite/internal/sql/engine/ItSqlOperatorsTest.java     |  1 +
 .../sql/types/string/test_unicode.test_ignored             |  6 ++++++
 .../internal/sql/engine/exec/exp/IgniteSqlFunctions.java   | 14 ++++++++++++--
 .../ignite/internal/sql/engine/exec/exp/RexImpTable.java   |  1 +
 .../sql/engine/sql/fun/IgniteSqlOperatorTable.java         |  8 +++++++-
 .../ignite/internal/sql/engine/util/IgniteMethod.java      |  3 +++
 7 files changed, 38 insertions(+), 3 deletions(-)

diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
index f816b8111b..d60805517b 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItFunctionsTest.java
@@ -68,6 +68,14 @@ public class ItFunctionsTest extends BaseSqlIntegrationTest {
         assertQuery("SELECT LENGTH(NULL)").returns(NULL_RESULT).check();
     }
 
+    @Test
+    public void testOctetLength() {
+        assertQuery("SELECT OCTET_LENGTH('TEST')").returns(4).check();
+        assertQuery("SELECT OCTET_LENGTH('我愛Java')").returns(10).check();
+        assertQuery("SELECT OCTET_LENGTH(x'012F')").returns(2).check();
+        assertQuery("SELECT OCTET_LENGTH(NULL)").returns(NULL_RESULT).check();
+    }
+
     @Test
     public void testCurrentDateTimeTimeStamp() {
         checkDateTimeQuery("SELECT CURRENT_DATE", Clock.DATE_CLOCK, 
LocalDate.class);
diff --git 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
index 4dab1ce75e..add835868e 100644
--- 
a/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
+++ 
b/modules/runner/src/integrationTest/java/org/apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java
@@ -279,6 +279,7 @@ public class ItSqlOperatorsTest extends 
BaseSqlIntegrationTest {
         assertExpression("GREATEST('a', 'b')").returns("b").check();
         assertExpression("COMPRESS('')").returns(new byte[]{}).check();
         assertExpression("OCTET_LENGTH(x'01')").returns(1).check();
+        assertExpression("OCTET_LENGTH('text')").returns(4).check();
         assertExpression("CAST(INTERVAL 1 SECONDS AS 
INT)").returns(1).check(); // Converted to REINTERPRED.
         assertExpression("CAST(INTERVAL 1 DAY AS INT)").returns(1).check(); // 
Converted to REINTERPRED.
     }
diff --git 
a/modules/runner/src/integrationTest/sql/types/string/test_unicode.test_ignored 
b/modules/runner/src/integrationTest/sql/types/string/test_unicode.test_ignored
index 2090cfff4f..27bfbd6b58 100644
--- 
a/modules/runner/src/integrationTest/sql/types/string/test_unicode.test_ignored
+++ 
b/modules/runner/src/integrationTest/sql/types/string/test_unicode.test_ignored
@@ -31,3 +31,9 @@ SELECT length(s) FROM emojis ORDER BY id
 1
 3
 
+query I
+SELECT octet_length(s) FROM emojis ORDER BY id
+----
+4
+12
+
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 0a3f8135e3..e89fb0af20 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
@@ -20,7 +20,6 @@ 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.RUNTIME_ERR;
 
 import java.math.BigDecimal;
@@ -44,6 +43,7 @@ import org.apache.calcite.linq4j.Linq4j;
 import org.apache.calcite.linq4j.function.NonDeterministic;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.runtime.SqlFunctions;
 import org.apache.calcite.schema.ScannableTable;
 import org.apache.calcite.schema.Schema;
 import org.apache.calcite.schema.Statistic;
@@ -125,7 +125,17 @@ public class IgniteSqlFunctions {
 
     /** LENGTH(VARBINARY|VARCHAR). */
     public static int length(Object b) {
-        return b instanceof ByteString ? octetLength((ByteString) b) : 
charLength((String) b);
+        return b instanceof ByteString ? SqlFunctions.octetLength((ByteString) 
b) : charLength((String) b);
+    }
+
+    /** OCTET_LENGTH(VARBINARY). */
+    public static int octetLength(ByteString s) {
+        return s.length();
+    }
+
+    /** OCTET_LENGTH(VARCHAR). */
+    public static int octetLength(String s) {
+        return s.getBytes().length;
     }
 
     // SQL ROUND function
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 146a760a07..4bb6dc7943 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
@@ -993,6 +993,7 @@ public class RexImpTable {
       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);
+      defineMethod(IgniteSqlOperatorTable.OCTET_LENGTH, 
IgniteMethod.OCTET_LENGTH.method(), NullPolicy.STRICT);
       defineMethod(SUBSTR, IgniteMethod.SUBSTR.method(), NullPolicy.STRICT);
       defineMethod(ROUND, IgniteMethod.ROUND.method(), NullPolicy.STRICT);
 
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 0025a5ea69..d667371faa 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
@@ -192,6 +192,12 @@ public class IgniteSqlOperatorTable extends 
ReflectiveSqlOperatorTable {
             OperandTypes.NUMERIC_OPTIONAL_INTEGER,
             SqlFunctionCategory.NUMERIC);
 
+    /** The {@code OCTET_LENGTH(string|binary)} function. */
+    public static final SqlFunction OCTET_LENGTH = 
SqlBasicFunction.create("OCTET_LENGTH",
+            ReturnTypes.INTEGER_NULLABLE,
+            OperandTypes.CHARACTER.or(OperandTypes.BINARY),
+            SqlFunctionCategory.NUMERIC);
+
     /** Singleton instance. */
     public static final IgniteSqlOperatorTable INSTANCE = new 
IgniteSqlOperatorTable();
 
@@ -412,7 +418,7 @@ public class IgniteSqlOperatorTable extends 
ReflectiveSqlOperatorTable {
         register(SqlLibraryOperators.LEAST);
         register(SqlLibraryOperators.GREATEST);
         register(SqlLibraryOperators.COMPRESS);
-        register(SqlStdOperatorTable.OCTET_LENGTH);
+        register(OCTET_LENGTH);
         register(SqlStdOperatorTable.DEFAULT);
         register(SqlStdOperatorTable.REINTERPRET);
 
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 48bf6bd87c..43be2825b8 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
@@ -103,6 +103,9 @@ public enum IgniteMethod {
 
     LENGTH(IgniteSqlFunctions.class, "length", Object.class),
 
+    OCTET_LENGTH(IgniteSqlFunctions.class, "octetLength", ByteString.class),
+    OCTET_LENGTH2(IgniteSqlFunctions.class, "octetLength", String.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