mirror of
https://github.com/MariaDB/server.git
synced 2025-11-21 06:21:35 +03:00
'CREATE TABLE IF NOT EXISTS ... SELECT' behaviour
BUG#55474, BUG#55499, BUG#55598, BUG#55616 and BUG#55777 are fixed
in this patch too.
This is the 5.1 part.
It implements:
- if the table exists, binlog two events: CREATE TABLE IF NOT EXISTS
and INSERT ... SELECT
- Insert nothing and binlog nothing on master if the existing object
is a view. It only generates a warning that table already exists.
mysql-test/r/trigger.result:
Ather this patch, 'CREATE TABLE IF NOT EXISTS ... SELECT' will not
insert anything if the creating table already exists and is a view.
sql/sql_class.h:
Declare virtual function write_to_binlog() for select_insert.
It's used to binlog 'create select'
sql/sql_insert.cc:
Implement write_to_binlog();
Use write_to_binlog() instead of binlog_query() to binlog the statement.
if the table exists, binlog two events: CREATE TABLE IF NOT EXISTS
and INSERT ... SELECT
sql/sql_lex.h:
Declare create_select_start_with_brace and create_select_pos.
They are helpful for binlogging 'create select'
sql/sql_parse.cc:
Do nothing on master if the existing object is a view.
sql/sql_yacc.yy:
Record the relative postion of 'SELECT' in the 'CREATE ...SELECT' statement.
Record whether there is a '(' before the 'SELECT' clause.
37 lines
1.1 KiB
PHP
37 lines
1.1 KiB
PHP
# #############################################################################
|
|
# Check whether the given table is consistent between different master and
|
|
# slaves
|
|
#
|
|
# Usage:
|
|
# --let $diff_table= test.t1
|
|
# --let $diff_server_list= master, slave, slave2
|
|
# --source include/rpl_diff_tables.inc
|
|
# #############################################################################
|
|
|
|
if (`SELECT "XX$diff_table" = "XX"`)
|
|
{
|
|
--die diff_table is null.
|
|
}
|
|
|
|
--let $_servers= master, slave
|
|
if (`SELECT "XX$diff_server_list" <> "XX"`)
|
|
{
|
|
--let $_servers= $diff_server_list
|
|
}
|
|
|
|
--let $_master= `SELECT SUBSTRING_INDEX('$_servers', ',', 1)`
|
|
--let $_servers= `SELECT LTRIM(SUBSTRING('$_servers', LENGTH('$_master') + 2))`
|
|
connection $_master;
|
|
while (`SELECT "XX$_servers" <> "XX"`)
|
|
{
|
|
--let $_slave= `SELECT SUBSTRING_INDEX('$_servers', ',', 1)`
|
|
--let $_servers= `SELECT LTRIM(SUBSTRING('$_servers', LENGTH('$_slave') + 2))`
|
|
|
|
--sync_slave_with_master $_slave
|
|
--let $diff_table_1= $_master:$diff_table
|
|
--let $diff_table_2= $_slave:$diff_table
|
|
--source include/diff_tables.inc
|
|
connection $_slave;
|
|
}
|
|
connection $_master;
|