diff options
author | evgen@sunlight.local <> | 2006-08-07 02:29:59 +0400 |
---|---|---|
committer | evgen@sunlight.local <> | 2006-08-07 02:29:59 +0400 |
commit | a73d90e705392721c9a0514065ca3b64be3d4aee (patch) | |
tree | befdbb3f365b8c926d9aaf218ab4ddae2c57ef61 /sql/sql_view.cc | |
parent | 2f9a6c7c4bd41bb2cae4c05f0af26fe2594ae563 (diff) | |
parent | 854245e715c05b9a6943534bec27efcecddbd5b9 (diff) | |
download | mariadb-git-a73d90e705392721c9a0514065ca3b64be3d4aee.tar.gz |
Merge epotemkin@bk-internal.mysql.com:/home/bk/mysql-5.0
into sunlight.local:/local_work/leak_fix
Diffstat (limited to 'sql/sql_view.cc')
-rw-r--r-- | sql/sql_view.cc | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sql/sql_view.cc b/sql/sql_view.cc index 637d2cc3684..6581297c72e 100644 --- a/sql/sql_view.cc +++ b/sql/sql_view.cc @@ -179,15 +179,23 @@ static bool fill_defined_view_parts (THD *thd, TABLE_LIST *view) { LEX *lex= thd->lex; - bool not_used; + bool free_view= 1; TABLE_LIST decoy; + if (view->view) + free_view= 0; memcpy (&decoy, view, sizeof (TABLE_LIST)); - if (!open_table(thd, &decoy, thd->mem_root, ¬_used, 0) && - !decoy.view) + if ((decoy.table= open_table(thd, &decoy, thd->mem_root, NULL, 0))) { + /* It's a table */ + my_free((gptr)decoy.table, MYF(0)); + my_error(ER_WRONG_OBJECT, MYF(0), view->db, view->table_name, "VIEW"); return TRUE; } + if (!decoy.view) + /* An error while opening the view occurs, caller will handle it */ + return FALSE; + if (!lex->definer) { view->definer.host= decoy.definer.host; @@ -199,6 +207,8 @@ fill_defined_view_parts (THD *thd, TABLE_LIST *view) if (lex->create_view_suid == VIEW_SUID_DEFAULT) lex->create_view_suid= decoy.view_suid ? VIEW_SUID_DEFINER : VIEW_SUID_INVOKER; + if (free_view) + delete decoy.view; return FALSE; } |