You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by mo...@apache.org on 2022/06/20 01:35:14 UTC

[doris] branch master updated: [feature-wip](array-type) add ArrayType support for FeFunctions (#10041)

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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 2f37e108e3 [feature-wip](array-type) add ArrayType support for FeFunctions (#10041)
2f37e108e3 is described below

commit 2f37e108e3a91f65745676c4bc010d5ba5dbb241
Author: camby <10...@qq.com>
AuthorDate: Mon Jun 20 09:35:06 2022 +0800

    [feature-wip](array-type) add ArrayType support for FeFunctions (#10041)
    
    FEFunctionSignature do not support ArrayType as args, then following SQL failed:
    `> select array_contains([1,2,3], 1);`
    ERROR 1105 (HY000): errCode = 2, detailMessage = Unexpected exception: org.apache.doris.catalog.ArrayType cannot be cast to org.apache.doris.catalog.ScalarType
---
 .../apache/doris/analysis/ExpressionFunctions.java |  22 ++---
 .../java/org/apache/doris/catalog/ArrayType.java   |   2 +-
 .../java/org/apache/doris/rewrite/FEFunctions.java |  13 ++-
 .../test_array_functions_by_literal.out            | 100 +++++++++++++++++++++
 .../test_array_functions_by_literal.groovy         |  62 +++++++++++++
 5 files changed, 184 insertions(+), 15 deletions(-)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java
index 035cd8a67b..4325f1168b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/ExpressionFunctions.java
@@ -93,12 +93,8 @@ public enum ExpressionFunctions {
                 return constExpr;
             }
 
-            List<ScalarType> argTypes = new ArrayList<>();
-            for (Type type : fn.getArgs()) {
-                argTypes.add((ScalarType) type);
-            }
             FEFunctionSignature signature = new FEFunctionSignature(fn.functionName(),
-                    argTypes.toArray(new ScalarType[argTypes.size()]), fn.getReturnType());
+                    fn.getArgs(), fn.getReturnType());
             FEFunctionInvoker invoker = getFunction(signature);
             if (invoker != null) {
                 try {
@@ -124,8 +120,8 @@ public enum ExpressionFunctions {
                 continue;
             }
 
-            ScalarType[] argTypes1 = invoker.getSignature().getArgTypes();
-            ScalarType[] argTypes2 = signature.getArgTypes();
+            Type[] argTypes1 = invoker.getSignature().getArgTypes();
+            Type[] argTypes2 = signature.getArgTypes();
 
             if (!Arrays.equals(argTypes1, argTypes2)) {
                 continue;
@@ -161,12 +157,12 @@ public enum ExpressionFunctions {
         if (annotation != null) {
             String name = annotation.name();
             Type returnType = Type.fromPrimitiveType(PrimitiveType.valueOf(annotation.returnType()));
-            List<ScalarType> argTypes = new ArrayList<>();
+            List<Type> argTypes = new ArrayList<>();
             for (String type : annotation.argTypes()) {
                 argTypes.add(ScalarType.createType(type));
             }
             FEFunctionSignature signature = new FEFunctionSignature(name,
-                    argTypes.toArray(new ScalarType[argTypes.size()]), returnType);
+                    argTypes.toArray(new Type[argTypes.size()]), returnType);
             mapBuilder.put(name, new FEFunctionInvoker(method, signature));
         }
     }
@@ -229,7 +225,7 @@ public enum ExpressionFunctions {
                 throw new AnalysisException("Function's args doesn't match.");
             }
 
-            final ScalarType argType = signature.getArgTypes()[typeIndex];
+            final Type argType = signature.getArgTypes()[typeIndex];
             LiteralExpr[] exprs;
             if (argType.isStringType()) {
                 exprs = new StringLiteral[args.size()];
@@ -259,16 +255,16 @@ public enum ExpressionFunctions {
 
     public static class FEFunctionSignature {
         private final String name;
-        private final ScalarType[] argTypes;
+        private final Type[] argTypes;
         private final Type returnType;
 
-        public FEFunctionSignature(String name, ScalarType[] argTypes, Type returnType) {
+        public FEFunctionSignature(String name, Type[] argTypes, Type returnType) {
             this.name = name;
             this.argTypes = argTypes;
             this.returnType = returnType;
         }
 
-        public ScalarType[] getArgTypes() {
+        public Type[] getArgTypes() {
             return argTypes;
         }
 
diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/ArrayType.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/ArrayType.java
index 8ad8bb9935..04775c2bf6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/catalog/ArrayType.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/ArrayType.java
@@ -113,7 +113,7 @@ public class ArrayType extends Type {
             return false;
         }
         ArrayType otherArrayType = (ArrayType) other;
-        return otherArrayType.itemType.equals(itemType) && otherArrayType.containsNull == containsNull;
+        return otherArrayType.itemType.equals(itemType);
     }
 
     public static boolean canCastTo(ArrayType type, ArrayType targetType) {
diff --git a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java
index fb69a19a4c..b2463d71d2 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/rewrite/FEFunctions.java
@@ -562,8 +562,19 @@ public class FEFunctions {
     }
 
     @FEFunctionList({
+        @FEFunction(name = "array", argTypes = {"BOOLEAN"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"TINYINT"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"SMALLINT"}, returnType = "ARRAY"),
         @FEFunction(name = "array", argTypes = {"INT"}, returnType = "ARRAY"),
-        @FEFunction(name = "array", argTypes = {"VARCHAR"}, returnType = "ARRAY")
+        @FEFunction(name = "array", argTypes = {"BIGINT"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"LARGEINT"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"DATETIME"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"DATE"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"FLOAT"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"DOUBLE"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"DECIMALV2"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"VARCHAR"}, returnType = "ARRAY"),
+        @FEFunction(name = "array", argTypes = {"STRING"}, returnType = "ARRAY")
     })
     public static ArrayLiteral array(LiteralExpr... exprs) throws AnalysisException {
         return new ArrayLiteral(exprs);
diff --git a/regression-test/data/query/sql_functions/array_functions/test_array_functions_by_literal.out b/regression-test/data/query/sql_functions/array_functions/test_array_functions_by_literal.out
new file mode 100644
index 0000000000..28c69d2f55
--- /dev/null
+++ b/regression-test/data/query/sql_functions/array_functions/test_array_functions_by_literal.out
@@ -0,0 +1,100 @@
+-- This file is automatically generated. You should know what you did if you want to edit this
+-- !sql --
+true
+
+-- !sql --
+false
+
+-- !sql --
+true
+
+-- !sql --
+\N
+
+-- !sql --
+false
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+1
+
+-- !sql --
+3
+
+-- !sql --
+0
+
+-- !sql --
+2
+
+-- !sql --
+\N
+
+-- !sql --
+0
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+1
+
+-- !sql --
+3
+
+-- !sql --
+\N
+
+-- !sql --
+3
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+2
+
+-- !sql --
+\N
+
+-- !sql --
+1
+
+-- !sql --
+3
+
+-- !sql --
+\N
+
+-- !sql --
+3
+
+-- !sql --
+\N
+
+-- !sql --
+\N
+
+-- !sql --
+2
+
+-- !sql --
+\N
+
diff --git a/regression-test/suites/query/sql_functions/array_functions/test_array_functions_by_literal.groovy b/regression-test/suites/query/sql_functions/array_functions/test_array_functions_by_literal.groovy
new file mode 100644
index 0000000000..c4349fd560
--- /dev/null
+++ b/regression-test/suites/query/sql_functions/array_functions/test_array_functions_by_literal.groovy
@@ -0,0 +1,62 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_array_functions_by_literal", "all") {
+    sql "set enable_vectorized_engine = true"
+    sql "set enable_array_type = true"
+
+    // array_contains function
+    qt_sql "select array_contains([1,2,3], 1)"
+    qt_sql "select array_contains([1,2,3], 4)"
+    qt_sql "select array_contains([1,2,3,NULL], 1)"
+    qt_sql "select array_contains([1,2,3,NULL], NULL)"
+    qt_sql "select array_contains([], 1)"
+    qt_sql "select array_contains([], NULL)"
+    qt_sql "select array_contains(NULL, 1)"
+    qt_sql "select array_contains(NULL, NULL)"
+
+    // array_position function
+    qt_sql "select array_position([1,2,3], 1)"
+    qt_sql "select array_position([1,2,3], 3)"
+    qt_sql "select array_position([1,2,3], 4)"
+    qt_sql "select array_position([NULL,2,3], 2)"
+    qt_sql "select array_position([NULL,2,3], NULL)"
+    qt_sql "select array_position([], 1)"
+    qt_sql "select array_position([], NULL)"
+    qt_sql "select array_position(NULL, 1)"
+    qt_sql "select array_position(NULL, NULL)"
+
+    // element_at function
+    qt_sql "select element_at([1,2,3], 1)"
+    qt_sql "select element_at([1,2,3], 3)"
+    qt_sql "select element_at([1,2,3], 4)"
+    qt_sql "select element_at([1,2,3], -1)"
+    qt_sql "select element_at([1,2,3], NULL)"
+    qt_sql "select element_at([1,2,NULL], 3)"
+    qt_sql "select element_at([1,2,NULL], 2)"
+    qt_sql "select element_at([], -1)"
+
+    // array subscript function
+    qt_sql "select [1,2,3][1]"
+    qt_sql "select [1,2,3][3]"
+    qt_sql "select [1,2,3][4]"
+    qt_sql "select [1,2,3][-1]"
+    qt_sql "select [1,2,3][NULL]"
+    qt_sql "select [1,2,NULL][3]"
+    qt_sql "select [1,2,NULL][2]"
+    qt_sql "select [][-1]"
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org