Merge pull request #57796 from evillique/replicated-database-forbid-create-as-select

Forbid CREATE AS SELECT for database Replicated
This commit is contained in:
Nikolay Degterinsky 2023-12-25 19:43:28 +01:00 committed by GitHub
commit 85b149395a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 38 additions and 0 deletions

View File

@ -1270,6 +1270,23 @@ BlockIO InterpreterCreateQuery::createTable(ASTCreateQuery & create)
if (need_add_to_database)
database = DatabaseCatalog::instance().tryGetDatabase(database_name);
if (database && database->getEngineName() == "Replicated" && create.select)
{
bool is_storage_replicated = false;
if (create.storage && create.storage->engine)
{
const auto & storage_name = create.storage->engine->name;
if (storage_name.starts_with("Replicated") || storage_name.starts_with("Shared"))
is_storage_replicated = true;
}
const bool allow_create_select_for_replicated = create.isView() || create.is_create_empty || !is_storage_replicated;
if (!allow_create_select_for_replicated)
throw Exception(
ErrorCodes::SUPPORT_IS_DISABLED,
"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))
{
chassert(!ddl_guard);

View File

@ -1,4 +1,6 @@
#!/usr/bin/env bash
# Tags: no-replicated-database
# Tag no-replicated-database: CREATE AS SELECT is disabled
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# shellcheck source=../shell_config.sh

View File

@ -1,4 +1,6 @@
#!/usr/bin/env bash
# Tags: no-replicated-database
# Tag no-replicated-database: CREATE AS SELECT is disabled
CUR_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# shellcheck source=../shell_config.sh

View File

@ -0,0 +1,16 @@
#!/usr/bin/env bash
# Tags: replica
# CREATE AS SELECT for Replicated database is broken (https://github.com/ClickHouse/ClickHouse/issues/35408).
# This should be fixed and this test should eventually be deleted.
CURDIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
# shellcheck source=../shell_config.sh
. "$CURDIR"/../shell_config.sh
${CLICKHOUSE_CLIENT} --allow_experimental_database_replicated=1 --query "CREATE DATABASE ${CLICKHOUSE_DATABASE}_db engine = Replicated('/clickhouse/databases/${CLICKHOUSE_TEST_ZOOKEEPER_PREFIX}/${CLICKHOUSE_DATABASE}_db', '{shard}', '{replica}')"
# Non-replicated engines are allowed
${CLICKHOUSE_CLIENT} --distributed_ddl_output_mode=none --query "CREATE TABLE ${CLICKHOUSE_DATABASE}_db.test (id UInt64) ENGINE = MergeTree() ORDER BY id AS SELECT 1"
# Replicated storafes are forbidden
${CLICKHOUSE_CLIENT} --query "CREATE TABLE ${CLICKHOUSE_DATABASE}_db.test2 (id UInt64) ENGINE = ReplicatedMergeTree('/clickhouse/$CLICKHOUSE_TEST_ZOOKEEPER_PREFIX/test2', '1') ORDER BY id AS SELECT 1" |& grep -cm1 "SUPPORT_IS_DISABLED"
${CLICKHOUSE_CLIENT} --query "DROP DATABASE ${CLICKHOUSE_DATABASE}_db"