MCPcopy Create free account
hub / github.com/ByConity/ByConity / execute

Method execute

src/Interpreters/InterpreterCreateUserQuery.cpp:75–153  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

73
74
75BlockIO InterpreterCreateUserQuery::execute()
76{
77 const auto & query = query_ptr->as<const ASTCreateUserQuery &>();
78 auto & access_control = getContext()->getAccessControlManager();
79 auto access = getContext()->getAccess();
80 access->checkAccess(query.alter ? AccessType::ALTER_USER : AccessType::CREATE_USER);
81
82 std::optional<RolesOrUsersSet> default_roles_from_query;
83 if (query.default_roles)
84 {
85 default_roles_from_query = RolesOrUsersSet{*query.default_roles, access_control};
86 if (!query.alter && !default_roles_from_query->all)
87 {
88 for (const UUID & role : default_roles_from_query->getMatchingIDs())
89 access->checkAdminOption(role);
90 }
91 }
92
93 // if (!query.cluster.empty())
94 // return executeDDLQueryOnCluster(query_ptr, getContext());
95
96 std::optional<SettingsProfileElements> settings_from_query;
97 if (query.settings)
98 settings_from_query = SettingsProfileElements{*query.settings, access_control};
99
100 if (query.alter)
101 {
102 std::optional<RolesOrUsersSet> grantees_from_query;
103 if (query.grantees)
104 grantees_from_query = RolesOrUsersSet{*query.grantees, access_control};
105
106 auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr
107 {
108 auto updated_user = typeid_cast<std::shared_ptr<User>>(entity->clone());
109 updateUserFromQueryImpl(*updated_user, query, {}, default_roles_from_query, settings_from_query, grantees_from_query);
110 return updated_user;
111 };
112
113 Strings names = query.names->toStrings();
114 if (query.if_exists)
115 {
116 auto ids = access_control.find<User>(names);
117 access_control.tryUpdate(ids, update_func);
118 }
119 else
120 access_control.update(access_control.getIDs<User>(names), update_func);
121 }
122 else
123 {
124 std::vector<AccessEntityPtr> new_users;
125 for (const auto & name : *query.names)
126 {
127 auto new_user = std::make_shared<User>();
128 updateUserFromQueryImpl(*new_user, query, name, default_roles_from_query, settings_from_query, RolesOrUsersSet::AllTag{});
129 new_users.emplace_back(std::move(new_user));
130 }
131
132 std::vector<UUID> ids;

Callers

nothing calls this directly

Calls 13

updateUserFromQueryImplFunction · 0.85
getAccessMethod · 0.80
getMatchingIDsMethod · 0.80
checkAdminOptionMethod · 0.80
tryUpdateMethod · 0.80
tryInsertMethod · 0.80
checkAccessMethod · 0.45
cloneMethod · 0.45
toStringsMethod · 0.45
updateMethod · 0.45
emplace_backMethod · 0.45
insertOrReplaceMethod · 0.45

Tested by

no test coverage detected