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]