From 9086a900bbe45367ab0648c2620ced0d2b51bed6 Mon Sep 17 00:00:00 2001 From: asfernandes Date: Thu, 11 Nov 2010 00:05:49 +0000 Subject: [PATCH] 1) Frontport fix for CORE-3222 - View with "WITH CHECK OPTION" doesn't like TRIM function in WHERE 2) Other related fix and cleanup --- src/dsql/DdlNodes.epp | 46 ++++++++++++---------- src/dsql/ddl.cpp | 91 ------------------------------------------- 2 files changed, 26 insertions(+), 111 deletions(-) diff --git a/src/dsql/DdlNodes.epp b/src/dsql/DdlNodes.epp index 9b78cba2763..b923d537e66 100644 --- a/src/dsql/DdlNodes.epp +++ b/src/dsql/DdlNodes.epp @@ -7998,37 +7998,40 @@ void CreateAlterViewNode::defineUpdateAction(DsqlCompilerScratch* dsqlScratch, dsql_nod* CreateAlterViewNode::replaceFieldNames(dsql_nod* input, dsql_nod* searchFields, dsql_nod* replaceFields, bool nullThem, const char* contextName) { + thread_db* tdbb = JRD_get_thread_data(); + if (!input || input->getType() != dsql_type_nod) return input; - const dsql_nod* const* endo; - dsql_nod** ptr; - - Array temp; + Array temp; if (input->nod_type == nod_class_exprnode) { ExprNode* exprNode = reinterpret_cast(input->nod_arg[0]); for (dsql_nod*** i = exprNode->dsqlChildNodes.begin(); - i != exprNode->dsqlChildNodes.end(); ++i) + i != exprNode->dsqlChildNodes.end(); ++i) { if (**i) - temp.add(**i); + temp.add(*i); } - - endo = temp.end(); - ptr = temp.begin(); } else { - endo = input->nod_arg + input->nod_count; - ptr = input->nod_arg; + for (dsql_nod** ptr = input->nod_arg; ptr != input->nod_arg + input->nod_count; ++ptr) + temp.add(ptr); } - for (; ptr < endo; ++ptr) + dsql_nod*** endo = temp.end(); + + for (dsql_nod*** ptr = temp.begin(); ptr != temp.end(); ++ptr) { - if ((*ptr)->nod_type == Dsql::nod_select_expr) + dsql_nod**& ptrNode = *ptr; + + if (!*ptrNode) + continue; + + if ((*ptrNode)->nod_type == Dsql::nod_select_expr) { // No subqueries permitted for VIEW WITH CHECK OPTION status_exception::raise( @@ -8037,11 +8040,11 @@ dsql_nod* CreateAlterViewNode::replaceFieldNames(dsql_nod* input, dsql_nod* sear Arg::Gds(isc_subquery_err)); } - if ((*ptr)->nod_type == Dsql::nod_field_name) + if ((*ptrNode)->nod_type == Dsql::nod_field_name) { // Found a field node, check if it needs to be replaced. - const dsql_str* fieldName = (dsql_str*) (*ptr)->nod_arg[Dsql::e_fln_name]; + const dsql_str* fieldName = (dsql_str*) (*ptrNode)->nod_arg[Dsql::e_fln_name]; dsql_nod** search = searchFields->nod_arg; const dsql_nod* const* const end = search + searchFields->nod_count; dsql_nod** replace = NULL; @@ -8065,10 +8068,9 @@ dsql_nod* CreateAlterViewNode::replaceFieldNames(dsql_nod* input, dsql_nod* sear found = true; if (replaceFields) - (*ptr)->nod_arg[e_fln_name] = (*replace)->nod_arg[Dsql::e_fln_name]; - - (*ptr)->nod_arg[Dsql::e_fln_context] = (dsql_nod*) MAKE_cstring(contextName); + (*ptrNode)->nod_arg[e_fln_name] = (*replace)->nod_arg[Dsql::e_fln_name]; + (*ptrNode)->nod_arg[Dsql::e_fln_context] = (dsql_nod*) MAKE_cstring(contextName); } if (nullThem && replaceFields && @@ -8079,12 +8081,16 @@ dsql_nod* CreateAlterViewNode::replaceFieldNames(dsql_nod* input, dsql_nod* sear } if (nullThem && !found) - (*ptr) = MAKE_node(Dsql::nod_not_null, 0); + { + (*ptrNode) = MAKE_node(nod_class_exprnode, 1); + (*ptrNode)->nod_arg[0] = reinterpret_cast( + FB_NEW(*tdbb->getDefaultPool()) NullNode(*tdbb->getDefaultPool())); + } } else { // Recursively go through the input tree looking for field name nodes. - replaceFieldNames(*ptr, searchFields, replaceFields, nullThem, contextName); + replaceFieldNames(*ptrNode, searchFields, replaceFields, nullThem, contextName); } } diff --git a/src/dsql/ddl.cpp b/src/dsql/ddl.cpp index e782d7910a6..e6a7690fdd6 100644 --- a/src/dsql/ddl.cpp +++ b/src/dsql/ddl.cpp @@ -136,7 +136,6 @@ static void modify_udf(DsqlCompilerScratch*); static void modify_map(DsqlCompilerScratch*); static void process_role_nm_list(DsqlCompilerScratch*, SSHORT, const dsql_nod*, const dsql_nod*, NOD_TYPE, const dsql_nod*); static void put_field(DsqlCompilerScratch*, dsql_fld*, bool); -static dsql_nod* replace_field_names(dsql_nod*, dsql_nod*, dsql_nod*, bool, const char*); static void set_statistics(DsqlCompilerScratch*); static void define_user(DsqlCompilerScratch*, UCHAR); static void put_grantor(DsqlCompilerScratch* dsqlScratch, const dsql_nod* grantor); @@ -1993,96 +1992,6 @@ static void put_field( DsqlCompilerScratch* dsqlScratch, dsql_fld* field, bool u } -static dsql_nod* replace_field_names(dsql_nod* input, - dsql_nod* search_fields, - dsql_nod* replace_fields, - bool null_them, - const char* context_name) -{ -/************************************** - * - * r e p l a c e _ f i e l d _ n a m e s - * - ************************************** - * - * Function - * Given an input node tree, find any field name nodes - * and replace them according to the mapping provided. - * Used to create view WITH CHECK OPTION. - * - **************************************/ - - thread_db* tdbb = JRD_get_thread_data(); - - if (!input || input->getType() != dsql_type_nod) - return input; - - const dsql_nod* const* const endo = input->nod_arg + input->nod_count; - - for (dsql_nod** ptr = input->nod_arg; ptr < endo; ++ptr) - { - - if ((*ptr)->nod_type == nod_select_expr) - { - // No subqueries permitted for VIEW WITH CHECK OPTION - post_607(Arg::Gds(isc_subquery_err)); - } - - if ((*ptr)->nod_type == nod_field_name) - { - // found a field node, check if it needs to be replaced - - const dsql_str* field_name = (dsql_str*) (*ptr)->nod_arg[e_fln_name]; - dsql_nod** search = search_fields->nod_arg; - const dsql_nod* const* const end = search + search_fields->nod_count; - dsql_nod** replace = NULL; - if (replace_fields) { - replace = replace_fields->nod_arg; - } - bool found = false; - for (; search < end; search++, replace_fields ? replace++ : NULL) - { - const dsql_str* replace_name = 0; - if (replace_fields) { - replace_name = (dsql_str*) (*replace)->nod_arg[e_fln_name]; - } - const dsql_nod* field_node = *search; - const dsql_fld* field = (dsql_fld*) field_node->nod_arg[e_fld_field]; - - if (field->fld_name == field_name->str_data) - { - found = true; - if (replace_fields) { - (*ptr)->nod_arg[e_fln_name] = (*replace)->nod_arg[e_fln_name]; - } - (*ptr)->nod_arg[e_fln_context] = (dsql_nod*) MAKE_cstring(context_name); - - } - if (null_them && replace_fields && !strcmp(field_name->str_data, replace_name->str_data)) - { - found = true; - } - } - - if (null_them && !found) - { - (*ptr) = MAKE_node(nod_class_exprnode, 1); - (*ptr)->nod_arg[0] = reinterpret_cast( - FB_NEW(*tdbb->getDefaultPool()) NullNode(*tdbb->getDefaultPool())); - } - } - else - { - // recursively go through the input tree - // looking for field name nodes - replace_field_names(*ptr, search_fields, replace_fields, null_them, context_name); - } - } - - return input; -} - - void DDL_reset_context_stack(DsqlCompilerScratch* dsqlScratch) { /**************************************