to fix issue 42856 and MaterializedMySQL improvement

This commit is contained in:
zzsmdfj 2022-11-03 20:21:02 +08:00
parent 404a9a0135
commit eeb9c57c59
6 changed files with 27 additions and 5 deletions

View File

@ -116,9 +116,10 @@ namespace MySQLReplication
if (!query.starts_with("XA COMMIT"))
transaction_complete = false;
}
else if (query.starts_with("SAVEPOINT"))
else if (query.starts_with("SAVEPOINT") || query.starts_with("ROLLBACK")
|| query.starts_with("RELEASE SAVEPOINT"))
{
throw ReplicationError("ParseQueryEvent: Unsupported query event:" + query, ErrorCodes::LOGICAL_ERROR);
typ = QUERY_EVENT_OTHER;
}
}
@ -941,6 +942,8 @@ namespace MySQLReplication
{
case QUERY_EVENT_MULTI_TXN_FLAG:
case QUERY_EVENT_XA:
/// Ignore queries that have no impact on the data
case QUERY_EVENT_OTHER:
{
event = std::make_shared<DryRunEvent>(std::move(query->header));
break;

View File

@ -368,7 +368,8 @@ namespace MySQLReplication
{
QUERY_EVENT_DDL = 0,
QUERY_EVENT_MULTI_TXN_FLAG = 1,
QUERY_EVENT_XA = 2
QUERY_EVENT_XA = 2,
QUERY_EVENT_OTHER = 3
};
class QueryEvent : public EventBase

View File

@ -55,7 +55,7 @@ DataTypePtr convertMySQLDataType(MultiEnum<MySQLDataTypesSupport> type_support,
else
res = std::make_shared<DataTypeInt16>();
}
else if (type_name == "int" || type_name == "mediumint")
else if (type_name == "int" || type_name == "mediumint" || type_name == "integer")
{
if (is_unsigned)
res = std::make_shared<DataTypeUInt32>();

View File

@ -267,7 +267,12 @@ static inline bool parseRenameCommand(IParser::Pos & pos, ASTPtr & node, Expecte
}
else
{
return false;
if (!ParserCompoundIdentifier(true).parse(pos, new_name, expected))
return false;
auto new_table_id = new_name->as<ASTTableIdentifier>()->getTableId();
alter_command->type = ASTAlterCommand::RENAME_TABLE;
alter_command->new_table_name = new_table_id.table_name;
alter_command->new_database_name = new_table_id.database_name;
}
node = alter_command;
@ -306,6 +311,7 @@ static inline bool parseOtherCommand(IParser::Pos & pos, ASTPtr & node, Expected
OptionDescribe("CONVERT TO CHARACTER SET", "charset", std::make_shared<ParserCharsetOrCollateName>()),
OptionDescribe("CHARACTER SET", "charset", std::make_shared<ParserCharsetOrCollateName>()),
OptionDescribe("DEFAULT CHARACTER SET", "charset", std::make_shared<ParserCharsetOrCollateName>()),
OptionDescribe("COMMENT", "", std::make_shared<ParserIdentifier>()),
OptionDescribe("LOCK", "lock", std::make_shared<ParserIdentifier>())
}
};

View File

@ -52,6 +52,7 @@ static inline bool parseColumnDeclareOptions(IParser::Pos & pos, ASTPtr & node,
OptionDescribe("KEY", "primary_key", std::make_unique<ParserAlwaysTrue>()),
OptionDescribe("COMMENT", "comment", std::make_unique<ParserStringLiteral>()),
OptionDescribe("CHARACTER SET", "charset_name", std::make_unique<ParserCharsetOrCollateName>()),
OptionDescribe("CHARSET", "charset", std::make_unique<ParserCharsetOrCollateName>()),
OptionDescribe("COLLATE", "collate", std::make_unique<ParserCharsetOrCollateName>()),
OptionDescribe("COLUMN_FORMAT", "column_format", std::make_unique<ParserIdentifier>()),
OptionDescribe("STORAGE", "storage", std::make_unique<ParserIdentifier>()),
@ -59,6 +60,7 @@ static inline bool parseColumnDeclareOptions(IParser::Pos & pos, ASTPtr & node,
OptionDescribe("GENERATED ALWAYS AS", "generated", std::make_unique<ParserExpression>()),
OptionDescribe("STORED", "is_stored", std::make_unique<ParserAlwaysTrue>()),
OptionDescribe("VIRTUAL", "is_stored", std::make_unique<ParserAlwaysFalse>()),
OptionDescribe("INVISIBLE", "", std::make_unique<ParserAlwaysTrue>()),
OptionDescribe("", "reference", std::make_unique<ParserDeclareReference>()),
OptionDescribe("", "constraint", std::make_unique<ParserDeclareConstraint>()),
}

View File

@ -875,6 +875,16 @@ def alter_rename_table_with_materialized_mysql_database(
"1\n2\n3\n4\n5\n",
)
mysql_node.query("ALTER TABLE test_database_rename_table.test_table_4 RENAME test_database_rename_table.test_table_5")
mysql_node.query("ALTER TABLE test_database_rename_table.test_table_5 RENAME TO test_database_rename_table.test_table_6")
mysql_node.query("ALTER TABLE test_database_rename_table.test_table_6 RENAME AS test_database_rename_table.test_table_7")
check_query(
clickhouse_node,
"SELECT * FROM test_database_rename_table.test_table_7 ORDER BY id FORMAT TSV",
"1\n2\n3\n4\n5\n",
)
clickhouse_node.query("DROP DATABASE test_database_rename_table")
mysql_node.query("DROP DATABASE test_database_rename_table")