| 2625 | |
| 2626 | void registerDatabaseReplicated(DatabaseFactory & factory); |
| 2627 | void registerDatabaseReplicated(DatabaseFactory & factory) |
| 2628 | { |
| 2629 | auto create_fn = [](const DatabaseFactory::Arguments & args) |
| 2630 | { |
| 2631 | auto * engine_define = args.create_query.storage; |
| 2632 | ASTFunction * engine = engine_define->engine; |
| 2633 | |
| 2634 | /// Fill in default parameters |
| 2635 | if (!args.create_query.attach) |
| 2636 | { |
| 2637 | if (!engine->arguments) |
| 2638 | { |
| 2639 | engine->arguments = make_intrusive<ASTExpressionList>(); |
| 2640 | engine->children.push_back(engine->arguments); |
| 2641 | } |
| 2642 | |
| 2643 | auto settings = args.context->getDatabaseReplicatedSettings(); |
| 2644 | if (engine->arguments->children.empty()) |
| 2645 | engine->arguments->children.emplace_back(make_intrusive<ASTLiteral>(settings[DatabaseReplicatedSetting::default_replica_path].value)); |
| 2646 | if (engine->arguments->children.size() == 1) |
| 2647 | engine->arguments->children.emplace_back(make_intrusive<ASTLiteral>(settings[DatabaseReplicatedSetting::default_replica_shard_name].value)); |
| 2648 | if (engine->arguments->children.size() == 2) |
| 2649 | engine->arguments->children.emplace_back(make_intrusive<ASTLiteral>(settings[DatabaseReplicatedSetting::default_replica_name].value)); |
| 2650 | } |
| 2651 | |
| 2652 | if (!engine->arguments || engine->arguments->children.size() != 3) |
| 2653 | throw Exception(ErrorCodes::BAD_ARGUMENTS, "Replicated database requires 3 arguments: zookeeper path, shard name and replica name"); |
| 2654 | |
| 2655 | auto & arguments = engine->arguments->children; |
| 2656 | for (auto & engine_arg : arguments) |
| 2657 | engine_arg = evaluateConstantExpressionOrIdentifierAsLiteral(engine_arg, args.context); |
| 2658 | |
| 2659 | String zookeeper_path = safeGetLiteralValue<String>(arguments[0], "Replicated"); |
| 2660 | String shard_name = safeGetLiteralValue<String>(arguments[1], "Replicated"); |
| 2661 | String replica_name = safeGetLiteralValue<String>(arguments[2], "Replicated"); |
| 2662 | |
| 2663 | /// Expand macros. |
| 2664 | Macros::MacroExpansionInfo info; |
| 2665 | info.expand_for_database = true; |
| 2666 | info.table_id.database_name = args.database_name; |
| 2667 | |
| 2668 | const bool is_on_cluster = args.context->isDDLOrOnClusterInternal(); |
| 2669 | /// Allow implicit {uuid} macros only for zookeeper_path in ON CLUSTER queries |
| 2670 | /// and if UUID was explicitly passed in CREATE DATABASE (like for ATTACH) |
| 2671 | bool allow_uuid_macro = is_on_cluster || args.create_query.attach || args.create_query.has_uuid; |
| 2672 | if (allow_uuid_macro) |
| 2673 | info.table_id.uuid = args.uuid; |
| 2674 | zookeeper_path = args.context->getMacros()->expand(zookeeper_path, info); |
| 2675 | auto zookeeper_name = zkutil::extractZooKeeperName(zookeeper_path); |
| 2676 | zookeeper_path = zkutil::extractZooKeeperPath(zookeeper_path, /*check_starts_with_slash*/false); |
| 2677 | |
| 2678 | info.level = 0; |
| 2679 | info.table_id.uuid = UUIDHelpers::Nil; |
| 2680 | shard_name = args.context->getMacros()->expand(shard_name, info); |
| 2681 | |
| 2682 | info.level = 0; |
| 2683 | replica_name = args.context->getMacros()->expand(replica_name, info); |
| 2684 |
no test coverage detected