diff --git a/src/observer/virtual_table/ob_table_columns.cpp b/src/observer/virtual_table/ob_table_columns.cpp index e92d868b0724911b46e7a7227d5a9c82e6f08b59..3cd7c0264121577ed6b88992e06d5fb4617fd41c 100644 --- a/src/observer/virtual_table/ob_table_columns.cpp +++ b/src/observer/virtual_table/ob_table_columns.cpp @@ -542,6 +542,10 @@ int ObTableColumns::deduce_column_attributes( if (OB_FAIL(set_null_and_default_according_binary_expr(select_stmt, expr, nullable, has_default))) { LOG_WARN("fail to get null and default for binary expr", K(ret)); } + } else if (expr->is_json_expr() || + (T_FUN_SYS_CAST == expr->get_expr_type() && ob_is_json(expr->get_result_type().get_type()))) { + nullable = true; + has_default = false; } else { // ObOpRawExpr, ObCaseOpRawExpr, ObAggFunRawExpr for (int64_t i = 0; OB_SUCC(ret) && i < expr->get_param_count(); ++i) { diff --git a/src/sql/engine/expr/ob_expr_json_array.cpp b/src/sql/engine/expr/ob_expr_json_array.cpp index 2a0e0d0fa62936fa1c5fae065801a35e50cc5590..7f64b0ee5b960ef1c4ec49c9e44ad415ce9aa150 100644 --- a/src/sql/engine/expr/ob_expr_json_array.cpp +++ b/src/sql/engine/expr/ob_expr_json_array.cpp @@ -51,6 +51,7 @@ int ObExprJsonArray::calc_result_typeN(ObExprResType& type, } else { // param_num >= 0 type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); for (int64_t i = 0; i < param_num; i++) { if (ob_is_string_type(types_stack[i].get_type())) { if (types_stack[i].get_charset_type() != CHARSET_UTF8MB4) { diff --git a/src/sql/engine/expr/ob_expr_json_array_append.cpp b/src/sql/engine/expr/ob_expr_json_array_append.cpp index f9ccc224385c6aed2ae098250c539802d250ccc7..372929a73f21837f1964e35efb65b9cdf5275b56 100644 --- a/src/sql/engine/expr/ob_expr_json_array_append.cpp +++ b/src/sql/engine/expr/ob_expr_json_array_append.cpp @@ -50,6 +50,7 @@ int ObExprJsonArrayAppend::calc_result_typeN(ObExprResType& type, LOG_USER_ERROR(OB_ERR_PARAM_SIZE, name.length(), name.ptr()); } else { type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); if (OB_FAIL(ObJsonExprHelper::is_valid_for_json(types_stack, 0, N_JSON_ARRAY_APPEND))) { LOG_WARN("wrong type for json doc.", K(ret), K(types_stack[0].get_type())); diff --git a/src/sql/engine/expr/ob_expr_json_array_insert.cpp b/src/sql/engine/expr/ob_expr_json_array_insert.cpp index 1b0a6f9f2f055c2b18009ba3fadadda96f8c0d07..6104283f3dd81b9b75c75e9519b5fc9f816c7fbc 100644 --- a/src/sql/engine/expr/ob_expr_json_array_insert.cpp +++ b/src/sql/engine/expr/ob_expr_json_array_insert.cpp @@ -48,6 +48,7 @@ int ObExprJsonArrayInsert::calc_result_typeN(ObExprResType& type, ObExprResType* LOG_USER_ERROR(OB_ERR_PARAM_SIZE, name.length(), name.ptr()); } else { type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); if (OB_FAIL(ObJsonExprHelper::is_valid_for_json(types_stack, 0, N_JSON_ARRAY_INSERT))) { LOG_WARN("wrong type for json doc.", K(ret), K(types_stack[0].get_type())); diff --git a/src/sql/engine/expr/ob_expr_json_extract.cpp b/src/sql/engine/expr/ob_expr_json_extract.cpp index d67faaf34b76029b2f0dbed00fc3c95297e5d133..87ca65bd226a4456dc55f3bd547924ab2b99bbef 100644 --- a/src/sql/engine/expr/ob_expr_json_extract.cpp +++ b/src/sql/engine/expr/ob_expr_json_extract.cpp @@ -74,11 +74,8 @@ int ObExprJsonExtract::calc_result_typeN(ObExprResType& type, } if (OB_SUCC(ret)) { - if (is_null_result) { - type.set_null(); - } else { - type.set_json(); - } + type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); } } return ret; diff --git a/src/sql/engine/expr/ob_expr_json_insert.cpp b/src/sql/engine/expr/ob_expr_json_insert.cpp index 7cfb1cd16a9e5b52ed380b73fa4c447a2c58480e..abea47dccb0faf15bb775147d780b728b98932ac 100644 --- a/src/sql/engine/expr/ob_expr_json_insert.cpp +++ b/src/sql/engine/expr/ob_expr_json_insert.cpp @@ -51,6 +51,7 @@ int ObExprJsonInsert::calc_result_typeN(ObExprResType& type, LOG_USER_ERROR(OB_ERR_PARAM_SIZE, name.length(), name.ptr()); } else { type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); if (OB_FAIL(ObJsonExprHelper::is_valid_for_json(types_stack, 0, N_JSON_INSERT))) { LOG_WARN("wrong type for json doc.", K(ret), K(types_stack[0].get_type())); diff --git a/src/sql/engine/expr/ob_expr_json_keys.cpp b/src/sql/engine/expr/ob_expr_json_keys.cpp index 53cab676b0f6e2921eb8282b77d502110bedd3c7..1ed46640a18d6fcbdc19f7037f6e3835d5d4c137 100644 --- a/src/sql/engine/expr/ob_expr_json_keys.cpp +++ b/src/sql/engine/expr/ob_expr_json_keys.cpp @@ -44,6 +44,7 @@ int ObExprJsonKeys::calc_result_typeN(ObExprResType& type, } else { // set result to json type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); // set type of json_doc if (OB_FAIL(ObJsonExprHelper::is_valid_for_json(types_stack, 0, N_JSON_KEYS))) { diff --git a/src/sql/engine/expr/ob_expr_json_merge_patch.cpp b/src/sql/engine/expr/ob_expr_json_merge_patch.cpp index 20dc695ae16478c8b99e77c485b1fd3a5f9d05eb..b51542377fae6092ac7b5e9891b94b81c6f67cf5 100644 --- a/src/sql/engine/expr/ob_expr_json_merge_patch.cpp +++ b/src/sql/engine/expr/ob_expr_json_merge_patch.cpp @@ -44,6 +44,7 @@ int ObExprJsonMergePatch::calc_result_typeN(ObExprResType& type, INIT_SUCC(ret); type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); for (int64_t i = 0; OB_SUCC(ret) && i < param_num; i++) { if (OB_FAIL(ObJsonExprHelper::is_valid_for_json(types_stack, i, N_JSON_MERGE_PRESERVE))) { LOG_WARN("wrong type for json doc.", K(ret), K(types_stack[i].get_type())); diff --git a/src/sql/engine/expr/ob_expr_json_merge_preserve.cpp b/src/sql/engine/expr/ob_expr_json_merge_preserve.cpp index ab5868ae42b4a7c4747bff89c96389557499ab79..aa6a1c9a3aa542dbfbefca99d057e2072aca9523 100644 --- a/src/sql/engine/expr/ob_expr_json_merge_preserve.cpp +++ b/src/sql/engine/expr/ob_expr_json_merge_preserve.cpp @@ -53,6 +53,7 @@ int ObExprJsonMergePreserve::calc_result_typeN(ObExprResType& type, UNUSED(type_ctx); INIT_SUCC(ret); type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); bool is_result_null = false; for (int64_t i = 0; OB_SUCC(ret) && !is_result_null && i < param_num; i++) { if (types_stack[0].get_type() == ObNullType) { diff --git a/src/sql/engine/expr/ob_expr_json_object.cpp b/src/sql/engine/expr/ob_expr_json_object.cpp index dda19eb4ecb31bf15fbd883946be02130094fd2c..c3167b8877046edbdb24c7ee6fabaa046cc9a462 100644 --- a/src/sql/engine/expr/ob_expr_json_object.cpp +++ b/src/sql/engine/expr/ob_expr_json_object.cpp @@ -45,6 +45,7 @@ int ObExprJsonObject::calc_result_typeN(ObExprResType& type, LOG_USER_ERROR(OB_ERR_PARAM_SIZE, name.length(), name.ptr()); } else { type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); for (int64_t i = 0; OB_SUCC(ret) && i < param_num; i += 2) { if ((types_stack[i].get_type() == ObNullType)) { ret = OB_ERR_JSON_DOCUMENT_NULL_KEY; diff --git a/src/sql/engine/expr/ob_expr_json_remove.cpp b/src/sql/engine/expr/ob_expr_json_remove.cpp index 735f32eaf093a63b4bddb19acdc50c8715f63543..c00181b284d9abdcf324ee1b5f1d3611bb9c59b2 100644 --- a/src/sql/engine/expr/ob_expr_json_remove.cpp +++ b/src/sql/engine/expr/ob_expr_json_remove.cpp @@ -49,6 +49,7 @@ int ObExprJsonRemove::calc_result_typeN(ObExprResType& type, } } type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); return ret; } diff --git a/src/sql/engine/expr/ob_expr_json_replace.cpp b/src/sql/engine/expr/ob_expr_json_replace.cpp index 6d3bf913964d541c825ee12cda90e9dd78cbdd21..c1d1d0ddc7ec249c8295a2d0e5f4e65b83cb1892 100644 --- a/src/sql/engine/expr/ob_expr_json_replace.cpp +++ b/src/sql/engine/expr/ob_expr_json_replace.cpp @@ -55,6 +55,7 @@ int ObExprJsonReplace::calc_result_typeN(ObExprResType& type, } } type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); } return ret; } diff --git a/src/sql/engine/expr/ob_expr_json_search.cpp b/src/sql/engine/expr/ob_expr_json_search.cpp index 45daee095d9cd8fb7aa89a7a52d844ae4e365ccb..1e4614321aab42564e54567a1c835a1cb11e2334 100644 --- a/src/sql/engine/expr/ob_expr_json_search.cpp +++ b/src/sql/engine/expr/ob_expr_json_search.cpp @@ -218,6 +218,7 @@ int ObExprJsonSearch::calc_result_typeN(ObExprResType& type, LOG_WARN("invalid param number", K(ret), K(param_num)); } else { type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); // json doc if (OB_FAIL(ObJsonExprHelper::is_valid_for_json(types_stack, 0, "json_search"))) { diff --git a/src/sql/engine/expr/ob_expr_json_set.cpp b/src/sql/engine/expr/ob_expr_json_set.cpp index 3a244653b6a3485e933aff9f1bca9227b7c5853c..5d7594c2b47859570bda2a47db2c2e14baa856f7 100644 --- a/src/sql/engine/expr/ob_expr_json_set.cpp +++ b/src/sql/engine/expr/ob_expr_json_set.cpp @@ -55,6 +55,7 @@ int ObExprJsonSet::calc_result_typeN(ObExprResType& type, } } type.set_json(); + type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); } return ret; } diff --git a/src/sql/resolver/expr/ob_raw_expr.cpp b/src/sql/resolver/expr/ob_raw_expr.cpp index 2b9d4206afe97bc6de308282e051d72d551e4a3c..a06e17a78352fbfae0cc7ba655f3f01756e0e907 100644 --- a/src/sql/resolver/expr/ob_raw_expr.cpp +++ b/src/sql/resolver/expr/ob_raw_expr.cpp @@ -466,6 +466,11 @@ int ObRawExpr::postorder_replace(ObRawExprVisitor& visitor) return ret; } +bool ObRawExpr::is_json_expr() const +{ + return (T_FUN_SYS_JSON_OBJECT <= get_expr_type() && get_expr_type() <= T_FUN_JSON_OBJECTAGG) ? true : false; +} + //////////////////////////////////////////////////////////////// ObRawExpr*& ObTerminalRawExpr::get_param_expr(int64_t index) { diff --git a/src/sql/resolver/expr/ob_raw_expr.h b/src/sql/resolver/expr/ob_raw_expr.h index bd6af0a54c5989869fa5f1848356efa144571156..281223e68397198576db39d1699fb35bb9681b91 100644 --- a/src/sql/resolver/expr/ob_raw_expr.h +++ b/src/sql/resolver/expr/ob_raw_expr.h @@ -1508,6 +1508,7 @@ public: { is_deterministic_ = is_deterministic; } + bool is_json_expr() const; VIRTUAL_TO_STRING_KV(N_ITEM_TYPE, type_, N_RESULT_TYPE, result_type_, N_EXPR_INFO, info_, N_REL_ID, rel_ids_, K_(expr_level), K_(expr_levels), K_(enum_set_values), K_(is_explicited_reference), K_(ref_count), K_(is_for_generated_column), K_(extra), K_(is_calculated)); diff --git a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp index 5cebd4461415870f735c874f99c1d2de4ce4233c..f36fec443df0d02be8fd9aa7f4f3d7f4c4d02225 100644 --- a/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_deduce_type.cpp @@ -1074,6 +1074,7 @@ int ObRawExprDeduceType::visit(ObAggFunRawExpr& expr) } case T_FUN_JSON_ARRAYAGG: { result_type.set_json(); + result_type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); expr.set_result_type(result_type); break; } @@ -1095,6 +1096,7 @@ int ObRawExprDeduceType::visit(ObAggFunRawExpr& expr) need_add_cast = true; } result_type.set_json(); + result_type.set_length((ObAccuracy::DDL_DEFAULT_ACCURACY[ObJsonType]).get_length()); expr.set_result_type(result_type); } break;