Merge branch 'master' into query_parameters

This commit is contained in:
Nikolay Degterinsky 2021-11-16 12:42:26 +00:00
commit dd3b0e4140
3 changed files with 55 additions and 9 deletions

View File

@ -421,23 +421,42 @@ static ASTPtr getOrderByPolicy(
void InterpreterCreateImpl::validate(const InterpreterCreateImpl::TQuery & create_query, ContextPtr)
{
/// This is dangerous, because the like table may not exists in ClickHouse
if (create_query.like_table)
throw Exception("Cannot convert create like statement to ClickHouse SQL", ErrorCodes::NOT_IMPLEMENTED);
if (!create_query.like_table)
{
bool missing_columns_definition = true;
if (create_query.columns_list)
{
const auto & create_defines = create_query.columns_list->as<MySQLParser::ASTCreateDefines>();
if (!create_defines || !create_defines->columns || create_defines->columns->children.empty())
if (create_defines && create_defines->columns && !create_defines->columns->children.empty())
missing_columns_definition = false;
}
if (missing_columns_definition)
throw Exception("Missing definition of columns.", ErrorCodes::EMPTY_LIST_OF_COLUMNS_PASSED);
}
}
ASTs InterpreterCreateImpl::getRewrittenQueries(
const TQuery & create_query, ContextPtr context, const String & mapped_to_database, const String & mysql_database)
{
auto rewritten_query = std::make_shared<ASTCreateQuery>();
if (resolveDatabase(create_query.database, mysql_database, mapped_to_database, context) != mapped_to_database)
return {};
if (create_query.like_table)
{
auto * table_like = create_query.like_table->as<ASTTableIdentifier>();
if (table_like->compound() && table_like->getTableId().database_name != mysql_database)
return {};
String table_name = table_like->shortName();
ASTPtr rewritten_create_ast = DatabaseCatalog::instance().getDatabase(mapped_to_database)->getCreateTableQuery(table_name, context);
auto * create_ptr = rewritten_create_ast->as<ASTCreateQuery>();
create_ptr->database = mapped_to_database;
create_ptr->table = create_query.table;
create_ptr->uuid = UUIDHelpers::generateV4();
create_ptr->if_not_exists = create_query.if_not_exists;
return ASTs{rewritten_create_ast};
}
auto rewritten_query = std::make_shared<ASTCreateQuery>();
const auto & create_defines = create_query.columns_list->as<MySQLParser::ASTCreateDefines>();
NamesAndTypesList columns_name_and_type = getColumnsList(create_defines->columns);

View File

@ -225,6 +225,31 @@ def drop_table_with_materialized_mysql_database(clickhouse_node, mysql_node, ser
mysql_node.query("DROP DATABASE test_database_drop")
def create_table_like_with_materialize_mysql_database(clickhouse_node, mysql_node, service_name):
mysql_node.query("DROP DATABASE IF EXISTS create_like")
mysql_node.query("DROP DATABASE IF EXISTS create_like2")
clickhouse_node.query("DROP DATABASE IF EXISTS create_like")
mysql_node.query("CREATE DATABASE create_like")
mysql_node.query("CREATE DATABASE create_like2")
mysql_node.query("CREATE TABLE create_like.t1 (id INT NOT NULL PRIMARY KEY)")
mysql_node.query("CREATE TABLE create_like2.t1 LIKE create_like.t1")
clickhouse_node.query(
f"CREATE DATABASE create_like ENGINE = MaterializeMySQL('{service_name}:3306', 'create_like', 'root', 'clickhouse')")
mysql_node.query("CREATE TABLE create_like.t2 LIKE create_like.t1")
mysql_node.query("USE create_like")
mysql_node.query("CREATE TABLE t3 LIKE create_like2.t1")
mysql_node.query("CREATE TABLE t4 LIKE t1")
check_query(clickhouse_node, "SHOW TABLES FROM create_like", "t1\nt2\nt4\n")
check_query(clickhouse_node, "SHOW DATABASES LIKE 'create_like%'", "create_like\n")
clickhouse_node.query("DROP DATABASE create_like")
mysql_node.query("DROP DATABASE create_like")
mysql_node.query("DROP DATABASE create_like2")
def create_table_with_materialized_mysql_database(clickhouse_node, mysql_node, service_name):
mysql_node.query("DROP DATABASE IF EXISTS test_database_create")
clickhouse_node.query("DROP DATABASE IF EXISTS test_database_create")

View File

@ -117,6 +117,7 @@ def test_materialize_database_ddl_with_mysql_5_7(started_cluster, started_mysql_
# materialize_with_ddl.alter_rename_column_with_materialized_mysql_database(clickhouse_node, started_mysql_5_7, "mysql57")
materialize_with_ddl.alter_rename_table_with_materialized_mysql_database(clickhouse_node, started_mysql_5_7, "mysql57")
materialize_with_ddl.alter_modify_column_with_materialized_mysql_database(clickhouse_node, started_mysql_5_7, "mysql57")
materialize_with_ddl.create_table_like_with_materialize_mysql_database(clickhouse_node, started_mysql_5_7, "mysql57")
@pytest.mark.parametrize(('clickhouse_node'), [pytest.param(node_db_ordinary, id="ordinary"), pytest.param(node_db_atomic, id="atomic")])
def test_materialize_database_ddl_with_mysql_8_0(started_cluster, started_mysql_8_0, clickhouse_node):
@ -128,6 +129,7 @@ def test_materialize_database_ddl_with_mysql_8_0(started_cluster, started_mysql_
materialize_with_ddl.alter_rename_table_with_materialized_mysql_database(clickhouse_node, started_mysql_8_0, "mysql80")
materialize_with_ddl.alter_rename_column_with_materialized_mysql_database(clickhouse_node, started_mysql_8_0, "mysql80")
materialize_with_ddl.alter_modify_column_with_materialized_mysql_database(clickhouse_node, started_mysql_8_0, "mysql80")
materialize_with_ddl.create_table_like_with_materialize_mysql_database(clickhouse_node, started_mysql_8_0, "mysql80")
@pytest.mark.parametrize(('clickhouse_node'), [pytest.param(node_db_ordinary, id="ordinary"), pytest.param(node_db_atomic, id="atomic")])
def test_materialize_database_ddl_with_empty_transaction_5_7(started_cluster, started_mysql_5_7, clickhouse_node):