| 1076 | } |
| 1077 | |
| 1078 | SelectQueryInfo ReadFromMerge::getModifiedQueryInfo(const ContextMutablePtr & modified_context, |
| 1079 | const StorageWithLockAndName & storage_with_lock_and_name, |
| 1080 | const StorageSnapshotPtr & storage_snapshot_, |
| 1081 | Names required_column_names, |
| 1082 | Names & column_names_as_aliases, |
| 1083 | bool & is_smallest_column_requested, |
| 1084 | Aliases & aliases) const |
| 1085 | { |
| 1086 | const auto & [database_name, storage, storage_lock, table_name] = storage_with_lock_and_name; |
| 1087 | const StorageID current_storage_id = storage->getStorageID(); |
| 1088 | |
| 1089 | SelectQueryInfo modified_query_info = query_info; |
| 1090 | |
| 1091 | modified_query_info.initial_storage_snapshot = merge_storage_snapshot; |
| 1092 | |
| 1093 | if (modified_query_info.planner_context) |
| 1094 | modified_query_info.planner_context = std::make_shared<PlannerContext>(modified_context, modified_query_info.planner_context); |
| 1095 | |
| 1096 | if (modified_query_info.table_expression) |
| 1097 | { |
| 1098 | auto replacement_table_expression = std::make_shared<TableNode>(storage, storage_lock, storage_snapshot_); |
| 1099 | replacement_table_expression->setAlias(modified_query_info.table_expression->getAlias()); |
| 1100 | if (query_info.table_expression_modifiers) |
| 1101 | replacement_table_expression->setTableExpressionModifiers(*query_info.table_expression_modifiers); |
| 1102 | |
| 1103 | modified_query_info.query_tree = replaceTableExpressionAndRemoveJoin(modified_query_info.query_tree, modified_query_info.table_expression, replacement_table_expression, modified_context, required_column_names); |
| 1104 | modified_query_info.table_expression = replacement_table_expression; |
| 1105 | modified_query_info.planner_context->getOrCreateTableExpressionData(replacement_table_expression); |
| 1106 | |
| 1107 | auto get_column_options = GetColumnsOptions(GetColumnsOptions::All).withSubcolumns(storage_snapshot_->storage.supportsSubcolumns()).withVirtuals(VirtualsKind::All, VirtualsMaterializationPlace::All); |
| 1108 | |
| 1109 | /// Replace references to columns that don't exist in this child table with default values. |
| 1110 | /// This happens when merge() is used over tables with different schemas and the processing |
| 1111 | /// stage is above FetchColumns (e.g., for distributed/remote tables where the full query |
| 1112 | /// is sent to the child for processing). |
| 1113 | std::unordered_map<std::string, QueryTreeNodePtr> column_name_to_node; |
| 1114 | for (const auto & column_name : required_column_names) |
| 1115 | { |
| 1116 | if (column_name_to_node.contains(column_name)) |
| 1117 | continue; |
| 1118 | |
| 1119 | if (storage_snapshot_->tryGetColumn(get_column_options, column_name)) |
| 1120 | continue; |
| 1121 | |
| 1122 | auto merge_column = merge_storage_snapshot->tryGetColumn( |
| 1123 | GetColumnsOptions(GetColumnsOptions::All).withVirtuals(VirtualsKind::All, VirtualsMaterializationPlace::All) |
| 1124 | .withSubcolumns(merge_storage_snapshot->storage.supportsSubcolumns()), |
| 1125 | column_name); |
| 1126 | if (!merge_column) |
| 1127 | continue; |
| 1128 | |
| 1129 | column_name_to_node.emplace(column_name, |
| 1130 | std::make_shared<ConstantNode>(merge_column->type->getDefault(), merge_column->type)); |
| 1131 | } |
| 1132 | |
| 1133 | auto storage_columns = storage_snapshot_->metadata->getColumns(); |
| 1134 | |
| 1135 | bool with_aliases = /* common_processed_stage == QueryProcessingStage::FetchColumns && */ !storage_columns.getAliases().empty(); |
nothing calls this directly
no test coverage detected