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

Method execute

src/Interpreters/InterpreterCreateRoleQuery.cpp:34–85  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

32
33
34BlockIO InterpreterCreateRoleQuery::execute()
35{
36 const auto & query = query_ptr->as<const ASTCreateRoleQuery &>();
37 auto & access_control = getContext()->getAccessControlManager();
38 if (query.alter)
39 getContext()->checkAccess(AccessType::ALTER_ROLE);
40 else
41 getContext()->checkAccess(AccessType::CREATE_ROLE);
42
43 // if (!query.cluster.empty())
44 // return executeDDLQueryOnCluster(query_ptr, getContext());
45
46 std::optional<SettingsProfileElements> settings_from_query;
47 if (query.settings)
48 settings_from_query = SettingsProfileElements{*query.settings, access_control};
49
50 if (query.alter)
51 {
52 auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr
53 {
54 auto updated_role = typeid_cast<std::shared_ptr<Role>>(entity->clone());
55 updateRoleFromQueryImpl(*updated_role, query, {}, settings_from_query);
56 return updated_role;
57 };
58 if (query.if_exists)
59 {
60 auto ids = access_control.find<Role>(query.names);
61 access_control.tryUpdate(ids, update_func);
62 }
63 else
64 access_control.update(access_control.getIDs<Role>(query.names), update_func);
65 }
66 else
67 {
68 std::vector<AccessEntityPtr> new_roles;
69 for (const auto & name : query.names)
70 {
71 auto new_role = std::make_shared<Role>();
72 updateRoleFromQueryImpl(*new_role, query, name, settings_from_query);
73 new_roles.emplace_back(std::move(new_role));
74 }
75
76 if (query.if_not_exists)
77 access_control.tryInsert(new_roles);
78 else if (query.or_replace)
79 access_control.insertOrReplace(new_roles);
80 else
81 access_control.insert(new_roles);
82 }
83
84 return {};
85}
86
87
88void InterpreterCreateRoleQuery::updateRoleFromQuery(Role & role, const ASTCreateRoleQuery & query)

Callers

nothing calls this directly

Calls 9

updateRoleFromQueryImplFunction · 0.85
tryUpdateMethod · 0.80
tryInsertMethod · 0.80
checkAccessMethod · 0.45
cloneMethod · 0.45
updateMethod · 0.45
emplace_backMethod · 0.45
insertOrReplaceMethod · 0.45
insertMethod · 0.45

Tested by

no test coverage detected