Merge branch '2.3' into 2.4
This commit is contained in:
@ -1007,6 +1007,9 @@ add_test_executable(mxs2609_history_replay.cpp mxs2609_history_replay mxs2609_hi
|
|||||||
# MXS-2621: Incorrect SQL if lower_case_table_names is used.
|
# MXS-2621: Incorrect SQL if lower_case_table_names is used.
|
||||||
add_test_executable(mxs2621_lower_case_tables.cpp mxs2621_lower_case_tables mxs2621_lower_case_tables LABELS REPL_BACKEND)
|
add_test_executable(mxs2621_lower_case_tables.cpp mxs2621_lower_case_tables mxs2621_lower_case_tables LABELS REPL_BACKEND)
|
||||||
|
|
||||||
|
# MXS-2631: Duplicate system tables not ignored
|
||||||
|
add_test_executable(mxs2631_ignore_system_tables.cpp mxs2631_ignore_system_tables mxs2631_ignore_system_tables LABELS schemarouter BREAKS_REPL REPL_BACKEND)
|
||||||
|
|
||||||
############################################
|
############################################
|
||||||
# END: Normal tests #
|
# END: Normal tests #
|
||||||
############################################
|
############################################
|
||||||
|
@ -0,0 +1,59 @@
|
|||||||
|
[maxscale]
|
||||||
|
threads=###threads###
|
||||||
|
log_warning=1
|
||||||
|
|
||||||
|
[MySQL-Monitor]
|
||||||
|
type=monitor
|
||||||
|
module=mysqlmon
|
||||||
|
servers=server1,server2,server3,server4
|
||||||
|
user=maxskysql
|
||||||
|
password=skysql
|
||||||
|
|
||||||
|
[Sharding-router]
|
||||||
|
type=service
|
||||||
|
router=schemarouter
|
||||||
|
servers=server1,server2,server3,server4
|
||||||
|
user=maxskysql
|
||||||
|
password=skysql
|
||||||
|
auth_all_servers=1
|
||||||
|
ignore_databases_regex=^(?!(mysql|information_schema|performance_schema))
|
||||||
|
|
||||||
|
[Sharding-Listener]
|
||||||
|
type=listener
|
||||||
|
service=Sharding-router
|
||||||
|
protocol=MySQLClient
|
||||||
|
port=4006
|
||||||
|
|
||||||
|
[CLI]
|
||||||
|
type=service
|
||||||
|
router=cli
|
||||||
|
|
||||||
|
[CLI-Listener]
|
||||||
|
type=listener
|
||||||
|
service=CLI
|
||||||
|
protocol=maxscaled
|
||||||
|
socket=default
|
||||||
|
|
||||||
|
[server1]
|
||||||
|
type=server
|
||||||
|
address=###node_server_IP_1###
|
||||||
|
port=###node_server_port_1###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
||||||
|
[server2]
|
||||||
|
type=server
|
||||||
|
address=###node_server_IP_2###
|
||||||
|
port=###node_server_port_2###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
||||||
|
[server3]
|
||||||
|
type=server
|
||||||
|
address=###node_server_IP_3###
|
||||||
|
port=###node_server_port_3###
|
||||||
|
protocol=MySQLBackend
|
||||||
|
|
||||||
|
[server4]
|
||||||
|
type=server
|
||||||
|
address=###node_server_IP_4###
|
||||||
|
port=###node_server_port_4###
|
||||||
|
protocol=MySQLBackend
|
25
maxscale-system-test/mxs2631_ignore_system_tables.cpp
Normal file
25
maxscale-system-test/mxs2631_ignore_system_tables.cpp
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/**
|
||||||
|
* MXS-2631: Dublicate system tables found
|
||||||
|
*
|
||||||
|
* https://jira.mariadb.org/browse/MXS-2631
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
#include "testconnections.h"
|
||||||
|
|
||||||
|
int main(int argc, char* argv[])
|
||||||
|
{
|
||||||
|
TestConnections test(argc, argv);
|
||||||
|
test.set_timeout(30);
|
||||||
|
|
||||||
|
MYSQL* conn = test.maxscales->open_rwsplit_connection(0);
|
||||||
|
|
||||||
|
test.add_result(execute_query(conn, "SELECT 1"), "Query should succeed.");
|
||||||
|
|
||||||
|
mysql_close(conn);
|
||||||
|
test.stop_timeout();
|
||||||
|
sleep(1);
|
||||||
|
test.repl->fix_replication();
|
||||||
|
return test.global_result;
|
||||||
|
}
|
@ -40,10 +40,6 @@ Config::Config(MXS_CONFIG_PARAMETER* conf)
|
|||||||
ignore_match_data = pcre2_match_data_create_from_pattern(ignore_regex, NULL);
|
ignore_match_data = pcre2_match_data_create_from_pattern(ignore_regex, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
ignored_dbs.insert("mysql");
|
|
||||||
ignored_dbs.insert("information_schema");
|
|
||||||
ignored_dbs.insert("performance_schema");
|
|
||||||
|
|
||||||
std::string ignored_dbs_str = conf->get_string(CN_IGNORE_TABLES);
|
std::string ignored_dbs_str = conf->get_string(CN_IGNORE_TABLES);
|
||||||
if (ignored_dbs_str.empty())
|
if (ignored_dbs_str.empty())
|
||||||
{
|
{
|
||||||
@ -59,7 +55,7 @@ Config::Config(MXS_CONFIG_PARAMETER* conf)
|
|||||||
{
|
{
|
||||||
for (const auto& a : mxs::strtok(ignored_dbs_str, ", \t"))
|
for (const auto& a : mxs::strtok(ignored_dbs_str, ", \t"))
|
||||||
{
|
{
|
||||||
ignored_dbs.insert(a);
|
ignored_tables.insert(a);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,9 +49,9 @@ struct Config
|
|||||||
bool refresh_databases; /**< Are databases refreshed when
|
bool refresh_databases; /**< Are databases refreshed when
|
||||||
* they are not found in the hashtable */
|
* they are not found in the hashtable */
|
||||||
bool debug; /**< Enable verbose debug messages to clients */
|
bool debug; /**< Enable verbose debug messages to clients */
|
||||||
pcre2_code* ignore_regex; /**< Regular expression used to ignore databases */
|
pcre2_code* ignore_regex; /**< Regular expression used to ignore tables */
|
||||||
pcre2_match_data* ignore_match_data;/**< Match data for @c ignore_regex */
|
pcre2_match_data* ignore_match_data;/**< Match data for @c ignore_regex */
|
||||||
std::set<std::string> ignored_dbs; /**< Set of ignored databases */
|
std::set<std::string> ignored_tables; /**< Set of ignored tables */
|
||||||
SERVER* preferred_server; /**< Server to prefer in conflict situations */
|
SERVER* preferred_server; /**< Server to prefer in conflict situations */
|
||||||
|
|
||||||
Config(MXS_CONFIG_PARAMETER* conf);
|
Config(MXS_CONFIG_PARAMETER* conf);
|
||||||
|
@ -1194,11 +1194,12 @@ char* get_lenenc_str(void* data)
|
|||||||
|
|
||||||
static const std::set<std::string> always_ignore = {"mysql", "information_schema", "performance_schema"};
|
static const std::set<std::string> always_ignore = {"mysql", "information_schema", "performance_schema"};
|
||||||
|
|
||||||
bool SchemaRouterSession::ignore_duplicate_database(const char* data)
|
bool SchemaRouterSession::ignore_duplicate_table(const std::string& data)
|
||||||
{
|
{
|
||||||
bool rval = false;
|
bool rval = false;
|
||||||
|
|
||||||
if (m_config->ignored_dbs.count(data) || always_ignore.count(data))
|
std::string db = data.substr(0, data.find("."));
|
||||||
|
if (m_config->ignored_tables.count(data) || always_ignore.count(db))
|
||||||
{
|
{
|
||||||
rval = true;
|
rval = true;
|
||||||
}
|
}
|
||||||
@ -1212,7 +1213,7 @@ bool SchemaRouterSession::ignore_duplicate_database(const char* data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (pcre2_match(m_config->ignore_regex,
|
if (pcre2_match(m_config->ignore_regex,
|
||||||
(PCRE2_SPTR) data,
|
(PCRE2_SPTR) data.c_str(),
|
||||||
PCRE2_ZERO_TERMINATED,
|
PCRE2_ZERO_TERMINATED,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
@ -1304,7 +1305,7 @@ enum showdb_response SchemaRouterSession::parse_mapping_response(SSRBackend& bre
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!ignore_duplicate_database(data))
|
if (strchr(data, '.') != NULL && !ignore_duplicate_table(std::string(data)))
|
||||||
{
|
{
|
||||||
duplicate_found = true;
|
duplicate_found = true;
|
||||||
SERVER* duplicate = m_shard.get_location(data);
|
SERVER* duplicate = m_shard.get_location(data);
|
||||||
|
@ -129,7 +129,7 @@ private:
|
|||||||
bool get_shard_dcb(DCB** dcb, const char* name);
|
bool get_shard_dcb(DCB** dcb, const char* name);
|
||||||
bool have_servers();
|
bool have_servers();
|
||||||
bool handle_default_db();
|
bool handle_default_db();
|
||||||
bool ignore_duplicate_database(const char* data);
|
bool ignore_duplicate_table(const std::string& data);
|
||||||
SERVER* get_query_target(GWBUF* buffer);
|
SERVER* get_query_target(GWBUF* buffer);
|
||||||
SERVER* get_ps_target(GWBUF* buffer, uint32_t qtype, qc_query_op_t op);
|
SERVER* get_ps_target(GWBUF* buffer, uint32_t qtype, qc_query_op_t op);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user