/* * Copyright (C) 2015-present ScyllaDB * * Modified by ScyllaDB */ /* * SPDX-License-Identifier: (LicenseRef-ScyllaDB-Source-Available-1.0 and Apache-2.0) */ #pragma once #include "cql3/statements/schema_altering_statement.hh" #include "cql3/statements/cf_properties.hh" #include "cql3/statements/raw/cf_statement.hh" #include "cql3/cql3_type.hh" #include "schema/schema_fwd.hh" #include #include #include #include #include #include namespace cql3 { class query_processor; class cf_prop_defs; namespace statements { /** A CREATE TABLE parsed from a CQL query statement. */ class create_table_statement : public schema_altering_statement { #if 0 private AbstractType defaultValidator; #endif std::vector _partition_key_types; std::vector _clustering_key_types; std::vector _key_aliases; std::vector _column_aliases; #if 0 private ByteBuffer valueAlias; #endif bool _use_compact_storage; using column_map_type = std::unordered_map<::shared_ptr, data_type, shared_ptr_value_hash, shared_ptr_equal_by_value>; using column_set_type = std::unordered_set<::shared_ptr, shared_ptr_value_hash, shared_ptr_equal_by_value>; column_map_type _columns; column_set_type _static_columns; ::shared_ptr _ttl_column; // for row-based TTL const ::shared_ptr _properties; const bool _if_not_exists; std::optional _id; public: create_table_statement(cf_name name, ::shared_ptr properties, bool if_not_exists, column_set_type static_columns, ::shared_ptr ttl_column, const std::optional& id); virtual future<> check_access(query_processor& qp, const service::client_state& state) const override; future, utils::chunked_vector, cql3::cql_warnings_vec>> prepare_schema_mutations(query_processor& qp, const query_options& options, api::timestamp_type) const override; virtual std::unique_ptr prepare(data_dictionary::database db, cql_stats& stats) override; virtual future<> grant_permissions_to_creator(const service::client_state&, service::group0_batch&) const override; schema_ptr get_cf_meta_data(const data_dictionary::database) const; class raw_statement; friend raw_statement; private: std::vector get_columns() const; void apply_properties_to(schema_builder& builder, const data_dictionary::database) const; void add_column_metadata_from_aliases(schema_builder& builder, std::vector aliases, const std::vector& types, column_kind kind) const; ::shared_ptr created_event() const; }; class create_table_statement::raw_statement : public raw::cf_statement { private: using defs_type = std::unordered_map<::shared_ptr, ::shared_ptr, shared_ptr_value_hash, shared_ptr_equal_by_value>; defs_type _definitions; std::vector>> _key_aliases; std::vector<::shared_ptr> _column_aliases; create_table_statement::column_set_type _static_columns; ::shared_ptr _ttl_column; // for row-based TTL std::multiset<::shared_ptr, indirect_less<::shared_ptr, column_identifier::text_comparator>> _defined_names; bool _if_not_exists; cf_properties _properties; public: raw_statement(cf_name name, bool if_not_exists); virtual std::unique_ptr prepare(data_dictionary::database db, cql_stats& stats) override; cf_properties& properties() { return _properties; } data_type get_type_and_remove(column_map_type& columns, ::shared_ptr t); void add_definition(::shared_ptr def, ::shared_ptr type, bool is_static, bool is_ttl); void add_key_aliases(const std::vector<::shared_ptr> aliases); void add_column_alias(::shared_ptr alias); protected: virtual audit::statement_category category() const override; }; std::optional check_restricted_table_properties( data_dictionary::database db, std::optional schema, const sstring& keyspace, const sstring& table, const cf_prop_defs& cfprops); } }