diff --git a/clickhouse/base/sslsocket.cpp b/clickhouse/base/sslsocket.cpp index 29efa504..ad3acb2e 100644 --- a/clickhouse/base/sslsocket.cpp +++ b/clickhouse/base/sslsocket.cpp @@ -61,6 +61,9 @@ void configureSSL(const clickhouse::SSLParams::ConfigurationType & configuration SSL_CONF_CTX_set_ssl(conf_ctx, ssl); else if (context) SSL_CONF_CTX_set_ssl_ctx(conf_ctx, context); + else { + throw clickhouse::AssertionError("Either SSL or SSL_CTX should be provided"); + } for (const auto & kv : configuration) { const int err = SSL_CONF_cmd(conf_ctx, kv.first.c_str(), (kv.second ? kv.second->c_str() : nullptr)); diff --git a/clickhouse/columns/string.cpp b/clickhouse/columns/string.cpp index 8ea362c4..914b0aa6 100644 --- a/clickhouse/columns/string.cpp +++ b/clickhouse/columns/string.cpp @@ -30,6 +30,9 @@ ColumnFixedString::ColumnFixedString(size_t n) { } +ColumnFixedString::~ColumnFixedString() +{} + void ColumnFixedString::Append(std::string_view str) { if (str.size() > string_size_) { throw ValidationError("Expected string of length not greater than " diff --git a/clickhouse/columns/string.h b/clickhouse/columns/string.h index f2216f40..db835dbd 100644 --- a/clickhouse/columns/string.h +++ b/clickhouse/columns/string.h @@ -18,6 +18,7 @@ class ColumnFixedString : public Column { using ValueType = std::string_view; explicit ColumnFixedString(size_t n); + ~ColumnFixedString() override; template ColumnFixedString(size_t n, const Values & values) @@ -76,7 +77,7 @@ class ColumnString : public Column { using ValueType = std::string_view; ColumnString(); - ~ColumnString(); + ~ColumnString() override; explicit ColumnString(const std::vector & data); explicit ColumnString(std::vector&& data); diff --git a/clickhouse/query.h b/clickhouse/query.h index ae98690d..8db22741 100644 --- a/clickhouse/query.h +++ b/clickhouse/query.h @@ -10,30 +10,6 @@ namespace clickhouse { -/** - * Settings of individual query. - */ -struct QuerySettings { - /// Maximum thread to use on the server-side to process a query. Default - let the server choose. - int max_threads = 0; - /// Compute min and max values of the result. - bool extremes = false; - /// Silently skip unavailable shards. - bool skip_unavailable_shards = false; - /// Write statistics about read rows, bytes, time elapsed, etc. - bool output_format_write_statistics = true; - /// Use client timezone for interpreting DateTime string values, instead of adopting server timezone. - bool use_client_time_zone = false; - - // connect_timeout - // max_block_size - // distributed_group_by_no_merge = false - // strict_insert_defaults = 0 - // network_compression_method = LZ4 - // priority = 0 -}; - - struct Profile { uint64_t rows = 0; uint64_t blocks = 0; diff --git a/ut/Column_ut.cpp b/ut/Column_ut.cpp index de8a21ac..83876d03 100644 --- a/ut/Column_ut.cpp +++ b/ut/Column_ut.cpp @@ -243,6 +243,15 @@ TYPED_TEST(GenericColumnTest, Swap) { column_A->Swap(*column_B); EXPECT_EQ(0u, column_A->Size()); + + { + // If there are any dandling pointers/references from column_B into column_A after Swap(), + // then filling column_A with new values would most likely overwrite/invalidate those + // and CompareRecursive below would fail. + this->AppendValues(column_A, this->GenerateValues(1)); + column_A.reset(); + } + EXPECT_TRUE(CompareRecursive(values, *column_B)); }