cql3: pass column_specification by ref to cql3::assignment_testable functions
This patch changes the signatures of `test_assignment` and `test_all` functions to accept `cql3::column_specification` by const reference instead of shared pointer. Mostly a cosmetic change reducing overall shared_ptr bloat in cql3 code. Tests: unit(dev, debug) Signed-off-by: Pavel Solodovnikov <pa.solodovnikov@scylladb.com> Message-Id: <20200529195249.767346-1-pa.solodovnikov@scylladb.com>
This commit is contained in:
committed by
Avi Kivity
parent
d6b4a9a237
commit
c4bbeb80db
@@ -87,7 +87,7 @@ abstract_marker::raw::raw(int32_t bind_index)
|
||||
return ::make_shared<constants::marker>(_bind_index, receiver);
|
||||
}
|
||||
|
||||
assignment_testable::test_result abstract_marker::raw::test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const {
|
||||
assignment_testable::test_result abstract_marker::raw::test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const {
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
}
|
||||
|
||||
|
||||
@@ -72,7 +72,7 @@ public:
|
||||
|
||||
virtual ::shared_ptr<term> prepare(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override;
|
||||
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override;
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override;
|
||||
|
||||
virtual sstring to_string() const override;
|
||||
};
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
// Test all elements of toTest for assignment. If all are exact match, return exact match. If any is not assignable,
|
||||
// return not assignable. Otherwise, return weakly assignable.
|
||||
template <typename AssignmentTestablePtrRange>
|
||||
static test_result test_all(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver,
|
||||
static test_result test_all(database& db, const sstring& keyspace, const column_specification& receiver,
|
||||
AssignmentTestablePtrRange&& to_test) {
|
||||
test_result res = test_result::EXACT_MATCH;
|
||||
for (auto&& rt : to_test) {
|
||||
@@ -99,7 +99,7 @@ public:
|
||||
* Most caller should just call the isAssignable() method on the result, though functions have a use for
|
||||
* testing "strong" equality to decide the most precise overload to pick when multiple could match.
|
||||
*/
|
||||
virtual test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const = 0;
|
||||
virtual test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const = 0;
|
||||
|
||||
// for error reporting
|
||||
virtual sstring assignment_testable_source_context() const = 0;
|
||||
|
||||
@@ -82,9 +82,9 @@ constants::literal::parsed_value(data_type validator) const
|
||||
}
|
||||
|
||||
assignment_testable::test_result
|
||||
constants::literal::test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const
|
||||
constants::literal::test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const
|
||||
{
|
||||
auto receiver_type = receiver->type->as_cql3_type();
|
||||
auto receiver_type = receiver.type->as_cql3_type();
|
||||
if (receiver_type.is_collection() || receiver_type.is_user_type()) {
|
||||
return test_result::NOT_ASSIGNABLE;
|
||||
}
|
||||
@@ -157,7 +157,7 @@ constants::literal::test_assignment(database& db, const sstring& keyspace, lw_sh
|
||||
::shared_ptr<term>
|
||||
constants::literal::prepare(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const
|
||||
{
|
||||
if (!is_assignable(test_assignment(db, keyspace, receiver))) {
|
||||
if (!is_assignable(test_assignment(db, keyspace, *receiver))) {
|
||||
throw exceptions::invalid_request_exception(format("Invalid {} constant ({}) for \"{}\" of type {}",
|
||||
_type, _text, *receiver->name, receiver->type->as_cql3_type().to_string()));
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ public:
|
||||
public:
|
||||
static thread_local const ::shared_ptr<terminal> NULL_VALUE;
|
||||
virtual ::shared_ptr<term> prepare(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override {
|
||||
if (!is_assignable(test_assignment(db, keyspace, receiver))) {
|
||||
if (!is_assignable(test_assignment(db, keyspace, *receiver))) {
|
||||
throw exceptions::invalid_request_exception("Invalid null value for counter increment/decrement");
|
||||
}
|
||||
return NULL_VALUE;
|
||||
@@ -96,8 +96,8 @@ public:
|
||||
|
||||
virtual assignment_testable::test_result test_assignment(database& db,
|
||||
const sstring& keyspace,
|
||||
lw_shared_ptr<column_specification> receiver) const override {
|
||||
return receiver->type->is_counter()
|
||||
const column_specification& receiver) const override {
|
||||
return receiver.type->is_counter()
|
||||
? assignment_testable::test_result::NOT_ASSIGNABLE
|
||||
: assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
}
|
||||
@@ -161,7 +161,7 @@ public:
|
||||
return _text;
|
||||
}
|
||||
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const;
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const;
|
||||
|
||||
virtual sstring to_string() const override {
|
||||
return _type == type::STRING ? sstring(format("'{}'", _text)) : _text;
|
||||
|
||||
@@ -79,7 +79,7 @@ public:
|
||||
// All parameters must be terminal
|
||||
static bytes_opt execute(scalar_function& fun, std::vector<shared_ptr<term>> parameters);
|
||||
public:
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override;
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override;
|
||||
virtual sstring to_string() const override;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -187,7 +187,7 @@ functions::get(database& db,
|
||||
const std::vector<shared_ptr<assignment_testable>>& provided_args,
|
||||
const sstring& receiver_ks,
|
||||
const sstring& receiver_cf,
|
||||
lw_shared_ptr<column_specification> receiver) {
|
||||
const column_specification* receiver) {
|
||||
|
||||
static const function_name TOKEN_FUNCTION_NAME = function_name::native_function("token");
|
||||
static const function_name TO_JSON_FUNCTION_NAME = function_name::native_function("tojson");
|
||||
@@ -370,7 +370,7 @@ functions::validate_types(database& db,
|
||||
}
|
||||
|
||||
auto&& expected = make_arg_spec(receiver_ks, receiver_cf, *fun, i);
|
||||
if (!is_assignable(provided->test_assignment(db, keyspace, expected))) {
|
||||
if (!is_assignable(provided->test_assignment(db, keyspace, *expected))) {
|
||||
throw exceptions::invalid_request_exception(
|
||||
format("Type error: {} cannot be passed as argument {:d} of function {} of type {}",
|
||||
provided, i, fun->name(), expected->type->as_cql3_type()));
|
||||
@@ -397,7 +397,7 @@ functions::match_arguments(database& db, const sstring& keyspace,
|
||||
continue;
|
||||
}
|
||||
auto&& expected = make_arg_spec(receiver_ks, receiver_cf, *fun, i);
|
||||
auto arg_res = provided->test_assignment(db, keyspace, expected);
|
||||
auto arg_res = provided->test_assignment(db, keyspace, *expected);
|
||||
if (arg_res == assignment_testable::test_result::NOT_ASSIGNABLE) {
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
}
|
||||
@@ -514,7 +514,7 @@ function_call::raw::prepare(database& db, const sstring& keyspace, lw_shared_ptr
|
||||
[] (auto&& x) -> shared_ptr<assignment_testable> {
|
||||
return x;
|
||||
});
|
||||
auto&& fun = functions::functions::get(db, keyspace, _name, args, receiver->ks_name, receiver->cf_name, receiver);
|
||||
auto&& fun = functions::functions::get(db, keyspace, _name, args, receiver->ks_name, receiver->cf_name, receiver.get());
|
||||
if (!fun) {
|
||||
throw exceptions::invalid_request_exception(format("Unknown function {} called", _name));
|
||||
}
|
||||
@@ -572,16 +572,16 @@ function_call::raw::execute(scalar_function& fun, std::vector<shared_ptr<term>>
|
||||
}
|
||||
|
||||
assignment_testable::test_result
|
||||
function_call::raw::test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const {
|
||||
function_call::raw::test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const {
|
||||
// Note: Functions.get() will return null if the function doesn't exist, or throw is no function matching
|
||||
// the arguments can be found. We may get one of those if an undefined/wrong function is used as argument
|
||||
// of another, existing, function. In that case, we return true here because we'll throw a proper exception
|
||||
// later with a more helpful error message that if we were to return false here.
|
||||
try {
|
||||
auto&& fun = functions::get(db, keyspace, _name, _terms, receiver->ks_name, receiver->cf_name, receiver);
|
||||
if (fun && receiver->type == fun->return_type()) {
|
||||
auto&& fun = functions::get(db, keyspace, _name, _terms, receiver.ks_name, receiver.cf_name, &receiver);
|
||||
if (fun && receiver.type == fun->return_type()) {
|
||||
return assignment_testable::test_result::EXACT_MATCH;
|
||||
} else if (!fun || receiver->type->is_value_compatible_with(*fun->return_type())) {
|
||||
} else if (!fun || receiver.type->is_value_compatible_with(*fun->return_type())) {
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
} else {
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
|
||||
@@ -77,7 +77,7 @@ public:
|
||||
const std::vector<shared_ptr<assignment_testable>>& provided_args,
|
||||
const sstring& receiver_ks,
|
||||
const sstring& receiver_cf,
|
||||
lw_shared_ptr<column_specification> receiver = nullptr);
|
||||
const column_specification* receiver = nullptr);
|
||||
template <typename AssignmentTestablePtrRange>
|
||||
static shared_ptr<function> get(database& db,
|
||||
const sstring& keyspace,
|
||||
@@ -85,7 +85,7 @@ public:
|
||||
AssignmentTestablePtrRange&& provided_args,
|
||||
const sstring& receiver_ks,
|
||||
const sstring& receiver_cf,
|
||||
lw_shared_ptr<column_specification> receiver = nullptr) {
|
||||
const column_specification* receiver = nullptr) {
|
||||
const std::vector<shared_ptr<assignment_testable>> args(std::begin(provided_args), std::end(provided_args));
|
||||
return get(db, keyspace, name, args, receiver_ks, receiver_cf, receiver);
|
||||
}
|
||||
|
||||
@@ -93,7 +93,7 @@ lists::literal::validate_assignable_to(database& db, const sstring keyspace, con
|
||||
}
|
||||
auto&& value_spec = value_spec_of(receiver);
|
||||
for (auto rt : _elements) {
|
||||
if (!is_assignable(rt->test_assignment(db, keyspace, value_spec))) {
|
||||
if (!is_assignable(rt->test_assignment(db, keyspace, *value_spec))) {
|
||||
throw exceptions::invalid_request_exception(format("Invalid list literal for {}: value {} is not of type {}",
|
||||
*receiver.name, *rt, value_spec->type->as_cql3_type()));
|
||||
}
|
||||
@@ -101,8 +101,8 @@ lists::literal::validate_assignable_to(database& db, const sstring keyspace, con
|
||||
}
|
||||
|
||||
assignment_testable::test_result
|
||||
lists::literal::test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const {
|
||||
if (!dynamic_pointer_cast<const list_type_impl>(receiver->type)) {
|
||||
lists::literal::test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const {
|
||||
if (!dynamic_pointer_cast<const list_type_impl>(receiver.type)) {
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
}
|
||||
|
||||
@@ -111,11 +111,11 @@ lists::literal::test_assignment(database& db, const sstring& keyspace, lw_shared
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
}
|
||||
|
||||
auto&& value_spec = value_spec_of(*receiver);
|
||||
auto&& value_spec = value_spec_of(receiver);
|
||||
std::vector<shared_ptr<assignment_testable>> to_test;
|
||||
to_test.reserve(_elements.size());
|
||||
std::copy(_elements.begin(), _elements.end(), std::back_inserter(to_test));
|
||||
return assignment_testable::test_all(db, keyspace, value_spec, to_test);
|
||||
return assignment_testable::test_all(db, keyspace, *value_spec, to_test);
|
||||
}
|
||||
|
||||
sstring
|
||||
|
||||
@@ -68,7 +68,7 @@ public:
|
||||
private:
|
||||
void validate_assignable_to(database& db, const sstring keyspace, const column_specification& receiver) const;
|
||||
public:
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override;
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override;
|
||||
virtual sstring to_string() const override;
|
||||
};
|
||||
|
||||
|
||||
16
cql3/maps.cc
16
cql3/maps.cc
@@ -104,31 +104,31 @@ maps::literal::validate_assignable_to(database& db, const sstring& keyspace, con
|
||||
auto&& key_spec = maps::key_spec_of(receiver);
|
||||
auto&& value_spec = maps::value_spec_of(receiver);
|
||||
for (auto&& entry : entries) {
|
||||
if (!is_assignable(entry.first->test_assignment(db, keyspace, key_spec))) {
|
||||
if (!is_assignable(entry.first->test_assignment(db, keyspace, *key_spec))) {
|
||||
throw exceptions::invalid_request_exception(format("Invalid map literal for {}: key {} is not of type {}", *receiver.name, *entry.first, key_spec->type->as_cql3_type()));
|
||||
}
|
||||
if (!is_assignable(entry.second->test_assignment(db, keyspace, value_spec))) {
|
||||
if (!is_assignable(entry.second->test_assignment(db, keyspace, *value_spec))) {
|
||||
throw exceptions::invalid_request_exception(format("Invalid map literal for {}: value {} is not of type {}", *receiver.name, *entry.second, value_spec->type->as_cql3_type()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assignment_testable::test_result
|
||||
maps::literal::test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const {
|
||||
if (!dynamic_pointer_cast<const map_type_impl>(receiver->type)) {
|
||||
maps::literal::test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const {
|
||||
if (!dynamic_pointer_cast<const map_type_impl>(receiver.type)) {
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
}
|
||||
// If there is no elements, we can't say it's an exact match (an empty map if fundamentally polymorphic).
|
||||
if (entries.empty()) {
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
}
|
||||
auto key_spec = maps::key_spec_of(*receiver);
|
||||
auto value_spec = maps::value_spec_of(*receiver);
|
||||
auto key_spec = maps::key_spec_of(receiver);
|
||||
auto value_spec = maps::value_spec_of(receiver);
|
||||
// It's an exact match if all are exact match, but is not assignable as soon as any is non assignable.
|
||||
auto res = assignment_testable::test_result::EXACT_MATCH;
|
||||
for (auto entry : entries) {
|
||||
auto t1 = entry.first->test_assignment(db, keyspace, key_spec);
|
||||
auto t2 = entry.second->test_assignment(db, keyspace, value_spec);
|
||||
auto t1 = entry.first->test_assignment(db, keyspace, *key_spec);
|
||||
auto t2 = entry.second->test_assignment(db, keyspace, *value_spec);
|
||||
if (t1 == assignment_testable::test_result::NOT_ASSIGNABLE || t2 == assignment_testable::test_result::NOT_ASSIGNABLE)
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
if (t1 != assignment_testable::test_result::EXACT_MATCH || t2 != assignment_testable::test_result::EXACT_MATCH)
|
||||
|
||||
@@ -70,7 +70,7 @@ public:
|
||||
private:
|
||||
void validate_assignable_to(database& db, const sstring& keyspace, const column_specification& receiver) const;
|
||||
public:
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override;
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override;
|
||||
virtual sstring to_string() const override;
|
||||
};
|
||||
|
||||
|
||||
@@ -107,8 +107,8 @@ public:
|
||||
*/
|
||||
virtual void reset() = 0;
|
||||
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override {
|
||||
auto t1 = receiver->type->underlying_type();
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override {
|
||||
auto t1 = receiver.type->underlying_type();
|
||||
auto t2 = get_type()->underlying_type();
|
||||
// We want columns of `counter_type' to be served by underlying type's overloads
|
||||
// (here: `counter_cell_view::total_value_type()') with an `EXACT_MATCH'.
|
||||
|
||||
12
cql3/sets.cc
12
cql3/sets.cc
@@ -98,17 +98,17 @@ sets::literal::validate_assignable_to(database& db, const sstring& keyspace, con
|
||||
|
||||
auto&& value_spec = value_spec_of(receiver);
|
||||
for (shared_ptr<term::raw> rt : _elements) {
|
||||
if (!is_assignable(rt->test_assignment(db, keyspace, value_spec))) {
|
||||
if (!is_assignable(rt->test_assignment(db, keyspace, *value_spec))) {
|
||||
throw exceptions::invalid_request_exception(format("Invalid set literal for {}: value {} is not of type {}", *receiver.name, *rt, value_spec->type->as_cql3_type()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assignment_testable::test_result
|
||||
sets::literal::test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const {
|
||||
if (!dynamic_pointer_cast<const set_type_impl>(receiver->type)) {
|
||||
sets::literal::test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const {
|
||||
if (!dynamic_pointer_cast<const set_type_impl>(receiver.type)) {
|
||||
// We've parsed empty maps as a set literal to break the ambiguity so handle that case now
|
||||
if (dynamic_pointer_cast<const map_type_impl>(receiver->type) && _elements.empty()) {
|
||||
if (dynamic_pointer_cast<const map_type_impl>(receiver.type) && _elements.empty()) {
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
}
|
||||
|
||||
@@ -120,10 +120,10 @@ sets::literal::test_assignment(database& db, const sstring& keyspace, lw_shared_
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
}
|
||||
|
||||
auto&& value_spec = value_spec_of(*receiver);
|
||||
auto&& value_spec = value_spec_of(receiver);
|
||||
// FIXME: make assignment_testable::test_all() accept ranges
|
||||
std::vector<shared_ptr<assignment_testable>> to_test(_elements.begin(), _elements.end());
|
||||
return assignment_testable::test_all(db, keyspace, value_spec, to_test);
|
||||
return assignment_testable::test_all(db, keyspace, *value_spec, to_test);
|
||||
}
|
||||
|
||||
sstring
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
virtual shared_ptr<term> prepare(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override;
|
||||
void validate_assignable_to(database& db, const sstring& keyspace, const column_specification& receiver) const;
|
||||
assignment_testable::test_result
|
||||
test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const;
|
||||
test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const;
|
||||
virtual sstring to_string() const override;
|
||||
};
|
||||
|
||||
|
||||
@@ -82,15 +82,15 @@ public:
|
||||
|
||||
auto&& value = _elements[i];
|
||||
auto&& spec = component_spec_of(receiver, i);
|
||||
if (!assignment_testable::is_assignable(value->test_assignment(db, keyspace, spec))) {
|
||||
if (!assignment_testable::is_assignable(value->test_assignment(db, keyspace, *spec))) {
|
||||
throw exceptions::invalid_request_exception(format("Invalid tuple literal for {}: component {:d} is not of type {}", receiver.name, i, spec->type->as_cql3_type()));
|
||||
}
|
||||
}
|
||||
}
|
||||
public:
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override {
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override {
|
||||
try {
|
||||
validate_assignable_to(db, keyspace, *receiver);
|
||||
validate_assignable_to(db, keyspace, receiver);
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
} catch (exceptions::invalid_request_exception& e) {
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
|
||||
@@ -53,10 +53,10 @@ public:
|
||||
}
|
||||
|
||||
virtual shared_ptr<term> prepare(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override {
|
||||
if (!is_assignable(_term->test_assignment(db, keyspace, casted_spec_of(db, keyspace, *receiver)))) {
|
||||
if (!is_assignable(_term->test_assignment(db, keyspace, *casted_spec_of(db, keyspace, *receiver)))) {
|
||||
throw exceptions::invalid_request_exception(format("Cannot cast value {} to type {}", _term, _type));
|
||||
}
|
||||
if (!is_assignable(test_assignment(db, keyspace, receiver))) {
|
||||
if (!is_assignable(test_assignment(db, keyspace, *receiver))) {
|
||||
throw exceptions::invalid_request_exception(format("Cannot assign value {} to {} of type {}", *this, receiver->name, receiver->type->as_cql3_type()));
|
||||
}
|
||||
return _term->prepare(db, keyspace, receiver);
|
||||
@@ -67,12 +67,12 @@ private:
|
||||
::make_shared<column_identifier>(to_string(), true), _type->prepare(db, keyspace).get_type());
|
||||
}
|
||||
public:
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override {
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override {
|
||||
try {
|
||||
auto&& casted_type = _type->prepare(db, keyspace).get_type();
|
||||
if (receiver->type == casted_type) {
|
||||
if (receiver.type == casted_type) {
|
||||
return assignment_testable::test_result::EXACT_MATCH;
|
||||
} else if (receiver->type->is_value_compatible_with(*casted_type)) {
|
||||
} else if (receiver.type->is_value_compatible_with(*casted_type)) {
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
} else {
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
|
||||
@@ -122,15 +122,15 @@ void user_types::literal::validate_assignable_to(database& db, const sstring& ke
|
||||
}
|
||||
const shared_ptr<term::raw>& value = _entries.at(field);
|
||||
auto&& field_spec = field_spec_of(receiver, i);
|
||||
if (!assignment_testable::is_assignable(value->test_assignment(db, keyspace, field_spec))) {
|
||||
if (!assignment_testable::is_assignable(value->test_assignment(db, keyspace, *field_spec))) {
|
||||
throw exceptions::invalid_request_exception(format("Invalid user type literal for {}: field {} is not of type {}", receiver.name, field, field_spec->type->as_cql3_type()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
assignment_testable::test_result user_types::literal::test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const {
|
||||
assignment_testable::test_result user_types::literal::test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const {
|
||||
try {
|
||||
validate_assignable_to(db, keyspace, *receiver);
|
||||
validate_assignable_to(db, keyspace, receiver);
|
||||
return assignment_testable::test_result::WEAKLY_ASSIGNABLE;
|
||||
} catch (exceptions::invalid_request_exception& e) {
|
||||
return assignment_testable::test_result::NOT_ASSIGNABLE;
|
||||
|
||||
@@ -67,7 +67,7 @@ public:
|
||||
private:
|
||||
void validate_assignable_to(database& db, const sstring& keyspace, const column_specification& receiver) const;
|
||||
public:
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, lw_shared_ptr<column_specification> receiver) const override;
|
||||
virtual assignment_testable::test_result test_assignment(database& db, const sstring& keyspace, const column_specification& receiver) const override;
|
||||
virtual sstring assignment_testable_source_context() const override;
|
||||
virtual sstring to_string() const override;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user