diff options
author | unknown <dlenev@mysql.com> | 2005-09-30 17:30:33 +0400 |
---|---|---|
committer | unknown <dlenev@mysql.com> | 2005-09-30 17:30:33 +0400 |
commit | 9b7e4a2aae5dd6ebe380f242d9d6caf295359115 (patch) | |
tree | 3d89891c21bcfccde9ae7dcd46decfb9894743e2 /sql/sql_view.cc | |
parent | 0a467b5fcca425ee80e67d880ddeb161ad9c3f83 (diff) | |
download | mariadb-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.cc | 29 |
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); } |