@@ -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