cql3/query_options: Use _value_views in prepare()
_value_views is the authoritative data structure for the client-specified values. Indeed, the ctor called transport::request::read_options() leaves _values completely empty. In query_options::prepare() we were, however, using _values to associated values to the client-specified column names, and not _value_views. Fix this by using _value_views instead. As for the reasons we didn't see this bug earlier, I assume it's because very few drivers set the 0x04 query options flag, which means column names are omitted. This is the right thing to do since most drivers have enough information to correctly position the values. Fixes #3688 Signed-off-by: Duarte Nunes <duarte@scylladb.com> Message-Id: <20180814234605.14775-1-duarte@scylladb.com>
This commit is contained in:
committed by
Paweł Dziepak
parent
8751a58a2b
commit
a4355fe7e7
@@ -170,19 +170,18 @@ void query_options::prepare(const std::vector<::shared_ptr<column_specification>
|
||||
}
|
||||
|
||||
auto& names = *_names;
|
||||
std::vector<cql3::raw_value> ordered_values;
|
||||
std::vector<cql3::raw_value_view> ordered_values;
|
||||
ordered_values.reserve(specs.size());
|
||||
for (auto&& spec : specs) {
|
||||
auto& spec_name = spec->name->text();
|
||||
for (size_t j = 0; j < names.size(); j++) {
|
||||
if (names[j] == spec_name) {
|
||||
ordered_values.emplace_back(_values[j]);
|
||||
ordered_values.emplace_back(_value_views[j]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
_values = std::move(ordered_values);
|
||||
fill_value_views();
|
||||
_value_views = std::move(ordered_values);
|
||||
}
|
||||
|
||||
void query_options::fill_value_views()
|
||||
|
||||
Reference in New Issue
Block a user