aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/clickhouse/src/Interpreters/removeOnClusterClauseIfNeeded.cpp
blob: da3930d62a6c7284e4bff35a6443672daab0c4be (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <Interpreters/removeOnClusterClauseIfNeeded.h>

#include <Access/AccessControl.h>
#include <Access/ReplicatedAccessStorage.h>
#include <Common/logger_useful.h>
#include <Functions/UserDefined/IUserDefinedSQLObjectsLoader.h>
#include <Interpreters/Context.h>
#include <Parsers/ASTCreateFunctionQuery.h>
#include <Parsers/ASTDropFunctionQuery.h>
#include <Parsers/ASTQueryWithOnCluster.h>
#include <Parsers/Access/ASTCreateQuotaQuery.h>
#include <Parsers/Access/ASTCreateRoleQuery.h>
#include <Parsers/Access/ASTCreateRowPolicyQuery.h>
#include <Parsers/Access/ASTCreateSettingsProfileQuery.h>
#include <Parsers/Access/ASTCreateUserQuery.h>
#include <Parsers/Access/ASTDropAccessEntityQuery.h>
#include <Parsers/Access/ASTGrantQuery.h>


namespace DB
{


static bool isUserDefinedFunctionQuery(const ASTPtr & query)
{
    return query->as<ASTCreateFunctionQuery>()
        || query->as<ASTDropFunctionQuery>();
}

static bool isAccessControlQuery(const ASTPtr & query)
{
    return query->as<ASTCreateUserQuery>()
        || query->as<ASTCreateQuotaQuery>()
        || query->as<ASTCreateRoleQuery>()
        || query->as<ASTCreateRowPolicyQuery>()
        || query->as<ASTCreateSettingsProfileQuery>()
        || query->as<ASTDropAccessEntityQuery>()
        || query->as<ASTGrantQuery>();
}

ASTPtr removeOnClusterClauseIfNeeded(const ASTPtr & query, ContextPtr context, const WithoutOnClusterASTRewriteParams & params)
{
    auto * query_on_cluster = dynamic_cast<ASTQueryWithOnCluster *>(query.get());

    if (!query_on_cluster || query_on_cluster->cluster.empty())
        return query;

    if ((isUserDefinedFunctionQuery(query)
         && context->getSettings().ignore_on_cluster_for_replicated_udf_queries
         && context->getUserDefinedSQLObjectsLoader().isReplicated())
        || (isAccessControlQuery(query)
            && context->getSettings().ignore_on_cluster_for_replicated_access_entities_queries
            && context->getAccessControl().containsStorage(ReplicatedAccessStorage::STORAGE_TYPE)))
    {
        LOG_DEBUG(&Poco::Logger::get("removeOnClusterClauseIfNeeded"), "ON CLUSTER clause was ignored for query {}", query->getID());
        return query_on_cluster->getRewrittenASTWithoutOnCluster(params);
    }

    return query;
}
}