mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-10 01:25:21 +00:00
Merge pull request #61365 from evillique/fix-attach-on-cluster
Fix ATTACH query with external ON CLUSTER
This commit is contained in:
commit
008c252a26
@ -1087,8 +1087,9 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
|
||||
// If this is a stub ATTACH query, read the query definition from the database
|
||||
if (create.attach && !create.storage && !create.columns_list)
|
||||
{
|
||||
auto database = DatabaseCatalog::instance().getDatabase(database_name);
|
||||
if (database->shouldReplicateQuery(getContext(), query_ptr))
|
||||
// In case of an ON CLUSTER query, the database may not be present on the initiator node
|
||||
auto database = DatabaseCatalog::instance().tryGetDatabase(database_name);
|
||||
if (database && database->shouldReplicateQuery(getContext(), query_ptr))
|
||||
{
|
||||
auto guard = DatabaseCatalog::instance().getDDLGuard(database_name, create.getTable());
|
||||
create.setDatabase(database_name);
|
||||
@ -1099,6 +1100,9 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
|
||||
if (!create.cluster.empty())
|
||||
return executeQueryOnCluster(create);
|
||||
|
||||
if (!database)
|
||||
throw Exception(ErrorCodes::UNKNOWN_DATABASE, "Database {} does not exist", backQuoteIfNeed(database_name));
|
||||
|
||||
/// For short syntax of ATTACH query we have to lock table name here, before reading metadata
|
||||
/// and hold it until table is attached
|
||||
if (likely(need_ddl_guard))
|
||||
@ -1250,6 +1254,7 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
|
||||
|
||||
DatabasePtr database;
|
||||
bool need_add_to_database = !create.temporary;
|
||||
// In case of an ON CLUSTER query, the database may not be present on the initiator node
|
||||
if (need_add_to_database)
|
||||
database = DatabaseCatalog::instance().tryGetDatabase(database_name);
|
||||
|
||||
@ -1270,7 +1275,7 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
|
||||
"CREATE AS SELECT is not supported with Replicated databases. Use separate CREATE and INSERT queries");
|
||||
}
|
||||
|
||||
if (need_add_to_database && database && database->shouldReplicateQuery(getContext(), query_ptr))
|
||||
if (database && database->shouldReplicateQuery(getContext(), query_ptr))
|
||||
{
|
||||
chassert(!ddl_guard);
|
||||
auto guard = DatabaseCatalog::instance().getDDLGuard(create.getDatabase(), create.getTable());
|
||||
|
@ -46,6 +46,12 @@ def test_ddl(started_cluster):
|
||||
control_node.query(
|
||||
"ALTER TABLE test_db.test_table ON CLUSTER 'external' add column data String"
|
||||
)
|
||||
control_node.query("DETACH TABLE test_db.test_table ON CLUSTER 'external'")
|
||||
|
||||
expected = ""
|
||||
assert_create_query(data_node, "test_db", "test_table", expected)
|
||||
|
||||
control_node.query("ATTACH TABLE test_db.test_table ON CLUSTER 'external'")
|
||||
|
||||
expected = "CREATE TABLE test_db.test_table (`id` Int64, `data` String) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity = 8192"
|
||||
assert_create_query(data_node, "test_db", "test_table", expected)
|
||||
|
Loading…
Reference in New Issue
Block a user