From 7988882b7d5488c908f364d4a4d13b4f45be904a Mon Sep 17 00:00:00 2001 From: beyondykk Date: Thu, 24 Aug 2023 17:21:56 +0900 Subject: [PATCH 1/3] [CBRD-24945] Correct value node print in dblink query rewritten --- src/parser/parse_tree.h | 1 + src/parser/parse_tree_cl.c | 8 ++++---- src/parser/parser_support.c | 15 +++++++++++++++ 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/parser/parse_tree.h b/src/parser/parse_tree.h index e0808fecb3a..1ec750b3d46 100644 --- a/src/parser/parse_tree.h +++ b/src/parser/parse_tree.h @@ -3772,6 +3772,7 @@ struct parser_node unsigned is_system_generated_stmt:1; /* is internally generated by system */ unsigned use_auto_commit:1; /* use autocommit */ unsigned done_reduce_equality_terms:1; /* reduce_equality_terms() is already called */ + unsigned print_in_value_for_dblink:1; /* for select ... where in (...) to print (...) not {...} */ } flag; PT_STATEMENT_INFO info; /* depends on 'node_type' field */ }; diff --git a/src/parser/parse_tree_cl.c b/src/parser/parse_tree_cl.c index 04ba84ea077..f55f7921b4d 100644 --- a/src/parser/parse_tree_cl.c +++ b/src/parser/parse_tree_cl.c @@ -15908,9 +15908,10 @@ pt_print_value (PARSER_CONTEXT * parser, PT_NODE * p) case PT_TYPE_SET: case PT_TYPE_MULTISET: case PT_TYPE_SEQUENCE: - if (p->spec_ident || (parser->custom_print & PT_PRINT_SUPPRESS_FOR_DBLINK)) + if (p->spec_ident || (p->flag.print_in_value_for_dblink && parser->custom_print & PT_PRINT_SUPPRESS_FOR_DBLINK)) { /* this is tagged as an "in" clause right hand side Print it as a parenthesized list */ + /* print_in_value_for_dblink is a flag as same meaning for dblink */ r1 = pt_print_bytes_l (parser, p->info.value.data_value.set); q = pt_append_nulstring (parser, q, "("); q = pt_append_varchar (parser, q, r1); @@ -15918,7 +15919,7 @@ pt_print_value (PARSER_CONTEXT * parser, PT_NODE * p) } else { - if (p->type_enum != PT_TYPE_SEQUENCE) + if (p->type_enum != PT_TYPE_SEQUENCE && !(parser->custom_print & PT_PRINT_SUPPRESS_FOR_DBLINK)) { q = pt_append_nulstring (parser, q, pt_show_type_enum (p->type_enum)); } @@ -15940,8 +15941,7 @@ pt_print_value (PARSER_CONTEXT * parser, PT_NODE * p) case PT_TYPE_INTEGER: case PT_TYPE_BIGINT: case PT_TYPE_SMALLINT: - if (p->info.value.text != NULL - && !(parser->custom_print & (PT_PRINT_SUPPRESS_FOR_DBLINK | PT_SUPPRESS_BIGINT_CAST))) + if (p->info.value.text != NULL && !(parser->custom_print & PT_SUPPRESS_BIGINT_CAST)) { r = p->info.value.text; } diff --git a/src/parser/parser_support.c b/src/parser/parser_support.c index 40048a8d7c7..1f7817fe0bf 100644 --- a/src/parser/parser_support.c +++ b/src/parser/parser_support.c @@ -11899,6 +11899,19 @@ pt_convert_dml (PARSER_CONTEXT * parser, PT_NODE * node, void *arg, int *continu } while(0) // *INDENT-ON* +static PT_NODE * +pt_set_print_in_value_for_dblink (PARSER_CONTEXT * parser, PT_NODE * node, void *arg, int *continue_walk) +{ + PT_NODE *spec = (PT_NODE *) arg; + + if (node->node_type == PT_EXPR && (node->info.expr.op == PT_IS_IN || node->info.expr.op == PT_IS_NOT_IN)) + { + node->info.expr.arg2->flag.print_in_value_for_dblink = 1; + } + + return node; +} + void pt_rewrite_for_dblink (PARSER_CONTEXT * parser, PT_NODE * stmt) { @@ -11906,6 +11919,8 @@ pt_rewrite_for_dblink (PARSER_CONTEXT * parser, PT_NODE * stmt) memset (&snl, 0x00, sizeof (SERVER_NAME_LIST)); + parser_walk_tree (parser, stmt, pt_set_print_in_value_for_dblink, NULL, NULL, NULL); + switch (stmt->node_type) { case PT_INSERT: From 22e7f3646adfe6b6acab2e4dd6c7cdad462bd9f1 Mon Sep 17 00:00:00 2001 From: beyondykk Date: Fri, 25 Aug 2023 10:47:33 +0900 Subject: [PATCH 2/3] refine --- src/parser/parse_tree_cl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/parser/parse_tree_cl.c b/src/parser/parse_tree_cl.c index f55f7921b4d..13706eb02ee 100644 --- a/src/parser/parse_tree_cl.c +++ b/src/parser/parse_tree_cl.c @@ -15908,7 +15908,7 @@ pt_print_value (PARSER_CONTEXT * parser, PT_NODE * p) case PT_TYPE_SET: case PT_TYPE_MULTISET: case PT_TYPE_SEQUENCE: - if (p->spec_ident || (p->flag.print_in_value_for_dblink && parser->custom_print & PT_PRINT_SUPPRESS_FOR_DBLINK)) + if (p->spec_ident || ((parser->custom_print & PT_PRINT_SUPPRESS_FOR_DBLINK) && p->flag.print_in_value_for_dblink)) { /* this is tagged as an "in" clause right hand side Print it as a parenthesized list */ /* print_in_value_for_dblink is a flag as same meaning for dblink */ From 9b2bae77bd913d11992824bd1875581b1ed001c1 Mon Sep 17 00:00:00 2001 From: beyondykk Date: Fri, 25 Aug 2023 14:20:55 +0900 Subject: [PATCH 3/3] add set type to not supported --- src/parser/name_resolution.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/parser/name_resolution.c b/src/parser/name_resolution.c index e6cd3a9ebfc..c18c7917484 100644 --- a/src/parser/name_resolution.c +++ b/src/parser/name_resolution.c @@ -4850,6 +4850,27 @@ PT_TYPE_ENUM pt_type[CCI_U_TYPE_LAST + 1] = { PT_TYPE_JSON }; +static T_CCI_U_TYPE +pt_dblink_get_basic_utype (T_CCI_U_EXT_TYPE u_ext_type) +{ + if (CCI_IS_SET_TYPE (u_ext_type)) + { + return CCI_U_TYPE_SET; + } + else if (CCI_IS_MULTISET_TYPE (u_ext_type)) + { + return CCI_U_TYPE_MULTISET; + } + else if (CCI_IS_SEQUENCE_TYPE (u_ext_type)) + { + return CCI_U_TYPE_SEQUENCE; + } + else + { + return (T_CCI_U_TYPE) CCI_GET_COLLECTION_DOMAIN (u_ext_type); + } +} + static bool pt_dblink_table_fill_attr_def (PARSER_CONTEXT * parser, PT_NODE * attr_def_node, const S_REMOTE_COL_ATTR * attr) { @@ -4858,7 +4879,7 @@ pt_dblink_table_fill_attr_def (PARSER_CONTEXT * parser, PT_NODE * attr_def_node, attr_def_node->data_type = NULL; /* it needs to convert ext type to CCI_U_TYPE */ - attr_def_node->type_enum = pt_type[(T_CCI_U_TYPE) CCI_GET_COLLECTION_DOMAIN (attr->type_idx)]; + attr_def_node->type_enum = pt_type[pt_dblink_get_basic_utype (attr->type_idx)]; switch (attr_def_node->type_enum) { case PT_TYPE_JSON: @@ -4874,6 +4895,9 @@ pt_dblink_table_fill_attr_def (PARSER_CONTEXT * parser, PT_NODE * attr_def_node, case PT_TYPE_CLOB: case PT_TYPE_OBJECT: case PT_TYPE_ENUMERATION: + case PT_TYPE_SET: + case PT_TYPE_MULTISET: + case PT_TYPE_SEQUENCE: PT_ERRORmf (parser, attr_def_node, MSGCAT_SET_PARSER_SEMANTIC, MSGCAT_SEMANTIC_DBLINK_NOT_SUPPORTED_TYPE, pt_show_type_enum (attr_def_node->type_enum)); return false;