| 1256 | } |
| 1257 | |
| 1258 | void StorageFile::setStorageMetadata(CommonArguments args) |
| 1259 | { |
| 1260 | StorageInMemoryMetadata storage_metadata; |
| 1261 | |
| 1262 | if (args.format_name == "Distributed" || args.columns.empty()) |
| 1263 | { |
| 1264 | ColumnsDescription columns; |
| 1265 | if (use_table_fd) |
| 1266 | { |
| 1267 | if (format_name == "auto") |
| 1268 | std::tie(columns, format_name) = getTableStructureAndFormatFromFileDescriptor(std::nullopt, args.getContext()); |
| 1269 | else |
| 1270 | columns = getTableStructureAndFormatFromFileDescriptor(format_name, args.getContext()).first; |
| 1271 | } |
| 1272 | else |
| 1273 | { |
| 1274 | if (format_name == "auto") |
| 1275 | std::tie(columns, format_name) = getTableStructureAndFormatFromFile(paths, compression_method, format_settings, args.getContext(), archive_info); |
| 1276 | else |
| 1277 | columns = getTableStructureFromFile(format_name, paths, compression_method, format_settings, args.getContext(), archive_info); |
| 1278 | |
| 1279 | if (!args.columns.empty() && args.columns != columns) |
| 1280 | throw Exception(ErrorCodes::INCOMPATIBLE_COLUMNS, "Table structure and file structure are different"); |
| 1281 | } |
| 1282 | storage_metadata.setColumns(columns); |
| 1283 | } |
| 1284 | else |
| 1285 | { |
| 1286 | if (format_name == "auto") |
| 1287 | format_name = getTableStructureAndFormatFromFile(paths, compression_method, format_settings, args.getContext(), archive_info).second; |
| 1288 | /// We don't allow special columns in File storage. |
| 1289 | if (!args.columns.hasOnlyOrdinary()) |
| 1290 | throw Exception(ErrorCodes::BAD_ARGUMENTS, "Table engine File doesn't support special columns like MATERIALIZED, ALIAS or EPHEMERAL"); |
| 1291 | storage_metadata.setColumns(args.columns); |
| 1292 | } |
| 1293 | |
| 1294 | storage_metadata.setConstraints(args.constraints); |
| 1295 | storage_metadata.setComment(args.comment); |
| 1296 | |
| 1297 | const auto sample_path = paths.empty() ? "" : paths[0]; |
| 1298 | |
| 1299 | auto & storage_columns = storage_metadata.columns; |
| 1300 | |
| 1301 | std::tie(hive_partition_columns_to_read_from_file_path, std::ignore) = HivePartitioningUtils::setupHivePartitioningForFileURLLikeStorage( |
| 1302 | storage_columns, |
| 1303 | sample_path, |
| 1304 | args.columns.empty(), |
| 1305 | format_settings, |
| 1306 | args.getContext()); |
| 1307 | |
| 1308 | storage_metadata.setVirtuals(VirtualColumnUtils::getVirtualsForFileLikeStorage(storage_metadata.columns, args.getContext(), format_settings, PartitionStrategyFactory::StrategyType::NONE, sample_path)); |
| 1309 | setInMemoryMetadata(storage_metadata); |
| 1310 | |
| 1311 | supports_prewhere = format_name != "Distributed" && FormatFactory::instance().checkIfFormatSupportsPrewhere(format_name, args.getContext(), format_settings); |
| 1312 | } |
| 1313 | |
| 1314 | static std::chrono::seconds getLockTimeout(const ContextPtr & context) |
| 1315 | { |
nothing calls this directly
no test coverage detected