summaryrefslogtreecommitdiff
path: root/sql/sql_view.cc
diff options
context:
space:
mode:
authorunknown <dlenev@mysql.com>2005-09-30 17:30:33 +0400
committerunknown <dlenev@mysql.com>2005-09-30 17:30:33 +0400
commit9b7e4a2aae5dd6ebe380f242d9d6caf295359115 (patch)
tree3d89891c21bcfccde9ae7dcd46decfb9894743e2 /sql/sql_view.cc
parent0a467b5fcca425ee80e67d880ddeb161ad9c3f83 (diff)
downloadmariadb-git-9b7e4a2aae5dd6ebe380f242d9d6caf295359115.tar.gz
Fix for bug #13629 "view test crashes for debug build" (also includes better
fix for bug #13451 "view test produces warning about unfreed memory"). sql/sql_view.cc: mysql_rename_view(): Intead of doing full-blown opening of view and then doing extensive cleanup of its and main LEXes afterwards, let us just read and parse its .FRM file.
Diffstat (limited to 'sql/sql_view.cc')
-rw-r--r--sql/sql_view.cc29
1 files changed, 16 insertions, 13 deletions
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index 36b49196456..f956d9d4928 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -482,8 +482,6 @@ err:
/* index of revision number in following table */
static const int revision_number_position= 8;
-/* index of source */
-static const int source_number_position= 11;
/* index of last required parameter for making view */
static const int required_view_parameters= 10;
/* number of backups */
@@ -1414,17 +1412,27 @@ mysql_rename_view(THD *thd,
if ((parser= sql_parse_prepare(&pathstr, thd->mem_root, 1)) &&
is_equal(&view_type, parser->type()))
{
+ TABLE_LIST view_def;
char dir_buff[FN_REFLEN], file_buff[FN_REFLEN];
+ /*
+ To be PS-friendly we should either to restore state of
+ TABLE_LIST object pointed by 'view' after using it for
+ view definition parsing or use temporary 'view_def'
+ object for it.
+ */
+ bzero(&view_def, sizeof(view_def));
+ view_def.timestamp.str= view_def.timestamp_buffer;
+ view_def.view_suid= TRUE;
+
/* get view definition and source */
- if (mysql_make_view(parser, view) ||
- parser->parse((gptr)view, thd->mem_root,
- view_parameters + source_number_position, 1))
+ if (parser->parse((gptr)&view_def, thd->mem_root, view_parameters,
+ sizeof(view_parameters)/sizeof(view_parameters[0])-1))
goto err;
/* rename view and it's backups */
if (rename_in_schema_file(view->db, view->table_name, new_name,
- view->revision - 1, num_view_backups))
+ view_def.revision - 1, num_view_backups))
goto err;
strxnmov(dir_buff, FN_REFLEN, mysql_data_home, "/", view->db, "/", NullS);
@@ -1438,12 +1446,12 @@ mysql_rename_view(THD *thd,
- file_buff);
if (sql_create_definition_file(&pathstr, &file, view_file_type,
- (gptr)view, view_parameters,
+ (gptr)&view_def, view_parameters,
num_view_backups))
{
/* restore renamed view in case of error */
rename_in_schema_file(view->db, new_name, view->table_name,
- view->revision - 1, num_view_backups);
+ view_def.revision - 1, num_view_backups);
goto err;
}
} else
@@ -1455,10 +1463,5 @@ mysql_rename_view(THD *thd,
error= FALSE;
err:
- /*
- We have to explicitly call destructor for view's LEX since it won't
- be called otherwise.
- */
- delete view->view;
DBUG_RETURN(error);
}