cql3: add proper setting of empty collections in INSERT JSON

Previously empty collections where incorrectly added as dead cells,
which resulted in serialization errors later.

Fixes #3664
Message-Id: <a9c90d66c6737641cafe40edb779df490ada0309.1534848313.git.sarna@scylladb.com>
This commit is contained in:
Piotr Sarna
2018-08-21 12:46:24 +02:00
committed by Avi Kivity
parent 36a293bb23
commit 465045368f

View File

@@ -181,6 +181,19 @@ modification_statement::json_cache_opt insert_prepared_json_statement::maybe_pre
void
insert_prepared_json_statement::execute_set_value(mutation& m, const clustering_key_prefix& prefix, const update_parameters& params, const column_definition& column, const bytes_opt& value) {
if (!value) {
if (column.type->is_collection()) {
auto& k = static_pointer_cast<const collection_type_impl>(column.type)->_kind;
if (&k == &collection_type_impl::kind::list) {
lists::setter::execute(m, prefix, params, column, make_shared<lists::value>(lists::value(std::vector<bytes_opt>())));
} else if (&k == &collection_type_impl::kind::set) {
sets::setter::execute(m, prefix, params, column, make_shared<sets::value>(sets::value(std::set<bytes, serialized_compare>(serialized_compare(empty_type)))));
} else if (&k == &collection_type_impl::kind::map) {
maps::setter::execute(m, prefix, params, column, make_shared<maps::value>(maps::value(std::map<bytes, bytes, serialized_compare>(serialized_compare(empty_type)))));
} else {
throw exceptions::invalid_request_exception("Incorrect value kind in JSON INSERT statement");
}
return;
}
m.set_cell(prefix, column, std::move(operation::make_dead_cell(params)));
return;
} else if (!column.type->is_collection()) {