You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2023/10/31 12:07:55 UTC

(ignite-3) branch ignite-20660 created (now d9ed74cc6b)

This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a change to branch ignite-20660
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


      at d9ed74cc6b Fix

This branch includes the following new commits:

     new d9ed74cc6b Fix

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(ignite-3) 01/01: Fix

Posted by am...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

amashenkov pushed a commit to branch ignite-20660
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit d9ed74cc6b417064ea09d6d567cb86eacbc7dfdc
Author: amashenkov <an...@gmail.com>
AuthorDate: Tue Oct 31 15:07:47 2023 +0300

    Fix
---
 .../org/apache/ignite/internal/sql/engine/ItFunctionsTest.java   | 7 +++++++
 .../apache/ignite/internal/sql/engine/ItSqlOperatorsTest.java    | 1 +
 .../engine/datatypes/varbinary/ItVarBinaryExpressionTest.java    | 4 ++++
 .../integrationTest/sql/types/string/test_unicode.test_ignored   | 6 ++++++
 .../ignite/internal/sql/engine/exec/exp/IgniteSqlFunctions.java  | 9 +++++++--
 .../apache/ignite/internal/sql/engine/exec/exp/RexImpTable.java  | 1 +
 .../internal/sql/engine/sql/fun/IgniteSqlOperatorTable.java      | 8 +++++++-
 .../org/apache/ignite/internal/sql/engine/util/IgniteMethod.java | 2 ++
 8 files changed, 35 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..d98ea378f4 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,13 @@ 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(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/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 25b5275d68..4721f0d20f 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
@@ -93,6 +93,10 @@ public class ItVarBinaryExpressionTest extends BaseExpressionDataTypeTest<VarBin
                 .withParams(new byte[0])
                 .returns(0).check();
 
+        checkQuery("SELECT OCTET_LENGTH(?)")
+                .withParams("123")
+                .returns(3).check();
+
         checkQuery("SELECT LENGTH(?)")
                 .withParams(new byte[]{1, 2, 3})
                 .returns(3).check();
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..c8f61dc834 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,12 @@ 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|VARCHAR). */
+    public static int octetLength(Object s) {
+        return s instanceof ByteString ? SqlFunctions.octetLength((ByteString) s) : ((String) 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..f821968c44 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,8 @@ public enum IgniteMethod {
 
     LENGTH(IgniteSqlFunctions.class, "length", Object.class),
 
+    OCTET_LENGTH(IgniteSqlFunctions.class, "octetLength", 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"),