Files
scylladb/test/boost/aggregate_fcts_test.cc
Kefu Chai 7ff0d7ba98 tree: Remove unused boost headers
This commit eliminates unused boost header includes from the tree.

Removing these unnecessary includes reduces dependencies on the
external Boost.Adapters library, leading to faster compile times
and a slightly cleaner codebase.

Signed-off-by: Kefu Chai <kefu.chai@scylladb.com>

Closes scylladb/scylladb#22857
2025-02-15 20:32:22 +02:00

273 lines
14 KiB
C++

/*
* Copyright (C) 2017-present ScyllaDB
*/
/*
* SPDX-License-Identifier: LicenseRef-ScyllaDB-Source-Available-1.0
*/
#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"
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)},
{decimal_type->from_string("2")},
{decimal_type->from_string("1.50")},
{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.)},
{decimal_type->from_string("3")},
{decimal_type->from_string("3.00")},
{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.)},
{decimal_type->from_string("2")},
{decimal_type->from_string("2.00")},
{varint_type->from_string("2")},
{utf8_type->from_string("b")},
{simple_date_type->from_string("2017-12-02")},
{timestamp_type->from_string("2017-12-02t03:00:00")},
{timeuuid_type->from_string("b650cbe0-f914-11e7-8892-000000000004")},
{bytes_type->from_string("0101")},
{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.)},
{decimal_type->from_string("1")},
{decimal_type->from_string("1.00")},
{varint_type->from_string("1")},
{utf8_type->from_string("a")},
{simple_date_type->from_string("2016-12-02")},
{timestamp_type->from_string("2016-12-02t06:00:00")},
{timeuuid_type->from_string("D2177dD0-EAa2-11de-a572-001B779C76e3")},
{bytes_type->from_string("01")},
{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()