Files
scylladb/test/boost/aggregate_fcts_test.cc
Botond Dénes 597d4252dc types: abstract_type::from_string() switch to fragmented buffers (interface)
Change input: str::string_view -> utils::chunked_string_view.
Change return value: bytes -> managed_bytes.

This patch only changes the interface, with some to_bytes() sprinkled in
the internals to deal with recursive calls.
Internals will be updated in the next patch, to keep the churn of
updating callers separate from the actually important changes.
2026-05-26 09:08:06 +03:00

274 lines
14 KiB
C++

/*
* Copyright (C) 2017-present ScyllaDB
*/
/*
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.1
*/
#include <boost/test/unit_test.hpp>
#include <boost/multiprecision/cpp_int.hpp>
#undef SEASTAR_TESTING_MAIN
#include <seastar/testing/test_case.hh>
#include "test/lib/cql_test_env.hh"
#include "test/lib/cql_assertions.hh"
#include <seastar/core/future-util.hh>
#include "types/set.hh"
#include "utils/chunked_string.hh"
BOOST_AUTO_TEST_SUITE(aggregate_fcts_test)
namespace {
void create_table(cql_test_env& e) {
e.execute_cql("CREATE TABLE test (a tinyint primary key,"
" b smallint,"
" c int,"
" d bigint,"
" e float,"
" f double,"
" g_0 decimal,"
" g_2 decimal,"
" h varint, "
" t text,"
" dt date,"
" tm timestamp,"
" tu timeuuid,"
" bl blob, "
" bo boolean)").get();
e.execute_cql("INSERT INTO test (a, b, c, d, e, f, g_0, g_2, h, t, dt, tm, tu, bl, bo) VALUES (1, 1, 1, 1, 1, 1, 1, 1.00, 1, 'a', '2017-12-02', '2017-12-02t03:00:00', b650cbe0-f914-11e7-8892-000000000004, 0x0101, false)").get();
e.execute_cql("INSERT INTO test (a, b, c, d, e, f, g_0, g_2, h, t, dt, tm, tu, bl, bo) VALUES (2, 2, 2, 2, 2, 2, 2, 2.00, 2, 'b', '2016-12-02', '2016-12-02t06:00:00', D2177dD0-EAa2-11de-a572-001B779C76e3, 0x01, true)").get();
}
} /* anonymous namespace */
SEASTAR_TEST_CASE(test_aggregate_avg) {
return do_with_cql_env_thread([&] (auto& e) {
create_table(e);
auto msg = e.execute_cql("SELECT avg(a), "
"avg(b), "
"avg(c), "
"avg(d), "
"avg(e), "
"avg(f), "
"avg(g_0), "
"avg(g_2), "
"avg(h) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{byte_type->decompose(int8_t(1))},
{short_type->decompose(int16_t(1))},
{int32_type->decompose(int32_t(1))},
{long_type->decompose(int64_t(1))},
{float_type->decompose((1.f+2.f)/2L)},
{double_type->decompose((1.+2.)/2L)},
{to_bytes(decimal_type->from_string("2"))},
{to_bytes(decimal_type->from_string("1.50"))},
{to_bytes(varint_type->from_string("1"))}});
});
}
SEASTAR_TEST_CASE(test_aggregate_sum) {
return do_with_cql_env_thread([&] (auto& e) {
create_table(e);
auto msg = e.execute_cql("SELECT sum(a), "
"sum(b), "
"sum(c), "
"sum(d), "
"sum(e), "
"sum(f), "
"sum(g_0), "
"sum(g_2), "
"sum(h) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{byte_type->decompose(int8_t(3))},
{short_type->decompose(int16_t(3))},
{int32_type->decompose(int32_t(3))},
{long_type->decompose(int64_t(3))},
{float_type->decompose(3.f)},
{double_type->decompose(3.)},
{to_bytes(decimal_type->from_string("3"))},
{to_bytes(decimal_type->from_string("3.00"))},
{to_bytes(varint_type->from_string("3"))}});
});
}
SEASTAR_TEST_CASE(test_aggregate_max) {
return do_with_cql_env_thread([&] (auto& e) {
create_table(e);
auto msg = e.execute_cql("SELECT max(a), "
"max(b), "
"max(c), "
"max(d), "
"max(e), "
"max(f), "
"max(g_0), "
"max(g_2), "
"max(h), "
"max(t), "
"max(dt), "
"max(tm), "
"max(tu), "
"max(bl), "
"max(bo) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{byte_type->decompose(int8_t(2))},
{short_type->decompose(int16_t(2))},
{int32_type->decompose(int32_t(2))},
{long_type->decompose(int64_t(2))},
{float_type->decompose(2.f)},
{double_type->decompose(2.)},
{to_bytes(decimal_type->from_string("2"))},
{to_bytes(decimal_type->from_string("2.00"))},
{to_bytes(varint_type->from_string("2"))},
{to_bytes(utf8_type->from_string("b"))},
{to_bytes(simple_date_type->from_string("2017-12-02"))},
{to_bytes(timestamp_type->from_string("2017-12-02t03:00:00"))},
{to_bytes(timeuuid_type->from_string("b650cbe0-f914-11e7-8892-000000000004"))},
{to_bytes(bytes_type->from_string("0101"))},
{to_bytes(boolean_type->from_string("true"))},
});
});
}
SEASTAR_TEST_CASE(test_aggregate_min) {
return do_with_cql_env_thread([&] (auto& e) {
create_table(e);
auto msg = e.execute_cql("SELECT min(a), "
"min(b), "
"min(c), "
"min(d), "
"min(e), "
"min(f), "
"min(g_0), "
"min(g_2), "
"min(h), "
"min(t), "
"min(dt), "
"min(tm), "
"min(tu), "
"min(bl), "
"min(bo) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{byte_type->decompose(int8_t(1))},
{short_type->decompose(int16_t(1))},
{int32_type->decompose(int32_t(1))},
{long_type->decompose(int64_t(1))},
{float_type->decompose(1.f)},
{double_type->decompose(1.)},
{to_bytes(decimal_type->from_string("1"))},
{to_bytes(decimal_type->from_string("1.00"))},
{to_bytes(varint_type->from_string("1"))},
{to_bytes(utf8_type->from_string("a"))},
{to_bytes(simple_date_type->from_string("2016-12-02"))},
{to_bytes(timestamp_type->from_string("2016-12-02t06:00:00"))},
{to_bytes(timeuuid_type->from_string("D2177dD0-EAa2-11de-a572-001B779C76e3"))},
{to_bytes(bytes_type->from_string("01"))},
{to_bytes(boolean_type->from_string("false"))},
});
});
}
SEASTAR_TEST_CASE(test_aggregate_count) {
return do_with_cql_env_thread([&] (auto& e) {
e.execute_cql("CREATE TABLE test(a int primary key, b int, c int, bl blob, bo boolean)").get();
e.execute_cql("INSERT INTO test(a, b, bl, bo) VALUES (1, 1, 0x01, false)").get();
e.execute_cql("INSERT INTO test(a, c, bo) VALUES (2, 2, true)").get();
e.execute_cql("INSERT INTO test(a, c, bl) VALUES (3, 3, 0x03)").get();
{
auto msg = e.execute_cql("SELECT count(*) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{long_type->decompose(int64_t(3))}});
}
{
auto msg = e.execute_cql("SELECT count(a) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{long_type->decompose(int64_t(3))}});
}
{
auto msg = e.execute_cql("SELECT count(b) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{long_type->decompose(int64_t(1))}});
}
{
auto msg = e.execute_cql("SELECT count(c) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{long_type->decompose(int64_t(2))}});
}
{
auto msg = e.execute_cql("SELECT count(bo) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{long_type->decompose(int64_t(2))}});
}
{
auto msg = e.execute_cql("SELECT count(a), count(b), count(c), count(bl), count(bo), count(*) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{long_type->decompose(int64_t(3))},
{long_type->decompose(int64_t(1))},
{long_type->decompose(int64_t(2))},
{long_type->decompose(int64_t(2))},
{long_type->decompose(int64_t(2))},
{long_type->decompose(int64_t(3))}});
}
{
auto msg = e.execute_cql("SELECT count(a), count(b), count(c), count(bo), count(*) FROM test LIMIT 1").get();
assert_that(msg).is_rows().with_size(1).with_row({{long_type->decompose(int64_t(3))},
{long_type->decompose(int64_t(1))},
{long_type->decompose(int64_t(2))},
{long_type->decompose(int64_t(2))},
{long_type->decompose(int64_t(3))}});
}
});
}
SEASTAR_TEST_CASE(test_reverse_type_aggregation) {
return do_with_cql_env_thread([&] (auto& e) {
e.execute_cql("CREATE TABLE test(p int, c timestamp, v int, primary key (p, c)) with clustering order by (c desc)").get();
e.execute_cql("INSERT INTO test(p, c, v) VALUES (1, 1, 1)").get();
e.execute_cql("INSERT INTO test(p, c, v) VALUES (1, 2, 1)").get();
{
auto tp = db_clock::from_time_t(0) + std::chrono::milliseconds(1);
auto msg = e.execute_cql("SELECT min(c) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{timestamp_type->decompose(tp)}});
}
{
auto tp = db_clock::from_time_t(0) + std::chrono::milliseconds(2);
auto msg = e.execute_cql("SELECT max(c) FROM test").get();
assert_that(msg).is_rows().with_size(1).with_row({{timestamp_type->decompose(tp)}});
}
});
}
// Tests #6768
SEASTAR_TEST_CASE(test_minmax_on_set) {
return do_with_cql_env_thread([&] (auto& e) {
e.execute_cql("CREATE TABLE test (id int PRIMARY KEY, s1 set<int>, s2 set<blob>);").get();
e.execute_cql("INSERT INTO test (id, s1, s2) VALUES (1, {-1, 1}, {0xff, 0x01});").get();
e.execute_cql("INSERT INTO test (id, s1, s2) VALUES (2, {-2, 2}, {0xfe, 0x02});").get();
const auto set_type_int = set_type_impl::get_instance(int32_type, true);
const auto set_type_blob = set_type_impl::get_instance(bytes_type, true);
{
const auto msg = e.execute_cql("SELECT max(s1), max(s2) FROM test;").get();
assert_that(msg).is_rows().with_size(1).with_row({
set_type_int->decompose(make_set_value(set_type_int, {-1, 1})),
set_type_blob->decompose(make_set_value(set_type_blob, {"\x02", "\xfe"}))
});
}
{
const auto msg = e.execute_cql("SELECT min(s1), min(s2) FROM test;").get();
assert_that(msg).is_rows().with_size(1).with_row({
set_type_int->decompose(make_set_value(set_type_int, {-2, 2})),
set_type_blob->decompose(make_set_value(set_type_blob, {"\x01", "\xff"}))
});
}
});
}
BOOST_AUTO_TEST_SUITE_END()