diff options
author | unknown <mats@kindahl-laptop.dnsalias.net> | 2007-06-12 22:14:54 +0200 |
---|---|---|
committer | unknown <mats@kindahl-laptop.dnsalias.net> | 2007-06-12 22:14:54 +0200 |
commit | 95d678f84166348a46688d6f6c4f7f59abbfc058 (patch) | |
tree | 8f3cbdbb202fc2e5f1959f002cb2721b328aa458 /sql/sql_insert.cc | |
parent | fac5ba8b4452de1830a2a5a847f6c230fc25031a (diff) | |
parent | 492ebf924b40ac847201fa6dc3cb44731dbac210 (diff) | |
download | mariadb-git-95d678f84166348a46688d6f6c4f7f59abbfc058.tar.gz |
Merge kindahl-laptop.dnsalias.net:/home/bkroot/mysql-5.1-rpl
into kindahl-laptop.dnsalias.net:/home/bk/b23051-mysql-5.1-rpl
sql/ha_ndbcluster.cc:
Auto merged
sql/handler.cc:
Auto merged
sql/handler.h:
Auto merged
sql/mysql_priv.h:
Auto merged
sql/set_var.cc:
Auto merged
sql/sql_base.cc:
Auto merged
sql/sql_class.h:
Auto merged
sql/sql_insert.cc:
Auto merged
sql/sql_parse.cc:
Auto merged
storage/archive/ha_archive.h:
Auto merged
storage/blackhole/ha_blackhole.h:
Auto merged
storage/csv/ha_tina.h:
Auto merged
storage/example/ha_example.h:
Auto merged
storage/federated/ha_federated.h:
Auto merged
storage/heap/ha_heap.h:
Auto merged
storage/innobase/handler/ha_innodb.cc:
Auto merged
storage/innobase/handler/ha_innodb.h:
Auto merged
storage/myisam/ha_myisam.cc:
Auto merged
storage/myisammrg/ha_myisammrg.h:
Auto merged
sql/share/errmsg.txt:
SCCS merged
Diffstat (limited to 'sql/sql_insert.cc')
-rw-r--r-- | sql/sql_insert.cc | 28 |
1 files changed, 23 insertions, 5 deletions
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc index b0c96530548..95d31b371d6 100644 --- a/sql/sql_insert.cc +++ b/sql/sql_insert.cc @@ -3341,8 +3341,15 @@ static TABLE *create_table_from_items(THD *thd, HA_CREATE_INFO *create_info, table->reginfo.lock_type=TL_WRITE; hooks->prelock(&table, 1); // Call prelock hooks if (! ((*lock)= mysql_lock_tables(thd, &table, 1, - MYSQL_LOCK_IGNORE_FLUSH, ¬_used))) + MYSQL_LOCK_IGNORE_FLUSH, ¬_used)) || + hooks->postlock(&table, 1)) { + if (*lock) + { + mysql_unlock_tables(thd, *lock); + *lock= 0; + } + if (!create_info->table_existed) drop_open_table(thd, table, create_table->db, create_table->table_name); DBUG_RETURN(0); @@ -3377,24 +3384,35 @@ select_create::prepare(List<Item> &values, SELECT_LEX_UNIT *u) */ class MY_HOOKS : public TABLEOP_HOOKS { public: - MY_HOOKS(select_create *x) : ptr(x) { } + MY_HOOKS(select_create *x, TABLE_LIST *create_table, + TABLE_LIST *select_tables) + : ptr(x), all_tables(*create_table) + { + all_tables.next_global= select_tables; + } private: - virtual void do_prelock(TABLE **tables, uint count) + virtual int do_postlock(TABLE **tables, uint count) { + THD *thd= const_cast<THD*>(ptr->get_thd()); + if (int error= decide_logging_format(thd, &all_tables)) + return error; + TABLE const *const table = *tables; - if (ptr->get_thd()->current_stmt_binlog_row_based && + if (thd->current_stmt_binlog_row_based && !table->s->tmp_table && !ptr->get_create_info()->table_existed) { ptr->binlog_show_create_table(tables, count); } + return 0; } select_create *ptr; + TABLE_LIST all_tables; }; - MY_HOOKS hooks(this); + MY_HOOKS hooks(this, create_table, select_tables); hook_ptr= &hooks; unit= u; |