summaryrefslogtreecommitdiff
path: root/mysql-test/suite/binlog/t/binlog_drop_if_exists.test
blob: b565104ce3ac805c23df24df68e0399c926037ff (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
--source include/have_innodb.inc

# BUG#13684: 
#   SP: DROP PROCEDURE|FUNCTION IF EXISTS not binlogged if routine 
#   does not exist
#   
#   There is an inconsistency with DROP DATABASE IF EXISTS, DROP
#   TABLE IF EXISTS and DROP VIEW IF EXISTS: those are binlogged even
#   if the DB or TABLE does not exist, whereas DROP PROCEDURE IF
#   EXISTS does not. It would be nice or at least consistent if DROP
#   PROCEDURE/STATEMENT worked the same too.
#
# Description: 
#   DROP PROCEDURE|FUNCTION IF EXISTS does not get binlogged whereas DROP
#   DATABASE|TABLE|TRIGGER|... IF EXISTS do.
#
#   Fixed DROP PROCEDURE|FUNCTION IF EXISTS by adding a call to
#   write_bin_log in mysql_execute_command. Checked also if all
#   documented "DROP (...) IF EXISTS" get binlogged. Left out DROP
#   SERVER IF EXISTS because it seems that it only gets binlogged when
#   using row event (see BUG#25705).
#
#   TODO: add DROP SERVER IF EXISTS to the test case when its
#   binlogging procedure gets fixed (BUG#25705). Furthermore, when
#   logging in RBR format the events that get logged are effectively in
#   RBR format and not in STATEMENT format meaning that one must needs
#   to be extra careful when writing a test for it, or change the CREATE
#   SERVER logging to always log as STATEMENT. You can quickly check this
#   by enabling the flag below $fixed_bug_25705=1 and watch the diff on
#   the STDOUT. More detail may be found on the generated reject file.
#   
#   Test is implemented as follows:
#
#       i) test each "drop if exists" (DDL), found in MySQL 5.1 manual, 
#          on inexistent objects (except for DROP SERVER);
#      ii) show binlog events;
#     iii) create an object for each drop if exists statement;
#      iv) issue "drop if exists" in existent objects.
#       v) show binlog events;
#
# References:
#  http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-data-definition.html
#
--source include/have_log_bin.inc
RESET MASTER;

disable_warnings;

# test all "drop if exists" in manual with inexistent objects
DROP PROCEDURE IF EXISTS db_bug_13684.p;
DROP FUNCTION IF EXISTS db_bug_13684.f;
DROP TRIGGER IF EXISTS db_bug_13684.tr;
DROP VIEW IF EXISTS db_bug_13684.v;
DROP EVENT IF EXISTS db_bug_13684.e;
DROP TABLE IF EXISTS db_bug_13684.t;
DROP DATABASE IF EXISTS db_bug_13684;

let $fixed_bug_25705 = 0;

if($fixed_bug_25705)
{
  DROP SERVER IF EXISTS s_bug_13684;
}
--source include/show_binlog_events.inc

# test drop with existing values

# create 
CREATE DATABASE db_bug_13684;

CREATE TABLE db_bug_13684.t (a int);

CREATE EVENT db_bug_13684.e
  ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR
  DO
    UPDATE db_bug_13684.t SET a = a + 1;

CREATE VIEW db_bug_13684.v 
  AS SELECT * FROM db_bug_13684.t;

CREATE TRIGGER db_bug_13684.tr BEFORE INSERT ON db_bug_13684.t
  FOR EACH ROW BEGIN
  END;

CREATE PROCEDURE db_bug_13684.p (OUT p1 INT)
  BEGIN
  END;

CREATE FUNCTION db_bug_13684.f (s CHAR(20))
  RETURNS CHAR(50) DETERMINISTIC
  RETURN s;

if($fixed_bug_25705)
{
  CREATE SERVER s_bug_13684
    FOREIGN DATA WRAPPER mysql
    OPTIONS (USER 'Remote', HOST '192.168.1.106', DATABASE 'test');
}

--source include/show_binlog_events.inc

# drop existing 
DROP PROCEDURE IF EXISTS db_bug_13684.p;
DROP FUNCTION IF EXISTS db_bug_13684.f;
DROP TRIGGER IF EXISTS db_bug_13684.tr;
DROP VIEW IF EXISTS db_bug_13684.v;
DROP EVENT IF EXISTS db_bug_13684.e;
DROP TABLE IF EXISTS db_bug_13684.t;
DROP DATABASE IF EXISTS db_bug_13684;
if($fixed_bug_25705)
{
  DROP SERVER IF EXISTS s_bug_13684;
}

--source include/show_binlog_events.inc

enable_warnings;

# Drop comments in binlog
let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);
CREATE TABLE t1(id int);
DROP TABLE /* comment */ t1;
CREATE TABLE t1(id int);
DROP TABLE IF EXISTS /* comment */ t1;

CREATE TABLE t1(id int);
DROP TABLE /**/ t1;
CREATE TABLE t1(id int);
DROP TABLE IF EXISTS /* */ t1;

--source include/show_binlog_events.inc

--echo #
--echo # MDEV-22820 Bogus "Unknown table" warnings produced upon attempt to
--echo #            drop parent table referenced by FK
--echo #

let $binlog_start= query_get_value(SHOW MASTER STATUS, Position, 1);

create table t1 (a int, key(a)) engine=InnoDB;
create table t2 (b int, foreign key(b) references t1(a)) engine=InnoDB;
--error ER_ROW_IS_REFERENCED_2
drop table if exists t1;
--error ER_ROW_IS_REFERENCED_2
drop table if exists t1,t0;
show warnings;
drop table t2,t1;

create table t3 (a int) engine=aria;

# This is not logged
--error ER_BAD_TABLE_ERROR
drop table t10,t20;
# This is logged
--error ER_BAD_TABLE_ERROR
drop table t10,t20,t3;

# These are both logged
drop table if exists t10,t20;
drop table if exists t10,t20,t3;

--source include/show_binlog_events.inc