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

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git

commit dd567fa77444dfae36884f376a6790b0409215d6
Author: Xujian Duan <50550370+darvend...@users.noreply.github.com>
AuthorDate: Thu May 23 14:07:50 2024 +0800

    [fix](function) support return JsonType for If function (#35199)
    
    add a FunctionSignature for If to support return Type is JsonType.
---
 .../trees/expressions/functions/scalar/If.java     |  5 +-
 .../conditional_functions/test_if_json.out         | 29 +++++++++
 .../conditional_functions/test_if_json.groovy      | 74 ++++++++++++++++++++++
 3 files changed, 107 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java
index 8f98e7641b1..e7ffcebdfe5 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/If.java
@@ -36,6 +36,7 @@ import org.apache.doris.nereids.types.DoubleType;
 import org.apache.doris.nereids.types.FloatType;
 import org.apache.doris.nereids.types.HllType;
 import org.apache.doris.nereids.types.IntegerType;
+import org.apache.doris.nereids.types.JsonType;
 import org.apache.doris.nereids.types.LargeIntType;
 import org.apache.doris.nereids.types.MapType;
 import org.apache.doris.nereids.types.NullType;
@@ -101,7 +102,9 @@ public class If extends ScalarFunction
             FunctionSignature.ret(VarcharType.SYSTEM_DEFAULT)
                     .args(BooleanType.INSTANCE, VarcharType.SYSTEM_DEFAULT, 
VarcharType.SYSTEM_DEFAULT),
             FunctionSignature.ret(StringType.INSTANCE)
-                    .args(BooleanType.INSTANCE, StringType.INSTANCE, 
StringType.INSTANCE)
+                    .args(BooleanType.INSTANCE, StringType.INSTANCE, 
StringType.INSTANCE),
+            FunctionSignature.ret(JsonType.INSTANCE)
+                    .args(BooleanType.INSTANCE, JsonType.INSTANCE, 
JsonType.INSTANCE)
     );
 
     /**
diff --git 
a/regression-test/data/query_p0/sql_functions/conditional_functions/test_if_json.out
 
b/regression-test/data/query_p0/sql_functions/conditional_functions/test_if_json.out
new file mode 100644
index 00000000000..579c66a6fcd
--- /dev/null
+++ 
b/regression-test/data/query_p0/sql_functions/conditional_functions/test_if_json.out
@@ -0,0 +1,29 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !if_json_parse --
+1      {"k":"k1","v":"v1"}     {"k":"k1","v":"v1"}
+2      {"k":"k2","v":"v3"}     {"k":"k2","v":"v3"}
+3      \N      \N
+4      {"k":"k4","v":"v4"}     {"k":"k4","v":"v4"}
+5      \N      {"k":"k5","v":"v5"}
+
+-- !case_json_parse --
+1      {"k":"k1","v":"v1"}     {"k":"k1","v":"v1"}
+2      {"k":"k2","v":"v3"}     {"k":"k2","v":"v3"}
+3      \N      \N
+4      {"k":"k4","v":"v4"}     {"k":"k4","v":"v4"}
+5      \N      {"k":"k5","v":"v5"}
+
+-- !case_json_parse_error_to_null --
+1      {"k":"k1","v":"v1"}     {"k":"k1","v":"v1"}
+2      {"k":"k2","v":"v3"}     {"k":"k2","v":"v3"}
+3      \N      \N
+4      {"k":"k4","v":"v4"}     {"k":"k4","v":"v4"}
+5      \N      {"k":"k5","v":"v5"}
+
+-- !case_json_parse_error_to_value --
+1      {"k":"k1","v":"v1"}     {"k":"k1","v":"v1"}
+2      {"k":"k2","v":"v3"}     {"k":"k2","v":"v3"}
+3      \N      \N
+4      {"k":"k4","v":"v4"}     {"k":"k4","v":"v4"}
+5      \N      {"k":"k5","v":"v5"}
+
diff --git 
a/regression-test/suites/query_p0/sql_functions/conditional_functions/test_if_json.groovy
 
b/regression-test/suites/query_p0/sql_functions/conditional_functions/test_if_json.groovy
new file mode 100644
index 00000000000..973f193b461
--- /dev/null
+++ 
b/regression-test/suites/query_p0/sql_functions/conditional_functions/test_if_json.groovy
@@ -0,0 +1,74 @@
+// 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_if_json") {
+    def tblName = "test_if_json"
+    sql """DROP TABLE IF EXISTS ${tblName};"""
+    sql """
+        CREATE TABLE ${tblName} (
+            `id` INT NULL,
+            `v_key` CHAR NULL,
+            `v_json` JSON NULL
+        ) ENGINE=OLAP
+        DUPLICATE KEY(`id`, `v_key`)
+        COMMENT 'OLAP'
+        DISTRIBUTED BY HASH(`id`) BUCKETS 10
+        PROPERTIES (
+        "replication_num" = "1"
+        )
+    """
+
+    sql """ insert into ${tblName} values (1, 'a', '{"k":"k1","v":"v1"}')"""
+    sql """ insert into ${tblName} values (2, 'a', '{"k":"k2","v":"v3"}')"""
+    sql """ insert into ${tblName} values (3, 'b', '{"k":"k3","v":"v3"}')"""
+    sql """ insert into ${tblName} values (4, 'a', '{"k":"k4","v":"v4"}')"""
+    sql """ insert into ${tblName} values (5, 'c', '{"k":"k5","v":"v5"}')"""
+
+    qt_if_json_parse """
+    SELECT id,
+        if(v_key = 'a', JSON_PARSE(v_json), NULL) AS a,
+        if(v_key = 'b', NULL, JSON_PARSE(v_json)) AS b
+    FROM ${tblName}
+    ORDER BY id
+    """
+
+    qt_case_json_parse """
+    SELECT id,
+        CASE v_key WHEN 'a' THEN JSON_PARSE(v_json) ELSE NULL END AS a,
+        CASE v_key WHEN 'b' THEN NULL ELSE JSON_PARSE(v_json) END AS b
+    FROM ${tblName}
+    ORDER BY id
+    """
+
+    qt_case_json_parse_error_to_null """ 
+    SELECT id,
+        CASE v_key WHEN 'a' THEN json_parse_error_to_null(v_json) ELSE NULL 
END AS a,
+        CASE v_key WHEN 'b' THEN NULL ELSE json_parse_error_to_null(v_json) 
END AS b
+    FROM ${tblName}
+    ORDER BY id
+    """
+
+    qt_case_json_parse_error_to_value """ 
+    SELECT id,
+        CASE v_key WHEN 'a' THEN 
json_parse_error_to_value(v_json,json_object()) ELSE NULL END AS a,
+        CASE v_key WHEN 'b' THEN NULL ELSE 
json_parse_error_to_value(v_json,json_object()) END AS b
+    FROM ${tblName}
+    ORDER BY id
+    """
+
+    sql """DROP TABLE IF EXISTS ${tblName};"""
+}


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

Reply via email to