diff --git a/clickhouse/client.cpp b/clickhouse/client.cpp index 3b75efc0..ca57190b 100644 --- a/clickhouse/client.cpp +++ b/clickhouse/client.cpp @@ -609,9 +609,9 @@ bool Client::Impl::ReadBlock(InputStream& input, Block* block) { CreateColumnByTypeSettings create_column_settings; create_column_settings.low_cardinality_as_wrapped_column = options_.backward_compatibility_lowcardinality_as_wrapped_column; - std::string name; - std::string type; for (size_t i = 0; i < num_columns; ++i) { + std::string name; + std::string type; if (!WireFormat::ReadString(input, &name)) { return false; } diff --git a/ut/CMakeLists.txt b/ut/CMakeLists.txt index 2c9f6ee5..6b395458 100644 --- a/ut/CMakeLists.txt +++ b/ut/CMakeLists.txt @@ -15,6 +15,7 @@ SET ( clickhouse-cpp-ut-src performance_tests.cpp tcp_server.cpp readonly_client_test.cpp + abnormal_column_names_test.cpp connection_failed_client_test.cpp array_of_low_cardinality_tests.cpp CreateColumnByType_ut.cpp diff --git a/ut/abnormal_column_names_test.cpp b/ut/abnormal_column_names_test.cpp new file mode 100644 index 00000000..cb8c81eb --- /dev/null +++ b/ut/abnormal_column_names_test.cpp @@ -0,0 +1,75 @@ +#include "abnormal_column_names_test.h" +#include "utils.h" + +#include +#include +#include +#include + +namespace { + using namespace clickhouse; +} + +void AbnormalColumnNamesClientTest::SetUp() { + client_ = std::make_unique(std::get<0>(GetParam())); +} + +void AbnormalColumnNamesClientTest::TearDown() { + client_.reset(); +} + +// Sometimes gtest fails to detect that this test is instantiated elsewhere, suppress the error explicitly. +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(AbnormalColumnNamesClientTest); +TEST_P(AbnormalColumnNamesClientTest, Select) { + static const std::vector expect_results { + "+-------+-------+-------+\n"\ + "| 123 | 231 | 113 |\n"\ + "+-------+-------+-------+\n"\ + "| UInt8 | UInt8 | UInt8 |\n"\ + "+-------+-------+-------+\n"\ + "| 123 | 231 | 113 |\n"\ + "+-------+-------+-------+\n", + "+--------+--------+--------+--------+\n"\ + "| 'ABC' | 'AAA' | 'BBB' | 'CCC' |\n"\ + "+--------+--------+--------+--------+\n"\ + "| String | String | String | String |\n"\ + "+--------+--------+--------+--------+\n"\ + "| ABC | AAA | BBB | CCC |\n"\ + "+--------+--------+--------+--------+\n" + }; + const auto & queries = std::get<1>(GetParam()); + for (size_t i = 0; i < queries.size(); ++i) { + const auto & query = queries.at(i); + client_->Select(query, + [& queries, i](const Block& block) { + if (block.GetRowCount() == 0 || block.GetColumnCount() == 0) + return; + EXPECT_EQ(1UL, block.GetRowCount()); + EXPECT_EQ(i == 0 ? 3UL: 4UL, block.GetColumnCount()); + + std::stringstream sstr; + sstr << PrettyPrintBlock{block}; + auto result = sstr.str(); + std::cout << "query => " << queries.at(i) <<"\n" << PrettyPrintBlock{block}; + ASSERT_EQ(expect_results.at(i), result); + } + ); + } +} + + +INSTANTIATE_TEST_SUITE_P(ClientColumnNames, AbnormalColumnNamesClientTest, + ::testing::Values(AbnormalColumnNamesClientTest::ParamType{ + ClientOptions() + .SetHost( getEnvOrDefault("CLICKHOUSE_HOST", "localhost")) + .SetPort( getEnvOrDefault("CLICKHOUSE_PORT", "9000")) + .SetUser( getEnvOrDefault("CLICKHOUSE_USER", "default")) + .SetPassword( getEnvOrDefault("CLICKHOUSE_PASSWORD", "")) + .SetDefaultDatabase(getEnvOrDefault("CLICKHOUSE_DB", "default")) + .SetSendRetries(1) + .SetPingBeforeQuery(true) + .SetCompressionMethod(CompressionMethod::None), + {"select 123,231,113", "select 'ABC','AAA','BBB','CCC'"} + } +)); + diff --git a/ut/abnormal_column_names_test.h b/ut/abnormal_column_names_test.h new file mode 100644 index 00000000..b0f56c62 --- /dev/null +++ b/ut/abnormal_column_names_test.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +#include + +#include +#include +#include + +class AbnormalColumnNamesClientTest : public testing::TestWithParam< + std::tuple > /*queries*/> { +protected: + void SetUp() override; + void TearDown() override; + + std::unique_ptr client_; +}; diff --git a/ut/client_ut.cpp b/ut/client_ut.cpp index 3ed1092e..d894cc36 100644 --- a/ut/client_ut.cpp +++ b/ut/client_ut.cpp @@ -1196,6 +1196,7 @@ INSTANTIATE_TEST_SUITE_P(ClientLocalReadonly, ReadonlyClientTest, } )); + INSTANTIATE_TEST_SUITE_P(ClientLocalFailed, ConnectionFailedClientTest, ::testing::Values(ConnectionFailedClientTest::ParamType{ ClientOptions()