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
8635be6a
Commit
8635be6a
authored
Nov 05, 2021
by
Oleksandr Byelkin
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch '10.4' into 10.5
parents
8d7196cd
a19ab673
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
1210 additions
and
50 deletions
+1210
-50
mysql-test/suite/rpl/include/rpl_drop_create_temp_table.inc
mysql-test/suite/rpl/include/rpl_drop_create_temp_table.inc
+1
-1
mysql-test/suite/rpl/include/rpl_drop_create_temp_table.test
mysql-test/suite/rpl/include/rpl_drop_create_temp_table.test
+60
-2
mysql-test/suite/rpl/r/rpl_mixed_drop_create_temp_table.result
...-test/suite/rpl/r/rpl_mixed_drop_create_temp_table.result
+368
-0
mysql-test/suite/rpl/r/rpl_row_drop_create_temp_table.result
mysql-test/suite/rpl/r/rpl_row_drop_create_temp_table.result
+368
-18
mysql-test/suite/rpl/r/rpl_stm_drop_create_temp_table.result
mysql-test/suite/rpl/r/rpl_stm_drop_create_temp_table.result
+382
-0
sql/handler.h
sql/handler.h
+12
-0
sql/log.cc
sql/log.cc
+10
-27
sql/sp_head.cc
sql/sp_head.cc
+7
-1
sql/sql_class.h
sql/sql_class.h
+2
-1
No files found.
mysql-test/suite/rpl/include/rpl_drop_create_temp_table.inc
View file @
8635be6a
...
...
@@ -58,7 +58,7 @@ if (`SELECT HEX(@commands) = HEX('configure')`)
--
eval
CREATE
TEMPORARY
TABLE
nt_tmp_xx_1
(
id
INT
)
ENGINE
=
MyIsam
#
# Creates a Temporary
N
-table that is never dropped.
# Creates a Temporary
T
-table that is never dropped.
#
--
eval
CREATE
TEMPORARY
TABLE
tt_tmp_xx_1
(
id
INT
)
ENGINE
=
Innodb
...
...
mysql-test/suite/rpl/include/rpl_drop_create_temp_table.test
View file @
8635be6a
...
...
@@ -483,6 +483,65 @@ SET @commands= 'B N N-Temp T-SELECT-T-Temp N-Temp Te R';
SET
@
commands
=
'B N N-Temp T-SELECT-T-Temp N-Temp NeT-trig R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
--
echo
# > MDEV-26833
--
echo
# Errored out and rolled back Te statement should not produce any event to binlog
--
echo
# in the following cases:
SET
@
sav_var
=
@@
session
.
binlog_direct_non_transactional_updates
;
SET
@@
session
.
binlog_direct_non_transactional_updates
=
ON
;
SET
@
commands
=
'B T Drop-Temp-TT-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'Drop-Temp-T-Temp B T Create-T-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T Drop-Temp-TN-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T N-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T Drop-Temp-TT-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'Drop-Temp-T-Temp B T Create-T-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T Drop-Temp-TN-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T N-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
--
echo
# Non-transactional side effects.
SET
@
commands
=
'B T N-Temp Te Ne C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T N-Temp Te Ne R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@@
session
.
binlog_direct_non_transactional_updates
=
OFF
;
SET
@
commands
=
'B T Drop-Temp-TT-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'Drop-Temp-T-Temp B T Create-T-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T Drop-Temp-TN-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T N-Temp Te C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T Drop-Temp-TT-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'Drop-Temp-T-Temp B T Create-T-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T Drop-Temp-TN-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T N-Temp Te R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
--
echo
# Non-transactional side effects.
SET
@
commands
=
'B T N-Temp Te Ne C'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@
commands
=
'B T N-Temp Te Ne R'
;
--
source
suite
/
rpl
/
include
/
rpl_drop_create_temp_table
.
inc
SET
@@
session
.
binlog_direct_non_transactional_updates
=
@
sav_var
;
--
echo
# < MDEV-26833
--
echo
###################################################################################
--
echo
# CHECK CONSISTENCY
--
echo
###################################################################################
...
...
@@ -495,8 +554,7 @@ if (`select @@session.binlog_format != 'STATEMENT'`)
{
--
exec
$MYSQL_DUMP
--
compact
--
order
-
by
-
primary
--
skip
-
extended
-
insert
--
no
-
create
-
info
test
>
$MYSQLD_DATADIR
/
test
-
temporary
-
master
.
sql
--
exec
$MYSQL_DUMP_SLAVE
--
compact
--
order
-
by
-
primary
--
skip
-
extended
-
insert
--
no
-
create
-
info
test
>
$MYSQLD_DATADIR
/
test
-
temporary
-
slave
.
sql
# uncomment when anders.song@greatopensource.com-20110105052107-zoab0bsf5a6xxk2y from mysql-5.6 is merged
#--diff_files $MYSQLD_DATADIR/test-temporary-master.sql $MYSQLD_DATADIR/test-temporary-slave.sql
--
diff_files
$MYSQLD_DATADIR
/
test
-
temporary
-
master
.
sql
$MYSQLD_DATADIR
/
test
-
temporary
-
slave
.
sql
}
--
echo
#########################################################################
...
...
mysql-test/suite/rpl/r/rpl_mixed_drop_create_temp_table.result
View file @
8635be6a
This diff is collapsed.
Click to expand it.
mysql-test/suite/rpl/r/rpl_row_drop_create_temp_table.result
View file @
8635be6a
This diff is collapsed.
Click to expand it.
mysql-test/suite/rpl/r/rpl_stm_drop_create_temp_table.result
View file @
8635be6a
This diff is collapsed.
Click to expand it.
sql/handler.h
View file @
8635be6a
...
...
@@ -1861,9 +1861,13 @@ struct THD_TRANS
/*
Define the type of statements which cannot be rolled back safely.
Each type occupies one bit in m_unsafe_rollback_flags.
MODIFIED_NON_TRANS_TABLE is limited to mark only the temporary
non-transactional table *when* it's cached along with the transactional
events; the regular table is covered by the "namesake" bool var.
*/
enum
unsafe_statement_types
{
MODIFIED_NON_TRANS_TABLE
=
1
,
CREATED_TEMP_TABLE
=
2
,
DROPPED_TEMP_TABLE
=
4
,
DID_WAIT
=
8
,
...
...
@@ -1871,6 +1875,14 @@ struct THD_TRANS
EXECUTED_TABLE_ADMIN_CMD
=
0x20
};
void
mark_modified_non_trans_temp_table
()
{
m_unsafe_rollback_flags
|=
MODIFIED_NON_TRANS_TABLE
;
}
bool
has_modified_non_trans_temp_table
()
const
{
return
(
m_unsafe_rollback_flags
&
MODIFIED_NON_TRANS_TABLE
)
!=
0
;
}
void
mark_executed_table_admin_cmd
()
{
DBUG_PRINT
(
"debug"
,
(
"mark_executed_table_admin_cmd"
));
...
...
sql/log.cc
View file @
8635be6a
...
...
@@ -272,7 +272,7 @@ class binlog_cache_data
public:
binlog_cache_data
()
:
m_pending
(
0
),
status
(
0
),
before_stmt_pos
(
MY_OFF_T_UNDEF
),
incident
(
FALSE
),
changes_to_non_trans_temp_table_flag
(
FALSE
),
incident
(
FALSE
),
saved_max_binlog_cache_size
(
0
),
ptr_binlog_cache_use
(
0
),
ptr_binlog_cache_disk_use
(
0
)
{
}
...
...
@@ -321,16 +321,6 @@ class binlog_cache_data
return
(
incident
);
}
void
set_changes_to_non_trans_temp_table
()
{
changes_to_non_trans_temp_table_flag
=
TRUE
;
}
bool
changes_to_non_trans_temp_table
()
{
return
(
changes_to_non_trans_temp_table_flag
);
}
void
reset
()
{
bool
cache_was_empty
=
empty
();
...
...
@@ -342,7 +332,6 @@ class binlog_cache_data
if
(
truncate_file
)
my_chsize
(
cache_log
.
file
,
0
,
0
,
MYF
(
MY_WME
));
changes_to_non_trans_temp_table_flag
=
FALSE
;
status
=
0
;
incident
=
FALSE
;
before_stmt_pos
=
MY_OFF_T_UNDEF
;
...
...
@@ -441,12 +430,6 @@ class binlog_cache_data
*/
bool
incident
;
/*
This flag indicates if the cache has changes to temporary tables.
@TODO This a temporary fix and should be removed after BUG#54562.
*/
bool
changes_to_non_trans_temp_table_flag
;
/**
This function computes binlog cache and disk usage.
*/
...
...
@@ -2066,13 +2049,12 @@ inline bool is_prepared_xa(THD *thd)
*/
static
bool
trans_cannot_safely_rollback
(
THD
*
thd
,
bool
all
)
{
binlog_cache_mngr
*
const
cache_mngr
=
(
binlog_cache_mngr
*
)
thd_get_ha_data
(
thd
,
binlog_hton
);
DBUG_ASSERT
(
ending_trans
(
thd
,
all
));
return
((
thd
->
variables
.
option_bits
&
OPTION_KEEP_LOG
)
||
(
trans_has_updated_non_trans_table
(
thd
)
&&
thd
->
wsrep_binlog_format
()
==
BINLOG_FORMAT_STMT
)
||
(
cache_mngr
->
trx_cache
.
changes_to
_non_trans_temp_table
()
&&
(
thd
->
transaction
->
all
.
has_modified
_non_trans_temp_table
()
&&
thd
->
wsrep_binlog_format
()
==
BINLOG_FORMAT_MIXED
)
||
(
trans_has_updated_non_trans_table
(
thd
)
&&
ending_single_stmt_trans
(
thd
,
all
)
&&
...
...
@@ -2285,17 +2267,19 @@ static int binlog_rollback(handlerton *hton, THD *thd, bool all)
/*
Truncate the cache if:
. aborting a single or multi-statement transaction or;
. the OPTION_KEEP_LOG is not active and;
. the current statement created or dropped a temporary table
while having actual STATEMENT format;
. the format is not STMT or no non-trans table was
updated and;
. the format is not MIXED or no temporary non-trans table
was updated.
*/
else
if
(
ending_trans
(
thd
,
all
)
||
(
!
(
thd
->
variables
.
option_bits
&
OPTION_KEEP_LOG
)
&&
(
!
(
thd
->
transaction
->
stmt
.
has_created_dropped_temp_table
()
&&
!
thd
->
is_current_stmt_binlog_format_row
())
&&
(
!
stmt_has_updated_non_trans_table
(
thd
)
||
thd
->
wsrep_binlog_format
()
!=
BINLOG_FORMAT_STMT
)
&&
(
!
cache_mngr
->
trx_cache
.
changes_to
_non_trans_temp_table
()
||
(
!
thd
->
transaction
->
stmt
.
has_modified
_non_trans_temp_table
()
||
thd
->
wsrep_binlog_format
()
!=
BINLOG_FORMAT_MIXED
)))
error
=
binlog_truncate_trx_cache
(
thd
,
cache_mngr
,
all
);
}
...
...
@@ -6635,9 +6619,8 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info, my_bool *with_annotate)
cache_data
=
cache_mngr
->
get_binlog_cache_data
(
is_trans_cache
);
file
=
&
cache_data
->
cache_log
;
if
(
thd
->
lex
->
stmt_accessed_non_trans_temp_table
())
cache_data
->
set_changes_to_non_trans_temp_table
();
if
(
thd
->
lex
->
stmt_accessed_non_trans_temp_table
()
&&
is_trans_cache
)
thd
->
transaction
->
stmt
.
mark_modified_non_trans_temp_table
();
thd
->
binlog_start_trans_and_stmt
();
}
DBUG_PRINT
(
"info"
,(
"event type: %d"
,
event_info
->
get_type_code
()));
...
...
sql/sp_head.cc
View file @
8635be6a
...
...
@@ -3433,8 +3433,13 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp,
It's reset further in the common code part.
It's merged with the saved parent's value at the exit of this func.
*/
bool
parent_modified_non_trans_table
=
thd
->
transaction
->
stmt
.
modified_non_trans_table
;
bool
parent_modified_non_trans_table
=
thd
->
transaction
->
stmt
.
modified_non_trans_table
;
unsigned
int
parent_unsafe_rollback_flags
=
thd
->
transaction
->
stmt
.
m_unsafe_rollback_flags
;
thd
->
transaction
->
stmt
.
modified_non_trans_table
=
FALSE
;
thd
->
transaction
->
stmt
.
m_unsafe_rollback_flags
=
0
;
DBUG_ASSERT
(
!
thd
->
derived_tables
);
DBUG_ASSERT
(
thd
->
Item_change_list
::
is_empty
());
/*
...
...
@@ -3557,6 +3562,7 @@ sp_lex_keeper::reset_lex_and_exec_core(THD *thd, uint *nextp,
what is needed from the substatement gained
*/
thd
->
transaction
->
stmt
.
modified_non_trans_table
|=
parent_modified_non_trans_table
;
thd
->
transaction
->
stmt
.
m_unsafe_rollback_flags
|=
parent_unsafe_rollback_flags
;
TRANSACT_TRACKER
(
add_trx_state_from_thd
(
thd
));
...
...
sql/sql_class.h
View file @
8635be6a
...
...
@@ -5154,7 +5154,8 @@ class THD: public THD_count, /* this must be first */
transaction
->
all
.
modified_non_trans_table
=
TRUE
;
transaction
->
all
.
m_unsafe_rollback_flags
|=
(
transaction
->
stmt
.
m_unsafe_rollback_flags
&
(
THD_TRANS
::
DID_WAIT
|
THD_TRANS
::
CREATED_TEMP_TABLE
|
(
THD_TRANS
::
MODIFIED_NON_TRANS_TABLE
|
THD_TRANS
::
DID_WAIT
|
THD_TRANS
::
CREATED_TEMP_TABLE
|
THD_TRANS
::
DROPPED_TEMP_TABLE
|
THD_TRANS
::
DID_DDL
|
THD_TRANS
::
EXECUTED_TABLE_ADMIN_CMD
));
}
...
...
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