1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-27 18:02:13 +03:00

BUG#11758263 50440: MARK UNORDERED UPDATE WITH AUTOINC UNSAFE

Problem: Statements that write to tables with auto_increment columns
      based on the selection from another table, may lead to master
      and slave going out of sync, as the order in which the rows
      are retrived from the table may differ on master and slave.
      
      Solution: We mark writing to a table with auto_increment table
      as unsafe. This will cause the execution of such statements to
      throw a warning and forces the statement to be logged in ROW if
      the logging format is mixed. 
      
      Changes: 
      1. All the statements that writes to a table with auto_increment 
      column(s) based on the rows fetched from another table, will now
      be unsafe.
      2. CREATE TABLE with SELECT will now be unsafe.


sql/share/errmsg-utf8.txt:
  Added new Warning messages
sql/sql_base.cc:
  created a new function that checks for select + write on a autoinc table
  made all such statements to be unsafe.
sql/sql_parse.cc:
  made create autoincremnet tabble + select unsafe
This commit is contained in:
Rohit Kalhans
2012-02-08 00:33:08 +05:30
parent 56e3f68c72
commit de85a60049
27 changed files with 153 additions and 26 deletions

View File

@ -2414,9 +2414,12 @@ case SQLCOM_PREPARE:
select_result *result;
/*
CREATE TABLE...IGNORE/REPLACE SELECT... can be unsafe, unless
ORDER BY PRIMARY KEY clause is used in SELECT statement. We therefore
use row based logging if mixed or row based logging is available.
- CREATE TABLE...IGNORE
- REPLACE SELECT...
- CREATE TABLE [with auto inc. column]...SELECT
can be unsafe, unless ORDER BY PRIMARY KEY clause is used in SELECT
statement. We therefore use row based logging if mixed or row based
logging is available.
TODO: Check if the order of the output of the select statement is
deterministic. Waiting for BUG#42415
*/
@ -2426,6 +2429,9 @@ case SQLCOM_PREPARE:
if(lex->duplicates == DUP_REPLACE)
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_CREATE_REPLACE_SELECT);
if (lex->type & AUTO_INCREMENT_FLAG)
lex->set_stmt_unsafe(LEX::BINLOG_STMT_UNSAFE_CREATE_SELECT_AUTOINC);
/*
If:
a) we inside an SP and there was NAME_CONST substitution,