Skip to content

Commit

Permalink
1) Frontport fix for CORE-3222 - View with "WITH CHECK OPTION" doesn'…
Browse files Browse the repository at this point in the history
…t like TRIM function in WHERE

2) Other related fix and cleanup
  • Loading branch information
asfernandes committed Nov 11, 2010
1 parent 56cffa6 commit 9086a90
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 111 deletions.
46 changes: 26 additions & 20 deletions src/dsql/DdlNodes.epp
Expand Up @@ -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<dsql_nod*> temp;
Array<dsql_nod**> temp;

if (input->nod_type == nod_class_exprnode)
{
ExprNode* exprNode = reinterpret_cast<ExprNode*>(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(
Expand All @@ -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;
Expand All @@ -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 &&
Expand All @@ -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<dsql_nod*>(
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);
}
}

Expand Down
91 changes: 0 additions & 91 deletions src/dsql/ddl.cpp
Expand Up @@ -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);
Expand Down Expand Up @@ -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<dsql_nod*>(
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)
{
/**************************************
Expand Down

0 comments on commit 9086a90

Please sign in to comment.