summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <svoj@june.mysql.com>2008-03-21 12:46:01 +0400
committerunknown <svoj@june.mysql.com>2008-03-21 12:46:01 +0400
commitf0e55820df999eb2156fb6aaed5292ffac74a030 (patch)
tree03fb9b7280d7c3977cc0993634980566fc51daec /sql
parent95023bb9b0702cc9e080d67ab79cf56d2c12fd97 (diff)
parent503dfdbc8064f18f7df02d33766710da9549eafd (diff)
downloadmariadb-git-f0e55820df999eb2156fb6aaed5292ffac74a030.tar.gz
Merge mysql.com:/home/svoj/devel/mysql/BUG34790/mysql-5.1-engines
into mysql.com:/home/svoj/devel/mysql/push/mysql-5.1-engines sql/sql_servers.cc: Auto merged
Diffstat (limited to 'sql')
-rw-r--r--sql/sql_delete.cc13
-rw-r--r--sql/sql_insert.cc13
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_servers.cc8
-rw-r--r--sql/sql_update.cc13
5 files changed, 46 insertions, 3 deletions
diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc
index 990f7713561..abf25e96be0 100644
--- a/sql/sql_delete.cc
+++ b/sql/sql_delete.cc
@@ -418,6 +418,19 @@ bool mysql_prepare_delete(THD *thd, TABLE_LIST *table_list, Item **conds)
DBUG_ENTER("mysql_prepare_delete");
List<Item> all_fields;
+ /*
+ Statement-based replication of DELETE ... LIMIT is not safe as order of
+ rows is not defined, so in mixed mode we go to row-based.
+
+ Note that we may consider a statement as safe if ORDER BY primary_key
+ is present. However it may confuse users to see very similiar statements
+ replicated differently.
+ */
+ if (thd->lex->current_select->select_limit)
+ {
+ thd->lex->set_stmt_unsafe();
+ thd->set_current_stmt_binlog_row_based_if_mixed();
+ }
thd->lex->allow_sum_func= 0;
if (setup_tables_and_check_access(thd, &thd->lex->select_lex.context,
&thd->lex->select_lex.top_join_list,
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 2be932a6040..58acf40964b 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -2764,6 +2764,19 @@ bool mysql_insert_select_prepare(THD *thd)
DBUG_ENTER("mysql_insert_select_prepare");
/*
+ Statement-based replication of INSERT ... SELECT ... LIMIT is not safe
+ as order of rows is not defined, so in mixed mode we go to row-based.
+
+ Note that we may consider a statement as safe if ORDER BY primary_key
+ is present or we SELECT a constant. However it may confuse users to
+ see very similiar statements replicated differently.
+ */
+ if (lex->current_select->select_limit)
+ {
+ lex->set_stmt_unsafe();
+ thd->set_current_stmt_binlog_row_based_if_mixed();
+ }
+ /*
SELECT_LEX do not belong to INSERT statement, so we can't add WHERE
clause if table is VIEW
*/
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index f2e0065f860..046eae4e654 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -6486,6 +6486,8 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables,
result= 1;
if (grant_reload(thd))
result= 1;
+ if (servers_reload(thd))
+ result= 1;
}
if (tmp_thd)
{
diff --git a/sql/sql_servers.cc b/sql/sql_servers.cc
index 6255901d782..4390919f8c7 100644
--- a/sql/sql_servers.cc
+++ b/sql/sql_servers.cc
@@ -166,6 +166,9 @@ end:
RETURN VALUES
FALSE Success
TRUE Error
+
+ TODO
+ Revert back to old list if we failed to load new one.
*/
static bool servers_load(THD *thd, TABLE_LIST *tables)
@@ -175,10 +178,9 @@ static bool servers_load(THD *thd, TABLE_LIST *tables)
bool return_val= TRUE;
DBUG_ENTER("servers_load");
- /* first, send all cached rows to sleep with the fishes, oblivion!
- I expect this crappy comment replaced */
- free_root(&mem, MYF(MY_MARK_BLOCKS_FREE));
my_hash_reset(&servers_cache);
+ free_root(&mem, MYF(0));
+ init_alloc_root(&mem, ACL_ALLOC_BLOCK_SIZE, 0);
init_read_record(&read_record_info,thd,table=tables[0].table,NULL,1,0);
while (!(read_record_info.read_record(&read_record_info)))
diff --git a/sql/sql_update.cc b/sql/sql_update.cc
index 7c9ead7591c..77d5fd7421c 100644
--- a/sql/sql_update.cc
+++ b/sql/sql_update.cc
@@ -859,6 +859,19 @@ bool mysql_prepare_update(THD *thd, TABLE_LIST *table_list,
SELECT_LEX *select_lex= &thd->lex->select_lex;
DBUG_ENTER("mysql_prepare_update");
+ /*
+ Statement-based replication of UPDATE ... LIMIT is not safe as order of
+ rows is not defined, so in mixed mode we go to row-based.
+
+ Note that we may consider a statement as safe if ORDER BY primary_key
+ is present. However it may confuse users to see very similiar statements
+ replicated differently.
+ */
+ if (thd->lex->current_select->select_limit)
+ {
+ thd->lex->set_stmt_unsafe();
+ thd->set_current_stmt_binlog_row_based_if_mixed();
+ }
#ifndef NO_EMBEDDED_ACCESS_CHECKS
table_list->grant.want_privilege= table->grant.want_privilege=
(SELECT_ACL & ~table->grant.privilege);