Skip to content

Commit 113cfe6

Browse files
committed
Prevent creation of the Hybrid tables when some segments does not provide the required columns
1 parent ac8ad7d commit 113cfe6

File tree

1 file changed

+20
-0
lines changed

1 file changed

+20
-0
lines changed

src/Storages/StorageDistributed.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2572,6 +2572,22 @@ void registerStorageHybrid(StorageFactory & factory)
25722572
if (columns_to_use.empty())
25732573
columns_to_use = first_segment_columns;
25742574

2575+
auto validate_segment_schema = [&](const ColumnsDescription & segment_columns, const String & segment_name)
2576+
{
2577+
for (const auto & column : columns_to_use.getAllPhysical())
2578+
{
2579+
if (!segment_columns.tryGetPhysical(column.name))
2580+
{
2581+
throw Exception(
2582+
ErrorCodes::BAD_ARGUMENTS,
2583+
"Hybrid segment '{}' is missing column '{}' required by Hybrid schema",
2584+
segment_name, column.name);
2585+
}
2586+
}
2587+
};
2588+
2589+
validate_segment_schema(first_segment_columns, engine_args[0]->formatForLogging());
2590+
25752591
// Execute the table function to get the underlying storage
25762592
StoragePtr storage = table_function->execute(
25772593
first_arg,
@@ -2648,6 +2664,8 @@ void registerStorageHybrid(StorageFactory & factory)
26482664
ColumnsDescription segment_columns = additional_table_function->getActualTableStructure(local_context, true);
26492665
replaceCurrentDatabaseFunction(normalized_table_function_ast, local_context);
26502666

2667+
validate_segment_schema(segment_columns, normalized_table_function_ast->formatForLogging());
2668+
26512669
// It's a table function - store the AST and cached schema for later execution
26522670
segment_definitions.emplace_back(normalized_table_function_ast, predicate_ast, std::move(segment_columns));
26532671
}
@@ -2720,6 +2738,8 @@ void registerStorageHybrid(StorageFactory & factory)
27202738
if (validated_table)
27212739
segment_columns = validated_table->getInMemoryMetadataPtr()->getColumns();
27222740

2741+
validate_segment_schema(segment_columns, storage_id.getNameForLogs());
2742+
27232743
segment_definitions.emplace_back(table_function_ast, predicate_ast, storage_id, std::move(segment_columns));
27242744
}
27252745
catch (const Exception & e)

0 commit comments

Comments
 (0)