mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge branch 'master' into query_parameters
This commit is contained in:
commit
dd3b0e4140
@ -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);
|
||||
|
||||
const auto & create_defines = create_query.columns_list->as<MySQLParser::ASTCreateDefines>();
|
||||
|
||||
if (!create_defines || !create_defines->columns || create_defines->columns->children.empty())
|
||||
throw Exception("Missing definition of columns.", ErrorCodes::EMPTY_LIST_OF_COLUMNS_PASSED);
|
||||
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())
|
||||
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);
|
||||
|
@ -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")
|
||||
|
@ -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):
|
||||
|
Loading…
Reference in New Issue
Block a user