Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PS-9238: Make MySQL 5.7 compatible with CREATE TABLE AS SELECT [...] START TRANSACTION to improve 8.0 -> 5.7 replication reliability #5362

Open
wants to merge 3 commits into
base: 8.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions mysql-test/r/mysqld--help-notwin.result
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,9 @@ The following options may be given as the first argument:
--create-admin-listener-thread
Use a dedicated thread for listening incoming connections
on admin interface
--ctas-compatibility-mode
Execute and binlog CTAS in pre 8.0.21 way, i.e. with
intermediate commit after the table creation.
--cte-max-recursion-depth=#
Abort a recursive common table expression if it does more
than this number of iterations.
Expand Down Expand Up @@ -1856,6 +1859,7 @@ connection-memory-limit 18446744073709551615
console FALSE
coredumper (No default value)
create-admin-listener-thread FALSE
ctas-compatibility-mode FALSE
cte-max-recursion-depth 1000
daemonize FALSE
default-authentication-plugin caching_sha2_password
Expand Down
2 changes: 2 additions & 0 deletions mysql-test/suite/sys_vars/r/all_vars.result
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ binlog_expire_logs_auto_purge
binlog_expire_logs_auto_purge
binlog_rotate_encryption_master_key_at_startup
binlog_rotate_encryption_master_key_at_startup
ctas_compatibility_mode
ctas_compatibility_mode
cte_max_recursion_depth
cte_max_recursion_depth
default_collation_for_utf8mb4
Expand Down
11 changes: 11 additions & 0 deletions mysql-test/suite/sys_vars/r/ctas_compatibility_mode.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
include/assert.inc [ctas_compatibility_mode default should be OFF]
SET GLOBAL ctas_compatibility_mode = ON;
ERROR HY000: Variable 'ctas_compatibility_mode' is a read only variable
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (0);
# restart: --ctas-compatibility-mode=ON --log-bin=ctas_binlog
CREATE TABLE t2 AS SELECT * FROM t1;
# restart:
include/assert_grep.inc ["Checking if ctas_compatibility_mode works"]
include/assert_grep.inc ["Checking if rows are inserted as the separate transaction"]
DROP TABLE t1, t2;
45 changes: 45 additions & 0 deletions mysql-test/suite/sys_vars/t/ctas_compatibility_mode.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#
# The default is OFF
#
--let $assert_text= ctas_compatibility_mode default should be OFF
--let $assert_cond= "[SHOW GLOBAL VARIABLES LIKE "ctas_compatibility_mode", Value, 1]" = "OFF"
--source include/assert.inc

#
# Check that it is read-only
#
--error ER_INCORRECT_GLOBAL_LOCAL_VAR
SET GLOBAL ctas_compatibility_mode = ON;

#
# Check that compatibility mode works
#
CREATE TABLE t1 (a int);
INSERT INTO t1 VALUES (0);

--let $binlog_file = ctas_binlog
--let $restart_parameters = "restart: --ctas-compatibility-mode=ON --log-bin=$binlog_file"
--source include/restart_mysqld.inc

CREATE TABLE t2 AS SELECT * FROM t1;

--let $restart_parameters = "restart:"
--source include/restart_mysqld.inc

let $MYSQLD_DATADIR= `select @@datadir;`;
--exec $MYSQL_BINLOG --verbose $MYSQLD_DATADIR/$binlog_file.000001 > $MYSQLTEST_VARDIR/tmp/$binlog_file.sql
--let $assert_file = $MYSQLTEST_VARDIR/tmp/$binlog_file.sql
--let $assert_text = "Checking if ctas_compatibility_mode works"
--let $assert_select = START TRANSACTION
--let $assert_count = 0
--source include/assert_grep.inc

--let $assert_text = "Checking if rows are inserted as the separate transaction"
--let $assert_select = BEGIN
--let $assert_count = 1
--source include/assert_grep.inc

# cleanup
DROP TABLE t1, t2;
--remove_file $MYSQLD_DATADIR/$binlog_file.000001
--remove_file $MYSQLTEST_VARDIR/tmp/$binlog_file.sql
2 changes: 1 addition & 1 deletion sql/mysqld.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1241,7 +1241,7 @@ bool opt_show_replica_auth_info;
bool opt_log_replica_updates = false;
char *opt_replica_skip_errors;
bool opt_replica_allow_batching = true;

bool opt_ctas_compatibility_mode = false;
/**
compatibility option:
- index usage hints (USE INDEX without a FOR clause) behave as in 5.0
Expand Down
1 change: 1 addition & 0 deletions sql/mysqld.h
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,7 @@ extern Rpl_acf_configuration_handler *rpl_acf_configuration_handler;
extern Source_IO_monitor *rpl_source_io_monitor;
extern int32_t opt_regexp_time_limit;
extern int32_t opt_regexp_stack_limit;
extern bool opt_ctas_compatibility_mode;
#ifdef _WIN32
extern bool opt_no_monitor;
#endif // _WIN32
Expand Down
5 changes: 3 additions & 2 deletions sql/sql_insert.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3039,8 +3039,9 @@ int Query_result_create::binlog_show_create_table(THD *thd) {

bool is_trans = false;
bool direct = true;
if (get_default_handlerton(thd, thd->lex->create_info->db_type)->flags &
HTON_SUPPORTS_ATOMIC_DDL) {
if ((get_default_handlerton(thd, thd->lex->create_info->db_type)->flags &
HTON_SUPPORTS_ATOMIC_DDL) &&
Comment on lines +3042 to +3043

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ readability-implicit-bool-conversion ⚠️
implicit conversion unsigned int -> bool

Suggested change
if ((get_default_handlerton(thd, thd->lex->create_info->db_type)->flags &
HTON_SUPPORTS_ATOMIC_DDL) &&
if (((get_default_handlerton(thd, thd->lex->create_info->db_type)->flags &
HTON_SUPPORTS_ATOMIC_DDL) != 0u) &&

!opt_ctas_compatibility_mode) {
is_trans = true;
direct = false;
}
Expand Down
3 changes: 2 additions & 1 deletion sql/sql_show.cc
Original file line number Diff line number Diff line change
Expand Up @@ -2363,7 +2363,8 @@ bool store_create_info(THD *thd, Table_ref *table_list, String *packet,
This is done only while binlogging CREATE TABLE AS SELECT.
*/
if (!thd->lex->query_block->field_list_is_empty() &&
(create_info_arg->db_type->flags & HTON_SUPPORTS_ATOMIC_DDL)) {
(create_info_arg->db_type->flags & HTON_SUPPORTS_ATOMIC_DDL) &&

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ readability-implicit-bool-conversion ⚠️
implicit conversion unsigned int -> bool

Suggested change
(create_info_arg->db_type->flags & HTON_SUPPORTS_ATOMIC_DDL) &&
((create_info_arg->db_type->flags & HTON_SUPPORTS_ATOMIC_DDL) != 0u) &&

!opt_ctas_compatibility_mode) {
packet->append(STRING_WITH_LEN(" START TRANSACTION"));
}

Expand Down
7 changes: 7 additions & 0 deletions sql/sys_vars.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4292,6 +4292,13 @@ static Sys_var_int32 Sys_regexp_stack_limit(
GLOBAL_VAR(opt_regexp_stack_limit), CMD_LINE(REQUIRED_ARG),
VALID_RANGE(0, INT32_MAX), DEFAULT(8000000), BLOCK_SIZE(1));

static Sys_var_bool Sys_ctas_compatibility_mode(

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ cppcoreguidelines-interfaces-global-init ⚠️
initializing non-local variable with non-const expression depending on uninitialized non-local variable opt_ctas_compatibility_mode

"ctas_compatibility_mode",
"Execute and binlog CTAS in pre 8.0.21 way, i.e. with intermediate commit "
"after the table creation.",
READ_ONLY GLOBAL_VAR(opt_ctas_compatibility_mode), CMD_LINE(OPT_ARG),

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ cppcoreguidelines-pro-type-cstyle-cast ⚠️
do not use C-style cast to convert between unrelated types

DEFAULT(false));

static Sys_var_bool Sys_replica_compressed_protocol(
"replica_compressed_protocol",
"Use compression in the source/replica protocol.",
Expand Down
Loading