MCPcopy Create free account
hub / github.com/ClickHouse/ClickHouse / registerDatabaseReplicated

Function registerDatabaseReplicated

src/Databases/DatabaseReplicated.cpp:2627–2879  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

2625
2626void registerDatabaseReplicated(DatabaseFactory & factory);
2627void 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

Callers 1

registerDatabasesFunction · 0.85

Calls 13

extractZooKeeperNameFunction · 0.85
extractZooKeeperPathFunction · 0.85
getMacrosMethod · 0.80
registerDatabaseMethod · 0.80
ExceptionClass · 0.50
push_backMethod · 0.45
emptyMethod · 0.45
emplace_backMethod · 0.45
sizeMethod · 0.45
expandMethod · 0.45

Tested by

no test coverage detected