Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
acd19de6
Commit
acd19de6
authored
Jun 01, 2007
by
bar@bar.myoffice.izhnet.ru
Browse files
Options
Browse Files
Download
Plain Diff
Merge abarkov@bk-internal.mysql.com:/home/bk/mysql-5.1-rpl
into mysql.com:/home/bar/mysql-work/mysql-5.1.b28600
parents
c826b4e7
964369b5
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
362 additions
and
20 deletions
+362
-20
mysql-test/r/binlog_unsafe.result
mysql-test/r/binlog_unsafe.result
+13
-0
mysql-test/r/check.result
mysql-test/r/check.result
+2
-1
mysql-test/r/rpl_slave_skip.result
mysql-test/r/rpl_slave_skip.result
+136
-0
mysql-test/r/rpl_udf.result
mysql-test/r/rpl_udf.result
+8
-0
mysql-test/t/binlog_unsafe.test
mysql-test/t/binlog_unsafe.test
+16
-0
mysql-test/t/check.test
mysql-test/t/check.test
+2
-1
mysql-test/t/func_misc.test
mysql-test/t/func_misc.test
+2
-0
mysql-test/t/rpl_slave_skip.test
mysql-test/t/rpl_slave_skip.test
+71
-0
sql/item_create.cc
sql/item_create.cc
+2
-2
sql/log_event.cc
sql/log_event.cc
+27
-0
sql/log_event.h
sql/log_event.h
+2
-0
sql/share/errmsg.txt
sql/share/errmsg.txt
+3
-0
sql/sp_head.cc
sql/sp_head.cc
+1
-1
sql/sp_head.h
sql/sp_head.h
+1
-1
sql/sql_base.cc
sql/sql_base.cc
+2
-2
sql/sql_class.cc
sql/sql_class.cc
+22
-1
sql/sql_class.h
sql/sql_class.h
+12
-0
sql/sql_insert.cc
sql/sql_insert.cc
+1
-0
sql/sql_lex.cc
sql/sql_lex.cc
+1
-1
sql/sql_lex.h
sql/sql_lex.h
+36
-8
sql/sql_view.cc
sql/sql_view.cc
+2
-2
No files found.
mysql-test/r/binlog_unsafe.result
0 → 100644
View file @
acd19de6
SET BINLOG_FORMAT=STATEMENT;
CREATE TABLE t1 (a CHAR(40));
CREATE TABLE t2 (a INT AUTO_INCREMENT PRIMARY KEY);
CREATE TABLE t3 (b INT AUTO_INCREMENT PRIMARY KEY);
CREATE VIEW v1(a,b) AS SELECT a,b FROM t2,t3;
INSERT INTO t1 SELECT UUID();
Warnings:
Warning 1588 Statement is not safe to log in statement format.
SHOW WARNINGS;
Level Warning
Code 1588
Message Statement is not safe to log in statement format.
DROP TABLE t1,t2,t3;
mysql-test/r/check.result
View file @
acd19de6
drop table if exists t1;
drop table if exists t1,t2;
drop view if exists v1;
create table t1(n int not null, key(n), key(n), key(n), key(n));
check table t1 extended;
insert into t1 values (200000);
...
...
mysql-test/r/rpl_slave_skip.result
0 → 100644
View file @
acd19de6
stop slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
reset master;
reset slave;
drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9;
start slave;
**** On Slave ****
STOP SLAVE;
**** On Master ****
SET SESSION BINLOG_FORMAT=ROW;
CREATE TABLE t1 (a INT, b INT);
CREATE TABLE t2 (c INT, d INT);
INSERT INTO t1 VALUES (1,1),(2,4),(3,9);
INSERT INTO t2 VALUES (1,1),(2,8),(3,27);
UPDATE t1,t2 SET b = d, d = b * 2 WHERE a = c;
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # Query # # use `test`; CREATE TABLE t1 (a INT, b INT)
master-bin.000001 # Query # # use `test`; CREATE TABLE t2 (c INT, d INT)
master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map # # table_id: # (test.t2)
master-bin.000001 # Write_rows # # table_id: # flags: STMT_END_F
master-bin.000001 # Table_map # # table_id: # (test.t1)
master-bin.000001 # Table_map # # table_id: # (test.t2)
master-bin.000001 # Update_rows # # table_id: #
master-bin.000001 # Update_rows # # table_id: # flags: STMT_END_F
SELECT * FROM t1;
a b
1 1
2 8
3 27
SELECT * FROM t2;
c d
1 2
2 16
3 54
**** On Slave ****
START SLAVE UNTIL MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=484;
SHOW SLAVE STATUS;
Slave_IO_State #
Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_PORT
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 714
Relay_Log_File #
Relay_Log_Pos #
Relay_Master_Log_File master-bin.000001
Slave_IO_Running Yes
Slave_SQL_Running No
Replicate_Do_DB
Replicate_Ignore_DB
Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table
Last_Errno 0
Last_Error
Skip_Counter 0
Exec_Master_Log_Pos 484
Relay_Log_Space #
Until_Condition Master
Until_Log_File master-bin.000001
Until_Log_Pos 484
Master_SSL_Allowed No
Master_SSL_CA_File
Master_SSL_CA_Path
Master_SSL_Cert
Master_SSL_Cipher
Master_SSL_Key
Seconds_Behind_Master #
Master_SSL_Verify_Server_Cert No
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
SELECT * FROM t1;
a b
1 1
2 4
3 9
SELECT * FROM t2;
c d
1 1
2 8
3 27
STOP SLAVE;
RESET SLAVE;
RESET MASTER;
SET SESSION BINLOG_FORMAT=STATEMENT;
SET @foo = 12;
INSERT INTO t1 VALUES(@foo, 2*@foo);
show binlog events from <binlog_start>;
Log_name Pos Event_type Server_id End_log_pos Info
master-bin.000001 # User var # # @`foo`=12
master-bin.000001 # Query # # use `test`; INSERT INTO t1 VALUES(@foo, 2*@foo)
START SLAVE UNTIL MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=106;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
SHOW SLAVE STATUS;
Slave_IO_State #
Master_Host 127.0.0.1
Master_User root
Master_Port MASTER_PORT
Connect_Retry 1
Master_Log_File master-bin.000001
Read_Master_Log_Pos 248
Relay_Log_File #
Relay_Log_Pos #
Relay_Master_Log_File master-bin.000001
Slave_IO_Running Yes
Slave_SQL_Running Yes
Replicate_Do_DB
Replicate_Ignore_DB
Replicate_Do_Table
Replicate_Ignore_Table
Replicate_Wild_Do_Table
Replicate_Wild_Ignore_Table
Last_Errno 0
Last_Error
Skip_Counter 0
Exec_Master_Log_Pos 248
Relay_Log_Space #
Until_Condition None
Until_Log_File
Until_Log_Pos 0
Master_SSL_Allowed No
Master_SSL_CA_File
Master_SSL_CA_Path
Master_SSL_Cert
Master_SSL_Cipher
Master_SSL_Key
Seconds_Behind_Master #
Master_SSL_Verify_Server_Cert No
**** On Master ****
DROP TABLE t1, t2;
mysql-test/r/rpl_udf.result
View file @
acd19de6
...
...
@@ -181,12 +181,20 @@ affected rows: 2
CREATE TABLE t1(sum INT, price FLOAT(24)) ENGINE=MyISAM;
affected rows: 0
INSERT INTO t1 VALUES(myfunc_int(100), myfunc_double(50.00));
Warnings:
Warning 1588 Statement is not safe to log in statement format.
affected rows: 1
INSERT INTO t1 VALUES(myfunc_int(10), myfunc_double(5.00));
Warnings:
Warning 1588 Statement is not safe to log in statement format.
affected rows: 1
INSERT INTO t1 VALUES(myfunc_int(200), myfunc_double(25.00));
Warnings:
Warning 1588 Statement is not safe to log in statement format.
affected rows: 1
INSERT INTO t1 VALUES(myfunc_int(1), myfunc_double(500.00));
Warnings:
Warning 1588 Statement is not safe to log in statement format.
affected rows: 1
SELECT * FROM t1 ORDER BY sum;
sum price
...
...
mysql-test/t/binlog_unsafe.test
0 → 100644
View file @
acd19de6
# Test to check that a warning is generated for unsafe statements
# executed under statement mode logging.
SET
BINLOG_FORMAT
=
STATEMENT
;
CREATE
TABLE
t1
(
a
CHAR
(
40
));
CREATE
TABLE
t2
(
a
INT
AUTO_INCREMENT
PRIMARY
KEY
);
CREATE
TABLE
t3
(
b
INT
AUTO_INCREMENT
PRIMARY
KEY
);
CREATE
VIEW
v1
(
a
,
b
)
AS
SELECT
a
,
b
FROM
t2
,
t3
;
INSERT
INTO
t1
SELECT
UUID
();
query_vertical
SHOW
WARNINGS
;
DROP
TABLE
t1
,
t2
,
t3
;
mysql-test/t/check.test
View file @
acd19de6
...
...
@@ -2,7 +2,8 @@ connect (con1,localhost,root,,);
connect
(
con2
,
localhost
,
root
,,);
connection
con1
;
--
disable_warnings
drop
table
if
exists
t1
;
drop
table
if
exists
t1
,
t2
;
drop
view
if
exists
v1
;
--
enable_warnings
# Add a lot of keys to slow down check
...
...
mysql-test/t/func_misc.test
View file @
acd19de6
...
...
@@ -89,7 +89,9 @@ select export_set(3, _latin1'foo', _utf8'bar', ',', 4);
#
# Test for BUG#9535
#
--
disable_warnings
create
table
t1
as
select
uuid
(),
length
(
uuid
());
--
enable_warnings
show
create
table
t1
;
drop
table
t1
;
...
...
mysql-test/t/rpl_slave_skip.test
0 → 100644
View file @
acd19de6
source
include
/
master
-
slave
.
inc
;
--
echo
****
On
Slave
****
connection
slave
;
STOP
SLAVE
;
--
echo
****
On
Master
****
connection
master
;
SET
SESSION
BINLOG_FORMAT
=
ROW
;
CREATE
TABLE
t1
(
a
INT
,
b
INT
);
CREATE
TABLE
t2
(
c
INT
,
d
INT
);
INSERT
INTO
t1
VALUES
(
1
,
1
),(
2
,
4
),(
3
,
9
);
INSERT
INTO
t2
VALUES
(
1
,
1
),(
2
,
8
),(
3
,
27
);
UPDATE
t1
,
t2
SET
b
=
d
,
d
=
b
*
2
WHERE
a
=
c
;
source
include
/
show_binlog_events
.
inc
;
# These tables should be changed
SELECT
*
FROM
t1
;
SELECT
*
FROM
t2
;
save_master_pos
;
--
echo
****
On
Slave
****
connection
slave
;
# Stop when reaching the the first table map event.
START
SLAVE
UNTIL
MASTER_LOG_FILE
=
'master-bin.000001'
,
MASTER_LOG_POS
=
484
;
wait_for_slave_to_stop
;
--
replace_result
$MASTER_MYPORT
MASTER_PORT
--
replace_column
1
# 8 # 9 # 23 # 33 #
query_vertical
SHOW
SLAVE
STATUS
;
# Now we skip *one* table map event. If the execution starts right
# after that table map event, *one* of the involved tables will be
# changed.
SET
GLOBAL
SQL_SLAVE_SKIP_COUNTER
=
1
;
START
SLAVE
;
sync_with_master
;
# These values should be what was inserted, not what was
# updated. Since we are skipping the first table map of the group
# representing the UPDATE statement above, we should skip the entire
# group and not start executing at the first table map.
SELECT
*
FROM
t1
;
SELECT
*
FROM
t2
;
STOP
SLAVE
;
RESET
SLAVE
;
connection
master
;
RESET
MASTER
;
SET
SESSION
BINLOG_FORMAT
=
STATEMENT
;
SET
@
foo
=
12
;
INSERT
INTO
t1
VALUES
(
@
foo
,
2
*@
foo
);
save_master_pos
;
source
include
/
show_binlog_events
.
inc
;
connection
slave
;
START
SLAVE
UNTIL
MASTER_LOG_FILE
=
'master-bin.000001'
,
MASTER_LOG_POS
=
106
;
wait_for_slave_to_stop
;
SET
GLOBAL
SQL_SLAVE_SKIP_COUNTER
=
1
;
START
SLAVE
;
sync_with_master
;
--
replace_result
$MASTER_MYPORT
MASTER_PORT
--
replace_column
1
# 8 # 9 # 23 # 33 #
query_vertical
SHOW
SLAVE
STATUS
;
--
echo
****
On
Master
****
connection
master
;
DROP
TABLE
t1
,
t2
;
sync_slave_with_master
;
sql/item_create.cc
View file @
acd19de6
...
...
@@ -2341,7 +2341,7 @@ Create_udf_func::create(THD *thd, udf_func *udf, List<Item> *item_list)
if
(
item_list
!=
NULL
)
arg_count
=
item_list
->
elements
;
thd
->
lex
->
binlog_row_based_if_mixed
=
TRUE
;
thd
->
lex
->
set_stmt_unsafe
()
;
DBUG_ASSERT
(
(
udf
->
type
==
UDFTYPE_FUNCTION
)
||
(
udf
->
type
==
UDFTYPE_AGGREGATE
));
...
...
@@ -4528,7 +4528,7 @@ Create_func_uuid Create_func_uuid::s_singleton;
Item
*
Create_func_uuid
::
create
(
THD
*
thd
)
{
thd
->
lex
->
binlog_row_based_if_mixed
=
TRUE
;
thd
->
lex
->
set_stmt_unsafe
()
;
return
new
(
thd
->
mem_root
)
Item_func_uuid
();
}
...
...
sql/log_event.cc
View file @
acd19de6
...
...
@@ -6149,6 +6149,20 @@ int Rows_log_event::do_apply_event(RELAY_LOG_INFO const *rli)
DBUG_RETURN
(
0
);
}
Log_event
::
enum_skip_reason
Rows_log_event
::
do_shall_skip
(
RELAY_LOG_INFO
*
rli
)
{
/*
If the slave skip counter is 1 and this event does not end a
statement, then we should not start executing on the next event.
Otherwise, we defer the decision to the normal skipping logic.
*/
if
(
rli
->
slave_skip_counter
==
1
&&
!
get_flags
(
STMT_END_F
))
return
Log_event
::
EVENT_SKIP_IGNORE
;
else
return
Log_event
::
do_shall_skip
(
rli
);
}
int
Rows_log_event
::
do_update_pos
(
RELAY_LOG_INFO
*
rli
)
{
...
...
@@ -6622,6 +6636,19 @@ int Table_map_log_event::do_apply_event(RELAY_LOG_INFO const *rli)
DBUG_RETURN
(
error
);
}
Log_event
::
enum_skip_reason
Table_map_log_event
::
do_shall_skip
(
RELAY_LOG_INFO
*
rli
)
{
/*
If the slave skip counter is 1, then we should not start executing
on the next event.
*/
if
(
rli
->
slave_skip_counter
==
1
)
return
Log_event
::
EVENT_SKIP_IGNORE
;
else
return
Log_event
::
do_shall_skip
(
rli
);
}
int
Table_map_log_event
::
do_update_pos
(
RELAY_LOG_INFO
*
rli
)
{
rli
->
inc_event_relay_log_pos
();
...
...
sql/log_event.h
View file @
acd19de6
...
...
@@ -2067,6 +2067,7 @@ class Table_map_log_event : public Log_event
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
virtual
int
do_apply_event
(
RELAY_LOG_INFO
const
*
rli
);
virtual
int
do_update_pos
(
RELAY_LOG_INFO
*
rli
);
virtual
enum_skip_reason
do_shall_skip
(
RELAY_LOG_INFO
*
rli
);
#endif
#ifndef MYSQL_CLIENT
...
...
@@ -2245,6 +2246,7 @@ class Rows_log_event : public Log_event
#if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION)
virtual
int
do_apply_event
(
RELAY_LOG_INFO
const
*
rli
);
virtual
int
do_update_pos
(
RELAY_LOG_INFO
*
rli
);
virtual
enum_skip_reason
do_shall_skip
(
RELAY_LOG_INFO
*
rli
);
/*
Primitive to prepare for a sequence of row executions.
...
...
sql/share/errmsg.txt
View file @
acd19de6
...
...
@@ -6059,3 +6059,6 @@ ER_SLAVE_INCIDENT
eng "The incident %s occured on the master. Message: %-.64s"
ER_NO_PARTITION_FOR_GIVEN_VALUE_SILENT
eng "Table has no partition for some existing values"
ER_BINLOG_UNSAFE_STATEMENT
eng "Statement is not safe to log in statement format."
swe "Detta r inte skert att logga i statement-format."
sql/sp_head.cc
View file @
acd19de6
...
...
@@ -1855,7 +1855,7 @@ sp_head::restore_lex(THD *thd)
cannot switch from statement-based to row-based only for this
substatement).
*/
if
(
sublex
->
binlog_row_based_if_mixed
)
if
(
sublex
->
is_stmt_unsafe
()
)
m_flags
|=
BINLOG_ROW_BASED_IF_MIXED
;
/*
...
...
sql/sp_head.h
View file @
acd19de6
...
...
@@ -378,7 +378,7 @@ class sp_head :private Query_arena
the substatements not).
*/
if
(
m_flags
&
BINLOG_ROW_BASED_IF_MIXED
)
lex
->
binlog_row_based_if_mixed
=
TRUE
;
lex
->
set_stmt_unsafe
()
;
}
...
...
sql/sql_base.cc
View file @
acd19de6
...
...
@@ -3992,7 +3992,7 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
/*
CREATE ... SELECT UUID() locks no tables, we have to test here.
*/
if
(
thd
->
lex
->
binlog_row_based_if_mixed
)
if
(
thd
->
lex
->
is_stmt_unsafe
()
)
thd
->
set_current_stmt_binlog_row_based_if_mixed
();
if
(
!
tables
&&
!
thd
->
lex
->
requires_prelocking
())
...
...
@@ -4033,7 +4033,7 @@ int lock_tables(THD *thd, TABLE_LIST *tables, uint count, bool *need_reopen)
if
(
thd
->
variables
.
binlog_format
==
BINLOG_FORMAT_MIXED
&&
has_two_write_locked_tables_with_auto_increment
(
tables
))
{
thd
->
lex
->
binlog_row_based_if_mixed
=
TRUE
;
thd
->
lex
->
set_stmt_unsafe
()
;
thd
->
set_current_stmt_binlog_row_based_if_mixed
();
}
}
...
...
sql/sql_class.cc
View file @
acd19de6
...
...
@@ -329,7 +329,7 @@ THD::THD()
Open_tables_state
(
refresh_version
),
rli_fake
(
0
),
lock_id
(
&
main_lock_id
),
user_time
(
0
),
in_sub_stmt
(
0
),
binlog_table_maps
(
0
),
binlog_table_maps
(
0
),
binlog_flags
(
0UL
),
arg_of_last_insert_id_function
(
FALSE
),
first_successful_insert_id_in_prev_stmt
(
0
),
first_successful_insert_id_in_prev_stmt_for_binlog
(
0
),
...
...
@@ -3103,6 +3103,27 @@ int THD::binlog_query(THD::enum_binlog_query_type qtype, char const *query,
if
(
int
error
=
binlog_flush_pending_rows_event
(
TRUE
))
DBUG_RETURN
(
error
);
/*
If we are in statement mode and trying to log an unsafe statement,
we should print a warning.
*/
if
(
lex
->
is_stmt_unsafe
()
&&
variables
.
binlog_format
==
BINLOG_FORMAT_STMT
)
{
DBUG_ASSERT
(
this
->
query
!=
NULL
);
push_warning
(
this
,
MYSQL_ERROR
::
WARN_LEVEL_WARN
,
ER_BINLOG_UNSAFE_STATEMENT
,
ER
(
ER_BINLOG_UNSAFE_STATEMENT
));
if
(
!
(
binlog_flags
&
BINLOG_FLAG_UNSAFE_STMT_PRINTED
))
{
char
warn_buf
[
MYSQL_ERRMSG_SIZE
];
my_snprintf
(
warn_buf
,
MYSQL_ERRMSG_SIZE
,
"%s Statement: %s"
,
ER
(
ER_BINLOG_UNSAFE_STATEMENT
),
this
->
query
);
sql_print_warning
(
warn_buf
);
binlog_flags
|=
BINLOG_FLAG_UNSAFE_STMT_PRINTED
;
}
}
switch
(
qtype
)
{
case
THD
:
:
ROW_QUERY_TYPE
:
if
(
current_stmt_binlog_row_based
)
...
...
sql/sql_class.h
View file @
acd19de6
...
...
@@ -1110,6 +1110,17 @@ class THD :public Statement,
private:
uint
binlog_table_maps
;
// Number of table maps currently in the binlog
enum
enum_binlog_flag
{
BINLOG_FLAG_UNSAFE_STMT_PRINTED
,
BINLOG_FLAG_COUNT
};
/**
Flags with per-thread information regarding the status of the
binary log.
*/
uint32
binlog_flags
;
public:
uint
get_binlog_table_maps
()
const
{
return
binlog_table_maps
;
...
...
@@ -1680,6 +1691,7 @@ class THD :public Statement,
void
restore_sub_statement_state
(
Sub_statement_state
*
backup
);
void
set_n_backup_active_arena
(
Query_arena
*
set
,
Query_arena
*
backup
);
void
restore_active_arena
(
Query_arena
*
set
,
Query_arena
*
backup
);
inline
void
set_current_stmt_binlog_row_based_if_mixed
()
{
/*
...
...
sql/sql_insert.cc
View file @
acd19de6
...
...
@@ -1664,6 +1664,7 @@ class Delayed_insert :public ilink {
Statement-based replication of INSERT DELAYED has problems with RAND()
and user vars, so in mixed mode we go to row-based.
*/
thd
.
lex
->
set_stmt_unsafe
();
thd
.
set_current_stmt_binlog_row_based_if_mixed
();
bzero
((
char
*
)
&
thd
.
net
,
sizeof
(
thd
.
net
));
// Safety
...
...
sql/sql_lex.cc
View file @
acd19de6
...
...
@@ -1782,7 +1782,7 @@ void Query_tables_list::reset_query_tables_list(bool init)
sroutines_list
.
empty
();
sroutines_list_own_last
=
sroutines_list
.
next
;
sroutines_list_own_elements
=
0
;
binlog_
row_based_if_mixed
=
FALSE
;
binlog_
stmt_flags
=
0
;
}
...
...
sql/sql_lex.h
View file @
acd19de6
...
...
@@ -950,14 +950,6 @@ class Query_tables_list
byte
**
sroutines_list_own_last
;
uint
sroutines_list_own_elements
;
/*
Tells if the parsing stage detected that some items require row-based
binlogging to give a reliable binlog/replication, or if we will use
stored functions or triggers which themselves need require row-based
binlogging.
*/
bool
binlog_row_based_if_mixed
;
/*
These constructor and destructor serve for creation/destruction
of Query_tables_list instances which are used as backup storage.
...
...
@@ -1005,12 +997,48 @@ class Query_tables_list
query_tables_own_last
=
0
;
}
}
/**
Has the parser/scanner detected that this statement is unsafe?
*/
inline
bool
is_stmt_unsafe
()
const
{
return
binlog_stmt_flags
&
(
1U
<<
BINLOG_STMT_FLAG_UNSAFE
);
}
/**
Flag the current (top-level) statement as unsafe.
The flag will be reset after the statement has finished.
*/
inline
void
set_stmt_unsafe
()
{
binlog_stmt_flags
|=
(
1U
<<
BINLOG_STMT_FLAG_UNSAFE
);
}
inline
void
clear_stmt_unsafe
()
{
binlog_stmt_flags
&=
~
(
1U
<<
BINLOG_STMT_FLAG_UNSAFE
);
}
/**
true if the parsed tree contains references to stored procedures
or functions, false otherwise
*/
bool
uses_stored_routines
()
const
{
return
sroutines_list
.
elements
!=
0
;
}
private:
enum
enum_binlog_stmt_flag
{
BINLOG_STMT_FLAG_UNSAFE
,
BINLOG_STMT_FLAG_COUNT
};
/*
Tells if the parsing stage detected properties of the statement,
for example: that some items require row-based binlogging to give
a reliable binlog/replication, or if we will use stored functions
or triggers which themselves need require row-based binlogging.
*/
uint32
binlog_stmt_flags
;
};
...
...
sql/sql_view.cc
View file @
acd19de6
...
...
@@ -1118,8 +1118,8 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
If the view's body needs row-based binlogging (e.g. the VIEW is created
from SELECT UUID()), the top statement also needs it.
*/
if
(
lex
->
binlog_row_based_if_mixed
)
old_lex
->
binlog_row_based_if_mixed
=
TRUE
;
if
(
lex
->
is_stmt_unsafe
()
)
old_lex
->
set_stmt_unsafe
()
;
view_is_mergeable
=
(
table
->
algorithm
!=
VIEW_ALGORITHM_TMPTABLE
&&
lex
->
can_be_merged
());
LINT_INIT
(
view_main_select_tables
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment