Merge branch '10.2' into 10.3
This commit is contained in:
commit
9614fde1aa
@ -567,3 +567,5 @@
|
|||||||
#endif // !defined(__STDC_FORMAT_MACROS)
|
#endif // !defined(__STDC_FORMAT_MACROS)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#cmakedefine HAVE_VFORK 1
|
||||||
|
@ -1018,3 +1018,19 @@ IF(NOT MSVC)
|
|||||||
HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE
|
HAVE_FALLOC_PUNCH_HOLE_AND_KEEP_SIZE
|
||||||
)
|
)
|
||||||
ENDIF()
|
ENDIF()
|
||||||
|
|
||||||
|
MY_CHECK_C_COMPILER_FLAG("-Werror")
|
||||||
|
IF(have_C__Werror)
|
||||||
|
SET(SAVE_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
|
||||||
|
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -Werror")
|
||||||
|
CHECK_C_SOURCE_COMPILES("
|
||||||
|
#include <unistd.h>
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
pid_t pid=vfork();
|
||||||
|
return (int)pid;
|
||||||
|
}"
|
||||||
|
HAVE_VFORK
|
||||||
|
)
|
||||||
|
SET(CMAKE_REQUIRED_FLAGS ${SAVE_CMAKE_REQUIRED_FLAGS})
|
||||||
|
ENDIF()
|
||||||
|
@ -266,7 +266,8 @@ free_mysql_variables(mysql_variable *vars)
|
|||||||
|
|
||||||
static
|
static
|
||||||
char *
|
char *
|
||||||
read_mysql_one_value(MYSQL *connection, const char *query)
|
read_mysql_one_value(MYSQL *connection, const char *query,
|
||||||
|
uint column, uint expect_columns)
|
||||||
{
|
{
|
||||||
MYSQL_RES *mysql_result;
|
MYSQL_RES *mysql_result;
|
||||||
MYSQL_ROW row;
|
MYSQL_ROW row;
|
||||||
@ -274,10 +275,10 @@ read_mysql_one_value(MYSQL *connection, const char *query)
|
|||||||
|
|
||||||
mysql_result = xb_mysql_query(connection, query, true);
|
mysql_result = xb_mysql_query(connection, query, true);
|
||||||
|
|
||||||
ut_ad(mysql_num_fields(mysql_result) == 1);
|
ut_ad(mysql_num_fields(mysql_result) == expect_columns);
|
||||||
|
|
||||||
if ((row = mysql_fetch_row(mysql_result))) {
|
if ((row = mysql_fetch_row(mysql_result))) {
|
||||||
result = strdup(row[0]);
|
result = strdup(row[column]);
|
||||||
}
|
}
|
||||||
|
|
||||||
mysql_free_result(mysql_result);
|
mysql_free_result(mysql_result);
|
||||||
@ -285,6 +286,15 @@ read_mysql_one_value(MYSQL *connection, const char *query)
|
|||||||
return(result);
|
return(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
char *
|
||||||
|
read_mysql_one_value(MYSQL *mysql, const char *query)
|
||||||
|
{
|
||||||
|
return read_mysql_one_value(mysql, query, 0/*offset*/, 1/*total columns*/);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static
|
static
|
||||||
bool
|
bool
|
||||||
check_server_version(unsigned long version_number,
|
check_server_version(unsigned long version_number,
|
||||||
@ -1197,92 +1207,322 @@ cleanup:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class Var
|
||||||
|
{
|
||||||
|
const char *m_name;
|
||||||
|
char *m_value;
|
||||||
|
/*
|
||||||
|
Disable copying constructors for safety, as the default binary copying
|
||||||
|
which would be wrong. If we ever want them, the m_value
|
||||||
|
member should be copied using an strdup()-alike function.
|
||||||
|
*/
|
||||||
|
Var(const Var &); // Disabled
|
||||||
|
Var(Var &); // Disabled
|
||||||
|
public:
|
||||||
|
~Var()
|
||||||
|
{
|
||||||
|
free(m_value);
|
||||||
|
}
|
||||||
|
Var(const char *name)
|
||||||
|
:m_name(name),
|
||||||
|
m_value(NULL)
|
||||||
|
{ }
|
||||||
|
// Init using a SHOW VARIABLES LIKE 'name' query
|
||||||
|
Var(const char *name, MYSQL *mysql)
|
||||||
|
:m_name(name)
|
||||||
|
{
|
||||||
|
char buf[128];
|
||||||
|
my_snprintf(buf, sizeof(buf), "SHOW VARIABLES LIKE '%s'", m_name);
|
||||||
|
m_value= read_mysql_one_value(mysql, buf, 1/*offset*/, 2/*total columns*/);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
Init by name from a result set.
|
||||||
|
If the variable name is not found in the result set metadata field names,
|
||||||
|
it's value stays untouched.
|
||||||
|
*/
|
||||||
|
bool init(MYSQL_RES *mysql_result, MYSQL_ROW row)
|
||||||
|
{
|
||||||
|
MYSQL_FIELD *field= mysql_fetch_fields(mysql_result);
|
||||||
|
for (uint i= 0; i < mysql_num_fields(mysql_result); i++)
|
||||||
|
{
|
||||||
|
if (!strcmp(field[i].name, m_name))
|
||||||
|
{
|
||||||
|
free(m_value); // In case it was initialized earlier
|
||||||
|
m_value= row[i] ? strdup(row[i]) : NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
void replace(char from, char to)
|
||||||
|
{
|
||||||
|
ut_ad(m_value);
|
||||||
|
for (char *ptr= strchr(m_value, from); ptr; ptr= strchr(ptr, from))
|
||||||
|
*ptr= to;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *value() const { return m_value; }
|
||||||
|
bool eq_value(const char *str, size_t length) const
|
||||||
|
{
|
||||||
|
return m_value && !strncmp(m_value, str, length) && m_value[length] == '\0';
|
||||||
|
}
|
||||||
|
bool is_null_or_empty() const { return !m_value || !m_value[0]; }
|
||||||
|
bool print(String *to) const
|
||||||
|
{
|
||||||
|
ut_ad(m_value);
|
||||||
|
return to->append(m_value);
|
||||||
|
}
|
||||||
|
bool print_quoted(String *to) const
|
||||||
|
{
|
||||||
|
ut_ad(m_value);
|
||||||
|
return to->append("'") || to->append(m_value) || to->append("'");
|
||||||
|
}
|
||||||
|
bool print_set_global(String *to) const
|
||||||
|
{
|
||||||
|
ut_ad(m_value);
|
||||||
|
return
|
||||||
|
to->append("SET GLOBAL ") ||
|
||||||
|
to->append(m_name) ||
|
||||||
|
to->append(" = '") ||
|
||||||
|
to->append(m_value) ||
|
||||||
|
to->append("';\n");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Show_slave_status
|
||||||
|
{
|
||||||
|
Var m_mariadb_connection_name; // MariaDB: e.g. 'master1'
|
||||||
|
Var m_master; // e.g. 'localhost'
|
||||||
|
Var m_filename; // e.g. 'source-bin.000002'
|
||||||
|
Var m_position; // a number
|
||||||
|
Var m_mysql_gtid_executed; // MySQL56: e.g. single '<UUID>:1-5" or multiline
|
||||||
|
// '<UUID1>:1-10,\n<UUID2>:1-20\n<UUID3>:1-30'
|
||||||
|
Var m_mariadb_using_gtid; // MariaDB: 'No','Slave_Pos','Current_Pos'
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
Show_slave_status()
|
||||||
|
:m_mariadb_connection_name("Connection_name"),
|
||||||
|
m_master("Master_Host"),
|
||||||
|
m_filename("Relay_Master_Log_File"),
|
||||||
|
m_position("Exec_Master_Log_Pos"),
|
||||||
|
m_mysql_gtid_executed("Executed_Gtid_Set"),
|
||||||
|
m_mariadb_using_gtid("Using_Gtid")
|
||||||
|
{ }
|
||||||
|
|
||||||
|
void init(MYSQL_RES *res, MYSQL_ROW row)
|
||||||
|
{
|
||||||
|
m_mariadb_connection_name.init(res, row);
|
||||||
|
m_master.init(res, row);
|
||||||
|
m_filename.init(res, row);
|
||||||
|
m_position.init(res, row);
|
||||||
|
m_mysql_gtid_executed.init(res, row);
|
||||||
|
m_mariadb_using_gtid.init(res, row);
|
||||||
|
// Normalize
|
||||||
|
if (m_mysql_gtid_executed.value())
|
||||||
|
m_mysql_gtid_executed.replace('\n', ' ');
|
||||||
|
}
|
||||||
|
|
||||||
|
static void msg_is_not_slave()
|
||||||
|
{
|
||||||
|
msg("Failed to get master binlog coordinates "
|
||||||
|
"from SHOW SLAVE STATUS.This means that the server is not a "
|
||||||
|
"replication slave. Ignoring the --slave-info option");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool is_mariadb_using_gtid() const
|
||||||
|
{
|
||||||
|
return !m_mariadb_using_gtid.eq_value("No", 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool start_comment_chunk(String *to)
|
||||||
|
{
|
||||||
|
return to->length() ? to->append("; ") : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool print_connection_name_if_set(String *to) const
|
||||||
|
{
|
||||||
|
if (!m_mariadb_connection_name.is_null_or_empty())
|
||||||
|
return m_mariadb_connection_name.print_quoted(to) || to->append(' ');
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool print_comment_master_identity(String *comment) const
|
||||||
|
{
|
||||||
|
if (comment->append("master "))
|
||||||
|
return true;
|
||||||
|
if (!m_mariadb_connection_name.is_null_or_empty())
|
||||||
|
return m_mariadb_connection_name.print_quoted(comment);
|
||||||
|
return comment->append("''"); // Default not named master
|
||||||
|
}
|
||||||
|
|
||||||
|
bool print_using_master_log_pos(String *sql, String *comment) const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
sql->append("CHANGE MASTER ") ||
|
||||||
|
print_connection_name_if_set(sql) ||
|
||||||
|
sql->append("TO MASTER_LOG_FILE=") || m_filename.print_quoted(sql) ||
|
||||||
|
sql->append(", MASTER_LOG_POS=") || m_position.print(sql) ||
|
||||||
|
sql->append(";\n") ||
|
||||||
|
print_comment_master_identity(comment) ||
|
||||||
|
comment->append(" filename ") || m_filename.print_quoted(comment) ||
|
||||||
|
comment->append(" position ") || m_position.print_quoted(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool print_mysql56(String *sql, String *comment) const
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
SET @@GLOBAL.gtid_purged = '2174B383-5441-11E8-B90A-C80AA9429562:1-1029, '
|
||||||
|
'224DA167-0C0C-11E8-8442-00059A3C7B00:1-2695';
|
||||||
|
CHANGE MASTER TO MASTER_AUTO_POSITION=1;
|
||||||
|
*/
|
||||||
|
return
|
||||||
|
sql->append("SET GLOBAL gtid_purged=") ||
|
||||||
|
m_mysql_gtid_executed.print_quoted(sql) ||
|
||||||
|
sql->append(";\n") ||
|
||||||
|
sql->append("CHANGE MASTER TO MASTER_AUTO_POSITION=1;\n") ||
|
||||||
|
print_comment_master_identity(comment) ||
|
||||||
|
comment->append(" purge list ") ||
|
||||||
|
m_mysql_gtid_executed.print_quoted(comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool print_mariadb10_using_gtid(String *sql, String *comment) const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
sql->append("CHANGE MASTER ") ||
|
||||||
|
print_connection_name_if_set(sql) ||
|
||||||
|
sql->append("TO master_use_gtid = slave_pos;\n") ||
|
||||||
|
print_comment_master_identity(comment) ||
|
||||||
|
comment->append(" master_use_gtid = slave_pos");
|
||||||
|
}
|
||||||
|
|
||||||
|
bool print(String *sql, String *comment, const Var >id_slave_pos) const
|
||||||
|
{
|
||||||
|
if (!m_mysql_gtid_executed.is_null_or_empty())
|
||||||
|
{
|
||||||
|
/* MySQL >= 5.6 with GTID enabled */
|
||||||
|
return print_mysql56(sql, comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gtid_slave_pos.is_null_or_empty() && is_mariadb_using_gtid())
|
||||||
|
{
|
||||||
|
/* MariaDB >= 10.0 with GTID enabled */
|
||||||
|
return print_mariadb10_using_gtid(sql, comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
return print_using_master_log_pos(sql, comment);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get master info into strings "sql" and "comment" from a MYSQL_RES.
|
||||||
|
@return false on success
|
||||||
|
@return true on error
|
||||||
|
*/
|
||||||
|
static bool get_slave_info(MYSQL_RES *show_slave_info_result,
|
||||||
|
const Var >id_slave_pos,
|
||||||
|
String *sql, String *comment)
|
||||||
|
{
|
||||||
|
if (!gtid_slave_pos.is_null_or_empty())
|
||||||
|
{
|
||||||
|
// Print gtid_slave_pos if any of the masters really needs it.
|
||||||
|
while (MYSQL_ROW row= mysql_fetch_row(show_slave_info_result))
|
||||||
|
{
|
||||||
|
Show_slave_status status;
|
||||||
|
status.init(show_slave_info_result, row);
|
||||||
|
if (status.is_mariadb_using_gtid())
|
||||||
|
{
|
||||||
|
if (gtid_slave_pos.print_set_global(sql) ||
|
||||||
|
comment->append("gtid_slave_pos ") ||
|
||||||
|
gtid_slave_pos.print_quoted(comment))
|
||||||
|
return true; // Error
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print the list of masters
|
||||||
|
mysql_data_seek(show_slave_info_result, 0);
|
||||||
|
while (MYSQL_ROW row= mysql_fetch_row(show_slave_info_result))
|
||||||
|
{
|
||||||
|
Show_slave_status status;
|
||||||
|
status.init(show_slave_info_result, row);
|
||||||
|
if (start_comment_chunk(comment) ||
|
||||||
|
status.print(sql, comment, gtid_slave_pos))
|
||||||
|
return true; // Error
|
||||||
|
}
|
||||||
|
return false; // Success
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Get master info into strings "sql" and "comment".
|
||||||
|
@return false on success
|
||||||
|
@return true on error
|
||||||
|
*/
|
||||||
|
static bool get_slave_info(MYSQL *mysql, bool show_all_slave_status,
|
||||||
|
String *sql, String *comment)
|
||||||
|
{
|
||||||
|
bool rc= false; // Success
|
||||||
|
// gtid_slave_pos - MariaDB variable : e.g. "0-1-1" or "1-10-100,2-20-500"
|
||||||
|
Var gtid_slave_pos("gtid_slave_pos", mysql);
|
||||||
|
const char *query= show_all_slave_status ? "SHOW ALL SLAVES STATUS" :
|
||||||
|
"SHOW SLAVE STATUS";
|
||||||
|
MYSQL_RES *mysql_result= xb_mysql_query(mysql, query, true);
|
||||||
|
if (!mysql_num_rows(mysql_result))
|
||||||
|
{
|
||||||
|
msg_is_not_slave();
|
||||||
|
// Don't change rc, we still want to continue the backup
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rc= get_slave_info(mysql_result, gtid_slave_pos, sql, comment);
|
||||||
|
}
|
||||||
|
mysql_free_result(mysql_result);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*********************************************************************//**
|
/*********************************************************************//**
|
||||||
Retrieves MySQL binlog position of the master server in a replication
|
Retrieves MySQL binlog position of the master server in a replication
|
||||||
setup and saves it in a file. It also saves it in mysql_slave_position
|
setup and saves it in a file. It also saves it in mysql_slave_position
|
||||||
variable. */
|
variable.
|
||||||
|
@returns false on error
|
||||||
|
@returns true on success
|
||||||
|
*/
|
||||||
bool
|
bool
|
||||||
write_slave_info(MYSQL *connection)
|
write_slave_info(MYSQL *connection)
|
||||||
{
|
{
|
||||||
char *master = NULL;
|
String sql, comment;
|
||||||
char *filename = NULL;
|
bool show_all_slaves_status= false;
|
||||||
char *gtid_executed = NULL;
|
|
||||||
char *using_gtid = NULL;
|
|
||||||
char *position = NULL;
|
|
||||||
char *gtid_slave_pos = NULL;
|
|
||||||
char *ptr;
|
|
||||||
bool result = false;
|
|
||||||
|
|
||||||
mysql_variable status[] = {
|
switch (server_flavor)
|
||||||
{"Master_Host", &master},
|
{
|
||||||
{"Relay_Master_Log_File", &filename},
|
case FLAVOR_MARIADB:
|
||||||
{"Exec_Master_Log_Pos", &position},
|
show_all_slaves_status= mysql_server_version >= 100000;
|
||||||
{"Executed_Gtid_Set", >id_executed},
|
break;
|
||||||
{"Using_Gtid", &using_gtid},
|
case FLAVOR_UNKNOWN:
|
||||||
{NULL, NULL}
|
case FLAVOR_MYSQL:
|
||||||
};
|
case FLAVOR_PERCONA_SERVER:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
mysql_variable variables[] = {
|
if (Show_slave_status::get_slave_info(connection, show_all_slaves_status,
|
||||||
{"gtid_slave_pos", >id_slave_pos},
|
&sql, &comment))
|
||||||
{NULL, NULL}
|
return false; // Error
|
||||||
};
|
|
||||||
|
|
||||||
read_mysql_variables(connection, "SHOW SLAVE STATUS", status, false);
|
if (!sql.length())
|
||||||
read_mysql_variables(connection, "SHOW VARIABLES", variables, true);
|
{
|
||||||
|
/*
|
||||||
|
SHOW [ALL] SLAVE STATUS returned no rows.
|
||||||
|
Don't create the file, but return success to continue the backup.
|
||||||
|
*/
|
||||||
|
return true; // Success
|
||||||
|
}
|
||||||
|
|
||||||
if (master == NULL || filename == NULL || position == NULL) {
|
mysql_slave_position= strdup(comment.c_ptr());
|
||||||
msg("Failed to get master binlog coordinates "
|
return backup_file_print_buf(XTRABACKUP_SLAVE_INFO, sql.ptr(), sql.length());
|
||||||
"from SHOW SLAVE STATUS.This means that the server is not a "
|
|
||||||
"replication slave. Ignoring the --slave-info option");
|
|
||||||
/* we still want to continue the backup */
|
|
||||||
result = true;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Print slave status to a file.
|
|
||||||
If GTID mode is used, construct a CHANGE MASTER statement with
|
|
||||||
MASTER_AUTO_POSITION and correct a gtid_purged value. */
|
|
||||||
if (gtid_executed != NULL && *gtid_executed) {
|
|
||||||
/* MySQL >= 5.6 with GTID enabled */
|
|
||||||
|
|
||||||
for (ptr = strchr(gtid_executed, '\n');
|
|
||||||
ptr;
|
|
||||||
ptr = strchr(ptr, '\n')) {
|
|
||||||
*ptr = ' ';
|
|
||||||
}
|
|
||||||
|
|
||||||
result = backup_file_printf(XTRABACKUP_SLAVE_INFO,
|
|
||||||
"SET GLOBAL gtid_purged='%s';\n"
|
|
||||||
"CHANGE MASTER TO MASTER_AUTO_POSITION=1\n",
|
|
||||||
gtid_executed);
|
|
||||||
|
|
||||||
ut_a(asprintf(&mysql_slave_position,
|
|
||||||
"master host '%s', purge list '%s'",
|
|
||||||
master, gtid_executed) != -1);
|
|
||||||
} else if (gtid_slave_pos && *gtid_slave_pos &&
|
|
||||||
!(using_gtid && !strncmp(using_gtid, "No", 2))) {
|
|
||||||
/* MariaDB >= 10.0 with GTID enabled */
|
|
||||||
result = backup_file_printf(XTRABACKUP_SLAVE_INFO,
|
|
||||||
"SET GLOBAL gtid_slave_pos = '%s';\n"
|
|
||||||
"CHANGE MASTER TO master_use_gtid = slave_pos\n",
|
|
||||||
gtid_slave_pos);
|
|
||||||
ut_a(asprintf(&mysql_slave_position,
|
|
||||||
"master host '%s', gtid_slave_pos %s",
|
|
||||||
master, gtid_slave_pos) != -1);
|
|
||||||
} else {
|
|
||||||
result = backup_file_printf(XTRABACKUP_SLAVE_INFO,
|
|
||||||
"CHANGE MASTER TO MASTER_LOG_FILE='%s', "
|
|
||||||
"MASTER_LOG_POS=%s\n", filename, position);
|
|
||||||
ut_a(asprintf(&mysql_slave_position,
|
|
||||||
"master host '%s', filename '%s', position '%s'",
|
|
||||||
master, filename, position) != -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
free_mysql_variables(status);
|
|
||||||
free_mysql_variables(variables);
|
|
||||||
|
|
||||||
return(result);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -5390,11 +5390,23 @@ static ibool prepare_handle_new_files(const char *data_home_dir,
|
|||||||
const char *file_name, void *arg)
|
const char *file_name, void *arg)
|
||||||
{
|
{
|
||||||
const char *dest_dir = static_cast<const char *>(arg);
|
const char *dest_dir = static_cast<const char *>(arg);
|
||||||
std::string src_path = std::string(data_home_dir) + '/' + std::string(db_name) + '/' + file_name;
|
std::string src_path = std::string(data_home_dir) + '/' + std::string(db_name) + '/';
|
||||||
/* Copy "*.new" files from incremental to base dir for incremental backup */
|
/* Copy "*.new" files from incremental to base dir for incremental backup */
|
||||||
std::string dest_path=
|
std::string dest_path=
|
||||||
dest_dir ? std::string(dest_dir) + '/' + std::string(db_name) +
|
dest_dir ? std::string(dest_dir) + '/' + std::string(db_name) +
|
||||||
'/' + file_name : src_path;
|
'/' : src_path;
|
||||||
|
|
||||||
|
/*
|
||||||
|
A CREATE DATABASE could have happened during the base mariabackup run.
|
||||||
|
In case if the current table file (e.g. `t1.new`) is from such
|
||||||
|
a new database, the database directory may not exist yet in
|
||||||
|
the base backup directory. Let's make sure to check if the directory
|
||||||
|
exists (and create if needed).
|
||||||
|
*/
|
||||||
|
if (!directory_exists(dest_path.c_str(), true/*create if not exists*/))
|
||||||
|
return FALSE;
|
||||||
|
src_path+= file_name;
|
||||||
|
dest_path+= file_name;
|
||||||
|
|
||||||
size_t index = dest_path.find(".new");
|
size_t index = dest_path.find(".new");
|
||||||
DBUG_ASSERT(index != std::string::npos);
|
DBUG_ASSERT(index != std::string::npos);
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit f6c3d9fd2af5d17db64cc996574aa312efd70fcf
|
Subproject commit ab7a81e79e4be4324a2d09d19d4f5249801ef665
|
@ -41,6 +41,7 @@ can be invoked several ways:
|
|||||||
shell> \fBmysql_tzinfo_to_sql \fR\fB\fItz_dir\fR\fR
|
shell> \fBmysql_tzinfo_to_sql \fR\fB\fItz_dir\fR\fR
|
||||||
shell> \fBmysql_tzinfo_to_sql \fR\fB\fItz_file tz_name\fR\fR
|
shell> \fBmysql_tzinfo_to_sql \fR\fB\fItz_file tz_name\fR\fR
|
||||||
shell> \fBmysql_tzinfo_to_sql \-\-leap \fR\fB\fItz_file\fR\fR
|
shell> \fBmysql_tzinfo_to_sql \-\-leap \fR\fB\fItz_file\fR\fR
|
||||||
|
shell> \fBmysql_tzinfo_to_sql \-\-skip\-write\-binlog \fR\fB\fItz_dir\fR\fR
|
||||||
.fi
|
.fi
|
||||||
.if n \{\
|
.if n \{\
|
||||||
.RE
|
.RE
|
||||||
@ -100,6 +101,9 @@ shell> \fBmysql_tzinfo_to_sql \-\-leap \fR\fB\fItz_file\fR\fR\fB | mysql \-u roo
|
|||||||
.RE
|
.RE
|
||||||
.\}
|
.\}
|
||||||
.PP
|
.PP
|
||||||
|
Using the \-\-skip\-write\-binlog option prevents writing of changes to the binary log or to other Galera
|
||||||
|
cluster members. This can be used with any form of running \fBmysql_tzinfo_to_sql\fR.
|
||||||
|
.PP
|
||||||
After running
|
After running
|
||||||
\fBmysql_tzinfo_to_sql\fR, it is best to restart the server so that it does not continue to use any previously cached time zone data\&.
|
\fBmysql_tzinfo_to_sql\fR, it is best to restart the server so that it does not continue to use any previously cached time zone data\&.
|
||||||
.SH "COPYRIGHT"
|
.SH "COPYRIGHT"
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
drop table if exists t1, t2;
|
CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
|
||||||
|
#
|
||||||
|
# Testcase for BUG#4551
|
||||||
|
#
|
||||||
CREATE TABLE t1 ( a int );
|
CREATE TABLE t1 ( a int );
|
||||||
INSERT INTO t1 VALUES (1),(2),(1);
|
INSERT INTO t1 VALUES (1),(2),(1);
|
||||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
||||||
@ -18,3 +21,17 @@ ERROR 23000: Duplicate entry '1' for key 'PRIMARY'
|
|||||||
select * from t2;
|
select * from t2;
|
||||||
ERROR 42S02: Table 'test.t2' doesn't exist
|
ERROR 42S02: Table 'test.t2' doesn't exist
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
|
# End of 4.1 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-28393 Server crashes in TABLE::mark_default_fields_for_write
|
||||||
|
#
|
||||||
|
create table t1 (a int, b text not null default '');
|
||||||
|
alter table t1 character set = utf8;
|
||||||
|
create table t2 select * from t1;
|
||||||
|
insert into t1 values (1,'');
|
||||||
|
drop table t1, t2;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
@ -1,39 +1,52 @@
|
|||||||
# Testcase for BUG#4551
|
# This does not work for RBR yet.
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_binlog_format_mixed_or_statement.inc
|
||||||
|
|
||||||
|
CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Testcase for BUG#4551
|
||||||
|
--echo #
|
||||||
|
|
||||||
# The bug was that when the table was TEMPORARY, it was not deleted if
|
# The bug was that when the table was TEMPORARY, it was not deleted if
|
||||||
# the CREATE SELECT failed (the code intended too, but it actually
|
# the CREATE SELECT failed (the code intended too, but it actually
|
||||||
# didn't). And as the CREATE TEMPORARY TABLE was not written to the
|
# didn't). And as the CREATE TEMPORARY TABLE was not written to the
|
||||||
# binlog if it was a transactional table, it resulted in an
|
# binlog if it was a transactional table, it resulted in an
|
||||||
# inconsistency between binlog and the internal list of temp tables.
|
# inconsistency between binlog and the internal list of temp tables.
|
||||||
|
|
||||||
# This does not work for RBR yet.
|
|
||||||
--source include/have_binlog_format_mixed_or_statement.inc
|
|
||||||
|
|
||||||
--disable_query_log
|
|
||||||
CALL mtr.add_suppression("Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT");
|
|
||||||
--enable_query_log
|
|
||||||
|
|
||||||
-- source include/have_innodb.inc
|
|
||||||
--disable_warnings
|
|
||||||
drop table if exists t1, t2;
|
|
||||||
--enable_warnings
|
|
||||||
CREATE TABLE t1 ( a int );
|
CREATE TABLE t1 ( a int );
|
||||||
INSERT INTO t1 VALUES (1),(2),(1);
|
INSERT INTO t1 VALUES (1),(2),(1);
|
||||||
--error ER_DUP_ENTRY
|
--error ER_DUP_ENTRY
|
||||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
||||||
--error 1146
|
--error ER_NO_SUCH_TABLE
|
||||||
select * from t2;
|
select * from t2;
|
||||||
--error ER_DUP_ENTRY
|
--error ER_DUP_ENTRY
|
||||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=INNODB SELECT a FROM t1;
|
||||||
--error 1146
|
--error ER_NO_SUCH_TABLE
|
||||||
select * from t2;
|
select * from t2;
|
||||||
--error ER_DUP_ENTRY
|
--error ER_DUP_ENTRY
|
||||||
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
CREATE TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
||||||
--error 1146
|
--error ER_NO_SUCH_TABLE
|
||||||
select * from t2;
|
select * from t2;
|
||||||
--error ER_DUP_ENTRY
|
--error ER_DUP_ENTRY
|
||||||
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
CREATE TEMPORARY TABLE t2 ( PRIMARY KEY (a) ) ENGINE=MYISAM SELECT a FROM t1;
|
||||||
--error 1146
|
--error ER_NO_SUCH_TABLE
|
||||||
select * from t2;
|
select * from t2;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
# End of 4.1 tests
|
--echo #
|
||||||
|
--echo # End of 4.1 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28393 Server crashes in TABLE::mark_default_fields_for_write
|
||||||
|
--echo #
|
||||||
|
create table t1 (a int, b text not null default '');
|
||||||
|
alter table t1 character set = utf8;
|
||||||
|
create table t2 select * from t1;
|
||||||
|
insert into t1 values (1,'');
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
@ -3628,4 +3628,64 @@ f2 f3
|
|||||||
DROP PROCEDURE p1;
|
DROP PROCEDURE p1;
|
||||||
DROP VIEW v1,v2,v3;
|
DROP VIEW v1,v2,v3;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# MDEV-27212: 2-nd execution of PS for select with embedded derived tables
|
||||||
|
# and correlated subquery in select list of outer derived
|
||||||
|
#
|
||||||
|
create table t1 ( id int, id2 int ) engine=myisam;
|
||||||
|
create table t2 ( x3 int , x1 int , x2 int, a1 int) engine=myisam;
|
||||||
|
insert into t1 values (3, 2), (4, 2), (3, 4);
|
||||||
|
insert into t2 values (1, 2, 2, 1), (1, 3, 3, 2), (2, 3, 3, 1);
|
||||||
|
prepare stmt from "select id from t1
|
||||||
|
join
|
||||||
|
( select dt2.x1,
|
||||||
|
( select sum(a1) from t2 where t2.x1 = dt2.x1 ) m
|
||||||
|
from ( select x1 from t2 u where x3 = 1 ) dt2
|
||||||
|
) dt
|
||||||
|
on t1.id = dt.x1
|
||||||
|
where t1.id2 < dt.m";
|
||||||
|
execute stmt;
|
||||||
|
id
|
||||||
|
3
|
||||||
|
execute stmt;
|
||||||
|
id
|
||||||
|
3
|
||||||
|
deallocate prepare stmt;
|
||||||
|
create procedure sp1() select id from t1
|
||||||
|
join
|
||||||
|
( select dt2.x1,
|
||||||
|
( select sum(a1) from t2 where t2.x1 = dt2.x1 ) m
|
||||||
|
from ( select x1 from t2 u where x3 = 1 ) dt2
|
||||||
|
) dt
|
||||||
|
on t1.id = dt.x1
|
||||||
|
where t1.id2 < dt.m;
|
||||||
|
call sp1();
|
||||||
|
id
|
||||||
|
3
|
||||||
|
call sp1();
|
||||||
|
id
|
||||||
|
3
|
||||||
|
create view v2 as select x1 from t2 u where x3 = 1;
|
||||||
|
create view v as
|
||||||
|
select v2.x1,
|
||||||
|
( select sum(a1) from t2 where t2.x1 = v2.x1 ) m from v2;
|
||||||
|
prepare stmt from "select id from t1 join v on t1.id = v.x1 where t1.id2 < v.m";
|
||||||
|
execute stmt;
|
||||||
|
id
|
||||||
|
3
|
||||||
|
execute stmt;
|
||||||
|
id
|
||||||
|
3
|
||||||
|
deallocate prepare stmt;
|
||||||
|
create procedure sp2() select id from t1 join v on t1.id = v.x1 where t1.id2 < v.m;
|
||||||
|
call sp2();
|
||||||
|
id
|
||||||
|
3
|
||||||
|
call sp2();
|
||||||
|
id
|
||||||
|
3
|
||||||
|
drop procedure sp1;
|
||||||
|
drop procedure sp2;
|
||||||
|
drop view v, v2;
|
||||||
|
drop table t1,t2;
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
|
@ -2400,4 +2400,56 @@ DROP PROCEDURE p1;
|
|||||||
DROP VIEW v1,v2,v3;
|
DROP VIEW v1,v2,v3;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-27212: 2-nd execution of PS for select with embedded derived tables
|
||||||
|
--echo # and correlated subquery in select list of outer derived
|
||||||
|
--echo #
|
||||||
|
create table t1 ( id int, id2 int ) engine=myisam;
|
||||||
|
create table t2 ( x3 int , x1 int , x2 int, a1 int) engine=myisam;
|
||||||
|
insert into t1 values (3, 2), (4, 2), (3, 4);
|
||||||
|
insert into t2 values (1, 2, 2, 1), (1, 3, 3, 2), (2, 3, 3, 1);
|
||||||
|
|
||||||
|
let $q=
|
||||||
|
select id from t1
|
||||||
|
join
|
||||||
|
( select dt2.x1,
|
||||||
|
( select sum(a1) from t2 where t2.x1 = dt2.x1 ) m
|
||||||
|
from ( select x1 from t2 u where x3 = 1 ) dt2
|
||||||
|
) dt
|
||||||
|
on t1.id = dt.x1
|
||||||
|
where t1.id2 < dt.m;
|
||||||
|
|
||||||
|
eval prepare stmt from "$q";
|
||||||
|
execute stmt;
|
||||||
|
execute stmt;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
eval create procedure sp1() $q;
|
||||||
|
call sp1();
|
||||||
|
call sp1();
|
||||||
|
|
||||||
|
create view v2 as select x1 from t2 u where x3 = 1;
|
||||||
|
create view v as
|
||||||
|
select v2.x1,
|
||||||
|
( select sum(a1) from t2 where t2.x1 = v2.x1 ) m from v2;
|
||||||
|
|
||||||
|
let $q=
|
||||||
|
select id from t1 join v on t1.id = v.x1 where t1.id2 < v.m;
|
||||||
|
|
||||||
|
eval prepare stmt from "$q";
|
||||||
|
execute stmt;
|
||||||
|
execute stmt;
|
||||||
|
deallocate prepare stmt;
|
||||||
|
|
||||||
|
eval create procedure sp2() $q;
|
||||||
|
call sp2();
|
||||||
|
call sp2();
|
||||||
|
|
||||||
|
drop procedure sp1;
|
||||||
|
drop procedure sp2;
|
||||||
|
|
||||||
|
drop view v, v2;
|
||||||
|
|
||||||
|
drop table t1,t2;
|
||||||
|
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
|
@ -167,8 +167,8 @@ create algorithm=temptable view v1 as select * from t1;
|
|||||||
create algorithm=merge view v2 as select * from t1;
|
create algorithm=merge view v2 as select * from t1;
|
||||||
select default(a) = now() from v1;
|
select default(a) = now() from v1;
|
||||||
default(a) = now()
|
default(a) = now()
|
||||||
NULL
|
1
|
||||||
NULL
|
1
|
||||||
select default(a) = now() from v2;
|
select default(a) = now() from v2;
|
||||||
default(a) = now()
|
default(a) = now()
|
||||||
1
|
1
|
||||||
@ -191,16 +191,29 @@ default(v1)
|
|||||||
2001-01-01 10:20:30
|
2001-01-01 10:20:30
|
||||||
select default(v1) from (select v1 from t1 group by v1) dt;
|
select default(v1) from (select v1 from t1 group by v1) dt;
|
||||||
default(v1)
|
default(v1)
|
||||||
0000-00-00 00:00:00
|
2001-01-01 10:20:30
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a text default '');
|
create table t1 (a text default '');
|
||||||
create algorithm=temptable view v1 as select * from t1;
|
create algorithm=temptable view v1 as select * from t1;
|
||||||
insert into t1 values ('a');
|
insert into t1 values ('a');
|
||||||
select default(a) from v1;
|
select default(a) from v1;
|
||||||
default(a)
|
default(a)
|
||||||
NULL
|
|
||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-28403 ASAN heap-use-after-free in String::copy / get_field_default_value
|
||||||
|
#
|
||||||
|
create table t (a blob default 'x');
|
||||||
|
create view v as select * from t;
|
||||||
|
insert into t () values ();
|
||||||
|
update t set a = default;
|
||||||
|
select table_name,column_name,column_default from information_schema.columns where table_name = 'v';
|
||||||
|
table_name v
|
||||||
|
column_name a
|
||||||
|
column_default 'x'
|
||||||
|
drop view v;
|
||||||
|
drop table t;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -166,6 +166,17 @@ select default(a) from v1;
|
|||||||
drop view v1;
|
drop view v1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28403 ASAN heap-use-after-free in String::copy / get_field_default_value
|
||||||
|
--echo #
|
||||||
|
create table t (a blob default 'x');
|
||||||
|
create view v as select * from t;
|
||||||
|
insert into t () values ();
|
||||||
|
update t set a = default;
|
||||||
|
query_vertical select table_name,column_name,column_default from information_schema.columns where table_name = 'v';
|
||||||
|
drop view v;
|
||||||
|
drop table t;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -989,6 +989,12 @@ ADDTIME('916:40:00', '416:40:00')
|
|||||||
Warnings:
|
Warnings:
|
||||||
Warning 1292 Truncated incorrect time value: '916:40:00'
|
Warning 1292 Truncated incorrect time value: '916:40:00'
|
||||||
Warning 1292 Truncated incorrect time value: '1255:39:59.999999'
|
Warning 1292 Truncated incorrect time value: '1255:39:59.999999'
|
||||||
|
SELECT ADDTIME(20010101,1e0), ADDTIME(20010101,1.1e0);
|
||||||
|
ADDTIME(20010101,1e0) ADDTIME(20010101,1.1e0)
|
||||||
|
2001-01-01 00:00:01 2001-01-01 00:00:01.100000
|
||||||
|
SELECT ADDTIME(ADDTIME(20010101,1e0), 0);
|
||||||
|
ADDTIME(ADDTIME(20010101,1e0), 0)
|
||||||
|
2001-01-01 00:00:01
|
||||||
SELECT SUBTIME('916:40:00', '416:40:00');
|
SELECT SUBTIME('916:40:00', '416:40:00');
|
||||||
SUBTIME('916:40:00', '416:40:00')
|
SUBTIME('916:40:00', '416:40:00')
|
||||||
422:19:59.999999
|
422:19:59.999999
|
||||||
|
@ -513,6 +513,10 @@ SELECT TIME_TO_SEC('916:40:00');
|
|||||||
SELECT ADDTIME('500:00:00', '416:40:00');
|
SELECT ADDTIME('500:00:00', '416:40:00');
|
||||||
SELECT ADDTIME('916:40:00', '416:40:00');
|
SELECT ADDTIME('916:40:00', '416:40:00');
|
||||||
|
|
||||||
|
# check if ADDTIME() handles NOT_FIXED_DEC correctly
|
||||||
|
SELECT ADDTIME(20010101,1e0), ADDTIME(20010101,1.1e0);
|
||||||
|
SELECT ADDTIME(ADDTIME(20010101,1e0), 0);
|
||||||
|
|
||||||
# check if SUBTIME() handles out-of-range values correctly
|
# check if SUBTIME() handles out-of-range values correctly
|
||||||
SELECT SUBTIME('916:40:00', '416:40:00');
|
SELECT SUBTIME('916:40:00', '416:40:00');
|
||||||
SELECT SUBTIME('-916:40:00', '416:40:00');
|
SELECT SUBTIME('-916:40:00', '416:40:00');
|
||||||
|
@ -2,8 +2,6 @@ set GLOBAL sql_mode="";
|
|||||||
set LOCAL sql_mode="";
|
set LOCAL sql_mode="";
|
||||||
SET @old_log_bin_trust_function_creators= @@global.log_bin_trust_function_creators;
|
SET @old_log_bin_trust_function_creators= @@global.log_bin_trust_function_creators;
|
||||||
SET GLOBAL log_bin_trust_function_creators = 1;
|
SET GLOBAL log_bin_trust_function_creators = 1;
|
||||||
drop table if exists t1;
|
|
||||||
drop database if exists mysqltest;
|
|
||||||
connect master,localhost,root,,;
|
connect master,localhost,root,,;
|
||||||
connection master;
|
connection master;
|
||||||
SET NAMES binary;
|
SET NAMES binary;
|
||||||
@ -2789,6 +2787,14 @@ DROP USER foo;
|
|||||||
DROP TABLE db.t;
|
DROP TABLE db.t;
|
||||||
DROP DATABASE db;
|
DROP DATABASE db;
|
||||||
#
|
#
|
||||||
|
# Bug#33578113: DROP privilege on performance_schema.* can't be revoked
|
||||||
|
#
|
||||||
|
connection default;
|
||||||
|
CREATE USER bug33578113;
|
||||||
|
GRANT DROP ON performance_schema.* TO bug33578113;
|
||||||
|
REVOKE DROP ON performance_schema.* FROM bug33578113;
|
||||||
|
DROP USER bug33578113;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
# Test of GRANT commands
|
# Test of GRANT commands
|
||||||
|
|
||||||
# Grant tests not performed with embedded server
|
# Grant tests not performed with embedded server
|
||||||
-- source include/not_embedded.inc
|
--source include/not_embedded.inc
|
||||||
|
|
||||||
# Save the initial number of concurrent sessions
|
# Save the initial number of concurrent sessions
|
||||||
--source include/count_sessions.inc
|
--source include/count_sessions.inc
|
||||||
@ -11,12 +11,6 @@ set LOCAL sql_mode="";
|
|||||||
SET @old_log_bin_trust_function_creators= @@global.log_bin_trust_function_creators;
|
SET @old_log_bin_trust_function_creators= @@global.log_bin_trust_function_creators;
|
||||||
SET GLOBAL log_bin_trust_function_creators = 1;
|
SET GLOBAL log_bin_trust_function_creators = 1;
|
||||||
|
|
||||||
# Cleanup
|
|
||||||
--disable_warnings
|
|
||||||
drop table if exists t1;
|
|
||||||
drop database if exists mysqltest;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
connect (master,localhost,root,,);
|
connect (master,localhost,root,,);
|
||||||
connection master;
|
connection master;
|
||||||
SET NAMES binary;
|
SET NAMES binary;
|
||||||
@ -2292,6 +2286,16 @@ DROP USER foo;
|
|||||||
DROP TABLE db.t;
|
DROP TABLE db.t;
|
||||||
DROP DATABASE db;
|
DROP DATABASE db;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#33578113: DROP privilege on performance_schema.* can't be revoked
|
||||||
|
--echo #
|
||||||
|
connection default;
|
||||||
|
CREATE USER bug33578113;
|
||||||
|
GRANT DROP ON performance_schema.* TO bug33578113;
|
||||||
|
REVOKE DROP ON performance_schema.* FROM bug33578113;
|
||||||
|
DROP USER bug33578113;
|
||||||
|
--source include/wait_until_count_sessions.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
47
mysql-test/main/information_schema_columns.result
Normal file
47
mysql-test/main/information_schema_columns.result
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
#
|
||||||
|
# Start of 10.2 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-25243 ASAN heap-use-after-free in Item_func_sp::execute_impl upon concurrent view DDL and I_S query with view and function
|
||||||
|
#
|
||||||
|
CREATE FUNCTION f1() RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v01 AS SELECT f1();
|
||||||
|
CREATE VIEW v02 AS SELECT f1();
|
||||||
|
connect con1,localhost,root,,;
|
||||||
|
SELECT GET_LOCK('v01',30);
|
||||||
|
GET_LOCK('v01',30)
|
||||||
|
1
|
||||||
|
SELECT GET_LOCK('v02',30);
|
||||||
|
GET_LOCK('v02',30)
|
||||||
|
1
|
||||||
|
connection default;
|
||||||
|
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA='test'
|
||||||
|
AND TABLE_NAME LIKE 'v0%'
|
||||||
|
AND GET_LOCK(TABLE_NAME,30)
|
||||||
|
AND RELEASE_LOCK(TABLE_NAME)
|
||||||
|
AND f1()=1
|
||||||
|
ORDER BY TABLE_NAME;
|
||||||
|
connection con1;
|
||||||
|
connection con1;
|
||||||
|
SELECT RELEASE_LOCK('v01') /* Let the first row evaluate f1 */;
|
||||||
|
RELEASE_LOCK('v01')
|
||||||
|
1
|
||||||
|
CREATE FUNCTION f2() RETURNS INT RETURN 1 /* Invalidate SP cache*/;
|
||||||
|
SELECT RELEASE_LOCK('v02') /* Let the second row evaluate f1() */;
|
||||||
|
RELEASE_LOCK('v02')
|
||||||
|
1
|
||||||
|
DROP FUNCTION f2;
|
||||||
|
disconnect con1;
|
||||||
|
connection default;
|
||||||
|
SELECT RELEASE_LOCK('v01');
|
||||||
|
RELEASE_LOCK('v01')
|
||||||
|
NULL
|
||||||
|
SELECT RELEASE_LOCK('v02');
|
||||||
|
RELEASE_LOCK('v02')
|
||||||
|
NULL
|
||||||
|
DROP VIEW v01, v02;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
48
mysql-test/main/information_schema_columns.test
Normal file
48
mysql-test/main/information_schema_columns.test
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
--echo #
|
||||||
|
--echo # Start of 10.2 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25243 ASAN heap-use-after-free in Item_func_sp::execute_impl upon concurrent view DDL and I_S query with view and function
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
|
||||||
|
CREATE FUNCTION f1() RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v01 AS SELECT f1();
|
||||||
|
CREATE VIEW v02 AS SELECT f1();
|
||||||
|
|
||||||
|
--connect(con1,localhost,root,,)
|
||||||
|
SELECT GET_LOCK('v01',30);
|
||||||
|
SELECT GET_LOCK('v02',30);
|
||||||
|
--connection default
|
||||||
|
|
||||||
|
--send
|
||||||
|
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
|
||||||
|
WHERE TABLE_SCHEMA='test'
|
||||||
|
AND TABLE_NAME LIKE 'v0%'
|
||||||
|
AND GET_LOCK(TABLE_NAME,30)
|
||||||
|
AND RELEASE_LOCK(TABLE_NAME)
|
||||||
|
AND f1()=1
|
||||||
|
ORDER BY TABLE_NAME;
|
||||||
|
|
||||||
|
--connection con1
|
||||||
|
--connection con1
|
||||||
|
SELECT RELEASE_LOCK('v01') /* Let the first row evaluate f1 */;
|
||||||
|
CREATE FUNCTION f2() RETURNS INT RETURN 1 /* Invalidate SP cache*/;
|
||||||
|
SELECT RELEASE_LOCK('v02') /* Let the second row evaluate f1() */;
|
||||||
|
DROP FUNCTION f2;
|
||||||
|
--disconnect con1
|
||||||
|
|
||||||
|
--connection default
|
||||||
|
--disable_result_log
|
||||||
|
--reap
|
||||||
|
--enable_result_log
|
||||||
|
SELECT RELEASE_LOCK('v01');
|
||||||
|
SELECT RELEASE_LOCK('v02');
|
||||||
|
|
||||||
|
DROP VIEW v01, v02;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
77
mysql-test/main/information_schema_tables.result
Normal file
77
mysql-test/main/information_schema_tables.result
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
#
|
||||||
|
# Start of 10.2 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-25243 ASAN heap-use-after-free in Item_func_sp::execute_impl upon concurrent view DDL and I_S query with view and function
|
||||||
|
#
|
||||||
|
# The originally reported non-deterministic test.
|
||||||
|
# It did not fail reliably on every run.
|
||||||
|
CREATE TABLE t (a INT);
|
||||||
|
INSERT INTO t VALUES (1),(2);
|
||||||
|
CREATE FUNCTION f(b INT) RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v AS SELECT f(SUM(a)) FROM t;
|
||||||
|
connect con1,localhost,root,,test;
|
||||||
|
LOOP
|
||||||
|
CREATE OR REPLACE VIEW vv AS SELECT 1;
|
||||||
|
END LOOP $
|
||||||
|
connection default;
|
||||||
|
SELECT v.* FROM v JOIN INFORMATION_SCHEMA.TABLES WHERE DATA_LENGTH = -1;
|
||||||
|
f(SUM(a))
|
||||||
|
KILL CONID;
|
||||||
|
disconnect con1;
|
||||||
|
connection default;
|
||||||
|
DROP VIEW IF EXISTS vv;
|
||||||
|
DROP VIEW v;
|
||||||
|
DROP FUNCTION f;
|
||||||
|
DROP TABLE t;
|
||||||
|
# The second test version from the MDEV.
|
||||||
|
# It failed more reliably, but still was not deterministic.
|
||||||
|
CREATE FUNCTION f() RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v AS SELECT f() FROM seq_1_to_10;
|
||||||
|
SELECT * FROM INFORMATION_SCHEMA.TABLES, v;;
|
||||||
|
connect con1,localhost,root,,;
|
||||||
|
CREATE VIEW v2 AS SELECT 1;
|
||||||
|
connection default;
|
||||||
|
disconnect con1;
|
||||||
|
DROP VIEW v;
|
||||||
|
DROP VIEW v2;
|
||||||
|
DROP FUNCTION f;
|
||||||
|
# The third test version from the MDEV.
|
||||||
|
# It failed reliably, and should be deterninistic.
|
||||||
|
CREATE FUNCTION f1() RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v01 AS SELECT f1();
|
||||||
|
CREATE VIEW v02 AS SELECT f1();
|
||||||
|
connect con1,localhost,root,,;
|
||||||
|
SELECT GET_LOCK('v01',30);
|
||||||
|
GET_LOCK('v01',30)
|
||||||
|
1
|
||||||
|
SELECT GET_LOCK('v02',30);
|
||||||
|
GET_LOCK('v02',30)
|
||||||
|
1
|
||||||
|
connection default;
|
||||||
|
SELECT * FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE TABLE_SCHEMA='test'
|
||||||
|
AND TABLE_NAME LIKE 'v0%'
|
||||||
|
AND GET_LOCK(TABLE_NAME,30)
|
||||||
|
AND RELEASE_LOCK(TABLE_NAME)
|
||||||
|
AND f1()=1
|
||||||
|
ORDER BY TABLE_NAME;
|
||||||
|
connection con1;
|
||||||
|
SELECT RELEASE_LOCK('v01') /* Let the first row evaluate f1 */;
|
||||||
|
RELEASE_LOCK('v01')
|
||||||
|
1
|
||||||
|
CREATE FUNCTION f2() RETURNS INT RETURN 1 /* Invalidate SP cache*/;
|
||||||
|
SELECT RELEASE_LOCK('v02') /* Let the second row evaluate f1() */;
|
||||||
|
RELEASE_LOCK('v02')
|
||||||
|
1
|
||||||
|
DROP FUNCTION f2;
|
||||||
|
disconnect con1;
|
||||||
|
connection default;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT MAX_INDEX_LENGTH TEMPORARY
|
||||||
|
def test v01 VIEW NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL VIEW NULL NULL
|
||||||
|
def test v02 VIEW NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL VIEW NULL NULL
|
||||||
|
DROP VIEW v01, v02;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
100
mysql-test/main/information_schema_tables.test
Normal file
100
mysql-test/main/information_schema_tables.test
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
--source include/have_sequence.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.2 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25243 ASAN heap-use-after-free in Item_func_sp::execute_impl upon concurrent view DDL and I_S query with view and function
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo # The originally reported non-deterministic test.
|
||||||
|
--echo # It did not fail reliably on every run.
|
||||||
|
|
||||||
|
CREATE TABLE t (a INT);
|
||||||
|
INSERT INTO t VALUES (1),(2);
|
||||||
|
CREATE FUNCTION f(b INT) RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v AS SELECT f(SUM(a)) FROM t;
|
||||||
|
--connect (con1,localhost,root,,test)
|
||||||
|
--let $conid= `SELECT CONNECTION_ID()`
|
||||||
|
--delimiter $
|
||||||
|
--send
|
||||||
|
LOOP
|
||||||
|
CREATE OR REPLACE VIEW vv AS SELECT 1;
|
||||||
|
END LOOP $
|
||||||
|
--delimiter ;
|
||||||
|
--connection default
|
||||||
|
# Avoid "Prepared statement needs to be re-prepared"
|
||||||
|
# Note, the code could probably eventually fixed to avoid forcing re-pepare if
|
||||||
|
# the *temporary* instance of Sp_caches (not the permanent one) was invalidated.
|
||||||
|
--disable_ps_protocol
|
||||||
|
--disable_warnings
|
||||||
|
SELECT v.* FROM v JOIN INFORMATION_SCHEMA.TABLES WHERE DATA_LENGTH = -1;
|
||||||
|
--enable_warnings
|
||||||
|
--enable_ps_protocol
|
||||||
|
# Cleanup
|
||||||
|
--replace_result $conid CONID
|
||||||
|
--eval KILL $conid
|
||||||
|
--disconnect con1
|
||||||
|
--connection default
|
||||||
|
DROP VIEW IF EXISTS vv;
|
||||||
|
DROP VIEW v;
|
||||||
|
DROP FUNCTION f;
|
||||||
|
DROP TABLE t;
|
||||||
|
|
||||||
|
|
||||||
|
--echo # The second test version from the MDEV.
|
||||||
|
--echo # It failed more reliably, but still was not deterministic.
|
||||||
|
|
||||||
|
|
||||||
|
CREATE FUNCTION f() RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v AS SELECT f() FROM seq_1_to_10;
|
||||||
|
--send SELECT * FROM INFORMATION_SCHEMA.TABLES, v;
|
||||||
|
--connect(con1,localhost,root,,)
|
||||||
|
CREATE VIEW v2 AS SELECT 1;
|
||||||
|
--connection default
|
||||||
|
--disable_result_log
|
||||||
|
--reap
|
||||||
|
--enable_result_log
|
||||||
|
--disconnect con1
|
||||||
|
DROP VIEW v;
|
||||||
|
DROP VIEW v2;
|
||||||
|
DROP FUNCTION f;
|
||||||
|
|
||||||
|
--echo # The third test version from the MDEV.
|
||||||
|
--echo # It failed reliably, and should be deterninistic.
|
||||||
|
|
||||||
|
CREATE FUNCTION f1() RETURNS INT RETURN 1;
|
||||||
|
CREATE VIEW v01 AS SELECT f1();
|
||||||
|
CREATE VIEW v02 AS SELECT f1();
|
||||||
|
|
||||||
|
--connect(con1,localhost,root,,)
|
||||||
|
SELECT GET_LOCK('v01',30);
|
||||||
|
SELECT GET_LOCK('v02',30);
|
||||||
|
--connection default
|
||||||
|
|
||||||
|
--send
|
||||||
|
SELECT * FROM INFORMATION_SCHEMA.TABLES
|
||||||
|
WHERE TABLE_SCHEMA='test'
|
||||||
|
AND TABLE_NAME LIKE 'v0%'
|
||||||
|
AND GET_LOCK(TABLE_NAME,30)
|
||||||
|
AND RELEASE_LOCK(TABLE_NAME)
|
||||||
|
AND f1()=1
|
||||||
|
ORDER BY TABLE_NAME;
|
||||||
|
|
||||||
|
--connection con1
|
||||||
|
SELECT RELEASE_LOCK('v01') /* Let the first row evaluate f1 */;
|
||||||
|
CREATE FUNCTION f2() RETURNS INT RETURN 1 /* Invalidate SP cache*/;
|
||||||
|
SELECT RELEASE_LOCK('v02') /* Let the second row evaluate f1() */;
|
||||||
|
DROP FUNCTION f2;
|
||||||
|
--disconnect con1
|
||||||
|
--connection default
|
||||||
|
--reap
|
||||||
|
|
||||||
|
|
||||||
|
DROP VIEW v01, v02;
|
||||||
|
DROP FUNCTION f1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
@ -149,6 +149,29 @@ ALTER TABLE time_zone_transition_type ENGINE=MyISAM;
|
|||||||
END IF|
|
END IF|
|
||||||
\d ;
|
\d ;
|
||||||
#
|
#
|
||||||
|
# MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Testing --skip-write-binlog
|
||||||
|
#
|
||||||
|
set @prep1=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on' and variable_value='ON'), 'SET SESSION WSREP_ON=OFF', 'do 0');
|
||||||
|
SET SESSION SQL_LOG_BIN=0;
|
||||||
|
execute immediate @prep1;
|
||||||
|
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
||||||
|
SET @time_zone_id= LAST_INSERT_ID();
|
||||||
|
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('XXX', @time_zone_id);
|
||||||
|
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
||||||
|
(@time_zone_id, 0, 0, 0, 'GMT')
|
||||||
|
;
|
||||||
|
set @prep1=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on' and variable_value='ON'), 'SET SESSION WSREP_ON=OFF', 'do 0');
|
||||||
|
SET SESSION SQL_LOG_BIN=0;
|
||||||
|
execute immediate @prep1;
|
||||||
|
TRUNCATE TABLE time_zone_leap_second;
|
||||||
|
ALTER TABLE time_zone_leap_second ORDER BY Transition_time;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
# MDEV-6236 - [PATCH] mysql_tzinfo_to_sql may produce invalid SQL
|
# MDEV-6236 - [PATCH] mysql_tzinfo_to_sql may produce invalid SQL
|
||||||
#
|
#
|
||||||
\d |
|
\d |
|
||||||
|
@ -32,6 +32,23 @@
|
|||||||
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --leap $MYSQLTEST_VARDIR/zoneinfo/GMT 2>&1
|
--exec $MYSQL_TZINFO_TO_SQL --leap $MYSQLTEST_VARDIR/zoneinfo/GMT 2>&1
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Testing --skip-write-binlog
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
--exec $MYSQL_TZINFO_TO_SQL --skip-write-binlog $MYSQLTEST_VARDIR/zoneinfo/GMT XXX 2>&1
|
||||||
|
|
||||||
|
--exec $MYSQL_TZINFO_TO_SQL --skip-write-binlog --leap $MYSQLTEST_VARDIR/zoneinfo/GMT 2>&1
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
#
|
#
|
||||||
# Cleanup
|
# Cleanup
|
||||||
#
|
#
|
||||||
|
@ -3508,6 +3508,26 @@ DELETE FROM t1 ORDER BY c;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
SET @@SESSION.max_sort_length=DEFAULT;
|
SET @@SESSION.max_sort_length=DEFAULT;
|
||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
|
#
|
||||||
|
# MDEV-25994 Crash with union of my_decimal type in ORDER BY clause
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (v1 INTEGER) ;
|
||||||
|
INSERT INTO t1 (v1) VALUES (8);
|
||||||
|
UPDATE t1 SET v1 = 1 ORDER BY (SELECT 1.1 UNION SELECT -1);
|
||||||
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
|
# This one must be successful
|
||||||
|
UPDATE t1 SET v1 = 2 ORDER BY (SELECT 1 UNION SELECT 1);
|
||||||
|
UPDATE t1 SET v1 = 3 ORDER BY (SELECT 'a' UNION SELECT 'b');
|
||||||
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
|
# Insert some more data
|
||||||
|
INSERT INTO t1 (v1) VALUES (8),(9),(100),(-234),(46584),(0);
|
||||||
|
UPDATE t1 SET v1 = v1+1 ORDER BY (SELECT 100.122 UNION SELECT -189.2);
|
||||||
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
|
# This one must be successful
|
||||||
|
UPDATE t1 SET v1 = v1-200 ORDER BY (SELECT 1 UNION SELECT 1);
|
||||||
|
UPDATE t1 SET v1 = v1 ORDER BY (SELECT 'abc' UNION SELECT 'bbb');
|
||||||
|
ERROR 21000: Subquery returns more than 1 row
|
||||||
|
DROP TABLE t1;
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
# MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY
|
# MDEV-16214: Incorrect plan taken by the optimizer , uses INDEX instead of ref access with ORDER BY
|
||||||
|
@ -2331,6 +2331,31 @@ DROP TABLE t1;
|
|||||||
SET @@SESSION.max_sort_length=DEFAULT;
|
SET @@SESSION.max_sort_length=DEFAULT;
|
||||||
SET sql_mode=DEFAULT;
|
SET sql_mode=DEFAULT;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25994 Crash with union of my_decimal type in ORDER BY clause
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE TABLE t1 (v1 INTEGER) ;
|
||||||
|
INSERT INTO t1 (v1) VALUES (8);
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
UPDATE t1 SET v1 = 1 ORDER BY (SELECT 1.1 UNION SELECT -1);
|
||||||
|
--echo # This one must be successful
|
||||||
|
UPDATE t1 SET v1 = 2 ORDER BY (SELECT 1 UNION SELECT 1);
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
UPDATE t1 SET v1 = 3 ORDER BY (SELECT 'a' UNION SELECT 'b');
|
||||||
|
|
||||||
|
-- echo # Insert some more data
|
||||||
|
INSERT INTO t1 (v1) VALUES (8),(9),(100),(-234),(46584),(0);
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
UPDATE t1 SET v1 = v1+1 ORDER BY (SELECT 100.122 UNION SELECT -189.2);
|
||||||
|
--echo # This one must be successful
|
||||||
|
UPDATE t1 SET v1 = v1-200 ORDER BY (SELECT 1 UNION SELECT 1);
|
||||||
|
--error ER_SUBQUERY_NO_1_ROW
|
||||||
|
UPDATE t1 SET v1 = v1 ORDER BY (SELECT 'abc' UNION SELECT 'bbb');
|
||||||
|
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
|
|
||||||
|
@ -1360,6 +1360,48 @@ SELECT tmp 1.e.test FROM scientific_notation AS tmp;
|
|||||||
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e.test FROM scientific_notation AS tmp' at line 1
|
ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1.e.test FROM scientific_notation AS tmp' at line 1
|
||||||
DROP TABLE scientific_notation;
|
DROP TABLE scientific_notation;
|
||||||
#
|
#
|
||||||
|
# MDEV-6899 extra semicolon in show create event syntax
|
||||||
|
#
|
||||||
|
set timestamp=unix_timestamp('2020-10-10 5:5:5');
|
||||||
|
create table t1 (a int);
|
||||||
|
create trigger a before insert on t1 for each row set @a:=1;select 2$
|
||||||
|
2
|
||||||
|
2
|
||||||
|
show create trigger a;
|
||||||
|
Trigger a
|
||||||
|
sql_mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||||
|
SQL Original Statement CREATE DEFINER=`root`@`localhost` trigger a before insert on t1 for each row set @a:=1
|
||||||
|
character_set_client latin1
|
||||||
|
collation_connection latin1_swedish_ci
|
||||||
|
Database Collation latin1_swedish_ci
|
||||||
|
Created 2020-10-10 05:05:05.00
|
||||||
|
drop table t1;
|
||||||
|
create procedure a() select 1;select 2$
|
||||||
|
2
|
||||||
|
2
|
||||||
|
show create procedure a;
|
||||||
|
Procedure a
|
||||||
|
sql_mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||||
|
Create Procedure CREATE DEFINER=`root`@`localhost` PROCEDURE `a`()
|
||||||
|
select 1
|
||||||
|
character_set_client latin1
|
||||||
|
collation_connection latin1_swedish_ci
|
||||||
|
Database Collation latin1_swedish_ci
|
||||||
|
drop procedure a;
|
||||||
|
create function a() returns int return 1;select 2$
|
||||||
|
2
|
||||||
|
2
|
||||||
|
show create function a;
|
||||||
|
Function a
|
||||||
|
sql_mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||||
|
Create Function CREATE DEFINER=`root`@`localhost` FUNCTION `a`() RETURNS int(11)
|
||||||
|
return 1
|
||||||
|
character_set_client latin1
|
||||||
|
collation_connection latin1_swedish_ci
|
||||||
|
Database Collation latin1_swedish_ci
|
||||||
|
drop function a;
|
||||||
|
set timestamp=default;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -1399,6 +1399,30 @@ SELECT tmp 1.e.test FROM scientific_notation AS tmp;
|
|||||||
|
|
||||||
DROP TABLE scientific_notation;
|
DROP TABLE scientific_notation;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-6899 extra semicolon in show create event syntax
|
||||||
|
--echo #
|
||||||
|
set timestamp=unix_timestamp('2020-10-10 5:5:5');
|
||||||
|
create table t1 (a int);
|
||||||
|
delimiter $;
|
||||||
|
create trigger a before insert on t1 for each row set @a:=1;select 2$
|
||||||
|
delimiter ;$
|
||||||
|
query_vertical show create trigger a;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
delimiter $;
|
||||||
|
create procedure a() select 1;select 2$
|
||||||
|
delimiter ;$
|
||||||
|
query_vertical show create procedure a;
|
||||||
|
drop procedure a;
|
||||||
|
|
||||||
|
delimiter $;
|
||||||
|
create function a() returns int return 1;select 2$
|
||||||
|
delimiter ;$
|
||||||
|
query_vertical show create function a;
|
||||||
|
drop function a;
|
||||||
|
set timestamp=default;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -102,3 +102,23 @@ ROLLBACK AND NO CHAIN NO RELEASE;
|
|||||||
#
|
#
|
||||||
# End of 5.5 tests
|
# End of 5.5 tests
|
||||||
#
|
#
|
||||||
|
#
|
||||||
|
# MDEV-6899 extra semicolon in show create event syntax
|
||||||
|
#
|
||||||
|
set timestamp=unix_timestamp('2020-10-10 5:5:5');
|
||||||
|
create event a on schedule every 1 day do set @a:=1;select 2$
|
||||||
|
2
|
||||||
|
2
|
||||||
|
show create event a;
|
||||||
|
Event a
|
||||||
|
sql_mode STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
|
||||||
|
time_zone SYSTEM
|
||||||
|
Create Event CREATE DEFINER=`root`@`localhost` EVENT `a` ON SCHEDULE EVERY 1 DAY STARTS '2020-10-10 05:05:05' ON COMPLETION NOT PRESERVE ENABLE DO set @a:=1
|
||||||
|
character_set_client latin1
|
||||||
|
collation_connection latin1_swedish_ci
|
||||||
|
Database Collation latin1_swedish_ci
|
||||||
|
drop event a;
|
||||||
|
set timestamp=default;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
||||||
|
@ -99,3 +99,18 @@ ROLLBACK AND NO CHAIN NO RELEASE;
|
|||||||
--echo #
|
--echo #
|
||||||
--echo # End of 5.5 tests
|
--echo # End of 5.5 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-6899 extra semicolon in show create event syntax
|
||||||
|
--echo #
|
||||||
|
set timestamp=unix_timestamp('2020-10-10 5:5:5');
|
||||||
|
delimiter $;
|
||||||
|
create event a on schedule every 1 day do set @a:=1;select 2$
|
||||||
|
delimiter ;$
|
||||||
|
query_vertical show create event a;
|
||||||
|
drop event a;
|
||||||
|
set timestamp=default;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
drop table if exists t1;
|
|
||||||
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
|
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
|
||||||
insert into t1 values(null, null), (1, "hello");
|
insert into t1 values(null, null), (1, "hello");
|
||||||
checksum table t1;
|
checksum table t1;
|
||||||
@ -98,4 +97,48 @@ CHECKSUM TABLE t1 EXTENDED;
|
|||||||
Table Checksum
|
Table Checksum
|
||||||
test.t1 2326430205
|
test.t1 2326430205
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
# End of 5.5 tests
|
# End of 5.5 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-28020 CHECKSUM TABLE calculates different checksums
|
||||||
|
#
|
||||||
|
create table t1 ( a int, b int as (a) virtual, c text) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
Warnings:
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
checksum table t1 extended;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
checksum table t1;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
drop table t1;
|
||||||
|
create table t1 ( a int, b int as (a) virtual, c text, key(b)) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
Warnings:
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
checksum table t1 extended;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
checksum table t1;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
drop table t1;
|
||||||
|
create table t1 ( a int, b int as (a) stored, c text) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
Warnings:
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
checksum table t1 extended;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 2897795735
|
||||||
|
checksum table t1;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 2897795735
|
||||||
|
drop table t1;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
||||||
|
@ -1,4 +1,3 @@
|
|||||||
drop table if exists t1;
|
|
||||||
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
|
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
|
||||||
insert into t1 values(null, null), (1, "hello");
|
insert into t1 values(null, null), (1, "hello");
|
||||||
checksum table t1;
|
checksum table t1;
|
||||||
@ -98,4 +97,48 @@ CHECKSUM TABLE t1 EXTENDED;
|
|||||||
Table Checksum
|
Table Checksum
|
||||||
test.t1 2326430205
|
test.t1 2326430205
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
#
|
||||||
# End of 5.5 tests
|
# End of 5.5 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-28020 CHECKSUM TABLE calculates different checksums
|
||||||
|
#
|
||||||
|
create table t1 ( a int, b int as (a) virtual, c text) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
Warnings:
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
checksum table t1 extended;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
checksum table t1;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
drop table t1;
|
||||||
|
create table t1 ( a int, b int as (a) virtual, c text, key(b)) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
Warnings:
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
checksum table t1 extended;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
checksum table t1;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 4101438232
|
||||||
|
drop table t1;
|
||||||
|
create table t1 ( a int, b int as (a) stored, c text) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
Warnings:
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
Warning 1906 The value specified for generated column 'b' in table 't1' has been ignored
|
||||||
|
checksum table t1 extended;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 2897795735
|
||||||
|
checksum table t1;
|
||||||
|
Table Checksum
|
||||||
|
test.t1 2897795735
|
||||||
|
drop table t1;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
||||||
|
@ -2,12 +2,8 @@
|
|||||||
# Test checksum
|
# Test checksum
|
||||||
#
|
#
|
||||||
|
|
||||||
-- source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
-- source include/have_maria.inc
|
--source include/have_maria.inc
|
||||||
|
|
||||||
--disable_warnings
|
|
||||||
drop table if exists t1;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
|
create table t1 (a int null, v varchar(100)) engine=myisam checksum=0;
|
||||||
insert into t1 values(null, null), (1, "hello");
|
insert into t1 values(null, null), (1, "hello");
|
||||||
@ -76,4 +72,31 @@ CHECKSUM TABLE t1 EXTENDED;
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
--echo # End of 5.5 tests
|
--echo # End of 5.5 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28020 CHECKSUM TABLE calculates different checksums
|
||||||
|
--echo #
|
||||||
|
create table t1 ( a int, b int as (a) virtual, c text) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
checksum table t1 extended;
|
||||||
|
checksum table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 ( a int, b int as (a) virtual, c text, key(b)) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
checksum table t1 extended;
|
||||||
|
checksum table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 ( a int, b int as (a) stored, c text) engine=myisam checksum=1;
|
||||||
|
insert ignore t1 values (1,2,'foo'),(2,3,'bar');
|
||||||
|
checksum table t1 extended;
|
||||||
|
checksum table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
||||||
|
@ -1260,7 +1260,7 @@ a
|
|||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(3) NOT NULL
|
`a` int(3) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
|
@ -2905,5 +2905,80 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||||||
2 DEPENDENT SUBQUERY tn eq_ref PRIMARY PRIMARY 32 test.tms.key1 1 Using where
|
2 DEPENDENT SUBQUERY tn eq_ref PRIMARY PRIMARY 32 test.tms.key1 1 Using where
|
||||||
set optimizer_switch=@tmp_os;
|
set optimizer_switch=@tmp_os;
|
||||||
drop table t1, t10, t11;
|
drop table t1, t10, t11;
|
||||||
|
#
|
||||||
|
# MDEV-28268: Server crashes in Expression_cache_tracker::fetch_current_stats
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,2),(3,4);
|
||||||
|
ANALYZE FORMAT=JSON
|
||||||
|
SELECT DISTINCT
|
||||||
|
(SELECT MIN(a) FROM t1 WHERE b <= ANY (SELECT a FROM t1)) AS f
|
||||||
|
FROM t1;
|
||||||
|
ANALYZE
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 1,
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"duplicate_removal": {
|
||||||
|
"temporary_table": {
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
},
|
||||||
|
"subqueries": [
|
||||||
|
{
|
||||||
|
"expression_cache": {
|
||||||
|
"state": "disabled",
|
||||||
|
"r_loops": 0,
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 2,
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"filtered": 100,
|
||||||
|
"r_filtered": 50,
|
||||||
|
"attached_condition": "<nop>(<in_optimizer>(t1.b,(subquery#3) >= 4))"
|
||||||
|
},
|
||||||
|
"subqueries": [
|
||||||
|
{
|
||||||
|
"query_block": {
|
||||||
|
"select_id": 3,
|
||||||
|
"r_loops": 1,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"table": {
|
||||||
|
"table_name": "t1",
|
||||||
|
"access_type": "ALL",
|
||||||
|
"r_loops": 1,
|
||||||
|
"rows": 2,
|
||||||
|
"r_rows": 2,
|
||||||
|
"r_total_time_ms": "REPLACED",
|
||||||
|
"filtered": 100,
|
||||||
|
"r_filtered": 100
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
DROP TABLE t1;
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
# End of 10.3 tests
|
# End of 10.3 tests
|
||||||
|
@ -2421,6 +2421,21 @@ set optimizer_switch=@tmp_os;
|
|||||||
|
|
||||||
drop table t1, t10, t11;
|
drop table t1, t10, t11;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28268: Server crashes in Expression_cache_tracker::fetch_current_stats
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (a INT, b INT);
|
||||||
|
INSERT INTO t1 VALUES (1,2),(3,4);
|
||||||
|
|
||||||
|
--source include/analyze-format.inc
|
||||||
|
ANALYZE FORMAT=JSON
|
||||||
|
SELECT DISTINCT
|
||||||
|
(SELECT MIN(a) FROM t1 WHERE b <= ANY (SELECT a FROM t1)) AS f
|
||||||
|
FROM t1;
|
||||||
|
|
||||||
|
# Cleanup
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
|
|
||||||
--echo # End of 10.3 tests
|
--echo # End of 10.3 tests
|
||||||
|
@ -629,3 +629,35 @@ a b
|
|||||||
2019-03-10 02:55:05 2019-03-10 02:55:05
|
2019-03-10 02:55:05 2019-03-10 02:55:05
|
||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
set character_set_connection=@save_character_set_connection;
|
set character_set_connection=@save_character_set_connection;
|
||||||
|
#
|
||||||
|
# MDEV-26047: MariaDB server crash at Item_subselect::init_expr_cache_tracker
|
||||||
|
#
|
||||||
|
CREATE TABLE t1 (a int) engine=innodb;
|
||||||
|
SELECT 1 IN (
|
||||||
|
SELECT NULL
|
||||||
|
FROM t1
|
||||||
|
WHERE
|
||||||
|
a IS NOT NULL
|
||||||
|
GROUP BY
|
||||||
|
(SELECT NULL from dual WHERE a = 1)
|
||||||
|
);
|
||||||
|
1 IN (
|
||||||
|
SELECT NULL
|
||||||
|
FROM t1
|
||||||
|
WHERE
|
||||||
|
a IS NOT NULL
|
||||||
|
GROUP BY
|
||||||
|
(SELECT NULL from dual WHERE a = 1)
|
||||||
|
)
|
||||||
|
0
|
||||||
|
drop table t1;
|
||||||
|
# Testcase from MDEV-26164
|
||||||
|
create table t1(a int);
|
||||||
|
# Disable the warning as it includes current time and changes for every test run.
|
||||||
|
select 1 from t1 where not exists
|
||||||
|
(
|
||||||
|
select 1 from t1 where binary current_time()
|
||||||
|
group by (select a),(select 1)
|
||||||
|
);
|
||||||
|
1
|
||||||
|
drop table t1;
|
||||||
|
@ -627,3 +627,31 @@ SELECT * FROM t1 WHERE (SELECT 1,CONCAT(a) FROM t1) = (SELECT 1,CONCAT(a) FROM t
|
|||||||
DROP TABLE t1,t2;
|
DROP TABLE t1,t2;
|
||||||
|
|
||||||
set character_set_connection=@save_character_set_connection;
|
set character_set_connection=@save_character_set_connection;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-26047: MariaDB server crash at Item_subselect::init_expr_cache_tracker
|
||||||
|
--echo #
|
||||||
|
CREATE TABLE t1 (a int) engine=innodb;
|
||||||
|
|
||||||
|
SELECT 1 IN (
|
||||||
|
SELECT NULL
|
||||||
|
FROM t1
|
||||||
|
WHERE
|
||||||
|
a IS NOT NULL
|
||||||
|
GROUP BY
|
||||||
|
(SELECT NULL from dual WHERE a = 1)
|
||||||
|
);
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
--echo # Testcase from MDEV-26164
|
||||||
|
create table t1(a int);
|
||||||
|
--echo # Disable the warning as it includes current time and changes for every test run.
|
||||||
|
--disable_warnings
|
||||||
|
select 1 from t1 where not exists
|
||||||
|
(
|
||||||
|
select 1 from t1 where binary current_time()
|
||||||
|
group by (select a),(select 1)
|
||||||
|
);
|
||||||
|
--enable_warnings
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
@ -1264,7 +1264,7 @@ a
|
|||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(3) NOT NULL
|
`a` int(3) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
|
@ -1267,7 +1267,7 @@ a
|
|||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(3) NOT NULL
|
`a` int(3) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
|
@ -1263,7 +1263,7 @@ a
|
|||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(3) NOT NULL
|
`a` int(3) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
|
@ -1266,7 +1266,7 @@ a
|
|||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(3) NOT NULL
|
`a` int(3) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
|
@ -1263,7 +1263,7 @@ a
|
|||||||
SHOW CREATE TABLE t1;
|
SHOW CREATE TABLE t1;
|
||||||
Table Create Table
|
Table Create Table
|
||||||
t1 CREATE TABLE `t1` (
|
t1 CREATE TABLE `t1` (
|
||||||
`a` int(3) NOT NULL
|
`a` int(3) DEFAULT NULL
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
create table t1 (a int);
|
create table t1 (a int);
|
||||||
|
@ -2456,5 +2456,29 @@ t1 CREATE TABLE `t1` (
|
|||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
#
|
#
|
||||||
|
# MDEV-25317 Assertion `scale <= precision' failed in
|
||||||
|
# decimal_bin_size And Assertion `scale >= 0 && precision > 0 && scale <= precision'
|
||||||
|
# failed in decimal_bin_size_inline/decimal_bin_size.
|
||||||
|
#
|
||||||
|
SELECT AVG(DISTINCT 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
|
||||||
|
AVG(DISTINCT 0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
|
||||||
|
0.00000000000000000000000000000000000000
|
||||||
|
CREATE TABLE t1 AS SELECT NULL AS v1;
|
||||||
|
SELECT 1 FROM t1 GROUP BY v1 ORDER BY AVG ( from_unixtime ( '' ) ) ;
|
||||||
|
1
|
||||||
|
1
|
||||||
|
Warnings:
|
||||||
|
Warning 1292 Truncated incorrect DECIMAL value: ''
|
||||||
|
DROP TABLE t1;
|
||||||
|
SELECT SUM(DISTINCT 0.000000000000000000000000000000000000001);
|
||||||
|
SUM(DISTINCT 0.000000000000000000000000000000000000001)
|
||||||
|
0.00000000000000000000000000000000000000
|
||||||
|
CREATE TABLE t1 AS SELECT 1.000000000000000000000000000000000 AS a;
|
||||||
|
ALTER TABLE t1 ADD COLUMN b INT;
|
||||||
|
SELECT ROUND (a,b) AS c FROM t1 ORDER BY c;
|
||||||
|
c
|
||||||
|
NULL
|
||||||
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
# End of 10.2 tests
|
# End of 10.2 tests
|
||||||
#
|
#
|
||||||
|
@ -1894,6 +1894,25 @@ show create table t1;
|
|||||||
|
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-25317 Assertion `scale <= precision' failed in
|
||||||
|
--echo # decimal_bin_size And Assertion `scale >= 0 && precision > 0 && scale <= precision'
|
||||||
|
--echo # failed in decimal_bin_size_inline/decimal_bin_size.
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SELECT AVG(DISTINCT 0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001);
|
||||||
|
|
||||||
|
CREATE TABLE t1 AS SELECT NULL AS v1;
|
||||||
|
SELECT 1 FROM t1 GROUP BY v1 ORDER BY AVG ( from_unixtime ( '' ) ) ;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
SELECT SUM(DISTINCT 0.000000000000000000000000000000000000001);
|
||||||
|
|
||||||
|
CREATE TABLE t1 AS SELECT 1.000000000000000000000000000000000 AS a;
|
||||||
|
ALTER TABLE t1 ADD COLUMN b INT;
|
||||||
|
SELECT ROUND (a,b) AS c FROM t1 ORDER BY c;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # End of 10.2 tests
|
--echo # End of 10.2 tests
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -1379,6 +1379,7 @@ include/stop_slave.inc
|
|||||||
SET GLOBAL slave_parallel_threads=1;
|
SET GLOBAL slave_parallel_threads=1;
|
||||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||||
SET GLOBAL debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
SET GLOBAL debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
||||||
|
CALL mtr.add_suppression("Unexpected break of being relay-logged GTID");
|
||||||
connection server_1;
|
connection server_1;
|
||||||
INSERT INTO t2 VALUES (101);
|
INSERT INTO t2 VALUES (101);
|
||||||
INSERT INTO t2 VALUES (102);
|
INSERT INTO t2 VALUES (102);
|
||||||
|
@ -23,6 +23,8 @@ t
|
|||||||
Master_SSL_Allowed = 'Yes'
|
Master_SSL_Allowed = 'Yes'
|
||||||
Master_SSL_CA_Path = ''
|
Master_SSL_CA_Path = ''
|
||||||
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
||||||
|
Master_SSL_Crl = ''
|
||||||
|
Master_SSL_Crlpath = ''
|
||||||
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
||||||
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
||||||
include/check_slave_is_running.inc
|
include/check_slave_is_running.inc
|
||||||
@ -37,6 +39,8 @@ include/wait_for_slave_to_start.inc
|
|||||||
Master_SSL_Allowed = 'Yes'
|
Master_SSL_Allowed = 'Yes'
|
||||||
Master_SSL_CA_Path = ''
|
Master_SSL_CA_Path = ''
|
||||||
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
||||||
|
Master_SSL_Crl = ''
|
||||||
|
Master_SSL_Crlpath = ''
|
||||||
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
||||||
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
||||||
include/check_slave_is_running.inc
|
include/check_slave_is_running.inc
|
||||||
|
152
mysql-test/suite/galera/r/mysql_tzinfo_to_sql.result
Normal file
152
mysql-test/suite/galera/r/mysql_tzinfo_to_sql.result
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
#
|
||||||
|
# MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases
|
||||||
|
#
|
||||||
|
|
||||||
|
# On node_1
|
||||||
|
connection node_1;
|
||||||
|
CREATE TABLE time_zone LIKE mysql.time_zone;
|
||||||
|
CREATE TABLE time_zone_name LIKE mysql.time_zone_name;
|
||||||
|
CREATE TABLE time_zone_transition LIKE mysql.time_zone_transition;
|
||||||
|
CREATE TABLE time_zone_transition_type LIKE mysql.time_zone_transition_type;
|
||||||
|
CREATE TABLE time_zone_leap_second LIKE mysql.time_zone_leap_second;
|
||||||
|
#
|
||||||
|
# Run on zoneinfo directory --skip-write-binlog
|
||||||
|
#
|
||||||
|
|
||||||
|
# Apply on node_1
|
||||||
|
|
||||||
|
load timezones
|
||||||
|
'binlog stationary as expected'
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
|
||||||
|
# On node_2 (not replicated)
|
||||||
|
|
||||||
|
connection node_2;
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
#
|
||||||
|
# Run on zoneinfo directory without --skip-write-binlog
|
||||||
|
#
|
||||||
|
|
||||||
|
# Apply on node_1
|
||||||
|
|
||||||
|
connection node_1;
|
||||||
|
load timezones
|
||||||
|
'binlog advanced as expected'
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
|
||||||
|
# On node_2 (replicated via InnoDB)
|
||||||
|
|
||||||
|
connection node_2;
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
TRUNCATE TABLE time_zone;
|
||||||
|
TRUNCATE TABLE time_zone_name;
|
||||||
|
TRUNCATE TABLE time_zone_transition;
|
||||||
|
TRUNCATE TABLE time_zone_transition_type;
|
||||||
|
TRUNCATE TABLE time_zone_leap_second;
|
||||||
|
|
||||||
|
# Apply on node_1 (with wsrep_on=OFF)
|
||||||
|
|
||||||
|
connection node_1;
|
||||||
|
SET GLOBAL WSREP_ON=OFF;
|
||||||
|
load timezones
|
||||||
|
SET GLOBAL WSREP_ON=ON;
|
||||||
|
'binlog advanced as expected'
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
COUNT(*)
|
||||||
|
2
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
|
||||||
|
# On node_2 (Should not have been replicated)
|
||||||
|
|
||||||
|
connection node_2;
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
connection node_1;
|
||||||
|
DROP TABLE time_zone;
|
||||||
|
DROP TABLE time_zone_name;
|
||||||
|
DROP TABLE time_zone_transition;
|
||||||
|
DROP TABLE time_zone_transition_type;
|
||||||
|
DROP TABLE time_zone_leap_second;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
1
mysql-test/suite/galera/t/mysql_tzinfo_to_sql.opt
Normal file
1
mysql-test/suite/galera/t/mysql_tzinfo_to_sql.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--log-bin
|
156
mysql-test/suite/galera/t/mysql_tzinfo_to_sql.test
Normal file
156
mysql-test/suite/galera/t/mysql_tzinfo_to_sql.test
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
--source include/galera_cluster.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/not_embedded.inc
|
||||||
|
# merge note: 10.6 change not_embedded.inc to no_protocol.inc
|
||||||
|
|
||||||
|
# Unlike the similar galera.mariadb_tzinfo_to_sql.test in 10.6+, this
|
||||||
|
# tests that the output can be parsed by the mysql client.
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28263: mariadb-tzinfo-to-sql improve wsrep and binlog cases
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--exec mkdir $MYSQLTEST_VARDIR/zoneinfo
|
||||||
|
--exec ln -s $MYSQLTEST_VARDIR/zoneinfo $MYSQLTEST_VARDIR/zoneinfo/posix
|
||||||
|
--copy_file std_data/zoneinfo/GMT $MYSQLTEST_VARDIR/zoneinfo/GMT
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # On node_1
|
||||||
|
--connection node_1
|
||||||
|
|
||||||
|
CREATE TABLE time_zone LIKE mysql.time_zone;
|
||||||
|
CREATE TABLE time_zone_name LIKE mysql.time_zone_name;
|
||||||
|
CREATE TABLE time_zone_transition LIKE mysql.time_zone_transition;
|
||||||
|
CREATE TABLE time_zone_transition_type LIKE mysql.time_zone_transition_type;
|
||||||
|
CREATE TABLE time_zone_leap_second LIKE mysql.time_zone_leap_second;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Run on zoneinfo directory --skip-write-binlog
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
--exec $MYSQL_TZINFO_TO_SQL --skip-write-binlog $MYSQLTEST_VARDIR/zoneinfo 2>/dev/null > $MYSQL_TMP_DIR/tz.sql
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Apply on node_1
|
||||||
|
--echo
|
||||||
|
--let $snap_pos= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_position', Value, 1)
|
||||||
|
--echo load timezones
|
||||||
|
--exec $MYSQL test < "$MYSQL_TMP_DIR/tz.sql"
|
||||||
|
--let $new_snap_pos= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_position', Value, 1)
|
||||||
|
|
||||||
|
if ($snap_pos == $new_snap_pos)
|
||||||
|
{
|
||||||
|
--echo 'binlog stationary as expected'
|
||||||
|
}
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # On node_2 (not replicated)
|
||||||
|
--echo
|
||||||
|
--connection node_2
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Run on zoneinfo directory without --skip-write-binlog
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
||||||
|
--exec $MYSQL_TZINFO_TO_SQL $MYSQLTEST_VARDIR/zoneinfo 2>/dev/null > $MYSQL_TMP_DIR/tz.sql
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Apply on node_1
|
||||||
|
--echo
|
||||||
|
--connection node_1
|
||||||
|
|
||||||
|
--echo load timezones
|
||||||
|
--exec $MYSQL test < "$MYSQL_TMP_DIR/tz.sql"
|
||||||
|
--let $new_snap_pos= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_position', Value, 1)
|
||||||
|
|
||||||
|
if ($snap_pos < $new_snap_pos)
|
||||||
|
{
|
||||||
|
--echo 'binlog advanced as expected'
|
||||||
|
}
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # On node_2 (replicated via InnoDB)
|
||||||
|
--echo
|
||||||
|
--connection node_2
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
|
||||||
|
TRUNCATE TABLE time_zone;
|
||||||
|
TRUNCATE TABLE time_zone_name;
|
||||||
|
TRUNCATE TABLE time_zone_transition;
|
||||||
|
TRUNCATE TABLE time_zone_transition_type;
|
||||||
|
TRUNCATE TABLE time_zone_leap_second;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Apply on node_1 (with wsrep_on=OFF)
|
||||||
|
--echo
|
||||||
|
--connection node_1
|
||||||
|
|
||||||
|
SET GLOBAL WSREP_ON=OFF;
|
||||||
|
--let $snap_pos= $new_snap_pos
|
||||||
|
--echo load timezones
|
||||||
|
--exec $MYSQL test < "$MYSQL_TMP_DIR/tz.sql"
|
||||||
|
--let $new_snap_pos= query_get_value(SHOW STATUS LIKE 'binlog_snapshot_position', Value, 1)
|
||||||
|
SET GLOBAL WSREP_ON=ON;
|
||||||
|
|
||||||
|
if ($snap_pos < $new_snap_pos)
|
||||||
|
{
|
||||||
|
--echo 'binlog advanced as expected'
|
||||||
|
}
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # On node_2 (Should not have been replicated)
|
||||||
|
--echo
|
||||||
|
--connection node_2
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM time_zone;
|
||||||
|
SELECT COUNT(*) FROM time_zone_name;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition;
|
||||||
|
SELECT COUNT(*) FROM time_zone_transition_type;
|
||||||
|
SELECT COUNT(*) FROM time_zone_leap_second;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Cleanup
|
||||||
|
#
|
||||||
|
|
||||||
|
--connection node_1
|
||||||
|
--remove_file $MYSQL_TMP_DIR/tz.sql
|
||||||
|
--exec rm -rf $MYSQLTEST_VARDIR/zoneinfo
|
||||||
|
DROP TABLE time_zone;
|
||||||
|
DROP TABLE time_zone_name;
|
||||||
|
DROP TABLE time_zone_transition;
|
||||||
|
DROP TABLE time_zone_transition_type;
|
||||||
|
DROP TABLE time_zone_leap_second;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
@ -1845,3 +1845,19 @@ a b
|
|||||||
HANDLER t1 CLOSE;
|
HANDLER t1 CLOSE;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
#
|
||||||
|
# 10.2 Test
|
||||||
|
#
|
||||||
|
# MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
# Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 'test.t1'
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 Test
|
||||||
|
@ -80,3 +80,23 @@ HANDLER t1 CLOSE;
|
|||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # 10.2 Test
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
--echo # Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
|
||||||
|
--error ER_CANT_CREATE_GEOMETRY_OBJECT
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo # End of 10.2 Test
|
||||||
|
@ -1748,3 +1748,19 @@ HANDLER t1 READ `PRIMARY` PREV;
|
|||||||
f1 f2
|
f1 f2
|
||||||
3 3
|
3 3
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
#
|
||||||
|
# 10.2 Test
|
||||||
|
#
|
||||||
|
# MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
# Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 'test.t1'
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 Test
|
||||||
|
@ -26,3 +26,23 @@ HANDLER t1 OPEN;
|
|||||||
HANDLER t1 READ FIRST WHERE f2 <= 1;
|
HANDLER t1 READ FIRST WHERE f2 <= 1;
|
||||||
HANDLER t1 READ `PRIMARY` PREV;
|
HANDLER t1 READ `PRIMARY` PREV;
|
||||||
DROP TABLE t1;
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # 10.2 Test
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
--echo # Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
|
||||||
|
--error ER_CANT_CREATE_GEOMETRY_OBJECT
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo # End of 10.2 Test
|
||||||
|
@ -313,6 +313,22 @@ handler v read next;
|
|||||||
ERROR 42S02: Unknown table 'v' in HANDLER
|
ERROR 42S02: Unknown table 'v' in HANDLER
|
||||||
drop view v;
|
drop view v;
|
||||||
#
|
#
|
||||||
|
# 10.2 Test
|
||||||
|
#
|
||||||
|
# MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
# Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
Warnings:
|
||||||
|
Note 1051 Unknown table 'test.t1'
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 Test
|
||||||
|
#
|
||||||
# MDEV-15813 ASAN use-after-poison in hp_hashnr upon
|
# MDEV-15813 ASAN use-after-poison in hp_hashnr upon
|
||||||
# HANDLER READ on a versioned HEAP table
|
# HANDLER READ on a versioned HEAP table
|
||||||
#
|
#
|
||||||
|
@ -355,6 +355,26 @@ execute stmt;
|
|||||||
handler v read next;
|
handler v read next;
|
||||||
drop view v;
|
drop view v;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # 10.2 Test
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
--echo # Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
|
||||||
|
--error ER_CANT_CREATE_GEOMETRY_OBJECT
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo # End of 10.2 Test
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-15813 ASAN use-after-poison in hp_hashnr upon
|
--echo # MDEV-15813 ASAN use-after-poison in hp_hashnr upon
|
||||||
--echo # HANDLER READ on a versioned HEAP table
|
--echo # HANDLER READ on a versioned HEAP table
|
||||||
|
@ -1931,3 +1931,17 @@ test.t1 preload_keys status OK
|
|||||||
HANDLER t1 READ FIRST;
|
HANDLER t1 READ FIRST;
|
||||||
ERROR 42S02: Unknown table 't1' in HANDLER
|
ERROR 42S02: Unknown table 't1' in HANDLER
|
||||||
End of 5.1 tests
|
End of 5.1 tests
|
||||||
|
#
|
||||||
|
# 10.2 Test
|
||||||
|
#
|
||||||
|
# MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
# Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
#
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
ERROR 22003: Cannot get geometry object from data you send to the GEOMETRY field
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
# End of 10.2 Test
|
||||||
|
@ -169,3 +169,23 @@ HANDLER t1 READ FIRST;
|
|||||||
|
|
||||||
|
|
||||||
--echo End of 5.1 tests
|
--echo End of 5.1 tests
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # 10.2 Test
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-20207: Assertion `! is_set()' failed in
|
||||||
|
--echo # Diagnostics_area::set_eof_status upon HANDLER READ
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS t1;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a POINT, KEY(a));
|
||||||
|
HANDLER t1 OPEN h;
|
||||||
|
|
||||||
|
--error ER_CANT_CREATE_GEOMETRY_OBJECT
|
||||||
|
HANDLER h READ a = (0);
|
||||||
|
|
||||||
|
HANDLER h CLOSE;
|
||||||
|
DROP TABLE t1;
|
||||||
|
|
||||||
|
--echo # End of 10.2 Test
|
||||||
|
34
mysql-test/suite/innodb/r/innodb-autoinc-part.result
Normal file
34
mysql-test/suite/innodb/r/innodb-autoinc-part.result
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#
|
||||||
|
# MDEV-28416 Incorrect AUTO_INCREMENT may be issued
|
||||||
|
#
|
||||||
|
SET @aii=@@auto_increment_increment;
|
||||||
|
SET auto_increment_increment=300;
|
||||||
|
CREATE TABLE t1 (a SERIAL) ENGINE=innodb
|
||||||
|
PARTITION BY RANGE (a) (
|
||||||
|
PARTITION p0 VALUES LESS THAN (6),
|
||||||
|
PARTITION p1 VALUES LESS THAN MAXVALUE
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551613);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
UNIQUE KEY `a` (`a`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=18446744073709551614 DEFAULT CHARSET=latin1
|
||||||
|
PARTITION BY RANGE (`a`)
|
||||||
|
(PARTITION `p0` VALUES LESS THAN (6) ENGINE = InnoDB,
|
||||||
|
PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
ERROR 22003: Out of range value for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
UNIQUE KEY `a` (`a`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=298 DEFAULT CHARSET=latin1
|
||||||
|
PARTITION BY RANGE (`a`)
|
||||||
|
(PARTITION `p0` VALUES LESS THAN (6) ENGINE = InnoDB,
|
||||||
|
PARTITION `p1` VALUES LESS THAN MAXVALUE ENGINE = InnoDB)
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET auto_increment_increment=@aii;
|
||||||
|
# End of 10.2 tests
|
@ -1,4 +1,3 @@
|
|||||||
drop table if exists t1;
|
|
||||||
CREATE TABLE t1 (c1 BIGINT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
|
CREATE TABLE t1 (c1 BIGINT PRIMARY KEY AUTO_INCREMENT, c2 VARCHAR(10)) ENGINE=InnoDB;
|
||||||
INSERT INTO t1 VALUES (9223372036854775807, null);
|
INSERT INTO t1 VALUES (9223372036854775807, null);
|
||||||
INSERT INTO t1 (c2) VALUES ('innodb');
|
INSERT INTO t1 (c2) VALUES ('innodb');
|
||||||
@ -1619,3 +1618,27 @@ id name
|
|||||||
-1 dog
|
-1 dog
|
||||||
2 cat
|
2 cat
|
||||||
DROP PROCEDURE autoinc_mdev15353_one;
|
DROP PROCEDURE autoinc_mdev15353_one;
|
||||||
|
#
|
||||||
|
# MDEV-28416 Incorrect AUTO_INCREMENT may be issued
|
||||||
|
#
|
||||||
|
SET @aii=@@auto_increment_increment;
|
||||||
|
SET auto_increment_increment=300;
|
||||||
|
CREATE TABLE t1 (a SERIAL) ENGINE=innodb;
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551613);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
UNIQUE KEY `a` (`a`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=18446744073709551614 DEFAULT CHARSET=latin1
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
ERROR 22003: Out of range value for column 'a' at row 1
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
|
||||||
|
UNIQUE KEY `a` (`a`)
|
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=18446744073709551615 DEFAULT CHARSET=latin1
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET auto_increment_increment=@aii;
|
||||||
|
# End of 10.2 tests
|
||||||
|
24
mysql-test/suite/innodb/t/innodb-autoinc-part.test
Normal file
24
mysql-test/suite/innodb/t/innodb-autoinc-part.test
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
--source include/have_partition.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28416 Incorrect AUTO_INCREMENT may be issued
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @aii=@@auto_increment_increment;
|
||||||
|
SET auto_increment_increment=300;
|
||||||
|
|
||||||
|
CREATE TABLE t1 (a SERIAL) ENGINE=innodb
|
||||||
|
PARTITION BY RANGE (a) (
|
||||||
|
PARTITION p0 VALUES LESS THAN (6),
|
||||||
|
PARTITION p1 VALUES LESS THAN MAXVALUE
|
||||||
|
);
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551613);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
--error HA_ERR_AUTOINC_ERANGE
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET auto_increment_increment=@aii;
|
||||||
|
|
||||||
|
--echo # End of 10.2 tests
|
@ -1,10 +1,4 @@
|
|||||||
--source include/have_innodb.inc
|
--source include/have_innodb.inc
|
||||||
# embedded server ignores 'delayed', so skip this
|
|
||||||
-- source include/not_embedded.inc
|
|
||||||
|
|
||||||
--disable_warnings
|
|
||||||
drop table if exists t1;
|
|
||||||
--enable_warnings
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bug #34335
|
# Bug #34335
|
||||||
@ -770,3 +764,20 @@ DROP TABLE t1;
|
|||||||
|
|
||||||
SET @engine='INNODB';
|
SET @engine='INNODB';
|
||||||
--source include/autoinc_mdev15353.inc
|
--source include/autoinc_mdev15353.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28416 Incorrect AUTO_INCREMENT may be issued
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET @aii=@@auto_increment_increment;
|
||||||
|
SET auto_increment_increment=300;
|
||||||
|
CREATE TABLE t1 (a SERIAL) ENGINE=innodb;
|
||||||
|
INSERT INTO t1 VALUES (18446744073709551613);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
--error HA_ERR_AUTOINC_ERANGE
|
||||||
|
INSERT INTO t1 VALUES (NULL);
|
||||||
|
SHOW CREATE TABLE t1;
|
||||||
|
DROP TABLE t1;
|
||||||
|
SET auto_increment_increment=@aii;
|
||||||
|
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
@ -0,0 +1,14 @@
|
|||||||
|
--disable_query_log
|
||||||
|
--file_exists $targetdir/xtrabackup_slave_info
|
||||||
|
CREATE TEMPORARY TABLE tmp_slave_info(lineno SERIAL, line TEXT);
|
||||||
|
--replace_result $targetdir TARGETDIR
|
||||||
|
--eval LOAD DATA LOCAL INFILE '$targetdir/xtrabackup_slave_info' INTO TABLE tmp_slave_info (line);
|
||||||
|
SELECT
|
||||||
|
lineno,
|
||||||
|
regexp_replace(
|
||||||
|
regexp_replace(line, '(?<=MASTER_LOG_POS=)[0-9]+', '<NUM>'),
|
||||||
|
'[0-9]+-[0-9]+-[0-9]+', '<NUM-NUM-NUM>')
|
||||||
|
AS line
|
||||||
|
FROM tmp_slave_info ORDER BY lineno;
|
||||||
|
DROP TEMPORARY TABLE tmp_slave_info;
|
||||||
|
--enable_query_log
|
@ -0,0 +1,20 @@
|
|||||||
|
--disable_query_log
|
||||||
|
--file_exists $XTRABACKUP_OUT
|
||||||
|
CREATE TEMPORARY TABLE tmp_slave_info_out(lineno SERIAL, line TEXT);
|
||||||
|
--replace_result $targetdir TARGETDIR
|
||||||
|
--eval LOAD DATA LOCAL INFILE '$XTRABACKUP_OUT' INTO TABLE tmp_slave_info_out (line);
|
||||||
|
SELECT
|
||||||
|
replace(
|
||||||
|
regexp_replace(
|
||||||
|
regexp_replace(line,
|
||||||
|
'[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] [0-9][0-9]:[0-9][0-9]:[0-9][0-9]',
|
||||||
|
'YYYY-MM-DD hh:mm:ss'),
|
||||||
|
'[0-9]+-[0-9]+-[0-9]+', '<NUM-NUM-NUM>'),
|
||||||
|
'\r','' /* Remove CR on Windows */)
|
||||||
|
AS line
|
||||||
|
FROM tmp_slave_info_out
|
||||||
|
WHERE line LIKE '%MySQL slave binlog position%'
|
||||||
|
OR line LIKE '%Failed to get master binlog coordinates%'
|
||||||
|
ORDER BY lineno;
|
||||||
|
DROP TEMPORARY TABLE tmp_slave_info_out;
|
||||||
|
--enable_query_log
|
@ -0,0 +1,24 @@
|
|||||||
|
call mtr.add_suppression("InnoDB: New log files created");
|
||||||
|
#
|
||||||
|
# Start of 10.2 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-28446 mariabackup prepare fails for incrementals if a new schema is created after full backup is taken
|
||||||
|
#
|
||||||
|
CREATE TABLE t1(i INT PRIMARY KEY) ENGINE INNODB;
|
||||||
|
# Prepare full backup, apply incremental one
|
||||||
|
# shutdown server
|
||||||
|
# remove datadir
|
||||||
|
# xtrabackup move back
|
||||||
|
# restart server
|
||||||
|
SELECT COUNT(*) FROM test.t1;
|
||||||
|
COUNT(*)
|
||||||
|
0
|
||||||
|
SELECT COUNT(*) FROM test1.t1;
|
||||||
|
COUNT(*)
|
||||||
|
10000
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP DATABASE test1;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
@ -0,0 +1,47 @@
|
|||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
|
|
||||||
|
call mtr.add_suppression("InnoDB: New log files created");
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.2 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-28446 mariabackup prepare fails for incrementals if a new schema is created after full backup is taken
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--let $basedir=$MYSQLTEST_VARDIR/tmp/backup
|
||||||
|
--let $incremental_dir=$MYSQLTEST_VARDIR/tmp/backup_inc1
|
||||||
|
|
||||||
|
CREATE TABLE t1(i INT PRIMARY KEY) ENGINE INNODB;
|
||||||
|
|
||||||
|
--disable_result_log
|
||||||
|
--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$basedir
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
--let after_load_tablespaces=BEGIN NOT ATOMIC CREATE DATABASE test1; CREATE TABLE test1.t1 ENGINE=INNODB SELECT UUID() from test.seq_1_to_10000; END
|
||||||
|
|
||||||
|
--exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --backup --target-dir=$incremental_dir --incremental-basedir=$basedir --dbug=+d,mariabackup_events,mariabackup_inject_code
|
||||||
|
--let after_load_tablespaces=
|
||||||
|
--disable_result_log
|
||||||
|
--echo # Prepare full backup, apply incremental one
|
||||||
|
--exec $XTRABACKUP --apply-log-only --prepare --target-dir=$basedir
|
||||||
|
--exec $XTRABACKUP --prepare --target-dir=$basedir --incremental-dir=$incremental_dir
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
--let $targetdir=$basedir
|
||||||
|
--source include/restart_and_restore.inc
|
||||||
|
--enable_result_log
|
||||||
|
|
||||||
|
SELECT COUNT(*) FROM test.t1;
|
||||||
|
SELECT COUNT(*) FROM test1.t1;
|
||||||
|
|
||||||
|
DROP TABLE t1;
|
||||||
|
DROP DATABASE test1;
|
||||||
|
--rmdir $basedir
|
||||||
|
--rmdir $incremental_dir
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
@ -13,6 +13,9 @@ connection slave;
|
|||||||
"using_gtid: Slave_Pos"
|
"using_gtid: Slave_Pos"
|
||||||
FOUND 1 /gtid_slave_pos/ in xtrabackup_slave_info
|
FOUND 1 /gtid_slave_pos/ in xtrabackup_slave_info
|
||||||
NOT FOUND /MASTER_LOG_FILE/ in xtrabackup_slave_info
|
NOT FOUND /MASTER_LOG_FILE/ in xtrabackup_slave_info
|
||||||
|
lineno line
|
||||||
|
1 SET GLOBAL gtid_slave_pos = '<NUM-NUM-NUM>';
|
||||||
|
2 CHANGE MASTER TO master_use_gtid = slave_pos;
|
||||||
###############
|
###############
|
||||||
# If Using_Gtid != 'No' and !gtid_slave_pos, backup master position
|
# If Using_Gtid != 'No' and !gtid_slave_pos, backup master position
|
||||||
########################
|
########################
|
||||||
@ -20,6 +23,8 @@ include/stop_slave.inc
|
|||||||
SET GLOBAL gtid_slave_pos="";
|
SET GLOBAL gtid_slave_pos="";
|
||||||
NOT FOUND /gtid_slave_pos/ in xtrabackup_slave_info
|
NOT FOUND /gtid_slave_pos/ in xtrabackup_slave_info
|
||||||
FOUND 1 /MASTER_LOG_FILE/ in xtrabackup_slave_info
|
FOUND 1 /MASTER_LOG_FILE/ in xtrabackup_slave_info
|
||||||
|
lineno line
|
||||||
|
1 CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=<NUM>;
|
||||||
###############
|
###############
|
||||||
# If Using_Gtid == 'No', backup Exec_Master_Log_Pos
|
# If Using_Gtid == 'No', backup Exec_Master_Log_Pos
|
||||||
########################
|
########################
|
||||||
@ -31,6 +36,8 @@ connection slave;
|
|||||||
"using_gtid: No"
|
"using_gtid: No"
|
||||||
NOT FOUND /gtid_slave_pos/ in xtrabackup_slave_info
|
NOT FOUND /gtid_slave_pos/ in xtrabackup_slave_info
|
||||||
FOUND 1 /MASTER_LOG_FILE/ in xtrabackup_slave_info
|
FOUND 1 /MASTER_LOG_FILE/ in xtrabackup_slave_info
|
||||||
|
lineno line
|
||||||
|
1 CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=<NUM>;
|
||||||
connection master;
|
connection master;
|
||||||
DROP TABLE t;
|
DROP TABLE t;
|
||||||
connection slave;
|
connection slave;
|
||||||
|
@ -27,6 +27,7 @@ exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffi
|
|||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
--let SEARCH_PATTERN=MASTER_LOG_FILE
|
--let SEARCH_PATTERN=MASTER_LOG_FILE
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
--source include/show_xtrabackup_slave_info.inc
|
||||||
|
|
||||||
rmdir $targetdir;
|
rmdir $targetdir;
|
||||||
|
|
||||||
@ -35,7 +36,9 @@ rmdir $targetdir;
|
|||||||
--echo ########################
|
--echo ########################
|
||||||
|
|
||||||
--source include/stop_slave.inc
|
--source include/stop_slave.inc
|
||||||
|
--disable_warnings
|
||||||
SET GLOBAL gtid_slave_pos="";
|
SET GLOBAL gtid_slave_pos="";
|
||||||
|
--enable_warnings
|
||||||
|
|
||||||
--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup
|
--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup
|
||||||
--disable_result_log
|
--disable_result_log
|
||||||
@ -47,6 +50,7 @@ exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffi
|
|||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
--let SEARCH_PATTERN=MASTER_LOG_FILE
|
--let SEARCH_PATTERN=MASTER_LOG_FILE
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
--source include/show_xtrabackup_slave_info.inc
|
||||||
|
|
||||||
rmdir $targetdir;
|
rmdir $targetdir;
|
||||||
|
|
||||||
@ -74,6 +78,7 @@ exec $XTRABACKUP --defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffi
|
|||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
--let SEARCH_PATTERN=MASTER_LOG_FILE
|
--let SEARCH_PATTERN=MASTER_LOG_FILE
|
||||||
--source include/search_pattern_in_file.inc
|
--source include/search_pattern_in_file.inc
|
||||||
|
--source include/show_xtrabackup_slave_info.inc
|
||||||
|
|
||||||
rmdir $targetdir;
|
rmdir $targetdir;
|
||||||
|
|
||||||
|
59
mysql-test/suite/mariabackup/slave_info_norpl.result
Normal file
59
mysql-test/suite/mariabackup/slave_info_norpl.result
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
#
|
||||||
|
# Start of 10.2 tests
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# MDEV-21037 mariabackup does not detect multi-source replication slave
|
||||||
|
#
|
||||||
|
SELECT @@global.gtid_slave_pos;
|
||||||
|
@@global.gtid_slave_pos
|
||||||
|
|
||||||
|
|
||||||
|
# Without any masters the file xtrabackup_slave_info is not created
|
||||||
|
line
|
||||||
|
[00] YYYY-MM-DD hh:mm:ss Failed to get master binlog coordinates from SHOW SLAVE STATUS.This means that the server is not a replication slave. Ignoring the --slave-info option
|
||||||
|
|
||||||
|
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=10000;
|
||||||
|
lineno line
|
||||||
|
1 CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
line
|
||||||
|
[00] YYYY-MM-DD hh:mm:ss MySQL slave binlog position: master '' filename '' position '0'
|
||||||
|
|
||||||
|
CHANGE MASTER 'master2' TO MASTER_HOST='localhost', MASTER_PORT=10002;
|
||||||
|
lineno line
|
||||||
|
1 CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
2 CHANGE MASTER 'master2' TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
line
|
||||||
|
[00] YYYY-MM-DD hh:mm:ss MySQL slave binlog position: master '' filename '' position '0'; master 'master2' filename '' position '0'
|
||||||
|
|
||||||
|
SET GLOBAL gtid_slave_pos='1-1-1,2-2-2';
|
||||||
|
CHANGE MASTER 'master3' TO MASTER_HOST='localhost', MASTER_PORT=10003, MASTER_USE_GTID=slave_pos;
|
||||||
|
CHANGE MASTER 'master4' TO MASTER_HOST='localhost', MASTER_PORT=10004, MASTER_USE_GTID=no;
|
||||||
|
CHANGE MASTER 'master5' TO MASTER_HOST='localhost', MASTER_PORT=10005, MASTER_USE_GTID=slave_pos;
|
||||||
|
lineno line
|
||||||
|
1 SET GLOBAL gtid_slave_pos = '<NUM-NUM-NUM>,<NUM-NUM-NUM>';
|
||||||
|
2 CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
3 CHANGE MASTER 'master2' TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
4 CHANGE MASTER 'master3' TO master_use_gtid = slave_pos;
|
||||||
|
5 CHANGE MASTER 'master4' TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
6 CHANGE MASTER 'master5' TO master_use_gtid = slave_pos;
|
||||||
|
line
|
||||||
|
[00] YYYY-MM-DD hh:mm:ss MySQL slave binlog position: gtid_slave_pos '<NUM-NUM-NUM>,<NUM-NUM-NUM>'; master '' filename '' position '0'; master 'master2' filename '' position '0'; master 'master3' master_use_gtid = slave_pos; master 'master4' filename '' position '0'; master 'master5' master_use_gtid = slave_pos
|
||||||
|
|
||||||
|
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=10000, MASTER_USE_GTID=slave_pos;
|
||||||
|
lineno line
|
||||||
|
1 SET GLOBAL gtid_slave_pos = '<NUM-NUM-NUM>,<NUM-NUM-NUM>';
|
||||||
|
2 CHANGE MASTER TO master_use_gtid = slave_pos;
|
||||||
|
3 CHANGE MASTER 'master2' TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
4 CHANGE MASTER 'master3' TO master_use_gtid = slave_pos;
|
||||||
|
5 CHANGE MASTER 'master4' TO MASTER_LOG_FILE='', MASTER_LOG_POS=<NUM>;
|
||||||
|
6 CHANGE MASTER 'master5' TO master_use_gtid = slave_pos;
|
||||||
|
line
|
||||||
|
[00] YYYY-MM-DD hh:mm:ss MySQL slave binlog position: gtid_slave_pos '<NUM-NUM-NUM>,<NUM-NUM-NUM>'; master '' master_use_gtid = slave_pos; master 'master2' filename '' position '0'; master 'master3' master_use_gtid = slave_pos; master 'master4' filename '' position '0'; master 'master5' master_use_gtid = slave_pos
|
||||||
|
RESET SLAVE ALL;
|
||||||
|
RESET SLAVE 'master2' ALL;
|
||||||
|
RESET SLAVE 'master3' ALL;
|
||||||
|
RESET SLAVE 'master4' ALL;
|
||||||
|
RESET SLAVE 'master5' ALL;
|
||||||
|
#
|
||||||
|
# End of 10.2 tests
|
||||||
|
#
|
86
mysql-test/suite/mariabackup/slave_info_norpl.test
Normal file
86
mysql-test/suite/mariabackup/slave_info_norpl.test
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
#
|
||||||
|
# "mariabackup --slave-info" tests that can be run without
|
||||||
|
# actually starting the replication.
|
||||||
|
#
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Start of 10.2 tests
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # MDEV-21037 mariabackup does not detect multi-source replication slave
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
--let $targetdir=$MYSQLTEST_VARDIR/tmp/backup
|
||||||
|
--let $XTRABACKUP_ARGS=--defaults-file=$MYSQLTEST_VARDIR/my.cnf --defaults-group-suffix=.2 --slave-info --backup --databases=test --target-dir=$targetdir
|
||||||
|
--let $XTRABACKUP_OUT=$MYSQLTEST_VARDIR/tmp/xtrabackup_out
|
||||||
|
|
||||||
|
# Should be empty by default
|
||||||
|
SELECT @@global.gtid_slave_pos;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
--echo # Without any masters the file xtrabackup_slave_info is not created
|
||||||
|
|
||||||
|
--disable_result_log
|
||||||
|
exec $XTRABACKUP $XTRABACKUP_ARGS >$XTRABACKUP_OUT;
|
||||||
|
--enable_result_log
|
||||||
|
--error 1
|
||||||
|
--file_exists $targetdir/xtrabackup_slave_info
|
||||||
|
--source include/show_xtrabackup_slave_info_out.inc
|
||||||
|
--remove_file $XTRABACKUP_OUT
|
||||||
|
rmdir $targetdir;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=10000;
|
||||||
|
--disable_result_log
|
||||||
|
exec $XTRABACKUP $XTRABACKUP_ARGS >$XTRABACKUP_OUT;
|
||||||
|
--enable_result_log
|
||||||
|
--source include/show_xtrabackup_slave_info.inc
|
||||||
|
--source include/show_xtrabackup_slave_info_out.inc
|
||||||
|
--remove_file $XTRABACKUP_OUT
|
||||||
|
rmdir $targetdir;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
CHANGE MASTER 'master2' TO MASTER_HOST='localhost', MASTER_PORT=10002;
|
||||||
|
--disable_result_log
|
||||||
|
exec $XTRABACKUP $XTRABACKUP_ARGS >$XTRABACKUP_OUT;
|
||||||
|
--enable_result_log
|
||||||
|
--source include/show_xtrabackup_slave_info.inc
|
||||||
|
--source include/show_xtrabackup_slave_info_out.inc
|
||||||
|
--remove_file $XTRABACKUP_OUT
|
||||||
|
rmdir $targetdir;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
SET GLOBAL gtid_slave_pos='1-1-1,2-2-2';
|
||||||
|
CHANGE MASTER 'master3' TO MASTER_HOST='localhost', MASTER_PORT=10003, MASTER_USE_GTID=slave_pos;
|
||||||
|
CHANGE MASTER 'master4' TO MASTER_HOST='localhost', MASTER_PORT=10004, MASTER_USE_GTID=no;
|
||||||
|
CHANGE MASTER 'master5' TO MASTER_HOST='localhost', MASTER_PORT=10005, MASTER_USE_GTID=slave_pos;
|
||||||
|
|
||||||
|
--disable_result_log
|
||||||
|
exec $XTRABACKUP $XTRABACKUP_ARGS >$XTRABACKUP_OUT;
|
||||||
|
--enable_result_log
|
||||||
|
--source include/show_xtrabackup_slave_info.inc
|
||||||
|
--source include/show_xtrabackup_slave_info_out.inc
|
||||||
|
--remove_file $XTRABACKUP_OUT
|
||||||
|
rmdir $targetdir;
|
||||||
|
|
||||||
|
--echo
|
||||||
|
CHANGE MASTER TO MASTER_HOST='localhost', MASTER_PORT=10000, MASTER_USE_GTID=slave_pos;
|
||||||
|
--disable_result_log
|
||||||
|
exec $XTRABACKUP $XTRABACKUP_ARGS >$XTRABACKUP_OUT;
|
||||||
|
--enable_result_log
|
||||||
|
--source include/show_xtrabackup_slave_info.inc
|
||||||
|
--source include/show_xtrabackup_slave_info_out.inc
|
||||||
|
--remove_file $XTRABACKUP_OUT
|
||||||
|
rmdir $targetdir;
|
||||||
|
|
||||||
|
RESET SLAVE ALL;
|
||||||
|
RESET SLAVE 'master2' ALL;
|
||||||
|
RESET SLAVE 'master3' ALL;
|
||||||
|
RESET SLAVE 'master4' ALL;
|
||||||
|
RESET SLAVE 'master5' ALL;
|
||||||
|
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # End of 10.2 tests
|
||||||
|
--echo #
|
@ -1,3 +1,5 @@
|
|||||||
|
--source include/have_symlink.inc
|
||||||
|
|
||||||
--echo #
|
--echo #
|
||||||
--echo # MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine
|
--echo # MDEV-14641 Incompatible key or row definition between the MariaDB .frm file and the information in the storage engine
|
||||||
--echo #
|
--echo #
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
--source include/have_partition.inc
|
--source include/have_partition.inc
|
||||||
--source include/have_symlink.inc
|
|
||||||
--let $engine=MyISAM
|
--let $engine=MyISAM
|
||||||
--source inc/part_alter_values.inc
|
--source inc/part_alter_values.inc
|
||||||
|
|
||||||
|
@ -1872,6 +1872,7 @@ SET GLOBAL slave_parallel_threads=10;
|
|||||||
SET GLOBAL slave_parallel_threads=1;
|
SET GLOBAL slave_parallel_threads=1;
|
||||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||||
SET GLOBAL debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
SET GLOBAL debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
||||||
|
CALL mtr.add_suppression("Unexpected break of being relay-logged GTID");
|
||||||
|
|
||||||
--connection server_1
|
--connection server_1
|
||||||
INSERT INTO t2 VALUES (101);
|
INSERT INTO t2 VALUES (101);
|
||||||
|
@ -37,7 +37,7 @@ select * from t1;
|
|||||||
|
|
||||||
# The slave is synced and waiting/reading from master
|
# The slave is synced and waiting/reading from master
|
||||||
# SHOW SLAVE STATUS will show "Waiting for master to send event"
|
# SHOW SLAVE STATUS will show "Waiting for master to send event"
|
||||||
let $status_items= Master_SSL_Allowed, Master_SSL_CA_Path, Master_SSL_CA_File, Master_SSL_Cert, Master_SSL_Key;
|
let $status_items= Master_SSL_Allowed, Master_SSL_CA_Path, Master_SSL_CA_File, Master_SSL_Crl, Master_SSL_Crlpath, Master_SSL_Cert, Master_SSL_Key;
|
||||||
source include/show_slave_status.inc;
|
source include/show_slave_status.inc;
|
||||||
source include/check_slave_is_running.inc;
|
source include/check_slave_is_running.inc;
|
||||||
|
|
||||||
|
54
mysql-test/suite/rpl/r/rpl_gtid_grouping.result
Normal file
54
mysql-test/suite/rpl/r/rpl_gtid_grouping.result
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
include/master-slave.inc
|
||||||
|
[connection master]
|
||||||
|
connection slave;
|
||||||
|
call mtr.add_suppression("Unexpected break of being relay-logged GTID 0-27697-1000");
|
||||||
|
call mtr.add_suppression("Relay log write failure: could not queue event from master");
|
||||||
|
call mtr.add_suppression("The current group of events starts with a non-GTID");
|
||||||
|
include/stop_slave.inc
|
||||||
|
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;
|
||||||
|
include/start_slave.inc
|
||||||
|
connection master;
|
||||||
|
CREATE TABLE t (a INT) ENGINE=innodb;
|
||||||
|
INSERT INTO t VALUES(1);
|
||||||
|
### A. Simulate an unnoticeable loss of Xid event
|
||||||
|
connection slave;
|
||||||
|
SET @@global.debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
||||||
|
connection master;
|
||||||
|
SET @@gtid_seq_no=1000;
|
||||||
|
set @@server_id=27697;
|
||||||
|
INSERT INTO t VALUES(1000);
|
||||||
|
set @@server_id=default;
|
||||||
|
INSERT INTO t VALUES(1001);
|
||||||
|
## Prove the error occurs.
|
||||||
|
connection slave;
|
||||||
|
include/wait_for_slave_io_error.inc [errno=1595]
|
||||||
|
## Prove the slave recovers after the simulation condtion is lifted.
|
||||||
|
SET @@global.debug_dbug=default;
|
||||||
|
include/start_slave.inc
|
||||||
|
### B. Do the same to GTID event.
|
||||||
|
connection slave;
|
||||||
|
SET @@global.debug_dbug="+d,slave_discard_gtid_0_x_1002";
|
||||||
|
connection master;
|
||||||
|
SET @@gtid_seq_no=1002;
|
||||||
|
set @@server_id=27697;
|
||||||
|
INSERT INTO t VALUES(1002);
|
||||||
|
set @@server_id=default;
|
||||||
|
INSERT INTO t VALUES(1003);
|
||||||
|
## Prove the error occurs.
|
||||||
|
connection slave;
|
||||||
|
include/wait_for_slave_io_error.inc [errno=1595]
|
||||||
|
## Prove the slave recovers after the simulation condtion is lifted.
|
||||||
|
SET @@global.debug_dbug=default;
|
||||||
|
include/start_slave.inc
|
||||||
|
connection master;
|
||||||
|
connection slave;
|
||||||
|
include/diff_tables.inc [master:t,slave:t]
|
||||||
|
"===== Clean up ====="
|
||||||
|
connection slave;
|
||||||
|
include/stop_slave.inc
|
||||||
|
CHANGE MASTER TO MASTER_USE_GTID=no;
|
||||||
|
include/start_slave.inc
|
||||||
|
connection master;
|
||||||
|
DROP TABLE t;
|
||||||
|
SET GLOBAL LOG_WARNINGS=default;
|
||||||
|
include/rpl_end.inc
|
@ -1378,6 +1378,7 @@ include/stop_slave.inc
|
|||||||
SET GLOBAL slave_parallel_threads=1;
|
SET GLOBAL slave_parallel_threads=1;
|
||||||
SET @old_dbug= @@GLOBAL.debug_dbug;
|
SET @old_dbug= @@GLOBAL.debug_dbug;
|
||||||
SET GLOBAL debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
SET GLOBAL debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
||||||
|
CALL mtr.add_suppression("Unexpected break of being relay-logged GTID");
|
||||||
connection server_1;
|
connection server_1;
|
||||||
INSERT INTO t2 VALUES (101);
|
INSERT INTO t2 VALUES (101);
|
||||||
INSERT INTO t2 VALUES (102);
|
INSERT INTO t2 VALUES (102);
|
||||||
|
@ -132,8 +132,13 @@ connection server_1;
|
|||||||
INSERT INTO t1 VALUES (0, 1);
|
INSERT INTO t1 VALUES (0, 1);
|
||||||
include/save_master_gtid.inc
|
include/save_master_gtid.inc
|
||||||
connection server_2;
|
connection server_2;
|
||||||
|
set @@sql_log_bin=0;
|
||||||
|
call mtr.add_suppression("Unexpected break of being relay-logged GTID 1-1-32 event group by the current GTID event 0-1-4");
|
||||||
|
set @@sql_log_bin=1;
|
||||||
|
set @@global.debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
||||||
include/start_slave.inc
|
include/start_slave.inc
|
||||||
include/sync_with_master_gtid.inc
|
include/sync_with_master_gtid.inc
|
||||||
|
set @@global.debug_dbug="";
|
||||||
SELECT * FROM t1 ORDER BY a;
|
SELECT * FROM t1 ORDER BY a;
|
||||||
a b
|
a b
|
||||||
0 1
|
0 1
|
||||||
|
@ -23,6 +23,8 @@ t
|
|||||||
Master_SSL_Allowed = 'Yes'
|
Master_SSL_Allowed = 'Yes'
|
||||||
Master_SSL_CA_Path = ''
|
Master_SSL_CA_Path = ''
|
||||||
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
||||||
|
Master_SSL_Crl = ''
|
||||||
|
Master_SSL_Crlpath = ''
|
||||||
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
||||||
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
||||||
include/check_slave_is_running.inc
|
include/check_slave_is_running.inc
|
||||||
@ -37,6 +39,8 @@ include/wait_for_slave_to_start.inc
|
|||||||
Master_SSL_Allowed = 'Yes'
|
Master_SSL_Allowed = 'Yes'
|
||||||
Master_SSL_CA_Path = ''
|
Master_SSL_CA_Path = ''
|
||||||
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
Master_SSL_CA_File = 'MYSQL_TEST_DIR/std_data/cacert.pem'
|
||||||
|
Master_SSL_Crl = ''
|
||||||
|
Master_SSL_Crlpath = ''
|
||||||
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
Master_SSL_Cert = 'MYSQL_TEST_DIR/std_data/client-cert.pem'
|
||||||
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
Master_SSL_Key = 'MYSQL_TEST_DIR/std_data/client-key.pem'
|
||||||
include/check_slave_is_running.inc
|
include/check_slave_is_running.inc
|
||||||
|
97
mysql-test/suite/rpl/t/rpl_gtid_grouping.test
Normal file
97
mysql-test/suite/rpl/t/rpl_gtid_grouping.test
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
# ==== Purpose ====
|
||||||
|
#
|
||||||
|
# Test verifies that replicated transaction boundaries are set properly
|
||||||
|
# at receiving from master time.
|
||||||
|
#
|
||||||
|
# ==== Implementation ====
|
||||||
|
#
|
||||||
|
# A. Simulate an unnoticeable loss of Xid event to observe a slave error,
|
||||||
|
# then restart slave to recover from the failure.
|
||||||
|
# B. Do the same to GTID event.
|
||||||
|
#
|
||||||
|
# ==== References ====
|
||||||
|
#
|
||||||
|
# MDEV-27697 slave must recognize incomplete replication event group
|
||||||
|
#
|
||||||
|
--source include/have_binlog_format_mixed.inc
|
||||||
|
--source include/have_innodb.inc
|
||||||
|
--source include/have_debug.inc
|
||||||
|
--source include/master-slave.inc
|
||||||
|
|
||||||
|
--connection slave
|
||||||
|
call mtr.add_suppression("Unexpected break of being relay-logged GTID 0-27697-1000");
|
||||||
|
call mtr.add_suppression("Relay log write failure: could not queue event from master");
|
||||||
|
call mtr.add_suppression("The current group of events starts with a non-GTID");
|
||||||
|
|
||||||
|
--source include/stop_slave.inc
|
||||||
|
CHANGE MASTER TO MASTER_USE_GTID=slave_pos;
|
||||||
|
--source include/start_slave.inc
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
CREATE TABLE t (a INT) ENGINE=innodb;
|
||||||
|
INSERT INTO t VALUES(1);
|
||||||
|
save_master_pos;
|
||||||
|
|
||||||
|
--echo ### A. Simulate an unnoticeable loss of Xid event
|
||||||
|
--sync_slave_with_master
|
||||||
|
SET @@global.debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
SET @@gtid_seq_no=1000;
|
||||||
|
set @@server_id=27697;
|
||||||
|
INSERT INTO t VALUES(1000);
|
||||||
|
set @@server_id=default;
|
||||||
|
INSERT INTO t VALUES(1001);
|
||||||
|
|
||||||
|
--echo ## Prove the error occurs.
|
||||||
|
--connection slave
|
||||||
|
# ER_SLAVE_RELAY_LOG_WRITE_FAILURE
|
||||||
|
--let $slave_io_errno = 1595
|
||||||
|
--source include/wait_for_slave_io_error.inc
|
||||||
|
## EOP
|
||||||
|
|
||||||
|
--echo ## Prove the slave recovers after the simulation condtion is lifted.
|
||||||
|
SET @@global.debug_dbug=default;
|
||||||
|
--source include/start_slave.inc
|
||||||
|
|
||||||
|
--echo ### B. Do the same to GTID event.
|
||||||
|
--connection slave
|
||||||
|
SET @@global.debug_dbug="+d,slave_discard_gtid_0_x_1002";
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
SET @@gtid_seq_no=1002;
|
||||||
|
set @@server_id=27697;
|
||||||
|
INSERT INTO t VALUES(1002);
|
||||||
|
set @@server_id=default;
|
||||||
|
INSERT INTO t VALUES(1003);
|
||||||
|
|
||||||
|
--echo ## Prove the error occurs.
|
||||||
|
--connection slave
|
||||||
|
# ER_SLAVE_RELAY_LOG_WRITE_FAILURE
|
||||||
|
--let $slave_io_errno = 1595
|
||||||
|
--source include/wait_for_slave_io_error.inc
|
||||||
|
## EOP
|
||||||
|
|
||||||
|
--echo ## Prove the slave recovers after the simulation condtion is lifted.
|
||||||
|
SET @@global.debug_dbug=default;
|
||||||
|
--source include/start_slave.inc
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
save_master_pos;
|
||||||
|
|
||||||
|
--sync_slave_with_master
|
||||||
|
## EOP
|
||||||
|
|
||||||
|
--let $diff_tables=master:t,slave:t
|
||||||
|
--source include/diff_tables.inc
|
||||||
|
|
||||||
|
--echo "===== Clean up ====="
|
||||||
|
--connection slave
|
||||||
|
--source include/stop_slave.inc
|
||||||
|
CHANGE MASTER TO MASTER_USE_GTID=no;
|
||||||
|
--source include/start_slave.inc
|
||||||
|
|
||||||
|
--connection master
|
||||||
|
DROP TABLE t;
|
||||||
|
SET GLOBAL LOG_WARNINGS=default;
|
||||||
|
--source include/rpl_end.inc
|
@ -201,9 +201,16 @@ INSERT INTO t1 VALUES (0, 1);
|
|||||||
# execution of format_description event will not wait infinitely
|
# execution of format_description event will not wait infinitely
|
||||||
# for a commit of the incomplete group that never happens.
|
# for a commit of the incomplete group that never happens.
|
||||||
|
|
||||||
|
# Apart from the suppression, MDEV-27697 refinement to the original test needs
|
||||||
|
# an allowance to one time accept malformed event group.
|
||||||
|
set @@sql_log_bin=0;
|
||||||
|
call mtr.add_suppression("Unexpected break of being relay-logged GTID 1-1-32 event group by the current GTID event 0-1-4");
|
||||||
|
set @@sql_log_bin=1;
|
||||||
|
set @@global.debug_dbug="+d,slave_discard_xid_for_gtid_0_x_1000";
|
||||||
--source include/start_slave.inc
|
--source include/start_slave.inc
|
||||||
#--sync_with_master
|
#--sync_with_master
|
||||||
--source include/sync_with_master_gtid.inc
|
--source include/sync_with_master_gtid.inc
|
||||||
|
set @@global.debug_dbug="";
|
||||||
|
|
||||||
SELECT * FROM t1 ORDER BY a;
|
SELECT * FROM t1 ORDER BY a;
|
||||||
SHOW STATUS LIKE 'Slave_open_temp_tables';
|
SHOW STATUS LIKE 'Slave_open_temp_tables';
|
||||||
|
@ -1,150 +0,0 @@
|
|||||||
#
|
|
||||||
# MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
|
||||||
#
|
|
||||||
# Verbose run
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=InnoDB;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
TRUNCATE TABLE time_zone;
|
|
||||||
TRUNCATE TABLE time_zone_name;
|
|
||||||
TRUNCATE TABLE time_zone_transition;
|
|
||||||
TRUNCATE TABLE time_zone_transition_type;
|
|
||||||
START TRANSACTION;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/garbage' as time zone. Skipping it.
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/ignored.tab' as time zone. Skipping it.
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('posix/GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/ignored.tab' as time zone. Skipping it.
|
|
||||||
Warning: Skipping directory 'MYSQLTEST_VARDIR/zoneinfo/posix/posix': to avoid infinite symlink recursion.
|
|
||||||
COMMIT;
|
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=MyISAM;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
# Silent run
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=InnoDB;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
TRUNCATE TABLE time_zone;
|
|
||||||
TRUNCATE TABLE time_zone_name;
|
|
||||||
TRUNCATE TABLE time_zone_transition;
|
|
||||||
TRUNCATE TABLE time_zone_transition_type;
|
|
||||||
START TRANSACTION;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/garbage' as time zone. Skipping it.
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('posix/GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
|
||||||
COMMIT;
|
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=MyISAM;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
#
|
|
||||||
# Testing with explicit timezonefile
|
|
||||||
#
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=InnoDB;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('XXX', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=MyISAM;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
#
|
|
||||||
# Testing --leap
|
|
||||||
#
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=InnoDB;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=InnoDB;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone_leap_second ENGINE=InnoDB;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
TRUNCATE TABLE time_zone_leap_second;
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone_leap_second ENGINE=MyISAM;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
||||||
ALTER TABLE time_zone_leap_second ORDER BY Transition_time;
|
|
||||||
\d |
|
|
||||||
IF (select count(*) from information_schema.global_variables where
|
|
||||||
variable_name='wsrep_on' and variable_value='ON') = 1 THEN
|
|
||||||
ALTER TABLE time_zone ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_name ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition ENGINE=MyISAM;
|
|
||||||
ALTER TABLE time_zone_transition_type ENGINE=MyISAM;
|
|
||||||
END IF|
|
|
||||||
\d ;
|
|
@ -1,78 +0,0 @@
|
|||||||
#
|
|
||||||
# MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
|
||||||
#
|
|
||||||
# Verbose run
|
|
||||||
set @prep1=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on' and variable_value='ON'), 'SET SESSION SQL_LOG_BIN=?, WSREP_ON=OFF;', 'do ?');
|
|
||||||
prepare set_wsrep_write_binlog from @prep1;
|
|
||||||
set @toggle=0; execute set_wsrep_write_binlog using @toggle;
|
|
||||||
TRUNCATE TABLE time_zone;
|
|
||||||
TRUNCATE TABLE time_zone_name;
|
|
||||||
TRUNCATE TABLE time_zone_transition;
|
|
||||||
TRUNCATE TABLE time_zone_transition_type;
|
|
||||||
START TRANSACTION;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/garbage' as time zone. Skipping it.
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/ignored.tab' as time zone. Skipping it.
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('posix/GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/ignored.tab' as time zone. Skipping it.
|
|
||||||
Warning: Skipping directory 'MYSQLTEST_VARDIR/zoneinfo/posix/posix': to avoid infinite symlink recursion.
|
|
||||||
COMMIT;
|
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
|
||||||
# Silent run
|
|
||||||
set @prep1=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on' and variable_value='ON'), 'SET SESSION SQL_LOG_BIN=?, WSREP_ON=OFF;', 'do ?');
|
|
||||||
prepare set_wsrep_write_binlog from @prep1;
|
|
||||||
set @toggle=0; execute set_wsrep_write_binlog using @toggle;
|
|
||||||
TRUNCATE TABLE time_zone;
|
|
||||||
TRUNCATE TABLE time_zone_name;
|
|
||||||
TRUNCATE TABLE time_zone_transition;
|
|
||||||
TRUNCATE TABLE time_zone_transition_type;
|
|
||||||
START TRANSACTION;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/garbage' as time zone. Skipping it.
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('posix/GMT', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
Warning: Unable to load 'MYSQLTEST_VARDIR/zoneinfo/posix/garbage' as time zone. Skipping it.
|
|
||||||
COMMIT;
|
|
||||||
ALTER TABLE time_zone_transition ORDER BY Time_zone_id, Transition_time;
|
|
||||||
ALTER TABLE time_zone_transition_type ORDER BY Time_zone_id, Transition_type_id;
|
|
||||||
#
|
|
||||||
# Testing with explicit timezonefile
|
|
||||||
#
|
|
||||||
set @prep1=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on' and variable_value='ON'), 'SET SESSION SQL_LOG_BIN=?, WSREP_ON=OFF;', 'do ?');
|
|
||||||
prepare set_wsrep_write_binlog from @prep1;
|
|
||||||
set @toggle=0; execute set_wsrep_write_binlog using @toggle;
|
|
||||||
INSERT INTO time_zone (Use_leap_seconds) VALUES ('N');
|
|
||||||
SET @time_zone_id= LAST_INSERT_ID();
|
|
||||||
INSERT INTO time_zone_name (Name, Time_zone_id) VALUES ('XXX', @time_zone_id);
|
|
||||||
INSERT INTO time_zone_transition_type (Time_zone_id, Transition_type_id, Offset, Is_DST, Abbreviation) VALUES
|
|
||||||
(@time_zone_id, 0, 0, 0, 'GMT')
|
|
||||||
;
|
|
||||||
#
|
|
||||||
# Testing --leap
|
|
||||||
#
|
|
||||||
set @prep1=if((select count(*) from information_schema.global_variables where variable_name='wsrep_on' and variable_value='ON'), 'SET SESSION SQL_LOG_BIN=?, WSREP_ON=OFF;', 'do ?');
|
|
||||||
prepare set_wsrep_write_binlog from @prep1;
|
|
||||||
set @toggle=0; execute set_wsrep_write_binlog using @toggle;
|
|
||||||
TRUNCATE TABLE time_zone_leap_second;
|
|
||||||
ALTER TABLE time_zone_leap_second ORDER BY Transition_time;
|
|
@ -1,3 +0,0 @@
|
|||||||
--wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 --binlog_format=ROW
|
|
||||||
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
--source include/have_wsrep.inc
|
|
||||||
--source include/have_symlink.inc
|
|
||||||
--source include/not_windows.inc
|
|
||||||
--source include/have_innodb.inc
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--exec mkdir $MYSQLTEST_VARDIR/zoneinfo
|
|
||||||
--exec ln -s $MYSQLTEST_VARDIR/zoneinfo $MYSQLTEST_VARDIR/zoneinfo/posix
|
|
||||||
--copy_file std_data/zoneinfo/GMT $MYSQLTEST_VARDIR/zoneinfo/GMT
|
|
||||||
--copy_file std_data/words.dat $MYSQLTEST_VARDIR/zoneinfo/garbage
|
|
||||||
--copy_file std_data/words.dat $MYSQLTEST_VARDIR/zoneinfo/ignored.tab
|
|
||||||
|
|
||||||
--echo # Verbose run
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --verbose $MYSQLTEST_VARDIR/zoneinfo 2>&1
|
|
||||||
|
|
||||||
--echo # Silent run
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL $MYSQLTEST_VARDIR/zoneinfo 2>&1
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Testing with explicit timezonefile
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL $MYSQLTEST_VARDIR/zoneinfo/GMT XXX 2>&1
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Testing --leap
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --leap $MYSQLTEST_VARDIR/zoneinfo/GMT 2>&1
|
|
||||||
|
|
||||||
#
|
|
||||||
# Cleanup
|
|
||||||
#
|
|
||||||
|
|
||||||
--exec rm -rf $MYSQLTEST_VARDIR/zoneinfo
|
|
@ -1,3 +0,0 @@
|
|||||||
--wsrep-provider=$WSREP_PROVIDER --wsrep-cluster-address=gcomm:// --wsrep-on=1 --binlog_format=ROW
|
|
||||||
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
|||||||
--source include/have_wsrep.inc
|
|
||||||
--source include/have_symlink.inc
|
|
||||||
--source include/not_windows.inc
|
|
||||||
--source include/have_innodb.inc
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # MDEV-5226 mysql_tzinfo_to_sql errors with tzdata 2013f and above
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--exec mkdir $MYSQLTEST_VARDIR/zoneinfo
|
|
||||||
--exec ln -s $MYSQLTEST_VARDIR/zoneinfo $MYSQLTEST_VARDIR/zoneinfo/posix
|
|
||||||
--copy_file std_data/zoneinfo/GMT $MYSQLTEST_VARDIR/zoneinfo/GMT
|
|
||||||
--copy_file std_data/words.dat $MYSQLTEST_VARDIR/zoneinfo/garbage
|
|
||||||
--copy_file std_data/words.dat $MYSQLTEST_VARDIR/zoneinfo/ignored.tab
|
|
||||||
|
|
||||||
--echo # Verbose run
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --verbose --skip-write-binlog $MYSQLTEST_VARDIR/zoneinfo 2>&1
|
|
||||||
|
|
||||||
--echo # Silent run
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --skip-write-binlog $MYSQLTEST_VARDIR/zoneinfo 2>&1
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Testing with explicit timezonefile
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--replace_result $MYSQLTEST_VARDIR MYSQLTEST_VARDIR
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --skip-write-binlog $MYSQLTEST_VARDIR/zoneinfo/GMT XXX 2>&1
|
|
||||||
|
|
||||||
--echo #
|
|
||||||
--echo # Testing --leap
|
|
||||||
--echo #
|
|
||||||
|
|
||||||
--exec $MYSQL_TZINFO_TO_SQL --leap --skip-write-binlog $MYSQLTEST_VARDIR/zoneinfo/GMT 2>&1
|
|
||||||
|
|
||||||
#
|
|
||||||
# Cleanup
|
|
||||||
#
|
|
||||||
|
|
||||||
--exec rm -rf $MYSQLTEST_VARDIR/zoneinfo
|
|
17
sql/field.cc
17
sql/field.cc
@ -3116,6 +3116,15 @@ Field *Field_decimal::make_new_field(MEM_ROOT *root, TABLE *new_table,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Field_new_decimal::set_and_validate_prec(uint32 len_arg,
|
||||||
|
uint8 dec_arg, bool unsigned_arg)
|
||||||
|
{
|
||||||
|
precision= my_decimal_length_to_precision(len_arg, dec_arg, unsigned_arg);
|
||||||
|
set_if_smaller(precision, DECIMAL_MAX_PRECISION);
|
||||||
|
bin_size= my_decimal_get_binary_size(precision, dec);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
** Field_new_decimal
|
** Field_new_decimal
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -3134,12 +3143,10 @@ Field_new_decimal::Field_new_decimal(uchar *ptr_arg,
|
|||||||
uint8 dec_arg,bool zero_arg,
|
uint8 dec_arg,bool zero_arg,
|
||||||
bool unsigned_arg)
|
bool unsigned_arg)
|
||||||
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
:Field_num(ptr_arg, len_arg, null_ptr_arg, null_bit_arg,
|
||||||
unireg_check_arg, field_name_arg, dec_arg, zero_arg, unsigned_arg)
|
unireg_check_arg, field_name_arg,
|
||||||
|
MY_MIN(dec_arg, DECIMAL_MAX_SCALE), zero_arg, unsigned_arg)
|
||||||
{
|
{
|
||||||
precision= get_decimal_precision(len_arg, dec_arg, unsigned_arg);
|
set_and_validate_prec(len_arg, dec_arg, unsigned_arg);
|
||||||
DBUG_ASSERT((precision <= DECIMAL_MAX_PRECISION) &&
|
|
||||||
(dec <= DECIMAL_MAX_SCALE));
|
|
||||||
bin_size= my_decimal_get_binary_size(precision, dec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1984,6 +1984,8 @@ public:
|
|||||||
class Field_new_decimal :public Field_num {
|
class Field_new_decimal :public Field_num {
|
||||||
private:
|
private:
|
||||||
int save_field_metadata(uchar *first_byte);
|
int save_field_metadata(uchar *first_byte);
|
||||||
|
void set_and_validate_prec(uint32 len_arg,
|
||||||
|
uint8 dec_arg, bool unsigned_arg);
|
||||||
public:
|
public:
|
||||||
/* The maximum number of decimal digits can be stored */
|
/* The maximum number of decimal digits can be stored */
|
||||||
uint precision;
|
uint precision;
|
||||||
|
@ -5118,6 +5118,9 @@ int handler::calculate_checksum()
|
|||||||
for (uint i= 0; i < table->s->fields; i++ )
|
for (uint i= 0; i < table->s->fields; i++ )
|
||||||
{
|
{
|
||||||
Field *f= table->field[i];
|
Field *f= table->field[i];
|
||||||
|
if (!f->stored_in_db())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
|
||||||
if (! thd->variables.old_mode && f->is_real_null(0))
|
if (! thd->variables.old_mode && f->is_real_null(0))
|
||||||
{
|
{
|
||||||
|
@ -2463,7 +2463,7 @@ void Item_func_round::fix_arg_decimal()
|
|||||||
set_handler(&type_handler_newdecimal);
|
set_handler(&type_handler_newdecimal);
|
||||||
unsigned_flag= args[0]->unsigned_flag;
|
unsigned_flag= args[0]->unsigned_flag;
|
||||||
decimals= args[0]->decimals;
|
decimals= args[0]->decimals;
|
||||||
max_length= float_length(args[0]->decimals) + 1;
|
max_length= args[0]->max_length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -763,6 +763,7 @@ bool Item_subselect::exec()
|
|||||||
|
|
||||||
DBUG_ENTER("Item_subselect::exec");
|
DBUG_ENTER("Item_subselect::exec");
|
||||||
DBUG_ASSERT(fixed);
|
DBUG_ASSERT(fixed);
|
||||||
|
DBUG_ASSERT(!eliminated);
|
||||||
|
|
||||||
DBUG_EXECUTE_IF("Item_subselect",
|
DBUG_EXECUTE_IF("Item_subselect",
|
||||||
Item::Print print(this,
|
Item::Print print(this,
|
||||||
@ -1272,11 +1273,18 @@ bool Item_singlerow_subselect::fix_length_and_dec()
|
|||||||
}
|
}
|
||||||
unsigned_flag= value->unsigned_flag;
|
unsigned_flag= value->unsigned_flag;
|
||||||
/*
|
/*
|
||||||
If there are not tables in subquery then ability to have NULL value
|
If the subquery has no tables (1) and is not a UNION (2), like:
|
||||||
depends on SELECT list (if single row subquery have tables then it
|
|
||||||
always can be NULL if there are not records fetched).
|
(SELECT subq_value)
|
||||||
|
|
||||||
|
then its NULLability is the same as subq_value's NULLability.
|
||||||
|
|
||||||
|
(1): A subquery that uses a table will return NULL when the table is empty.
|
||||||
|
(2): A UNION subquery will return NULL if it produces a "Subquery returns
|
||||||
|
more than one row" error.
|
||||||
*/
|
*/
|
||||||
if (engine->no_tables())
|
if (engine->no_tables() &&
|
||||||
|
engine->engine_type() != subselect_engine::UNION_ENGINE)
|
||||||
maybe_null= engine->may_be_null();
|
maybe_null= engine->may_be_null();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -1312,6 +1320,16 @@ Item* Item_singlerow_subselect::expr_cache_insert_transformer(THD *tmp_thd,
|
|||||||
|
|
||||||
DBUG_ASSERT(thd == tmp_thd);
|
DBUG_ASSERT(thd == tmp_thd);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Do not create subquery cache if the subquery was eliminated.
|
||||||
|
The optimizer may eliminate subquery items (see
|
||||||
|
eliminate_subselect_processor). However it does not update
|
||||||
|
all query's data structures, so the eliminated item may be
|
||||||
|
still reachable.
|
||||||
|
*/
|
||||||
|
if (eliminated)
|
||||||
|
DBUG_RETURN(this);
|
||||||
|
|
||||||
if (expr_cache)
|
if (expr_cache)
|
||||||
DBUG_RETURN(expr_cache);
|
DBUG_RETURN(expr_cache);
|
||||||
|
|
||||||
|
@ -1539,6 +1539,8 @@ void Item_sum_sum::fix_length_and_dec_decimal()
|
|||||||
decimals= args[0]->decimals;
|
decimals= args[0]->decimals;
|
||||||
/* SUM result can't be longer than length(arg) + length(MAX_ROWS) */
|
/* SUM result can't be longer than length(arg) + length(MAX_ROWS) */
|
||||||
int precision= args[0]->decimal_precision() + DECIMAL_LONGLONG_DIGITS;
|
int precision= args[0]->decimal_precision() + DECIMAL_LONGLONG_DIGITS;
|
||||||
|
decimals= MY_MIN(decimals, DECIMAL_MAX_SCALE);
|
||||||
|
precision= MY_MIN(precision, DECIMAL_MAX_PRECISION);
|
||||||
max_length= my_decimal_precision_to_length_no_truncation(precision,
|
max_length= my_decimal_precision_to_length_no_truncation(precision,
|
||||||
decimals,
|
decimals,
|
||||||
unsigned_flag);
|
unsigned_flag);
|
||||||
@ -1954,12 +1956,12 @@ void Item_sum_avg::fix_length_and_dec_decimal()
|
|||||||
{
|
{
|
||||||
Item_sum_sum::fix_length_and_dec_decimal();
|
Item_sum_sum::fix_length_and_dec_decimal();
|
||||||
int precision= args[0]->decimal_precision() + prec_increment;
|
int precision= args[0]->decimal_precision() + prec_increment;
|
||||||
decimals= MY_MIN(args[0]->decimals + prec_increment, DECIMAL_MAX_SCALE);
|
decimals= MY_MIN(args[0]->decimal_scale() + prec_increment, DECIMAL_MAX_SCALE);
|
||||||
max_length= my_decimal_precision_to_length_no_truncation(precision,
|
max_length= my_decimal_precision_to_length_no_truncation(precision,
|
||||||
decimals,
|
decimals,
|
||||||
unsigned_flag);
|
unsigned_flag);
|
||||||
f_precision= MY_MIN(precision+DECIMAL_LONGLONG_DIGITS, DECIMAL_MAX_PRECISION);
|
f_precision= MY_MIN(precision+DECIMAL_LONGLONG_DIGITS, DECIMAL_MAX_PRECISION);
|
||||||
f_scale= args[0]->decimals;
|
f_scale= args[0]->decimal_scale();
|
||||||
dec_bin_size= my_decimal_get_binary_size(f_precision, f_scale);
|
dec_bin_size= my_decimal_get_binary_size(f_precision, f_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
extern const LEX_CSTRING rpl_gtid_slave_state_table_name;
|
extern const LEX_CSTRING rpl_gtid_slave_state_table_name;
|
||||||
|
|
||||||
class String;
|
class String;
|
||||||
|
#define PARAM_GTID(G) G.domain_id, G.server_id, G.seq_no
|
||||||
|
|
||||||
struct rpl_gtid
|
struct rpl_gtid
|
||||||
{
|
{
|
||||||
|
165
sql/slave.cc
165
sql/slave.cc
@ -3214,9 +3214,9 @@ static bool send_show_master_info_data(THD *thd, Master_info *mi, bool full,
|
|||||||
protocol->store((uint32) mi->master_id);
|
protocol->store((uint32) mi->master_id);
|
||||||
// SQL_Delay
|
// SQL_Delay
|
||||||
// Master_Ssl_Crl
|
// Master_Ssl_Crl
|
||||||
protocol->store(mi->ssl_ca, &my_charset_bin);
|
protocol->store(mi->ssl_crl, &my_charset_bin);
|
||||||
// Master_Ssl_Crlpath
|
// Master_Ssl_Crlpath
|
||||||
protocol->store(mi->ssl_capath, &my_charset_bin);
|
protocol->store(mi->ssl_crlpath, &my_charset_bin);
|
||||||
// Using_Gtid
|
// Using_Gtid
|
||||||
protocol->store(mi->using_gtid_astext(mi->using_gtid), &my_charset_bin);
|
protocol->store(mi->using_gtid_astext(mi->using_gtid), &my_charset_bin);
|
||||||
// Gtid_IO_Pos
|
// Gtid_IO_Pos
|
||||||
@ -3315,7 +3315,7 @@ bool show_all_master_info(THD* thd)
|
|||||||
String gtid_pos;
|
String gtid_pos;
|
||||||
Master_info **tmp;
|
Master_info **tmp;
|
||||||
List<Item> field_list;
|
List<Item> field_list;
|
||||||
DBUG_ENTER("show_master_info");
|
DBUG_ENTER("show_all_master_info");
|
||||||
mysql_mutex_assert_owner(&LOCK_active_mi);
|
mysql_mutex_assert_owner(&LOCK_active_mi);
|
||||||
|
|
||||||
gtid_pos.length(0);
|
gtid_pos.length(0);
|
||||||
@ -6573,17 +6573,75 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
|||||||
mi->gtid_event_seen= true;
|
mi->gtid_event_seen= true;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
We have successfully queued to relay log everything before this GTID, so
|
Unless the previous group is malformed,
|
||||||
|
we have successfully queued to relay log everything before this GTID, so
|
||||||
in case of reconnect we can start from after any previous GTID.
|
in case of reconnect we can start from after any previous GTID.
|
||||||
(Normally we would have updated gtid_current_pos earlier at the end of
|
(We must have updated gtid_current_pos earlier at the end of
|
||||||
the previous event group, but better leave an extra check here for
|
the previous event group. Unless ...)
|
||||||
safety).
|
|
||||||
*/
|
*/
|
||||||
if (mi->events_queued_since_last_gtid)
|
if (unlikely(mi->events_queued_since_last_gtid > 0))
|
||||||
{
|
{
|
||||||
mi->gtid_current_pos.update(&mi->last_queued_gtid);
|
/*
|
||||||
mi->events_queued_since_last_gtid= 0;
|
...unless the last group has not been completed. An assert below
|
||||||
|
can be satisfied only with the strict mode that ensures
|
||||||
|
against "genuine" gtid duplicates.
|
||||||
|
*/
|
||||||
|
rpl_gtid *gtid_in_slave_state=
|
||||||
|
mi->gtid_current_pos.find(mi->last_queued_gtid.domain_id);
|
||||||
|
|
||||||
|
// Slave gtid state must not have updated yet to the last received gtid.
|
||||||
|
DBUG_ASSERT((mi->using_gtid == Master_info::USE_GTID_NO ||
|
||||||
|
!opt_gtid_strict_mode) ||
|
||||||
|
(!gtid_in_slave_state ||
|
||||||
|
!(*gtid_in_slave_state == mi->last_queued_gtid)));
|
||||||
|
|
||||||
|
DBUG_EXECUTE_IF("slave_discard_xid_for_gtid_0_x_1000",
|
||||||
|
{
|
||||||
|
/* Inject an event group that is missing its XID commit event. */
|
||||||
|
if ((mi->last_queued_gtid.domain_id == 0 &&
|
||||||
|
mi->last_queued_gtid.seq_no == 1000) ||
|
||||||
|
(mi->last_queued_gtid.domain_id == 1 &&
|
||||||
|
mi->last_queued_gtid.seq_no == 32))
|
||||||
|
{
|
||||||
|
sql_print_warning(
|
||||||
|
"Unexpected break of being relay-logged GTID %u-%u-%llu "
|
||||||
|
"event group by the current GTID event %u-%u-%llu",
|
||||||
|
PARAM_GTID(mi->last_queued_gtid),PARAM_GTID(event_gtid));
|
||||||
|
DBUG_SET("-d,slave_discard_xid_for_gtid_0_x_1000");
|
||||||
|
goto dbug_gtid_accept;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
error= ER_SLAVE_RELAY_LOG_WRITE_FAILURE;
|
||||||
|
sql_print_error("Unexpected break of being relay-logged GTID %u-%u-%llu "
|
||||||
|
"event group by the current GTID event %u-%u-%llu",
|
||||||
|
PARAM_GTID(mi->last_queued_gtid),PARAM_GTID(event_gtid));
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
|
else if (unlikely(mi->gtid_reconnect_event_skip_count > 0))
|
||||||
|
{
|
||||||
|
if (mi->gtid_reconnect_event_skip_count ==
|
||||||
|
mi->events_queued_since_last_gtid)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(event_gtid == mi->last_queued_gtid);
|
||||||
|
|
||||||
|
goto default_action;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBUG_ASSERT(0);
|
||||||
|
}
|
||||||
|
// else_likely{...
|
||||||
|
#ifndef DBUG_OFF
|
||||||
|
dbug_gtid_accept:
|
||||||
|
DBUG_EXECUTE_IF("slave_discard_gtid_0_x_1002",
|
||||||
|
{
|
||||||
|
if (mi->last_queued_gtid.server_id == 27697 &&
|
||||||
|
mi->last_queued_gtid.seq_no == 1002)
|
||||||
|
{
|
||||||
|
DBUG_SET("-d,slave_discard_gtid_0_x_1002");
|
||||||
|
goto skip_relay_logging;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
#endif
|
||||||
mi->last_queued_gtid= event_gtid;
|
mi->last_queued_gtid= event_gtid;
|
||||||
mi->last_queued_gtid_standalone=
|
mi->last_queued_gtid_standalone=
|
||||||
(gtid_flag & Gtid_log_event::FL_STANDALONE) != 0;
|
(gtid_flag & Gtid_log_event::FL_STANDALONE) != 0;
|
||||||
@ -6593,6 +6651,7 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
|||||||
|
|
||||||
++mi->events_queued_since_last_gtid;
|
++mi->events_queued_since_last_gtid;
|
||||||
inc_pos= event_len;
|
inc_pos= event_len;
|
||||||
|
// ...} eof else_likely
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
/*
|
/*
|
||||||
@ -6671,6 +6730,12 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
|||||||
case XID_EVENT:
|
case XID_EVENT:
|
||||||
DBUG_EXECUTE_IF("slave_discard_xid_for_gtid_0_x_1000",
|
DBUG_EXECUTE_IF("slave_discard_xid_for_gtid_0_x_1000",
|
||||||
{
|
{
|
||||||
|
if (mi->last_queued_gtid.server_id == 27697 &&
|
||||||
|
mi->last_queued_gtid.seq_no == 1000)
|
||||||
|
{
|
||||||
|
DBUG_SET("-d,slave_discard_xid_for_gtid_0_x_1000");
|
||||||
|
goto skip_relay_logging;
|
||||||
|
}
|
||||||
/* Inject an event group that is missing its XID commit event. */
|
/* Inject an event group that is missing its XID commit event. */
|
||||||
if (mi->last_queued_gtid.domain_id == 0 &&
|
if (mi->last_queued_gtid.domain_id == 0 &&
|
||||||
mi->last_queued_gtid.seq_no == 1000)
|
mi->last_queued_gtid.seq_no == 1000)
|
||||||
@ -6716,15 +6781,48 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
|||||||
}
|
}
|
||||||
};);
|
};);
|
||||||
|
|
||||||
if (mi->using_gtid != Master_info::USE_GTID_NO && mi->gtid_event_seen)
|
if (mi->using_gtid != Master_info::USE_GTID_NO)
|
||||||
{
|
{
|
||||||
if (unlikely(mi->gtid_reconnect_event_skip_count))
|
if (likely(mi->gtid_event_seen))
|
||||||
{
|
{
|
||||||
--mi->gtid_reconnect_event_skip_count;
|
if (unlikely(mi->gtid_reconnect_event_skip_count))
|
||||||
gtid_skip_enqueue= true;
|
{
|
||||||
|
if (!got_gtid_event &&
|
||||||
|
mi->gtid_reconnect_event_skip_count ==
|
||||||
|
mi->events_queued_since_last_gtid)
|
||||||
|
goto gtid_not_start; // the 1st re-sent must be gtid
|
||||||
|
|
||||||
|
--mi->gtid_reconnect_event_skip_count;
|
||||||
|
gtid_skip_enqueue= true;
|
||||||
|
}
|
||||||
|
else if (likely(mi->events_queued_since_last_gtid))
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(!got_gtid_event);
|
||||||
|
|
||||||
|
++mi->events_queued_since_last_gtid;
|
||||||
|
}
|
||||||
|
else if (Log_event::is_group_event((Log_event_type) (uchar)
|
||||||
|
buf[EVENT_TYPE_OFFSET]))
|
||||||
|
{
|
||||||
|
goto gtid_not_start; // no first gtid event in this group
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (Log_event::is_group_event((Log_event_type) (uchar)
|
||||||
|
buf[EVENT_TYPE_OFFSET]))
|
||||||
|
{
|
||||||
|
gtid_not_start:
|
||||||
|
|
||||||
|
DBUG_ASSERT(!got_gtid_event);
|
||||||
|
|
||||||
|
error= ER_SLAVE_RELAY_LOG_WRITE_FAILURE;
|
||||||
|
sql_print_error("The current group of events starts with "
|
||||||
|
"a non-GTID %s event; "
|
||||||
|
"the last seen GTID is %u-%u-%llu",
|
||||||
|
Log_event::get_type_str((Log_event_type) (uchar)
|
||||||
|
buf[EVENT_TYPE_OFFSET]),
|
||||||
|
mi->last_queued_gtid);
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
else if (mi->events_queued_since_last_gtid)
|
|
||||||
++mi->events_queued_since_last_gtid;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_compress_event)
|
if (!is_compress_event)
|
||||||
@ -6917,11 +7015,13 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
|||||||
The whole of the current event group is queued. So in case of
|
The whole of the current event group is queued. So in case of
|
||||||
reconnect we can start from after the current GTID.
|
reconnect we can start from after the current GTID.
|
||||||
*/
|
*/
|
||||||
if (mi->gtid_reconnect_event_skip_count)
|
if (gtid_skip_enqueue)
|
||||||
{
|
{
|
||||||
bool first= true;
|
bool first= true;
|
||||||
StringBuffer<1024> gtid_text;
|
StringBuffer<1024> gtid_text;
|
||||||
|
|
||||||
|
DBUG_ASSERT(mi->events_queued_since_last_gtid > 1);
|
||||||
|
|
||||||
rpl_slave_state_tostring_helper(>id_text, &mi->last_queued_gtid,
|
rpl_slave_state_tostring_helper(>id_text, &mi->last_queued_gtid,
|
||||||
&first);
|
&first);
|
||||||
sql_print_error("Slave IO thread received a terminal event from "
|
sql_print_error("Slave IO thread received a terminal event from "
|
||||||
@ -6931,12 +7031,39 @@ static int queue_event(Master_info* mi,const char* buf, ulong event_len)
|
|||||||
gtid_text.ptr(),
|
gtid_text.ptr(),
|
||||||
mi->gtid_reconnect_event_skip_count,
|
mi->gtid_reconnect_event_skip_count,
|
||||||
mi->events_queued_since_last_gtid);
|
mi->events_queued_since_last_gtid);
|
||||||
|
error= ER_SLAVE_RELAY_LOG_WRITE_FAILURE;
|
||||||
|
goto err;
|
||||||
}
|
}
|
||||||
mi->gtid_current_pos.update(&mi->last_queued_gtid);
|
mi->gtid_current_pos.update(&mi->last_queued_gtid);
|
||||||
mi->events_queued_since_last_gtid= 0;
|
mi->events_queued_since_last_gtid= 0;
|
||||||
|
|
||||||
/* Reset the domain_id_filter flag. */
|
if (unlikely(gtid_skip_enqueue))
|
||||||
mi->domain_id_filter.reset_filter();
|
{
|
||||||
|
error= ER_SLAVE_RELAY_LOG_WRITE_FAILURE;
|
||||||
|
sql_print_error("Recieved a group closing %s event "
|
||||||
|
"at %llu position in the group while there are "
|
||||||
|
"still %llu events to skip upon reconnecting; "
|
||||||
|
"the last seen GTID is %u-%u-%llu",
|
||||||
|
Log_event::get_type_str((Log_event_type) (uchar)
|
||||||
|
buf[EVENT_TYPE_OFFSET]),
|
||||||
|
(mi->events_queued_since_last_gtid -
|
||||||
|
mi->gtid_reconnect_event_skip_count),
|
||||||
|
mi->events_queued_since_last_gtid,
|
||||||
|
mi->last_queued_gtid);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
The whole of the current event group is queued. So in case of
|
||||||
|
reconnect we can start from after the current GTID.
|
||||||
|
*/
|
||||||
|
mi->gtid_current_pos.update(&mi->last_queued_gtid);
|
||||||
|
mi->events_queued_since_last_gtid= 0;
|
||||||
|
|
||||||
|
/* Reset the domain_id_filter flag. */
|
||||||
|
mi->domain_id_filter.reset_filter();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
skip_relay_logging:
|
skip_relay_logging:
|
||||||
|
@ -312,3 +312,12 @@ sp_cache::cleanup()
|
|||||||
{
|
{
|
||||||
my_hash_free(&m_hashtable);
|
my_hash_free(&m_hashtable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Sp_caches::sp_caches_clear()
|
||||||
|
{
|
||||||
|
sp_cache_clear(&sp_proc_cache);
|
||||||
|
sp_cache_clear(&sp_func_cache);
|
||||||
|
sp_cache_clear(&sp_package_spec_cache);
|
||||||
|
sp_cache_clear(&sp_package_body_cache);
|
||||||
|
}
|
||||||
|
@ -791,7 +791,7 @@ void
|
|||||||
sp_head::set_stmt_end(THD *thd)
|
sp_head::set_stmt_end(THD *thd)
|
||||||
{
|
{
|
||||||
Lex_input_stream *lip= & thd->m_parser_state->m_lip; /* shortcut */
|
Lex_input_stream *lip= & thd->m_parser_state->m_lip; /* shortcut */
|
||||||
const char *end_ptr= lip->get_cpp_ptr(); /* shortcut */
|
const char *end_ptr= lip->get_cpp_tok_start(); /* shortcut */
|
||||||
|
|
||||||
/* Make the string of parameters. */
|
/* Make the string of parameters. */
|
||||||
|
|
||||||
|
@ -812,11 +812,6 @@ THD::THD(my_thread_id id, bool is_wsrep_applier)
|
|||||||
(my_hash_get_key) get_sequence_last_key,
|
(my_hash_get_key) get_sequence_last_key,
|
||||||
(my_hash_free_key) free_sequence_last, HASH_THREAD_SPECIFIC);
|
(my_hash_free_key) free_sequence_last, HASH_THREAD_SPECIFIC);
|
||||||
|
|
||||||
sp_proc_cache= NULL;
|
|
||||||
sp_func_cache= NULL;
|
|
||||||
sp_package_spec_cache= NULL;
|
|
||||||
sp_package_body_cache= NULL;
|
|
||||||
|
|
||||||
/* For user vars replication*/
|
/* For user vars replication*/
|
||||||
if (opt_bin_log)
|
if (opt_bin_log)
|
||||||
my_init_dynamic_array(&user_var_events,
|
my_init_dynamic_array(&user_var_events,
|
||||||
@ -1383,10 +1378,7 @@ void THD::change_user(void)
|
|||||||
my_hash_init(&sequences, system_charset_info, SEQUENCES_HASH_SIZE, 0, 0,
|
my_hash_init(&sequences, system_charset_info, SEQUENCES_HASH_SIZE, 0, 0,
|
||||||
(my_hash_get_key) get_sequence_last_key,
|
(my_hash_get_key) get_sequence_last_key,
|
||||||
(my_hash_free_key) free_sequence_last, HASH_THREAD_SPECIFIC);
|
(my_hash_free_key) free_sequence_last, HASH_THREAD_SPECIFIC);
|
||||||
sp_cache_clear(&sp_proc_cache);
|
sp_caches_clear();
|
||||||
sp_cache_clear(&sp_func_cache);
|
|
||||||
sp_cache_clear(&sp_package_spec_cache);
|
|
||||||
sp_cache_clear(&sp_package_body_cache);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1512,10 +1504,7 @@ void THD::cleanup(void)
|
|||||||
|
|
||||||
my_hash_free(&user_vars);
|
my_hash_free(&user_vars);
|
||||||
my_hash_free(&sequences);
|
my_hash_free(&sequences);
|
||||||
sp_cache_clear(&sp_proc_cache);
|
sp_caches_clear();
|
||||||
sp_cache_clear(&sp_func_cache);
|
|
||||||
sp_cache_clear(&sp_package_spec_cache);
|
|
||||||
sp_cache_clear(&sp_package_body_cache);
|
|
||||||
auto_inc_intervals_forced.empty();
|
auto_inc_intervals_forced.empty();
|
||||||
auto_inc_intervals_in_cur_stmt_for_binlog.empty();
|
auto_inc_intervals_in_cur_stmt_for_binlog.empty();
|
||||||
|
|
||||||
|
@ -2167,6 +2167,39 @@ struct wait_for_commit
|
|||||||
void reinit();
|
void reinit();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class Sp_caches
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
sp_cache *sp_proc_cache;
|
||||||
|
sp_cache *sp_func_cache;
|
||||||
|
sp_cache *sp_package_spec_cache;
|
||||||
|
sp_cache *sp_package_body_cache;
|
||||||
|
Sp_caches()
|
||||||
|
:sp_proc_cache(NULL),
|
||||||
|
sp_func_cache(NULL),
|
||||||
|
sp_package_spec_cache(NULL),
|
||||||
|
sp_package_body_cache(NULL)
|
||||||
|
{ }
|
||||||
|
~Sp_caches()
|
||||||
|
{
|
||||||
|
// All caches must be freed by the caller explicitly
|
||||||
|
DBUG_ASSERT(sp_proc_cache == NULL);
|
||||||
|
DBUG_ASSERT(sp_func_cache == NULL);
|
||||||
|
DBUG_ASSERT(sp_package_spec_cache == NULL);
|
||||||
|
DBUG_ASSERT(sp_package_body_cache == NULL);
|
||||||
|
}
|
||||||
|
void sp_caches_swap(Sp_caches &rhs)
|
||||||
|
{
|
||||||
|
swap_variables(sp_cache*, sp_proc_cache, rhs.sp_proc_cache);
|
||||||
|
swap_variables(sp_cache*, sp_func_cache, rhs.sp_func_cache);
|
||||||
|
swap_variables(sp_cache*, sp_package_spec_cache, rhs.sp_package_spec_cache);
|
||||||
|
swap_variables(sp_cache*, sp_package_body_cache, rhs.sp_package_body_cache);
|
||||||
|
}
|
||||||
|
void sp_caches_clear();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
extern "C" void my_message_sql(uint error, const char *str, myf MyFlags);
|
extern "C" void my_message_sql(uint error, const char *str, myf MyFlags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2185,7 +2218,8 @@ class THD :public Statement,
|
|||||||
*/
|
*/
|
||||||
public Item_change_list,
|
public Item_change_list,
|
||||||
public MDL_context_owner,
|
public MDL_context_owner,
|
||||||
public Open_tables_state
|
public Open_tables_state,
|
||||||
|
public Sp_caches
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
inline bool is_stmt_prepare() const
|
inline bool is_stmt_prepare() const
|
||||||
@ -3180,10 +3214,6 @@ public:
|
|||||||
enum_sql_command last_sql_command; // Last sql_command exceuted in mysql_execute_command()
|
enum_sql_command last_sql_command; // Last sql_command exceuted in mysql_execute_command()
|
||||||
|
|
||||||
sp_rcontext *spcont; // SP runtime context
|
sp_rcontext *spcont; // SP runtime context
|
||||||
sp_cache *sp_proc_cache;
|
|
||||||
sp_cache *sp_func_cache;
|
|
||||||
sp_cache *sp_package_spec_cache;
|
|
||||||
sp_cache *sp_package_body_cache;
|
|
||||||
|
|
||||||
/** number of name_const() substitutions, see sp_head.cc:subst_spvars() */
|
/** number of name_const() substitutions, see sp_head.cc:subst_spvars() */
|
||||||
uint query_name_consts;
|
uint query_name_consts;
|
||||||
|
@ -63,7 +63,7 @@ void Expression_cache_tmptable::disable_cache()
|
|||||||
cache_table= NULL;
|
cache_table= NULL;
|
||||||
update_tracker();
|
update_tracker();
|
||||||
if (tracker)
|
if (tracker)
|
||||||
tracker->cache= NULL;
|
tracker->detach_from_cache();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -189,6 +189,8 @@ Expression_cache_tmptable::~Expression_cache_tmptable()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
update_tracker();
|
update_tracker();
|
||||||
|
if (tracker)
|
||||||
|
tracker->detach_from_cache();
|
||||||
tracker= NULL;
|
tracker= NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,11 @@ public:
|
|||||||
cache(c), hit(0), miss(0), state(UNINITED)
|
cache(c), hit(0), miss(0), state(UNINITED)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
private:
|
||||||
|
// This can be NULL if the cache is already deleted
|
||||||
Expression_cache *cache;
|
Expression_cache *cache;
|
||||||
|
|
||||||
|
public:
|
||||||
ulong hit, miss;
|
ulong hit, miss;
|
||||||
enum expr_cache_state state;
|
enum expr_cache_state state;
|
||||||
|
|
||||||
@ -91,6 +95,7 @@ public:
|
|||||||
void set(ulong h, ulong m, enum expr_cache_state s)
|
void set(ulong h, ulong m, enum expr_cache_state s)
|
||||||
{hit= h; miss= m; state= s;}
|
{hit= h; miss= m; state= s;}
|
||||||
|
|
||||||
|
void detach_from_cache() { cache= NULL; }
|
||||||
void fetch_current_stats()
|
void fetch_current_stats()
|
||||||
{
|
{
|
||||||
if (cache)
|
if (cache)
|
||||||
|
@ -701,8 +701,10 @@ mysql_ha_fix_cond_and_key(SQL_HANDLER *handler,
|
|||||||
if (!in_prepare)
|
if (!in_prepare)
|
||||||
{
|
{
|
||||||
MY_BITMAP *old_map= dbug_tmp_use_all_columns(table, &table->write_set);
|
MY_BITMAP *old_map= dbug_tmp_use_all_columns(table, &table->write_set);
|
||||||
(void) item->save_in_field(key_part->field, 1);
|
int res= item->save_in_field(key_part->field, 1);
|
||||||
dbug_tmp_restore_column_map(&table->write_set, old_map);
|
dbug_tmp_restore_column_map(&table->write_set, old_map);
|
||||||
|
if (res)
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
key_len+= key_part->store_length;
|
key_len+= key_part->store_length;
|
||||||
keypart_map= (keypart_map << 1) | 1;
|
keypart_map= (keypart_map << 1) | 1;
|
||||||
|
@ -17144,8 +17144,7 @@ Field *create_tmp_field_from_field(THD *thd, Field *org_field,
|
|||||||
table->s->db_create_options|= HA_OPTION_PACK_RECORD;
|
table->s->db_create_options|= HA_OPTION_PACK_RECORD;
|
||||||
else if (org_field->type() == FIELD_TYPE_DOUBLE)
|
else if (org_field->type() == FIELD_TYPE_DOUBLE)
|
||||||
((Field_double *) new_field)->not_fixed= TRUE;
|
((Field_double *) new_field)->not_fixed= TRUE;
|
||||||
new_field->vcol_info= new_field->default_value=
|
new_field->vcol_info= 0;
|
||||||
new_field->check_constraint= 0;
|
|
||||||
new_field->cond_selectivity= 1.0;
|
new_field->cond_selectivity= 1.0;
|
||||||
new_field->next_equal_field= NULL;
|
new_field->next_equal_field= NULL;
|
||||||
new_field->option_list= NULL;
|
new_field->option_list= NULL;
|
||||||
@ -17740,6 +17739,7 @@ create_tmp_table(THD *thd, TMP_TABLE_PARAM *param, List<Item> &fields,
|
|||||||
table->intersect_keys.init();
|
table->intersect_keys.init();
|
||||||
table->keys_in_use_for_query.init();
|
table->keys_in_use_for_query.init();
|
||||||
table->no_rows_with_nulls= param->force_not_null_cols;
|
table->no_rows_with_nulls= param->force_not_null_cols;
|
||||||
|
table->expr_arena= thd;
|
||||||
|
|
||||||
table->s= share;
|
table->s= share;
|
||||||
init_tmp_table_share(thd, share, "", 0, "(temporary)", tmpname);
|
init_tmp_table_share(thd, share, "", 0, "(temporary)", tmpname);
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user