diff options
author | unknown <aelkin@mysql.com> | 2006-01-23 18:03:09 +0200 |
---|---|---|
committer | unknown <aelkin@mysql.com> | 2006-01-23 18:03:09 +0200 |
commit | 1dcfe028a7e5509489cf2db5db37c3e2c6705d76 (patch) | |
tree | ede7ea9a78393a073eebd7b62ff0ff3ad03049a3 /sql | |
parent | 2bdcc1714e2c84e5d4dcd21ad27c459d3a7b79b6 (diff) | |
download | mariadb-git-1dcfe028a7e5509489cf2db5db37c3e2c6705d76.tar.gz |
BUG#15699, failure to apply ignore rule for unexisting table.
Since replication rules execute after `mysql_multi_update_prepare' returns we
delay to `break' in case this functions returns non-zero (some tables are not found)
for to examine if there is an ignore rule for a not-found table. By doing that
it is guaranteed do/ignore replication rules logically preceed opening table routine.
sql/sql_parse.cc:
BUG#15699. We delay to `break' in case of unexisted tables for multi-update.
First it is checked whether an ignore rule for such a table exists.
More to the fix:
if (opt_readonly && ...' in two places got be idented because it were
enclosed explicitly into corresponding `else' groups. For that
the preceding lines with `else' were changed in to be
`else
{'.
This grouping is necessary to avoid any inattentive
insertion in between of `else' and belonging to the else
`if (opt_readonly && ...' statement.
mysql-test/r/rpl_multi_update4.result:
New BitKeeper file ``mysql-test/r/rpl_multi_update4.result''
mysql-test/t/rpl_multi_update4-slave.opt:
New BitKeeper file ``mysql-test/t/rpl_multi_update4-slave.opt''
mysql-test/t/rpl_multi_update4.test:
New BitKeeper file ``mysql-test/t/rpl_multi_update4.test''
Diffstat (limited to 'sql')
-rw-r--r-- | sql/sql_parse.cc | 65 |
1 files changed, 40 insertions, 25 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index df366643cf9..1cbc616f63f 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -2415,23 +2415,26 @@ mysql_execute_command(THD *thd) } } else + { #endif /* HAVE_REPLICATION */ - - /* - When option readonly is set deny operations which change non-temporary - tables. Except for the replication thread and the 'super' users. - */ - if (opt_readonly && - !(thd->security_ctx->master_access & SUPER_ACL) && - uc_update_queries[lex->sql_command] && - !((lex->sql_command == SQLCOM_CREATE_TABLE) && - (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) && - ((lex->sql_command != SQLCOM_UPDATE_MULTI) && - some_non_temp_table_to_be_updated(thd, all_tables))) - { - my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); - DBUG_RETURN(-1); - } + /* + When option readonly is set deny operations which change non-temporary + tables. Except for the replication thread and the 'super' users. + */ + if (opt_readonly && + !(thd->security_ctx->master_access & SUPER_ACL) && + uc_update_queries[lex->sql_command] && + !((lex->sql_command == SQLCOM_CREATE_TABLE) && + (lex->create_info.options & HA_LEX_CREATE_TMP_TABLE)) && + ((lex->sql_command != SQLCOM_UPDATE_MULTI) && + some_non_temp_table_to_be_updated(thd, all_tables))) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + DBUG_RETURN(-1); + } +#ifdef HAVE_REPLICATION + } /* endif unlikely slave */ +#endif if(lex->orig_sql_command == SQLCOM_END) statistic_increment(thd->status_var.com_stat[lex->sql_command], &LOCK_status); @@ -3232,8 +3235,7 @@ end_with_restore_list: else res= 0; - if ((res= mysql_multi_update_prepare(thd))) - break; + res= mysql_multi_update_prepare(thd); #ifdef HAVE_REPLICATION /* Check slave filtering rules */ @@ -3241,20 +3243,33 @@ end_with_restore_list: { if (all_tables_not_ok(thd, all_tables)) { + if (res!= 0) + { + res= 0; /* don't care of prev failure */ + thd->clear_error(); /* filters are of highest prior */ + } /* we warn the slave SQL thread */ my_error(ER_SLAVE_IGNORED_TABLE, MYF(0)); break; } + if (res) + break; } else -#endif /* HAVE_REPLICATION */ - if (opt_readonly && - !(thd->security_ctx->master_access & SUPER_ACL) && - some_non_temp_table_to_be_updated(thd, all_tables)) { - my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); - break; - } +#endif /* HAVE_REPLICATION */ + if (res) + break; + if (opt_readonly && + !(thd->security_ctx->master_access & SUPER_ACL) && + some_non_temp_table_to_be_updated(thd, all_tables)) + { + my_error(ER_OPTION_PREVENTS_STATEMENT, MYF(0), "--read-only"); + break; + } +#ifdef HAVE_REPLICATION + } /* unlikely */ +#endif res= mysql_multi_update(thd, all_tables, &select_lex->item_list, |