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

kxiao 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 d4e823950a9 [bug](json)Fix some problems of json function on Nereids 
(#24898)
d4e823950a9 is described below

commit d4e823950a9969944ad552e3cc9ec1851f5c7f23
Author: Liqf <[email protected]>
AuthorDate: Wed Sep 27 21:01:45 2023 +0800

    [bug](json)Fix some problems of json function on Nereids (#24898)
    
    Fix some problems of json_length and json_contains function on Nereids
    fix wrong result of json_contains function
    Regression test jsonb_p0 to enable Nereids
---
 be/src/util/jsonb_document.h                       | 22 ++++++++++++++--------
 .../doris/catalog/BuiltinScalarFunctions.java      |  2 +-
 .../expressions/functions/scalar/JsonContains.java |  2 +-
 .../expressions/functions/scalar/JsonLength.java   |  6 +++---
 .../jsonb_p0/test_jsonb_load_and_function.groovy   |  3 ++-
 .../test_jsonb_load_unique_key_and_function.groovy |  3 ++-
 .../json_functions/test_json_function.groovy       |  6 +++---
 7 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/be/src/util/jsonb_document.h b/be/src/util/jsonb_document.h
index 3150f0d7ee5..657438fefee 100644
--- a/be/src/util/jsonb_document.h
+++ b/be/src/util/jsonb_document.h
@@ -1297,16 +1297,22 @@ inline bool JsonbValue::contains(JsonbValue* rhs) const 
{
         return false;
     }
     case JsonbType::T_Array: {
-        if (rhs->isArray() && ((ArrayVal*)this)->numElem() == 
((ArrayVal*)rhs)->numElem() &&
-            ((ArrayVal*)this)->numPackedBytes() == 
((ArrayVal*)rhs)->numPackedBytes()) {
-            for (int i = 0; i < ((ArrayVal*)this)->numElem(); ++i) {
-                if 
(!((ArrayVal*)this)->get(i)->contains(((ArrayVal*)rhs)->get(i))) {
-                    return false;
+        int lhs_num = ((ArrayVal*)this)->numElem();
+        if (rhs->isArray()) {
+            int rhs_num = ((ArrayVal*)rhs)->numElem();
+            if (rhs_num > lhs_num) return false;
+            int contains_num = 0;
+            for (int i = 0; i < lhs_num; ++i) {
+                for (int j = 0; j < rhs_num; ++j) {
+                    if 
(((ArrayVal*)this)->get(i)->contains(((ArrayVal*)rhs)->get(j))) {
+                        contains_num++;
+                        break;
+                    }
                 }
             }
-            return true;
+            return contains_num == rhs_num;
         }
-        for (int i = 0; i < ((ArrayVal*)this)->numElem(); ++i) {
+        for (int i = 0; i < lhs_num; ++i) {
             if (((ArrayVal*)this)->get(i)->contains(rhs)) {
                 return true;
             }
@@ -1320,7 +1326,7 @@ inline bool JsonbValue::contains(JsonbValue* rhs) const {
             for (int i = 0; i < str_value2->numElem(); ++i) {
                 JsonbKeyValue* key = str_value2->getJsonbKeyValue(i);
                 JsonbValue* value = str_value1->find(key->getKeyStr(), 
key->klen());
-                if (key != nullptr && value != nullptr && 
!key->value()->contains(value))
+                if (key != nullptr && value != nullptr && 
!value->contains(key->value()))
                     return false;
             }
             return true;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
index 8ee592ae44b..e73281e8098 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/BuiltinScalarFunctions.java
@@ -611,7 +611,7 @@ public class BuiltinScalarFunctions implements 
FunctionHelper {
             scalar(JsonbType.class, "json_type"),
             scalar(JsonbType.class, "jsonb_type"),
             scalar(JsonLength.class, "json_length"),
-            scalar(JsonContains.class, "json_conatins"),
+            scalar(JsonContains.class, "json_contains"),
             scalar(LastDay.class, "last_day"),
             scalar(Least.class, "least"),
             scalar(Left.class, "left"),
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonContains.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonContains.java
index afae87c0a5e..6841de6c4db 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonContains.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonContains.java
@@ -51,7 +51,7 @@ public class JsonContains extends ScalarFunction
      * constructor with 2 arguments.
      */
     public JsonContains(Expression arg0, Expression arg1) {
-        super("json_contains", arg0, arg1, Literal.of(""));
+        super("json_contains", arg0, arg1, Literal.of("$"));
     }
 
     /**
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonLength.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonLength.java
index fbe127d8779..048384eeb99 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonLength.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/functions/scalar/JsonLength.java
@@ -19,8 +19,8 @@ package 
org.apache.doris.nereids.trees.expressions.functions.scalar;
 
 import org.apache.doris.catalog.FunctionSignature;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.functions.AlwaysNullable;
 import 
org.apache.doris.nereids.trees.expressions.functions.ExplicitlyCastableSignature;
-import org.apache.doris.nereids.trees.expressions.functions.PropagateNullable;
 import org.apache.doris.nereids.trees.expressions.literal.Literal;
 import org.apache.doris.nereids.trees.expressions.shape.BinaryExpression;
 import org.apache.doris.nereids.trees.expressions.visitor.ExpressionVisitor;
@@ -38,7 +38,7 @@ import java.util.List;
  * ScalarFunction 'json_length'. This class is generated by GenerateFunction.
  */
 public class JsonLength extends ScalarFunction
-        implements BinaryExpression, ExplicitlyCastableSignature, 
PropagateNullable {
+        implements BinaryExpression, ExplicitlyCastableSignature, 
AlwaysNullable {
 
     public static final List<FunctionSignature> SIGNATURES = ImmutableList.of(
             
FunctionSignature.ret(IntegerType.INSTANCE).args(JsonType.INSTANCE),
@@ -50,7 +50,7 @@ public class JsonLength extends ScalarFunction
      * constructor with 1 arguments.
      */
     public JsonLength(Expression arg0) {
-        super("json_length", arg0, Literal.of(""));
+        super("json_length", arg0, Literal.of("$"));
     }
 
     /**
diff --git 
a/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy 
b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy
index 1347726d2af..524b89ae6a3 100644
--- a/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy
+++ b/regression-test/suites/jsonb_p0/test_jsonb_load_and_function.groovy
@@ -26,7 +26,8 @@ suite("test_jsonb_load_and_function", "p0") {
     def testTable = "tbl_test_jsonb"
     def dataFile = "test_jsonb.csv"
 
-    sql """ set experimental_enable_nereids_planner = false """
+    sql """ set experimental_enable_nereids_planner = true """
+    sql """ set enable_fallback_to_original_planner = true """
 
     sql "DROP TABLE IF EXISTS ${testTable}"
 
diff --git 
a/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy
 
b/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy
index 398e0f06eda..526ddf4710e 100644
--- 
a/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy
+++ 
b/regression-test/suites/jsonb_p0/test_jsonb_load_unique_key_and_function.groovy
@@ -23,7 +23,8 @@ suite("test_jsonb_unique_load_and_function", "p0") {
     def testTable = "tbl_test_jsonb_unique"
     def dataFile = "test_jsonb_unique_key.csv"
 
-    sql """ set experimental_enable_nereids_planner = false """
+    sql """ set experimental_enable_nereids_planner = true """
+    sql """ set enable_fallback_to_original_planner = true """
 
     sql "DROP TABLE IF EXISTS ${testTable}"
 
diff --git 
a/regression-test/suites/query_p0/sql_functions/json_functions/test_json_function.groovy
 
b/regression-test/suites/query_p0/sql_functions/json_functions/test_json_function.groovy
index ef9eb7637cd..474097e5047 100644
--- 
a/regression-test/suites/query_p0/sql_functions/json_functions/test_json_function.groovy
+++ 
b/regression-test/suites/query_p0/sql_functions/json_functions/test_json_function.groovy
@@ -71,8 +71,8 @@ suite("test_json_function") {
     qt_sql "SELECT JSON_CONTAINS('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 
4}}','1','\$.b');"
     qt_sql "SELECT JSON_CONTAINS('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 
4}}','{\"d\": 4}','\$.a');"
     qt_sql "SELECT JSON_CONTAINS('{\"a\": 1, \"b\": 2, \"c\": {\"d\": 
4}}','{\"d\": 4}','\$.c');"
-    qt_sql "SELECT JSON_CONTAINS('{\"name\": \"John\", \"age\": 30, \"city\": 
\"New York\", \"hobbies\": [\"reading\", \"travelling\"]}', '{\"age\": 31, 
\"hobbies\": [\"reading\"]}', '\$.');"
-    qt_sql "SELECT JSON_CONTAINS('{\"name\": \"John\", \"age\": 30, 
\"projects\": [{\"name\": \"Project A\", \"year\": 2020}, {\"name\": \"Project 
B\", \"year\": 2021}]}', '{\"projects\": [{\"name\": \"Project A\"}]}', '\$.');"
-    qt_sql "SELECT JSON_CONTAINS('{\"name\": \"John\", \"age\": 30, 
\"address\": {\"city\": \"New York\", \"country\": \"USA\"}}', '{\"address\": 
{\"city\": \"New York\"}}', '\$.');"
+    qt_sql "SELECT JSON_CONTAINS('{\"name\": \"John\", \"age\": 30, \"city\": 
\"New York\", \"hobbies\": [\"reading\", \"travelling\"]}', '{\"age\": 31, 
\"hobbies\": [\"reading\"]}', '\$');"
+    qt_sql "SELECT JSON_CONTAINS('{\"name\": \"John\", \"age\": 30, 
\"projects\": [{\"name\": \"Project A\", \"year\": 2020}, {\"name\": \"Project 
B\", \"year\": 2021}]}', '{\"projects\": [{\"name\": \"Project A\"}]}', '\$');"
+    qt_sql "SELECT JSON_CONTAINS('{\"name\": \"John\", \"age\": 30, 
\"address\": {\"city\": \"New York\", \"country\": \"USA\"}}', '{\"address\": 
{\"city\": \"New York\"}}', '\$');"
 
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to