| 1250 | } |
| 1251 | |
| 1252 | StorageWindowView::StorageWindowView( |
| 1253 | const StorageID & table_id_, |
| 1254 | ContextPtr context_, |
| 1255 | const ASTCreateQuery & query, |
| 1256 | const ColumnsDescription & columns_, |
| 1257 | const String & comment, |
| 1258 | LoadingStrictnessLevel mode) |
| 1259 | : IStorage(table_id_) |
| 1260 | , WithContext(context_->getGlobalContext()) |
| 1261 | , log(getLogger(fmt::format("StorageWindowView({}.{})", table_id_.database_name, table_id_.table_name))) |
| 1262 | , fire_signal_timeout_s(context_->getSettingsRef()[Setting::wait_for_window_view_fire_signal_timeout].totalSeconds()) |
| 1263 | , clean_interval_usec(context_->getSettingsRef()[Setting::window_view_clean_interval].totalMicroseconds()) |
| 1264 | { |
| 1265 | if (context_->getSettingsRef()[Setting::allow_experimental_analyzer]) |
| 1266 | disabled_due_to_analyzer = true; |
| 1267 | |
| 1268 | if (mode <= LoadingStrictnessLevel::CREATE) |
| 1269 | throwIfWindowViewIsDisabled(); |
| 1270 | |
| 1271 | if (!query.select) |
| 1272 | throw Exception(ErrorCodes::INCORRECT_QUERY, "SELECT query is not specified for {}", getName()); |
| 1273 | |
| 1274 | StorageInMemoryMetadata storage_metadata; |
| 1275 | storage_metadata.setColumns(columns_); |
| 1276 | storage_metadata.setComment(comment); |
| 1277 | setInMemoryMetadata(storage_metadata); |
| 1278 | |
| 1279 | /// If the target table is not set, use inner target table |
| 1280 | auto to_table_id = query.getTargetTableID(ViewTarget::To); |
| 1281 | has_inner_target_table = to_table_id.empty(); |
| 1282 | auto * to_table_engine = query.getTargetInnerEngine(ViewTarget::To); |
| 1283 | |
| 1284 | if (has_inner_target_table && !to_table_engine) |
| 1285 | throw Exception(ErrorCodes::INCORRECT_QUERY, |
| 1286 | "You must specify where to save results of a WindowView query: " |
| 1287 | "either ENGINE or an existing table in a TO clause"); |
| 1288 | |
| 1289 | if (query.select->list_of_selects->children.size() != 1) |
| 1290 | throw Exception( |
| 1291 | ErrorCodes::QUERY_IS_NOT_SUPPORTED_IN_WINDOW_VIEW, |
| 1292 | "UNION is not supported for {}", getName()); |
| 1293 | |
| 1294 | /// Extract information about watermark, lateness. |
| 1295 | eventTimeParser(query); |
| 1296 | |
| 1297 | auto inner_query = initInnerQuery(query.select->list_of_selects->children.at(0)->as<ASTSelectQuery &>(), context_); |
| 1298 | |
| 1299 | if (auto * inner_storage = query.getTargetInnerEngine(ViewTarget::Inner)) |
| 1300 | inner_table_engine = inner_storage->clone(); |
| 1301 | inner_table_id = StorageID(getStorageID().database_name, generateInnerTableName(getStorageID())); |
| 1302 | inner_fetch_query = generateInnerFetchQuery(inner_table_id); |
| 1303 | |
| 1304 | target_table_id = has_inner_target_table ? StorageID(table_id_.database_name, generateTargetTableName(table_id_)) : to_table_id; |
| 1305 | |
| 1306 | if (is_proctime) |
| 1307 | next_fire_signal = getWindowUpperBound(now()); |
| 1308 | |
| 1309 | std::exchange(has_inner_table, true); |
nothing calls this directly
no test coverage detected