diff --git a/cql3/statements/alter_keyspace_statement.hh b/cql3/statements/alter_keyspace_statement.hh index 261fc0f1d3..1d037b4857 100644 --- a/cql3/statements/alter_keyspace_statement.hh +++ b/cql3/statements/alter_keyspace_statement.hh @@ -29,6 +29,9 @@ class alter_keyspace_statement : public schema_altering_statement { public: alter_keyspace_statement(sstring name, ::shared_ptr attrs); + bool has_keyspace() const override { + return true; + } const sstring& keyspace() const override; future<> check_access(query_processor& qp, const service::client_state& state) const override; diff --git a/cql3/statements/cf_statement.cc b/cql3/statements/cf_statement.cc index 18a90062c3..1fb86c7a8a 100644 --- a/cql3/statements/cf_statement.cc +++ b/cql3/statements/cf_statement.cc @@ -39,6 +39,11 @@ void cf_statement::prepare_keyspace(std::string_view keyspace) } } +bool cf_statement::has_keyspace() const { + assert(_cf_name.has_value()); + return _cf_name->has_keyspace(); +} + const sstring& cf_statement::keyspace() const { assert(_cf_name->has_keyspace()); // "The statement hasn't be prepared correctly"; diff --git a/cql3/statements/create_keyspace_statement.hh b/cql3/statements/create_keyspace_statement.hh index 26ba2ae766..e7b5f9cd4d 100644 --- a/cql3/statements/create_keyspace_statement.hh +++ b/cql3/statements/create_keyspace_statement.hh @@ -51,6 +51,9 @@ public: */ create_keyspace_statement(const sstring& name, shared_ptr attrs, bool if_not_exists); + virtual bool has_keyspace() const override { + return true; + } virtual const sstring& keyspace() const override; virtual future<> check_access(query_processor& qp, const service::client_state& state) const override; diff --git a/cql3/statements/create_type_statement.hh b/cql3/statements/create_type_statement.hh index fe3252a45b..80257a2ebf 100644 --- a/cql3/statements/create_type_statement.hh +++ b/cql3/statements/create_type_statement.hh @@ -35,6 +35,10 @@ public: virtual void validate(query_processor&, const service::client_state& state) const override; + virtual bool has_keyspace() const override { + return true; + } + virtual const sstring& keyspace() const override; future, std::vector, cql3::cql_warnings_vec>> prepare_schema_mutations(query_processor& qp, api::timestamp_type) const override; diff --git a/cql3/statements/raw/cf_statement.hh b/cql3/statements/raw/cf_statement.hh index 94dbdb4ac8..295fa02eff 100644 --- a/cql3/statements/raw/cf_statement.hh +++ b/cql3/statements/raw/cf_statement.hh @@ -38,6 +38,8 @@ public: // Only for internal calls, use the version with ClientState for user queries void prepare_keyspace(std::string_view keyspace); + virtual bool has_keyspace() const; + virtual const sstring& keyspace() const; virtual const sstring& column_family() const; diff --git a/tools/schema_loader.cc b/tools/schema_loader.cc index dd926ba2c3..e094bbef96 100644 --- a/tools/schema_loader.cc +++ b/tools/schema_loader.cc @@ -281,6 +281,9 @@ std::vector do_load_schemas(const db::config& cfg, std::string_view if (!cf_statement) { continue; // we don't support any non-cf statements here } + if (!cf_statement->has_keyspace()) { + throw std::runtime_error("tools::do_load_schemas(): CQL statement does not have keyspace specified"); + } auto ks = find_or_create_keyspace(cf_statement->keyspace()); auto prepared_statement = cf_statement->prepare(db, cql_stats); auto* statement = prepared_statement->statement.get();