diff --git a/src/sql/plan_cache/ob_plan_cache_value.cpp b/src/sql/plan_cache/ob_plan_cache_value.cpp index 062d3b418c..e52ae6cee5 100644 --- a/src/sql/plan_cache/ob_plan_cache_value.cpp +++ b/src/sql/plan_cache/ob_plan_cache_value.cpp @@ -1629,7 +1629,8 @@ int ObPlanCacheValue::match(ObPlanCacheCtx &pc_ctx, } else if (OB_ISNULL(ps_param)) { ret = OB_INVALID_ARGUMENT; LOG_WARN("invalid argument", K(ps_param)); - } else if (ps_param->is_pl_extend() || !not_param_var_[i].ps_param_.can_compare(*ps_param)) { + } else if (ps_param->is_pl_extend() || not_param_var_[i].ps_param_.is_pl_extend() + || !not_param_var_[i].ps_param_.can_compare(*ps_param)) { is_same = false; LOG_WARN("can not compare", K(not_param_var_[i].ps_param_), K(*ps_param), K(i)); } else if (not_param_var_[i].ps_param_.is_string_type() diff --git a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp index 04fe4376ef..f86dc6f24a 100644 --- a/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp +++ b/src/sql/resolver/expr/ob_raw_expr_resolver_impl.cpp @@ -1320,7 +1320,7 @@ int ObRawExprResolverImpl::process_xml_attributes_values_node(const ParseNode *n // parameter 1 of function xmlelement without aliased ret = OB_ERR_XMLELEMENT_ALIASED; LOG_WARN("get column raw text failed", K(ret)); - } else if (!col_name.empty() && OB_FAIL(ObRawExprResolverImpl::malloc_new_specified_type_node(ctx_.local_allocator_, + } else if (!col_name.empty() && OB_FAIL(ObRawExprResolverImpl::malloc_new_specified_type_node(ctx_.expr_factory_.get_allocator(), ObString(col_name.length(), easy_string_toupper(col_name.ptr())), &key_node, T_CHAR))) { LOG_WARN("create key node failed", K(ret)); @@ -5330,8 +5330,7 @@ int ObRawExprResolverImpl::remove_format_json_opt_in_pl(ParseNode *node, int8_t if (expr_flag == OPT_JSON_OBJECT) { for (int64_t i = 2; i < num; i += 3) { if (OB_ISNULL(node->children_[i]) || OB_ISNULL(node->children_[i - 1])) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("should not null", K(ret), K(i)); + // do nothing } else if (node->children_[i]->type_ != T_INT) { ret = OB_ERR_UNEXPECTED; LOG_WARN("type is't int", K(ret), K(node->children_[i]->type_)); @@ -5553,7 +5552,7 @@ int ObRawExprResolverImpl::process_ora_json_object_node(const ParseNode *node, O } else if (cur_node_kv->type_ == T_COLUMN_REF // process star node && OB_NOT_NULL(cur_node_kv->children_[2]) && cur_node_kv->children_[2]->type_ == T_STAR - && OB_FAIL(ObRawExprResolverImpl::create_json_object_star_node(data_node, ctx_.local_allocator_, i))) { + && OB_FAIL(ObRawExprResolverImpl::create_json_object_star_node(data_node, ctx_.expr_factory_.get_allocator(), i))) { LOG_WARN("fail to create json object star node", K(ret)); } else if ((i % 3 == 1) && data_node->children_[i]->type_ == T_NULL && data_node->children_[i]->value_ == 2) { // 2 is flag of empty value cur_node_kv = data_node->children_[i - 1]; @@ -5587,13 +5586,16 @@ int ObRawExprResolverImpl::process_ora_json_object_node(const ParseNode *node, O for (int col_pos = cur_col_size; col_pos < ctx_.columns_->count(); col_pos ++) { ctx_.columns_->pop_back(); // delete column para } + } else if (lib::is_oracle_mode() && ctx_.current_scope_ == T_PL_SCOPE) { + ret = OB_ERR_PARSE_PLSQL; + LOG_USER_ERROR(OB_ERR_PARSE_PLSQL, ",", ". ( * % & - + / at mod remainder rem || multiset value"); } else { ret = OB_ERR_UNEXPECTED; LOG_WARN("fail to resolve column", K(ret), K(cur_col_size), K(ctx_.columns_->count())); } para_expr = NULL; if (OB_FAIL(ret)) { - } else if (OB_FAIL(ObRawExprResolverImpl::malloc_new_specified_type_node(ctx_.local_allocator_, col_name, &key_node, T_CHAR))) { + } else if (OB_FAIL(ObRawExprResolverImpl::malloc_new_specified_type_node(ctx_.expr_factory_.get_allocator(), col_name, &key_node, T_CHAR))) { LOG_WARN("create json doc node fail", K(ret)); } else if (OB_FAIL(SMART_CALL(recursive_resolve(&key_node, para_expr)))) { LOG_WARN("fail to get raw expr from node", K(ret), K(i)); @@ -5684,7 +5686,7 @@ int ObRawExprResolverImpl::process_json_query_node(const ParseNode *node, ObRawE if (OB_SUCC(ret)) { if (returning_type->type_ == T_NULL) { ObString path_str(node->children_[1]->text_len_, node->children_[1]->raw_text_); - if (OB_FAIL(ObJsonPath::change_json_expr_res_type_if_need(ctx_.local_allocator_, path_str, const_cast(*returning_type), OPT_JSON_QUERY))) { + if (OB_FAIL(ObJsonPath::change_json_expr_res_type_if_need(ctx_.expr_factory_.get_allocator(), path_str, const_cast(*returning_type), OPT_JSON_QUERY))) { LOG_WARN("set return type by path item method fail", K(ret), K(path_str)); } } @@ -5769,7 +5771,7 @@ int ObRawExprResolverImpl::pre_check_json_path_valid(const ParseNode *node) INIT_SUCC(ret); ObString j_path_text(node->str_len_, node->str_value_); - ObJsonPath j_path(j_path_text, &ctx_.local_allocator_); + ObJsonPath j_path(j_path_text, &ctx_.expr_factory_.get_allocator()); if (j_path_text.length() == 0) { } else if (OB_FAIL(j_path.parse_path())) { ret = OB_ERR_JSON_PATH_EXPRESSION_SYNTAX_ERROR; @@ -5828,7 +5830,7 @@ int ObRawExprResolverImpl::process_json_value_node(const ParseNode *node, ObRawE ObString default_val(7, "default"); if (OB_NOT_NULL(returning_type->raw_text_) && (0 == default_val.case_compare(returning_type->raw_text_)) && node->children_[1]->text_len_ > 0) { ObString path_str(node->children_[1]->text_len_, node->children_[1]->raw_text_); - if (OB_FAIL(ObJsonPath::change_json_expr_res_type_if_need(ctx_.local_allocator_, path_str, const_cast(*returning_type), OPT_JSON_VALUE))) { + if (OB_FAIL(ObJsonPath::change_json_expr_res_type_if_need(ctx_.expr_factory_.get_allocator(), path_str, const_cast(*returning_type), OPT_JSON_VALUE))) { LOG_WARN("set return type by path item method fail", K(ret), K(path_str)); } } @@ -5881,7 +5883,7 @@ int ObRawExprResolverImpl::process_json_value_node(const ParseNode *node, ObRawE ret = OB_ERR_UNEXPECTED; LOG_WARN("mismatch node is null", K(ret)); } else { - if (OB_FAIL(expand_node(ctx_.local_allocator_, const_cast(on_mismatch), 0, mismatch_arr))) { + if (OB_FAIL(expand_node(ctx_.expr_factory_.get_allocator(), const_cast(on_mismatch), 0, mismatch_arr))) { LOG_WARN("parse mismatch has error", K(ret), K(mismatch_arr.size())); } else { // [json_text][json_path][returning_type][empty_type][empty_default_value][error_type][error_default_value] diff --git a/src/sql/rewrite/ob_transform_utils.cpp b/src/sql/rewrite/ob_transform_utils.cpp index d90918f9e7..89e1951a56 100644 --- a/src/sql/rewrite/ob_transform_utils.cpp +++ b/src/sql/rewrite/ob_transform_utils.cpp @@ -13562,14 +13562,16 @@ int ObTransformUtils::get_column_node_from_table(ObTransformerCtx *ctx, if ((tmp_table_item->is_generated_table() || tmp_table_item->is_temp_table()) && OB_NOT_NULL(tmp_table_item->ref_query_)) { - ret = OB_INVALID_ARGUMENT; // not adaptive generate table - LOG_WARN("invalid argument", K(ret)); + if (OB_FAIL(stmt->get_column_items(tmp_table_item->table_id_, column_list))) { + LOG_WARN("fail to get column items from generate or temp table", K(ret)); + } } else if (tmp_table_item->is_json_table()) { ret = OB_SUCCESS; if (OB_FAIL(ObTransformUtils::get_columnitem_from_json_table(stmt, tmp_table_item, column_list))) { LOG_WARN("fail to get column item from json table", K(ret)); } } else { + ret = OB_INVALID_ARGUMENT; LOG_WARN("failed to get table schema", K(ret)); } } else {