This is an automated email from the ASF dual-hosted git repository.
xiong pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 2ddfb0eb00 [CALCITE-6821] Support crc32 function for Hive and Spark
library
2ddfb0eb00 is described below
commit 2ddfb0eb00bd87b040e4ca743a7451034dd28f98
Author: xuyu <[email protected]>
AuthorDate: Mon Feb 10 19:41:06 2025 +0800
[CALCITE-6821] Support crc32 function for Hive and Spark library
---
.../calcite/adapter/enumerable/RexImpTable.java | 2 ++
.../org/apache/calcite/runtime/SqlFunctions.java | 19 +++++++++++++++
.../calcite/sql/fun/SqlLibraryOperators.java | 7 ++++++
.../org/apache/calcite/util/BuiltInMethod.java | 1 +
site/_docs/reference.md | 1 +
.../org/apache/calcite/test/SqlOperatorTest.java | 28 ++++++++++++++++++++--
6 files changed, 56 insertions(+), 2 deletions(-)
diff --git
a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
index 5a9d4181c7..da79c96c0f 100644
--- a/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
+++ b/core/src/main/java/org/apache/calcite/adapter/enumerable/RexImpTable.java
@@ -188,6 +188,7 @@
import static org.apache.calcite.sql.fun.SqlLibraryOperators.COSD;
import static org.apache.calcite.sql.fun.SqlLibraryOperators.COSH;
import static org.apache.calcite.sql.fun.SqlLibraryOperators.COTH;
+import static org.apache.calcite.sql.fun.SqlLibraryOperators.CRC32;
import static org.apache.calcite.sql.fun.SqlLibraryOperators.CSC;
import static org.apache.calcite.sql.fun.SqlLibraryOperators.CSCH;
import static org.apache.calcite.sql.fun.SqlLibraryOperators.CURRENT_DATETIME;
@@ -697,6 +698,7 @@ void populate1() {
defineMethod(FROM_HEX, BuiltInMethod.FROM_HEX.method, NullPolicy.STRICT);
defineMethod(BIN, BuiltInMethod.BIN.method, NullPolicy.STRICT);
defineMethod(MD5, BuiltInMethod.MD5.method, NullPolicy.STRICT);
+ defineMethod(CRC32, BuiltInMethod.CRC32.method, NullPolicy.STRICT);
defineMethod(SHA1, BuiltInMethod.SHA1.method, NullPolicy.STRICT);
defineMethod(SHA256, BuiltInMethod.SHA256.method, NullPolicy.STRICT);
defineMethod(SHA512, BuiltInMethod.SHA512.method, NullPolicy.STRICT);
diff --git a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
index e7ea146118..9fa031c313 100644
--- a/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
+++ b/core/src/main/java/org/apache/calcite/runtime/SqlFunctions.java
@@ -133,6 +133,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
+import java.util.zip.CRC32;
import static
org.apache.calcite.config.CalciteSystemProperty.FUNCTION_LEVEL_CACHE_MAX_SIZE;
import static org.apache.calcite.linq4j.Nullness.castNonNull;
@@ -386,6 +387,24 @@ public static String bin(long value) {
}
}
+ /** SQL CRC32(string) function. */
+ public static long crc32(String value) {
+ final CRC32 crc32 = new CRC32();
+ crc32.reset();
+ byte[] bytes = value.getBytes(UTF_8);
+ crc32.update(bytes, 0, bytes.length);
+ return crc32.getValue();
+ }
+
+ /** SQL CRC32(string) function for binary string. */
+ public static long crc32(ByteString value) {
+ final CRC32 crc32 = new CRC32();
+ crc32.reset();
+ byte[] bytes = value.getBytes();
+ crc32.update(bytes, 0, bytes.length);
+ return crc32.getValue();
+ }
+
/** SQL MD5(string) function. */
public static String md5(String string) {
return DigestUtils.md5Hex(string.getBytes(UTF_8));
diff --git
a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
index a1faaba871..c617bac014 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
@@ -2518,6 +2518,13 @@ private static RelDataType
deriveTypeMapFromEntries(SqlOperatorBinding opBinding
OperandTypes.STRING.or(OperandTypes.BINARY),
SqlFunctionCategory.STRING);
+ @LibraryOperator(libraries = {SPARK, HIVE})
+ public static final SqlFunction CRC32 =
+ SqlBasicFunction.create("CRC32",
+ ReturnTypes.BIGINT_NULLABLE,
+ OperandTypes.STRING.or(OperandTypes.BINARY),
+ SqlFunctionCategory.STRING);
+
@LibraryOperator(libraries = {BIG_QUERY, MYSQL, POSTGRESQL, SPARK, HIVE})
public static final SqlFunction SHA1 =
SqlBasicFunction.create("SHA1",
diff --git a/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
b/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
index 82be1a9fe6..fbbbbc980d 100644
--- a/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
+++ b/core/src/main/java/org/apache/calcite/util/BuiltInMethod.java
@@ -440,6 +440,7 @@ public enum BuiltInMethod {
FROM_HEX(SqlFunctions.class, "fromHex", String.class),
BIN(SqlFunctions.class, "bin", long.class),
MD5(SqlFunctions.class, "md5", String.class),
+ CRC32(SqlFunctions.class, "crc32", String.class),
SHA1(SqlFunctions.class, "sha1", String.class),
SHA256(SqlFunctions.class, "sha256", String.class),
SHA512(SqlFunctions.class, "sha512", String.class),
diff --git a/site/_docs/reference.md b/site/_docs/reference.md
index 99f3b775bf..480a19e867 100644
--- a/site/_docs/reference.md
+++ b/site/_docs/reference.md
@@ -2842,6 +2842,7 @@ ### Dialect-specific Operators
| p | COSD(numeric) | Returns the cosine of
*numeric* in degrees as a double. Returns NaN if *numeric* is NaN. Fails if
*numeric* is greater than the maximum double value.
| * | COSH(numeric) | Returns the hyperbolic
cosine of *numeric*
| * | COTH(numeric) | Returns the hyperbolic
cotangent of *numeric*
+| s h | CRC32(string) | Calculates a cyclic
redundancy check value for string or binary argument and returns bigint value
| * | CSC(numeric) | Returns the cosecant of
*numeric* in radians
| * | CSCH(numeric) | Returns the hyperbolic
cosecant of *numeric*
| b | CURRENT_DATETIME([ timeZone ]) | Returns the current
time as a TIMESTAMP from *timezone*
diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
index 5b2521112f..a76d9f3065 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
@@ -5760,8 +5760,7 @@ void testBitGetFunc(SqlOperatorFixture f, String
functionName) {
* <a
href="https://issues.apache.org/jira/browse/CALCITE-6815">[CALCITE-6815]
* Add bin function (enabled in Hive and Spark library)</a>. */
@Test void testBin() {
-// final SqlOperatorFixture f0 = fixture().setFor(SqlLibraryOperators.BIN);
- final SqlOperatorFixture f0 =
Fixtures.forOperators(true).setFor(SqlLibraryOperators.BIN);
+ final SqlOperatorFixture f0 = fixture().setFor(SqlLibraryOperators.BIN);
f0.checkFails("^bin(x'')^",
"No match found for function signature BIN\\(<BINARY>\\)",
false);
@@ -5797,6 +5796,31 @@ void testBitGetFunc(SqlOperatorFixture f, String
functionName) {
f0.forEachLibrary(libraries, consumer);
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6821">[CALCITE-6821]
+ * Add crc32 function (enabled in Hive and Spark library)</a>. */
+ @Test void testCRC32() {
+ final SqlOperatorFixture f0 = fixture().setFor(SqlLibraryOperators.CRC32);
+ final List<SqlLibrary> libraries =
+ ImmutableList.of(SqlLibrary.SPARK, SqlLibrary.HIVE);
+ final Consumer<SqlOperatorFixture> consumer = f -> {
+ f.checkString("crc32('ABC')",
+ "2743272264",
+ "BIGINT NOT NULL");
+ f.checkString("crc32(x'414243')",
+ "2743272264",
+ "BIGINT NOT NULL");
+ f.checkString("crc32('')",
+ "0",
+ "BIGINT NOT NULL");
+ f.checkString("crc32(x'')",
+ "0",
+ "BIGINT NOT NULL");
+ f.checkNull("crc32(null)");
+ };
+ f0.forEachLibrary(libraries, consumer);
+ }
+
@Test void testMd5() {
final SqlOperatorFixture f0 = fixture().setFor(SqlLibraryOperators.MD5);
f0.checkFails("^md5(x'')^",