diff --git a/be/src/util/jsonb_document.h b/be/src/util/jsonb_document.h index 3150f0d7ee..657438fefe 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 8ee592ae44..e73281e809 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 afae87c0a5..6841de6c4d 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 fbe127d877..048384eeb9 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 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 1347726d2a..524b89ae6a 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 398e0f06ed..526ddf4710 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 ef9eb7637c..474097e504 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\"}}', '\$');" }