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

Method execute

src/Interpreters/InterpreterCreateRowPolicyQuery.cpp:44–99  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

42
43
44BlockIO InterpreterCreateRowPolicyQuery::execute()
45{
46 auto & query = query_ptr->as<ASTCreateRowPolicyQuery &>();
47 auto & access_control = getContext()->getAccessControlManager();
48 getContext()->checkAccess(query.alter ? AccessType::ALTER_ROW_POLICY : AccessType::CREATE_ROW_POLICY);
49
50 if (!query.cluster.empty())
51 {
52 query.replaceCurrentUserTag(getContext()->getUserName());
53 return executeDDLQueryOnCluster(query_ptr, getContext());
54 }
55
56 assert(query.names->cluster.empty());
57 std::optional<RolesOrUsersSet> roles_from_query;
58 if (query.roles)
59 roles_from_query = RolesOrUsersSet{*query.roles, access_control, getContext()->getUserID()};
60
61 query.replaceEmptyDatabase(getContext()->getCurrentDatabase());
62
63 if (query.alter)
64 {
65 auto update_func = [&](const AccessEntityPtr & entity) -> AccessEntityPtr
66 {
67 auto updated_policy = typeid_cast<std::shared_ptr<RowPolicy>>(entity->clone());
68 updateRowPolicyFromQueryImpl(*updated_policy, query, {}, roles_from_query);
69 return updated_policy;
70 };
71 Strings names = query.names->toStrings();
72 if (query.if_exists)
73 {
74 auto ids = access_control.find<RowPolicy>(names);
75 access_control.tryUpdate(ids, update_func);
76 }
77 else
78 access_control.update(access_control.getIDs<RowPolicy>(names), update_func);
79 }
80 else
81 {
82 std::vector<AccessEntityPtr> new_policies;
83 for (const auto & name_parts : query.names->name_parts)
84 {
85 auto new_policy = std::make_shared<RowPolicy>();
86 updateRowPolicyFromQueryImpl(*new_policy, query, name_parts, roles_from_query);
87 new_policies.emplace_back(std::move(new_policy));
88 }
89
90 if (query.if_not_exists)
91 access_control.tryInsert(new_policies);
92 else if (query.or_replace)
93 access_control.insertOrReplace(new_policies);
94 else
95 access_control.insert(new_policies);
96 }
97
98 return {};
99}
100
101

Callers

nothing calls this directly

Calls 15

executeDDLQueryOnClusterFunction · 0.85
getUserIDMethod · 0.80
getCurrentDatabaseMethod · 0.80
tryUpdateMethod · 0.80
tryInsertMethod · 0.80
checkAccessMethod · 0.45
emptyMethod · 0.45
replaceCurrentUserTagMethod · 0.45
getUserNameMethod · 0.45
replaceEmptyDatabaseMethod · 0.45
cloneMethod · 0.45

Tested by

no test coverage detected