Files
scylladb/tests/cql_assertions.hh
Eliran Sinvani 83628f5881 cql3: maintain correctness of multicolumn restriction on mixed order columns
When a query with multicolumn inequality is issued on clustering columns
having mixed order (ASC and DESC together), if the ranges are not
broken to none overlapping lexicographically monotonic ones, the node
return incorrect rows. This is due to the search nature
(prefix comparison). The solution is to break the range imposed
by the restriction into several single column restrictions OR-ed
together that will be logically equivalent and preserve the
monotonicity assumption. This commit also fixes incorrect results
returned by a multicolumn query on an all descending columns.

A unit test have been added to account for both issues fixed.

Fixes #2050
Tests: Unit test, manual tests of the use case in the issue.

Signed-off-by: Eliran Sinvani <eliransin@scylladb.com>
Message-Id: <3b96620a3bd8b0614359a3b0757f324d45189dbb.1536478193.git.eliransin@scylladb.com>
2018-09-17 20:35:55 +03:00

75 lines
2.2 KiB
C++

/*
* Copyright (C) 2015 ScyllaDB
*/
/*
* This file is part of Scylla.
*
* Scylla is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Scylla is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Scylla. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "transport/messages/result_message_base.hh"
#include "bytes.hh"
#include "core/shared_ptr.hh"
#include "core/future.hh"
class rows_assertions {
shared_ptr<cql_transport::messages::result_message::rows> _rows;
public:
rows_assertions(shared_ptr<cql_transport::messages::result_message::rows> rows);
rows_assertions with_size(size_t size);
rows_assertions is_empty();
rows_assertions is_not_empty();
rows_assertions with_row(std::initializer_list<bytes_opt> values);
// Verifies that the result has the following rows and only that rows, in that order.
rows_assertions with_rows(std::initializer_list<std::initializer_list<bytes_opt>> rows);
// Verifies that the result has the following rows and only those rows.
rows_assertions with_rows_ignore_order(std::vector<std::vector<bytes_opt>> rows);
};
class result_msg_assertions {
shared_ptr<cql_transport::messages::result_message> _msg;
public:
result_msg_assertions(shared_ptr<cql_transport::messages::result_message> msg);
rows_assertions is_rows();
};
result_msg_assertions assert_that(shared_ptr<cql_transport::messages::result_message> msg);
template<typename... T>
void assert_that_failed(future<T...>& f)
{
try {
f.get();
assert(f.failed());
}
catch (...) {
}
}
template<typename... T>
void assert_that_failed(future<T...>&& f)
{
try {
f.get();
assert(f.failed());
}
catch (...) {
}
}