Merge pull request #67436 from iceFireser/master

Fix the problem that alter modfiy order by causes inconsistent metadata
This commit is contained in:
Yarik Briukhovetskyi 2024-09-02 09:54:38 +00:00 committed by GitHub
commit 1b67fde591
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 103 additions and 0 deletions

View File

@ -1245,6 +1245,13 @@ void AlterCommands::prepare(const StorageInMemoryMetadata & metadata)
{
auto columns = metadata.columns;
auto ast_to_str = [](const ASTPtr & query) -> String
{
if (!query)
return "";
return queryToString(query);
};
for (size_t i = 0; i < size(); ++i)
{
auto & command = (*this)[i];
@ -1277,6 +1284,11 @@ void AlterCommands::prepare(const StorageInMemoryMetadata & metadata)
if (!has_column && command.if_exists)
command.ignore = true;
}
else if (command.type == AlterCommand::MODIFY_ORDER_BY)
{
if (ast_to_str(command.order_by) == ast_to_str(metadata.sorting_key.definition_ast))
command.ignore = true;
}
}
prepared = true;

View File

@ -0,0 +1,10 @@
<clickhouse>
<database_atomic_delay_before_drop_table_sec>10</database_atomic_delay_before_drop_table_sec>
<allow_moving_table_directory_to_trash>1</allow_moving_table_directory_to_trash>
<merge_tree>
<initialization_retry_period>10</initialization_retry_period>
</merge_tree>
<max_database_replicated_create_table_thread_pool_size>50</max_database_replicated_create_table_thread_pool_size>
<allow_experimental_transactions>42</allow_experimental_transactions>
<async_load_databases>false</async_load_databases>
</clickhouse>

View File

@ -0,0 +1,11 @@
<clickhouse>
<profiles>
<default>
</default>
</profiles>
<users>
<default>
<profile>default</profile>
</default>
</users>
</clickhouse>

View File

@ -0,0 +1,70 @@
import pytest
from helpers.cluster import ClickHouseCluster
from helpers.test_tools import assert_eq_with_retry
cluster = ClickHouseCluster(__file__)
shard1_node = cluster.add_instance(
"shard1_node",
main_configs=["configs/config.xml"],
user_configs=["configs/settings.xml"],
with_zookeeper=True,
stay_alive=True,
macros={"shard": 1, "replica": 1},
)
shard2_node = cluster.add_instance(
"shard2_node",
main_configs=["configs/config.xml"],
user_configs=["configs/settings.xml"],
with_zookeeper=True,
stay_alive=True,
macros={"shard": 2, "replica": 1},
)
all_nodes = [
shard1_node,
shard2_node,
]
@pytest.fixture(scope="module")
def started_cluster():
try:
cluster.start()
yield cluster
finally:
cluster.shutdown()
def test_alter_modify_order_by(started_cluster):
shard1_node.query("DROP DATABASE IF EXISTS alter_modify_order_by SYNC;")
shard2_node.query("DROP DATABASE IF EXISTS alter_modify_order_by SYNC;")
shard1_node.query(
"CREATE DATABASE alter_modify_order_by ENGINE = Replicated('/test/database/alter_modify_order_by', '{shard}', '{replica}');"
)
shard1_node.query(
"CREATE TABLE alter_modify_order_by.t1 (id Int64, score Int64) ENGINE = ReplicatedMergeTree('/test/tables/{uuid}/{shard}', '{replica}') ORDER BY (id);"
)
shard1_node.query("ALTER TABLE alter_modify_order_by.t1 modify order by (id);")
shard2_node.query(
"CREATE DATABASE alter_modify_order_by ENGINE = Replicated('/test/database/alter_modify_order_by', '{shard}', '{replica}');"
)
query = (
"select count() from system.tables where database = 'alter_modify_order_by';"
)
expected = shard1_node.query(query)
assert_eq_with_retry(shard2_node, query, expected)
query = "show create table alter_modify_order_by.t1;"
assert shard1_node.query(query) == shard2_node.query(query)
shard1_node.query("DROP DATABASE IF EXISTS alter_modify_order_by SYNC;")
shard2_node.query("DROP DATABASE IF EXISTS alter_modify_order_by SYNC;")