Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 90 additions & 26 deletions src/executables/unload_schema.c
Original file line number Diff line number Diff line change
Expand Up @@ -1955,13 +1955,16 @@ emit_query_specs (extract_context & ctxt, print_output & output_ctx, DB_OBJLIST
PARSER_CONTEXT *parser;
PT_NODE **query_ptr;
const char *name;
char owner_name[DB_MAX_IDENTIFIER_LENGTH] = { '\0' };
char owner_name[DB_MAX_IDENTIFIER_LENGTH];
owner_name[0] = '\0';
char *class_name = NULL;
const char *null_spec;
bool has_using_index;
bool change_vclass_spec;
int i;
char output_owner[DB_MAX_USER_LENGTH + 4] = { '\0' };
char output_owner[DB_MAX_USER_LENGTH + 4];
output_owner[0] = '\0';
char *query_ptr_result;

/*
* pass 1, emit NULL spec lists for vclasses that have attribute
Expand Down Expand Up @@ -2023,6 +2026,11 @@ emit_query_specs (extract_context & ctxt, print_output & output_ctx, DB_OBJLIST
continue;
}

if (ctxt.is_dba_user == false && ctxt.is_dba_group_member == false)
{
parser->custom_print |= PT_PRINT_NO_CURRENT_USER_NAME;
}

query_ptr = parser_parse_string (parser, db_query_spec_string (s));
if (query_ptr != NULL)
{
Expand Down Expand Up @@ -2069,22 +2077,46 @@ emit_query_specs (extract_context & ctxt, print_output & output_ctx, DB_OBJLIST
for (s = specs, i = 1; s != NULL; s = db_query_spec_next (s), i++)
{
SPLIT_USER_SPECIFIED_NAME (name, owner_name, class_name);
if (change_vclass_spec)
{ /* change the existing spec lists */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s CHANGE QUERY %d %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), i, db_query_spec_string (s));
parser = parser_create_parser ();
if (parser == NULL)
{
output_ctx ("/* ERROR : ALTER VCLASS %s%s%s ADD QUERY ... */\n", PRINT_IDENTIFIER (name));
continue;
}

if (ctxt.is_dba_user == false && ctxt.is_dba_group_member == false)
{
parser->custom_print |= PT_PRINT_NO_CURRENT_USER_NAME;
}
else
{ /* emit the usual statements */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s ADD QUERY %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), db_query_spec_string (s));
query_ptr = parser_parse_string (parser, db_query_spec_string (s));
if (query_ptr != NULL)
{
query_ptr_result = parser_print_tree_with_quotes (parser, *query_ptr);
if (change_vclass_spec)
{ /* change the existing spec lists */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s CHANGE QUERY %d %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), i, query_ptr_result);
}
else
{ /* emit the usual statements */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s ADD QUERY %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), query_ptr_result);
}
}
else
{
output_ctx ("/* ERROR : ALTER VCLASS %s%s%s ADD QUERY ... */\n", PRINT_IDENTIFIER (name));
}

parser_free_parser (parser);
}
}

Expand Down Expand Up @@ -2112,6 +2144,7 @@ emit_query_specs_has_using_index (extract_context & ctxt, print_output & output_
bool change_vclass_spec;
int i;
char output_owner[DB_MAX_USER_LENGTH + 4] = { '\0' };
char *query_ptr_result;

/*
* pass 1, emit NULL spec lists for vclasses that have attribute
Expand Down Expand Up @@ -2148,6 +2181,12 @@ emit_query_specs_has_using_index (extract_context & ctxt, print_output & output_
{
continue;
}

if (ctxt.is_dba_user == false && ctxt.is_dba_group_member == false)
{
parser->custom_print |= PT_PRINT_NO_CURRENT_USER_NAME;
}

query_ptr = parser_parse_string (parser, db_query_spec_string (s));
if (query_ptr != NULL)
{
Expand Down Expand Up @@ -2183,22 +2222,47 @@ emit_query_specs_has_using_index (extract_context & ctxt, print_output & output_
for (s = specs, i = 1; s; s = db_query_spec_next (s), i++)
{
SPLIT_USER_SPECIFIED_NAME (name, owner_name, class_name);
if (change_vclass_spec)
{ /* change the existing spec lists */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s CHANGE QUERY %d %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), i, db_query_spec_string (s));
parser = parser_create_parser ();
if (parser == NULL)
{
output_ctx ("/* ERROR : ALTER VCLASS %s%s%s ADD QUERY ... */\n", PRINT_IDENTIFIER (name));
continue;
}
else
{ /* emit the usual statements */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s ADD QUERY %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), db_query_spec_string (s));
if (ctxt.is_dba_user == false && ctxt.is_dba_group_member == false)
{
parser->custom_print |= PT_PRINT_NO_CURRENT_USER_NAME;
}

query_ptr = parser_parse_string (parser, db_query_spec_string (s));
if (query_ptr != NULL)
{
query_ptr_result = parser_print_tree_with_quotes (parser, *query_ptr);

if (change_vclass_spec)
{ /* change the existing spec lists */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s CHANGE QUERY %d %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), i, query_ptr_result);
}
else
{ /* emit the usual statements */
PRINT_OWNER_NAME (owner_name, (ctxt.is_dba_user || ctxt.is_dba_group_member), output_owner,
sizeof (output_owner));

output_ctx ("ALTER VCLASS %s%s%s%s ADD QUERY %s ;\n", output_owner,
PRINT_IDENTIFIER (class_name), query_ptr_result);
}
}
else
{
output_ctx ("/* ERROR : ALTER VCLASS %s%s%s ADD QUERY ... */\n", PRINT_IDENTIFIER (name));
}

parser_free_parser (parser);
}
}

Expand Down
Loading