Currently, when creating a UDA, we only check for permissions for creating functions. However, the creator gains all permissions to the UDA, including the EXECUTE permission. This enables the user to also execute the state/reduce/final functions that were used in the UDA, even if they don't have the EXECUTE permissions on them. This patch adds checks for the missing EXECUTE permissions, so that the UDA can be only created if the user has all required permissions. The new permissions that are now required when creating a UDA are now granted in the existing UDA test. Fixes #13818 Closes #13819
45 lines
1.5 KiB
C++
45 lines
1.5 KiB
C++
/*
|
|
* Copyright (C) 2021-present ScyllaDB
|
|
*/
|
|
|
|
/*
|
|
* SPDX-License-Identifier: AGPL-3.0-or-later
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "cql3/statements/function_statement.hh"
|
|
#include "cql3/cql3_type.hh"
|
|
#include "cql3/expr/expression.hh"
|
|
#include <optional>
|
|
|
|
namespace cql3 {
|
|
|
|
class query_processor;
|
|
|
|
namespace functions {
|
|
class user_aggregate;
|
|
}
|
|
|
|
namespace statements {
|
|
|
|
class create_aggregate_statement final : public create_function_statement_base {
|
|
virtual std::unique_ptr<prepared_statement> prepare(data_dictionary::database db, cql_stats& stats) override;
|
|
future<std::pair<::shared_ptr<cql_transport::event::schema_change>, std::vector<mutation>>> prepare_schema_mutations(query_processor& qp, api::timestamp_type) const override;
|
|
virtual future<> check_access(query_processor& qp, const service::client_state& state) const override;
|
|
|
|
virtual seastar::future<shared_ptr<db::functions::function>> create(query_processor& qp, db::functions::function* old) const override;
|
|
|
|
sstring _sfunc;
|
|
shared_ptr<cql3_type::raw> _stype;
|
|
std::optional<sstring> _rfunc;
|
|
std::optional<sstring> _ffunc;
|
|
std::optional<expr::expression> _ival;
|
|
|
|
public:
|
|
create_aggregate_statement(functions::function_name name, std::vector<shared_ptr<cql3_type::raw>> arg_types,
|
|
sstring sfunc, shared_ptr<cql3_type::raw> stype, std::optional<sstring> rfunc, std::optional<sstring> ffunc, std::optional<expr::expression> ival, bool or_replace, bool if_not_exists);
|
|
};
|
|
}
|
|
}
|