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