Fix "server failed to start" error

This commit is contained in:
Alexey Milovidov 2020-11-07 03:14:53 +03:00
parent 4e85d6a4c3
commit fd84d16387
94 changed files with 173 additions and 326 deletions

View File

@ -198,6 +198,7 @@ namespace
/// Serialize the list of ATTACH queries to a string.
std::stringstream ss;
ss.exceptions(std::ios::failbit);
for (const ASTPtr & query : queries)
ss << *query << ";\n";
String file_contents = std::move(ss).str();
@ -353,6 +354,7 @@ String DiskAccessStorage::getStorageParamsJSON() const
if (readonly)
json.set("readonly", readonly.load());
std::ostringstream oss;
oss.exceptions(std::ios::failbit);
Poco::JSON::Stringifier::stringify(json, oss);
return oss.str();
}

View File

@ -151,6 +151,7 @@ String LDAPAccessStorage::getStorageParamsJSON() const
params_json.set("roles", default_role_names);
std::ostringstream oss;
oss.exceptions(std::ios::failbit);
Poco::JSON::Stringifier::stringify(params_json, oss);
return oss.str();

View File

@ -461,6 +461,7 @@ String UsersConfigAccessStorage::getStorageParamsJSON() const
if (!path.empty())
json.set("path", path);
std::ostringstream oss;
oss.exceptions(std::ios::failbit);
Poco::JSON::Stringifier::stringify(json, oss);
return oss.str();
}

View File

@ -245,6 +245,7 @@ public:
{
DB::writeIntBinary<size_t>(this->data(place).total_values, buf);
std::ostringstream rng_stream;
rng_stream.exceptions(std::ios::failbit);
rng_stream << this->data(place).rng;
DB::writeStringBinary(rng_stream.str(), buf);
}
@ -275,6 +276,7 @@ public:
std::string rng_string;
DB::readStringBinary(rng_string, buf);
std::istringstream rng_stream(rng_string);
rng_stream.exceptions(std::ios::failbit);
rng_stream >> this->data(place).rng;
}
@ -564,6 +566,7 @@ public:
{
DB::writeIntBinary<size_t>(data(place).total_values, buf);
std::ostringstream rng_stream;
rng_stream.exceptions(std::ios::failbit);
rng_stream << data(place).rng;
DB::writeStringBinary(rng_stream.str(), buf);
}
@ -598,6 +601,7 @@ public:
std::string rng_string;
DB::readStringBinary(rng_string, buf);
std::istringstream rng_stream(rng_string);
rng_stream.exceptions(std::ios::failbit);
rng_stream >> data(place).rng;
}

View File

@ -191,6 +191,7 @@ public:
std::string rng_string;
DB::readStringBinary(rng_string, buf);
std::istringstream rng_stream(rng_string);
rng_stream.exceptions(std::ios::failbit);
rng_stream >> rng;
for (size_t i = 0; i < samples.size(); ++i)
@ -205,6 +206,7 @@ public:
DB::writeIntBinary<size_t>(total_values, buf);
std::ostringstream rng_stream;
rng_stream.exceptions(std::ios::failbit);
rng_stream << rng;
DB::writeStringBinary(rng_stream.str(), buf);

View File

@ -223,6 +223,7 @@ std::string MultiplexedConnections::dumpAddressesUnlocked() const
{
bool is_first = true;
std::ostringstream os;
os.exceptions(std::ios::failbit);
for (const ReplicaState & state : replica_states)
{
const Connection * connection = state.connection;

View File

@ -71,7 +71,8 @@ void checkColumn(
std::unordered_map<UInt32, T> map;
size_t num_collisions = 0;
std::stringstream collitions_str;
std::stringstream collisions_str;
collisions_str.exceptions(std::ios::failbit);
for (size_t i = 0; i < eq_class.size(); ++i)
{
@ -86,14 +87,14 @@ void checkColumn(
if (num_collisions <= max_collisions_to_print)
{
collitions_str << "Collision:\n";
collitions_str << print_for_row(it->second) << '\n';
collitions_str << print_for_row(i) << std::endl;
collisions_str << "Collision:\n";
collisions_str << print_for_row(it->second) << '\n';
collisions_str << print_for_row(i) << std::endl;
}
if (num_collisions > allowed_collisions)
{
std::cerr << collitions_str.rdbuf();
std::cerr << collisions_str.rdbuf();
break;
}
}

View File

@ -538,6 +538,7 @@ XMLDocumentPtr ConfigProcessor::processConfig(
*has_zk_includes = !contributing_zk_paths.empty();
std::stringstream comment;
comment.exceptions(std::ios::failbit);
comment << " This file was generated automatically.\n";
comment << " Do not edit it: it is likely to be discarded and generated again before it's read next time.\n";
comment << " Files used to generate this file:";

View File

@ -246,6 +246,7 @@ static std::string getExtraExceptionInfo(const std::exception & e)
std::string getCurrentExceptionMessage(bool with_stacktrace, bool check_embedded_stacktrace /*= false*/, bool with_extra_info /*= true*/)
{
std::stringstream stream;
stream.exceptions(std::ios::failbit);
try
{
@ -365,6 +366,7 @@ void tryLogException(std::exception_ptr e, Poco::Logger * logger, const std::str
std::string getExceptionMessage(const Exception & e, bool with_stacktrace, bool check_embedded_stacktrace)
{
std::stringstream stream;
stream.exceptions(std::ios::failbit);
try
{

View File

@ -17,12 +17,14 @@ struct HTMLForm : public Poco::Net::HTMLForm
{
Poco::URI uri(request.getURI());
std::istringstream istr(uri.getRawQuery());
istr.exceptions(std::ios::failbit);
readUrl(istr);
}
HTMLForm(const Poco::URI & uri)
{
std::istringstream istr(uri.getRawQuery());
istr.exceptions(std::ios::failbit);
readUrl(istr);
}

View File

@ -134,6 +134,7 @@ void MemoryTracker::alloc(Int64 size)
ProfileEvents::increment(ProfileEvents::QueryMemoryLimitExceeded);
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Memory tracker";
if (const auto * description = description_ptr.load(std::memory_order_relaxed))
message << " " << description;
@ -166,6 +167,7 @@ void MemoryTracker::alloc(Int64 size)
ProfileEvents::increment(ProfileEvents::QueryMemoryLimitExceeded);
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Memory limit";
if (const auto * description = description_ptr.load(std::memory_order_relaxed))
message << " " << description;

View File

@ -74,6 +74,7 @@ ShellCommand::~ShellCommand()
void ShellCommand::logCommand(const char * filename, char * const argv[])
{
std::stringstream args;
args.exceptions(std::ios::failbit);
for (int i = 0; argv != nullptr && argv[i] != nullptr; ++i)
{
if (i > 0)

View File

@ -24,6 +24,7 @@
std::string signalToErrorMessage(int sig, const siginfo_t & info, const ucontext_t & context)
{
std::stringstream error;
error.exceptions(std::ios::failbit);
switch (sig)
{
case SIGSEGV:
@ -319,6 +320,7 @@ static void toStringEveryLineImpl(
std::unordered_map<std::string, DB::Dwarf> dwarfs;
std::stringstream out;
out.exceptions(std::ios::failbit);
for (size_t i = offset; i < size; ++i)
{
@ -358,6 +360,7 @@ static void toStringEveryLineImpl(
}
#else
std::stringstream out;
out.exceptions(std::ios::failbit);
for (size_t i = offset; i < size; ++i)
{
@ -373,6 +376,7 @@ static void toStringEveryLineImpl(
static std::string toStringImpl(const StackTrace::FramePointers & frame_pointers, size_t offset, size_t size)
{
std::stringstream out;
out.exceptions(std::ios::failbit);
toStringEveryLineImpl(frame_pointers, offset, size, [&](const std::string & str) { out << str << '\n'; });
return out.str();
}

View File

@ -154,6 +154,8 @@ std::pair<bool, std::string> StudentTTest::compareAndReport(size_t confidence_le
double mean_confidence_interval = table_value * t_statistic;
std::stringstream ss;
ss.exceptions(std::ios::failbit);
if (mean_difference > mean_confidence_interval && (mean_difference - mean_confidence_interval > 0.0001)) /// difference must be more than 0.0001, to take into account connection latency.
{
ss << "Difference at " << confidence_level[confidence_level_index] << "% confidence : ";

View File

@ -415,6 +415,7 @@ std::vector<size_t> PerfEventsCounters::eventIndicesFromString(const std::string
}
std::istringstream iss(events_list);
iss.exceptions(std::ios::failbit);
std::string event_name;
while (std::getline(iss, event_name, ','))
{

View File

@ -80,6 +80,7 @@ void ThreadStatus::assertState(const std::initializer_list<int> & permitted_stat
}
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "Unexpected thread state " << getCurrentState();
if (description)
ss << ": " << description;

View File

@ -49,6 +49,7 @@ struct UInt128
String toHexString() const
{
std::ostringstream os;
os.exceptions(std::ios::failbit);
os << std::setw(16) << std::setfill('0') << std::hex << high << low;
return String(os.str());
}

View File

@ -308,6 +308,7 @@ struct ODBCBridgeMixin
path.setFileName("clickhouse-odbc-bridge");
std::stringstream command;
command.exceptions(std::ios::failbit);
#if !CLICKHOUSE_SPLIT_BINARY
cmd_args.push_back("odbc-bridge");

View File

@ -219,6 +219,7 @@ std::pair<ResponsePtr, Undo> TestKeeperCreateRequest::process(TestKeeper::Contai
++it->second.seq_num;
std::stringstream seq_num_str;
seq_num_str.exceptions(std::ios::failbit);
seq_num_str << std::setw(10) << std::setfill('0') << seq_num;
path_created += seq_num_str.str();

View File

@ -81,6 +81,7 @@ __attribute__((__weak__)) void checkStackSize()
if (stack_size * 2 > max_stack_size)
{
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Stack size too large"
<< ". Stack address: " << stack_address
<< ", frame address: " << frame_address

View File

@ -20,6 +20,7 @@ namespace DB
std::string makeRegexpPatternFromGlobs(const std::string & initial_str_with_globs)
{
std::ostringstream oss_for_escaping;
oss_for_escaping.exceptions(std::ios::failbit);
/// Escaping only characters that not used in glob syntax
for (const auto & letter : initial_str_with_globs)
{
@ -33,6 +34,7 @@ std::string makeRegexpPatternFromGlobs(const std::string & initial_str_with_glob
re2::StringPiece input(escaped_with_globs);
re2::StringPiece matched;
std::ostringstream oss_for_replacing;
oss_for_replacing.exceptions(std::ios::failbit);
size_t current_index = 0;
while (RE2::FindAndConsume(&input, enum_or_range, &matched))
{
@ -45,6 +47,7 @@ std::string makeRegexpPatternFromGlobs(const std::string & initial_str_with_glob
size_t range_end = 0;
char point;
std::istringstream iss_range(buffer);
iss_range.exceptions(std::ios::failbit);
iss_range >> range_begin >> point >> point >> range_end;
assert(!iss_range.fail());
bool leading_zeros = buffer[0] == '0';
@ -71,6 +74,7 @@ std::string makeRegexpPatternFromGlobs(const std::string & initial_str_with_glob
oss_for_replacing << escaped_with_globs.substr(current_index);
std::string almost_res = oss_for_replacing.str();
std::ostringstream oss_final_processing;
oss_final_processing.exceptions(std::ios::failbit);
for (const auto & letter : almost_res)
{
if ((letter == '?') || (letter == '*'))

View File

@ -19,6 +19,8 @@ TEST(Common, getMultipleValuesFromConfig)
</first_level>
</yandex>)END");
xml_isteam.exceptions(std::ios::failbit);
Poco::AutoPtr<Poco::Util::XMLConfiguration> config = new Poco::Util::XMLConfiguration(xml_isteam);
std::vector<std::string> answer = getMultipleValuesFromConfig(*config, "first_level", "second_level");
std::vector<std::string> right_answer = {"0", "1", "2", "3"};

View File

@ -135,6 +135,8 @@ TEST(Common, SensitiveDataMasker)
</query_masking_rules>
</clickhouse>)END");
xml_isteam.exceptions(std::ios::failbit);
Poco::AutoPtr<Poco::Util::XMLConfiguration> xml_config = new Poco::Util::XMLConfiguration(xml_isteam);
DB::SensitiveDataMasker masker_xml_based(*xml_config, "query_masking_rules");
std::string top_secret = "The e-mail of IVAN PETROV is kotik1902@sdsdf.test, and the password is qwerty123";
@ -165,6 +167,8 @@ TEST(Common, SensitiveDataMasker)
</rule>
</query_masking_rules>
</clickhouse>)END");
xml_isteam_bad.exceptions(std::ios::failbit);
Poco::AutoPtr<Poco::Util::XMLConfiguration> xml_config = new Poco::Util::XMLConfiguration(xml_isteam_bad);
DB::SensitiveDataMasker masker_xml_based_exception_check(*xml_config, "query_masking_rules");
@ -187,6 +191,8 @@ TEST(Common, SensitiveDataMasker)
</query_masking_rules>
</clickhouse>)END");
xml_isteam_bad.exceptions(std::ios::failbit);
Poco::AutoPtr<Poco::Util::XMLConfiguration> xml_config = new Poco::Util::XMLConfiguration(xml_isteam_bad);
DB::SensitiveDataMasker masker_xml_based_exception_check(*xml_config, "query_masking_rules");
@ -209,6 +215,8 @@ TEST(Common, SensitiveDataMasker)
</query_masking_rules>
</clickhouse>)END");
xml_isteam_bad.exceptions(std::ios::failbit);
Poco::AutoPtr<Poco::Util::XMLConfiguration> xml_config = new Poco::Util::XMLConfiguration(xml_isteam_bad);
DB::SensitiveDataMasker masker_xml_based_exception_check(*xml_config, "query_masking_rules");

View File

@ -52,6 +52,7 @@ int main(int, char **)
if (x != i)
{
std::stringstream s;
s.exceptions(std::ios::failbit);
s << "Failed!, read: " << x << ", expected: " << i;
throw DB::Exception(s.str(), 0);
}

View File

@ -22,6 +22,7 @@ void IMySQLReadPacket::readPayload(ReadBuffer & in, uint8_t & sequence_id)
if (!payload.eof())
{
std::stringstream tmp;
tmp.exceptions(std::ios::failbit);
tmp << "Packet payload is not fully read. Stopped after " << payload.count() << " bytes, while " << payload.available() << " bytes are in buffer.";
throw Exception(tmp.str(), ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT);
}

View File

@ -16,6 +16,7 @@ void IMySQLWritePacket::writePayload(WriteBuffer & buffer, uint8_t & sequence_id
if (buf.remainingPayloadSize())
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "Incomplete payload. Written " << getPayloadSize() - buf.remainingPayloadSize() << " bytes, expected " << getPayloadSize() << " bytes.";
throw Exception(ss.str(), 0);
}

View File

@ -61,6 +61,7 @@ struct SortColumnDescription
std::string dump() const
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << column_name << ":" << column_number << ":dir " << direction << "nulls " << nulls_direction;
return ss.str();
}

View File

@ -60,6 +60,7 @@ void CheckConstraintsBlockOutputStream::write(const Block & block)
if (!value)
{
std::stringstream exception_message;
exception_message.exceptions(std::ios::failbit);
exception_message << "Constraint " << backQuote(constraint_ptr->name)
<< " for table " << table_id.getNameForLogs()
@ -87,6 +88,7 @@ void CheckConstraintsBlockOutputStream::write(const Block & block)
Names related_columns = constraint_expr->getRequiredColumns();
std::stringstream exception_message;
exception_message.exceptions(std::ios::failbit);
exception_message << "Constraint " << backQuote(constraint_ptr->name)
<< " for table " << table_id.getNameForLogs()

View File

@ -360,6 +360,7 @@ Block IBlockInputStream::getExtremes()
String IBlockInputStream::getTreeID() const
{
std::stringstream s;
s.exceptions(std::ios::failbit);
s << getName();
if (!children.empty())

View File

@ -33,6 +33,7 @@ static const std::vector<String> supported_functions{"any", "anyLast", "min",
String DataTypeCustomSimpleAggregateFunction::getName() const
{
std::stringstream stream;
stream.exceptions(std::ios::failbit);
stream << "SimpleAggregateFunction(" << function->getName();
if (!parameters.empty())

View File

@ -30,6 +30,7 @@ template <typename T>
std::string DataTypeDecimal<T>::doGetName() const
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "Decimal(" << this->precision << ", " << this->scale << ")";
return ss.str();
}

View File

@ -27,6 +27,7 @@ static auto typeFromString(const std::string & str)
static auto typesFromString(const std::string & str)
{
std::istringstream data_types_stream(str);
data_types_stream.exceptions(std::ios::failbit);
DataTypes data_types;
std::string data_type;
while (data_types_stream >> data_type)

View File

@ -95,6 +95,7 @@ String getObjectDefinitionFromCreateQuery(const ASTPtr & query)
if (!create)
{
std::ostringstream query_stream;
query_stream.exceptions(std::ios::failbit);
formatAST(*query, query_stream, true);
throw Exception("Query '" + query_stream.str() + "' is not CREATE query", ErrorCodes::LOGICAL_ERROR);
}
@ -121,6 +122,7 @@ String getObjectDefinitionFromCreateQuery(const ASTPtr & query)
create->table = TABLE_WITH_UUID_NAME_PLACEHOLDER;
std::ostringstream statement_stream;
statement_stream.exceptions(std::ios::failbit);
formatAST(*create, statement_stream, false);
statement_stream << '\n';
return statement_stream.str();

View File

@ -128,6 +128,7 @@ static String checkVariableAndGetVersion(const mysqlxx::Pool::Entry & connection
bool first = true;
std::stringstream error_message;
error_message.exceptions(std::ios::failbit);
error_message << "Illegal MySQL variables, the MaterializeMySQL engine requires ";
for (const auto & [variable_name, variable_error_message] : variables_error_message)
{
@ -239,6 +240,7 @@ static inline BlockOutputStreamPtr getTableOutput(const String & database_name,
const StoragePtr & storage = DatabaseCatalog::instance().getTable(StorageID(database_name, table_name), query_context);
std::stringstream insert_columns_str;
insert_columns_str.exceptions(std::ios::failbit);
const StorageInMemoryMetadata & storage_metadata = storage->getInMemoryMetadata();
const ColumnsDescription & storage_columns = storage_metadata.getColumns();
const NamesAndTypesList & insert_columns_names = insert_materialized ? storage_columns.getAllPhysical() : storage_columns.getOrdinary();
@ -330,6 +332,7 @@ std::optional<MaterializeMetadata> MaterializeMySQLSyncThread::prepareSynchroniz
const auto & position_message = [&]()
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
position.dump(ss);
return ss.str();
};
@ -372,6 +375,7 @@ void MaterializeMySQLSyncThread::flushBuffersData(Buffers & buffers, Materialize
const auto & position_message = [&]()
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
client.getPosition().dump(ss);
return ss.str();
};
@ -643,6 +647,7 @@ void MaterializeMySQLSyncThread::onEvent(Buffers & buffers, const BinlogEventPtr
const auto & dump_event_message = [&]()
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
receive_event->dump(ss);
return ss.str();
};

View File

@ -231,6 +231,7 @@ std::string DictionaryStructure::getKeyDescription() const
return "UInt64";
std::ostringstream out;
out.exceptions(std::ios::failbit);
out << '(';

View File

@ -19,6 +19,7 @@ static std::string configurationToString(const DictionaryConfigurationPtr & conf
{
const Poco::Util::XMLConfiguration * xml_config = dynamic_cast<const Poco::Util::XMLConfiguration *>(config.get());
std::ostringstream oss;
oss.exceptions(std::ios::failbit);
xml_config->save(oss);
return oss.str();
}

View File

@ -12,7 +12,7 @@
#include <Functions/FunctionFactory.h>
#include <Functions/FunctionHelpers.h>
#include <IO/WriteHelpers.h>
#include <IO/WriteBufferFromOStream.h>
#include <IO/WriteBufferFromString.h>
#define STATS_ENABLE_STDVEC_WRAPPERS
#include <stats.hpp>
@ -139,31 +139,29 @@ Variants bayesian_ab_test(String distribution, PODArray<Float64> & xs, PODArray<
String convertToJson(const PODArray<String> & variant_names, const Variants & variants)
{
FormatSettings settings;
std::stringstream s;
WriteBufferOwnString buf;
writeCString("{\"data\":[", buf);
for (size_t i = 0; i < variants.size(); ++i)
{
WriteBufferFromOStream buf(s);
writeCString("{\"data\":[", buf);
for (size_t i = 0; i < variants.size(); ++i)
{
writeCString("{\"variant_name\":", buf);
writeJSONString(variant_names[i], buf, settings);
writeCString(",\"x\":", buf);
writeText(variants[i].x, buf);
writeCString(",\"y\":", buf);
writeText(variants[i].y, buf);
writeCString(",\"beats_control\":", buf);
writeText(variants[i].beats_control, buf);
writeCString(",\"to_be_best\":", buf);
writeText(variants[i].best, buf);
writeCString("}", buf);
if (i != variant_names.size() -1) writeCString(",", buf);
}
writeCString("]}", buf);
writeCString("{\"variant_name\":", buf);
writeJSONString(variant_names[i], buf, settings);
writeCString(",\"x\":", buf);
writeText(variants[i].x, buf);
writeCString(",\"y\":", buf);
writeText(variants[i].y, buf);
writeCString(",\"beats_control\":", buf);
writeText(variants[i].beats_control, buf);
writeCString(",\"to_be_best\":", buf);
writeText(variants[i].best, buf);
writeCString("}", buf);
if (i != variant_names.size() -1)
writeCString(",", buf);
}
writeCString("]}", buf);
return s.str();
return buf.str();
}
class FunctionBayesAB : public IFunction

View File

@ -240,6 +240,7 @@ void assertResponseIsOk(const Poco::Net::HTTPRequest & request, Poco::Net::HTTPR
if (!(status == Poco::Net::HTTPResponse::HTTP_OK || (isRedirect(status) && allow_redirects)))
{
std::stringstream error_message;
error_message.exceptions(std::ios::failbit);
error_message << "Received error from remote server " << request.getURI() << ". HTTP status code: " << status << " "
<< response.getReason() << ", body: " << istr.rdbuf();

View File

@ -27,20 +27,14 @@ bool MySQLPacketPayloadReadBuffer::nextImpl()
in.readStrict(reinterpret_cast<char *>(&payload_length), 3);
if (payload_length > MAX_PACKET_LENGTH)
{
std::ostringstream tmp;
tmp << "Received packet with payload larger than max_packet_size: " << payload_length;
throw Exception(tmp.str(), ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT);
}
throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT,
"Received packet with payload larger than max_packet_size: {}", payload_length);
size_t packet_sequence_id = 0;
in.read(reinterpret_cast<char &>(packet_sequence_id));
if (packet_sequence_id != sequence_id)
{
std::ostringstream tmp;
tmp << "Received packet with wrong sequence-id: " << packet_sequence_id << ". Expected: " << static_cast<unsigned int>(sequence_id) << '.';
throw Exception(tmp.str(), ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT);
}
throw Exception(ErrorCodes::UNKNOWN_PACKET_FROM_CLIENT,
"Received packet with wrong sequence-id: {}. Expected: {}.", packet_sequence_id, static_cast<unsigned int>(sequence_id));
sequence_id++;
if (payload_length == 0)

View File

@ -72,10 +72,7 @@ public:
}
else
{
std::stringstream error_message;
error_message << "Too many redirects while trying to access " << initial_uri.toString();
throw Exception(error_message.str(), ErrorCodes::TOO_MANY_REDIRECTS);
throw Exception(ErrorCodes::TOO_MANY_REDIRECTS, "Too many redirects while trying to access {}", initial_uri.toString());
}
}

View File

@ -248,6 +248,7 @@ void PocoHTTPClient::makeRequestInternal(
response->SetContentType(poco_response.getContentType());
std::stringstream headers_ss;
headers_ss.exceptions(std::ios::failbit);
for (const auto & [header_name, header_value] : poco_response)
{
response->AddHeader(header_name, header_value);

View File

@ -77,6 +77,7 @@ std::string dumpContents(const T& container,
{
std::stringstream sstr;
sstr.exceptions(std::ios::failbit);
dumpBuffer(std::begin(container), std::end(container), &sstr, col_sep, row_sep, cols_in_row);
return sstr.str();

View File

@ -23,6 +23,7 @@ static void test(size_t data_size)
{
std::cout << "block size " << read_buffer_block_size << std::endl;
std::stringstream io;
io.exceptions(std::ios::failbit);
DB::WriteBufferFromOStream out_impl(io);
DB::HashingWriteBuffer out(out_impl);
out.write(data, data_size);

View File

@ -21,6 +21,7 @@ try
using namespace DB;
std::stringstream s;
s.exceptions(std::ios::failbit);
{
std::string src = "1";

View File

@ -17,6 +17,7 @@ int main(int, char **)
DB::String d = "'xyz\\";
std::stringstream s;
s.exceptions(std::ios::failbit);
{
DB::WriteBufferFromOStream out(s);

View File

@ -107,6 +107,7 @@ String formattedAST(const ASTPtr & ast)
if (!ast)
return {};
std::stringstream ss;
ss.exceptions(std::ios::failbit);
formatAST(*ast, ss, false, true);
return ss.str();
}

View File

@ -1962,6 +1962,7 @@ void Context::checkCanBeDropped(const String & database, const String & table, c
String size_str = formatReadableSizeWithDecimalSuffix(size);
String max_size_to_drop_str = formatReadableSizeWithDecimalSuffix(max_size_to_drop);
std::stringstream ostr;
ostr.exceptions(std::ios::failbit);
ostr << "Table or Partition in " << backQuoteIfNeed(database) << "." << backQuoteIfNeed(table) << " was not dropped.\n"
<< "Reason:\n"

View File

@ -454,6 +454,7 @@ void ExpressionAction::execute(Block & block, bool dry_run) const
std::string ExpressionAction::toString() const
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
switch (type)
{
case ADD_COLUMN:
@ -550,6 +551,7 @@ void ExpressionActions::checkLimits(Block & block) const
if (non_const_columns > settings.max_temporary_non_const_columns)
{
std::stringstream list_of_non_const_columns;
list_of_non_const_columns.exceptions(std::ios::failbit);
for (size_t i = 0, size = block.columns(); i < size; ++i)
if (block.safeGetByPosition(i).column && !isColumnConst(*block.safeGetByPosition(i).column))
list_of_non_const_columns << "\n" << block.safeGetByPosition(i).name;
@ -921,6 +923,7 @@ void ExpressionActions::finalize(const Names & output_columns)
std::string ExpressionActions::dumpActions() const
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "input:\n";
for (const auto & input_column : input_columns)
@ -1342,6 +1345,7 @@ void ExpressionActionsChain::finalize()
std::string ExpressionActionsChain::dumpChain() const
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
for (size_t i = 0; i < steps.size(); ++i)
{

View File

@ -136,6 +136,7 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create)
{
/// Currently, there are no database engines, that support any arguments.
std::stringstream ostr;
ostr.exceptions(std::ios::failbit);
formatAST(*create.storage, ostr, false, false);
throw Exception("Unknown database engine: " + ostr.str(), ErrorCodes::UNKNOWN_DATABASE_ENGINE);
}
@ -182,6 +183,7 @@ BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create)
create.if_not_exists = false;
std::ostringstream statement_stream;
statement_stream.exceptions(std::ios::failbit);
formatAST(create, statement_stream, false);
statement_stream << '\n';
String statement = statement_stream.str();

View File

@ -223,6 +223,7 @@ BlockInputStreamPtr InterpreterExplainQuery::executeImpl()
MutableColumns res_columns = sample_block.cloneEmptyColumns();
std::stringstream ss;
ss.exceptions(std::ios::failbit);
if (ast.getKind() == ASTExplainQuery::ParsedAST)
{

View File

@ -35,6 +35,7 @@ BlockInputStreamPtr InterpreterShowAccessQuery::executeImpl() const
/// Build the result column.
MutableColumnPtr column = ColumnString::create();
std::stringstream ss;
ss.exceptions(std::ios::failbit);
for (const auto & query : queries)
{
ss.str("");

View File

@ -239,6 +239,7 @@ BlockInputStreamPtr InterpreterShowCreateAccessEntityQuery::executeImpl()
/// Build the result column.
MutableColumnPtr column = ColumnString::create();
std::stringstream create_query_ss;
create_query_ss.exceptions(std::ios::failbit);
for (const auto & create_query : create_queries)
{
formatAST(*create_query, create_query_ss, false, true);
@ -248,6 +249,7 @@ BlockInputStreamPtr InterpreterShowCreateAccessEntityQuery::executeImpl()
/// Prepare description of the result column.
std::stringstream desc_ss;
desc_ss.exceptions(std::ios::failbit);
const auto & show_query = query_ptr->as<const ASTShowCreateAccessEntityQuery &>();
formatAST(show_query, desc_ss, false, true);
String desc = desc_ss.str();

View File

@ -79,6 +79,7 @@ BlockInputStreamPtr InterpreterShowCreateQuery::executeImpl()
}
std::stringstream stream;
stream.exceptions(std::ios::failbit);
formatAST(*create_query, stream, false, false);
String res = stream.str();

View File

@ -119,6 +119,7 @@ BlockInputStreamPtr InterpreterShowGrantsQuery::executeImpl()
/// Build the result column.
MutableColumnPtr column = ColumnString::create();
std::stringstream grant_ss;
grant_ss.exceptions(std::ios::failbit);
for (const auto & grant_query : grant_queries)
{
grant_ss.str("");
@ -128,6 +129,7 @@ BlockInputStreamPtr InterpreterShowGrantsQuery::executeImpl()
/// Prepare description of the result column.
std::stringstream desc_ss;
desc_ss.exceptions(std::ios::failbit);
const auto & show_query = query_ptr->as<const ASTShowGrantsQuery &>();
formatAST(show_query, desc_ss, false, true);
String desc = desc_ss.str();

View File

@ -33,6 +33,7 @@ String InterpreterShowTablesQuery::getRewrittenQuery()
if (query.databases)
{
std::stringstream rewritten_query;
rewritten_query.exceptions(std::ios::failbit);
rewritten_query << "SELECT name FROM system.databases";
if (!query.like.empty())
@ -54,6 +55,7 @@ String InterpreterShowTablesQuery::getRewrittenQuery()
if (query.clusters)
{
std::stringstream rewritten_query;
rewritten_query.exceptions(std::ios::failbit);
rewritten_query << "SELECT DISTINCT cluster FROM system.clusters";
if (!query.like.empty())
@ -73,6 +75,7 @@ String InterpreterShowTablesQuery::getRewrittenQuery()
else if (query.cluster)
{
std::stringstream rewritten_query;
rewritten_query.exceptions(std::ios::failbit);
rewritten_query << "SELECT * FROM system.clusters";
rewritten_query << " WHERE cluster = " << std::quoted(query.cluster_str, '\'');
@ -87,6 +90,7 @@ String InterpreterShowTablesQuery::getRewrittenQuery()
DatabaseCatalog::instance().assertDatabaseExists(database);
std::stringstream rewritten_query;
rewritten_query.exceptions(std::ios::failbit);
rewritten_query << "SELECT name FROM system.";
if (query.dictionaries)

View File

@ -21,6 +21,7 @@ namespace ErrorCodes
static String wrongAliasMessage(const ASTPtr & ast, const ASTPtr & prev_ast, const String & alias)
{
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Different expressions with the same alias " << backQuoteIfNeed(alias) << ":" << std::endl;
formatAST(*ast, message, false, true);
message << std::endl << "and" << std::endl;

View File

@ -343,6 +343,7 @@ void Set::checkColumnsNumber(size_t num_key_columns) const
if (data_types.size() != num_key_columns)
{
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Number of columns in section IN doesn't match. "
<< num_key_columns << " at left, " << data_types.size() << " at right.";
throw Exception(message.str(), ErrorCodes::NUMBER_OF_COLUMNS_DOESNT_MATCH);

View File

@ -553,6 +553,7 @@ void TreeRewriterResult::collectUsedColumns(const ASTPtr & query, bool is_select
if (!unknown_required_source_columns.empty())
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "Missing columns:";
for (const auto & name : unknown_required_source_columns)
ss << " '" << name << "'";

View File

@ -779,6 +779,7 @@ static std::tuple<ASTPtr, BlockIO> executeQueryImpl(
if (!internal && res.in)
{
std::stringstream log_str;
log_str.exceptions(std::ios::failbit);
log_str << "Query pipeline:\n";
res.in->dumpTree(log_str);
LOG_DEBUG(&Poco::Logger::get("executeQuery"), log_str.str());

View File

@ -37,9 +37,6 @@ add_executable (in_join_subqueries_preprocessor in_join_subqueries_preprocessor.
target_link_libraries (in_join_subqueries_preprocessor PRIVATE clickhouse_aggregate_functions dbms clickhouse_parsers)
add_check(in_join_subqueries_preprocessor)
add_executable (users users.cpp)
target_link_libraries (users PRIVATE clickhouse_aggregate_functions dbms clickhouse_common_config)
if (OS_LINUX)
add_executable (internal_iotop internal_iotop.cpp)
target_link_libraries (internal_iotop PRIVATE dbms)

View File

@ -1,282 +0,0 @@
#include <Common/Config/ConfigProcessor.h>
#include <Access/AccessControlManager.h>
#include <Access/AccessFlags.h>
#include <Access/User.h>
#include <filesystem>
#include <vector>
#include <string>
#include <tuple>
#include <iostream>
#include <fstream>
#include <sstream>
#include <stdexcept>
#include <cstdlib>
#include <unistd.h>
namespace
{
namespace fs = std::filesystem;
struct TestEntry
{
std::string user_name;
std::string database_name;
bool is_allowed;
};
using TestEntries = std::vector<TestEntry>;
struct TestDescriptor
{
const char * config_content;
TestEntries entries;
};
using TestSet = std::vector<TestDescriptor>;
/// Tests description.
TestSet test_set =
{
{
"<?xml version=\"1.0\"?><yandex>"
" <profiles><default></default></profiles>"
" <users>"
" <default>"
" <password></password><profile>default</profile><quota>default</quota>"
" <allow_databases>"
" <database>default</database>"
" <database>test</database>"
" </allow_databases>"
" </default>"
" <web>"
" <password></password><profile>default</profile><quota>default</quota>"
" </web>"
" </users>"
" <quotas><default></default></quotas>"
"</yandex>",
{
{ "default", "default", true },
{ "default", "test", true },
{ "default", "stats", false },
{ "web", "default", true },
{ "web", "test", true },
{ "web", "stats", true },
{ "analytics", "default", false },
{ "analytics", "test", false },
{ "analytics", "stats", false }
}
},
{
"<?xml version=\"1.0\"?><yandex>"
" <profiles><default></default></profiles>"
" <users>"
" <default>"
" <password></password><profile>default</profile><quota>default</quota>"
" <allow_databases>"
" <database>default</database>"
" </allow_databases>"
" </default>"
" <web>"
" <password></password><profile>default</profile><quota>default</quota>"
" </web>"
" </users>"
" <quotas><default></default></quotas>"
"</yandex>",
{
{ "default", "default", true },
{ "default", "test", false },
{ "default", "stats", false },
{ "web", "default", true },
{ "web", "test", true },
{ "web", "stats", true },
{ "analytics", "default", false },
{ "analytics", "test", false },
{ "analytics", "stats", false }
}
},
{
"<?xml version=\"1.0\"?><yandex>"
" <profiles><default></default></profiles>"
" <users>"
" <default>"
" <password></password><profile>default</profile><quota>default</quota>"
" <allow_databases>"
" </allow_databases>"
" </default>"
" <web>"
" <password></password><profile>default</profile><quota>default</quota>"
" </web>"
" </users>"
" <quotas><default></default></quotas>"
"</yandex>",
{
{ "default", "default", true },
{ "default", "test", true },
{ "default", "stats", true },
{ "web", "default", true },
{ "web", "test", true },
{ "web", "stats", true },
{ "analytics", "default", false },
{ "analytics", "test", false },
{ "analytics", "stats", false }
}
},
{
"<?xml version=\"1.0\"?><yandex>"
" <profiles><default></default></profiles>"
" <users>"
" <default>"
" <password></password><profile>default</profile><quota>default</quota>"
" <allow_databases>"
" <database>default</database>"
" </allow_databases>"
" </default>"
" <web>"
" <password></password><profile>default</profile><quota>default</quota>"
" <allow_databases>"
" <database>test</database>"
" </allow_databases>"
" </web>"
" </users>"
" <quotas><default></default></quotas>"
"</yandex>",
{
{ "default", "default", true },
{ "default", "test", false },
{ "default", "stats", false },
{ "web", "default", false },
{ "web", "test", true },
{ "web", "stats", false },
{ "analytics", "default", false },
{ "analytics", "test", false },
{ "analytics", "stats", false }
}
}
};
std::string createTmpPath(const std::string & filename)
{
char pattern[] = "/tmp/fileXXXXXX";
char * dir = mkdtemp(pattern);
if (dir == nullptr)
throw std::runtime_error("Could not create directory");
return std::string(dir) + "/" + filename;
}
void createFile(const std::string & filename, const char * data)
{
std::ofstream ofs(filename.c_str());
if (!ofs.is_open())
throw std::runtime_error("Could not open file " + filename);
ofs << data;
}
void runOneTest(const TestDescriptor & test_descriptor)
{
const auto path_name = createTmpPath("users.xml");
createFile(path_name, test_descriptor.config_content);
DB::ConfigurationPtr config;
try
{
config = DB::ConfigProcessor(path_name).loadConfig().configuration;
}
catch (const Poco::Exception & ex)
{
std::ostringstream os;
os << "Error: " << ex.what() << ": " << ex.displayText();
throw std::runtime_error(os.str());
}
DB::AccessControlManager acl_manager;
try
{
acl_manager.setUsersConfig(*config);
}
catch (const Poco::Exception & ex)
{
std::ostringstream os;
os << "Error: " << ex.what() << ": " << ex.displayText();
throw std::runtime_error(os.str());
}
for (const auto & entry : test_descriptor.entries)
{
bool res;
try
{
res = acl_manager.read<DB::User>(entry.user_name)->access.isGranted(DB::AccessType::ALL, entry.database_name);
}
catch (const Poco::Exception &)
{
res = false;
}
if (res != entry.is_allowed)
{
auto to_string = [](bool access){ return (access ? "'granted'" : "'denied'"); };
std::ostringstream os;
os << "(user=" << entry.user_name << ", database=" << entry.database_name << "): ";
os << "Expected " << to_string(entry.is_allowed) << " but got " << to_string(res);
throw std::runtime_error(os.str());
}
}
fs::remove_all(fs::path(path_name).parent_path().string());
}
auto runTestSet()
{
size_t test_num = 1;
size_t failure_count = 0;
for (const auto & test_descriptor : test_set)
{
try
{
runOneTest(test_descriptor);
std::cout << "Test " << test_num << " passed\n";
}
catch (const std::runtime_error & ex)
{
std::cerr << "Test " << test_num << " failed with reason: " << ex.what() << "\n";
++failure_count;
}
catch (...)
{
std::cerr << "Test " << test_num << " failed with unknown reason\n";
++failure_count;
}
++test_num;
}
return std::make_tuple(test_set.size(), failure_count);
}
}
int main()
{
size_t test_count;
size_t failure_count;
std::tie(test_count, failure_count) = runTestSet();
std::cout << (test_count - failure_count) << " test(s) passed out of " << test_count << "\n";
return (failure_count == 0) ? 0 : EXIT_FAILURE;
}

View File

@ -63,6 +63,7 @@ namespace
{
std::vector<std::pair<ConditionType, String>> conditions_as_strings;
std::stringstream temp_sstream;
temp_sstream.exceptions(std::ios::failbit);
IAST::FormatSettings temp_settings(temp_sstream, settings);
for (const auto & [condition_type, condition] : conditions)
{

View File

@ -95,6 +95,7 @@ public:
DebugASTLog()
: log(nullptr)
{
ss.exceptions(std::ios::failbit);
if constexpr (_enable)
log = &Poco::Logger::get("AST");
}

View File

@ -90,6 +90,7 @@ size_t IAST::checkDepthImpl(size_t max_depth, size_t level) const
std::string IAST::formatForErrorMessage() const
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
format(FormatSettings(ss, true /* one line */));
return ss.str();
}

View File

@ -243,6 +243,7 @@ template <typename AstArray>
std::string IAST::formatForErrorMessage(const AstArray & array)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
for (size_t i = 0; i < array.size(); ++i)
{
if (i > 0)

View File

@ -16,6 +16,7 @@ void formatAST(const IAST & ast, std::ostream & s, bool hilite, bool one_line)
String serializeAST(const IAST & ast, bool one_line)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
formatAST(ast, ss, false, one_line);
return ss.str();
}

View File

@ -12,6 +12,7 @@ namespace DB
String queryToString(const IAST & query)
{
std::ostringstream out;
out.exceptions(std::ios::failbit);
formatAST(query, out, false, true);
return out.str();
}

View File

@ -18,6 +18,7 @@ using namespace DB;
static String astToString(IAST * ast)
{
std::ostringstream oss;
oss.exceptions(std::ios::failbit);
dumpAST(*ast, oss);
return oss.str();
}

View File

@ -161,6 +161,7 @@ static void insertNumber(IColumn & column, WhichDataType type, T value)
static std::string nodeToJson(avro::NodePtr root_node)
{
std::ostringstream ss;
ss.exceptions(std::ios::failbit);
root_node->printJson(ss, 0);
return ss.str();
}

View File

@ -168,6 +168,11 @@ void PrettyBlockOutputFormat::write(const Chunk & chunk, PortKind port_kind)
std::stringstream middle_values_separator;
std::stringstream bottom_separator;
top_separator.exceptions(std::ios::failbit);
middle_names_separator.exceptions(std::ios::failbit);
middle_values_separator.exceptions(std::ios::failbit);
bottom_separator.exceptions(std::ios::failbit);
top_separator << grid_symbols.bold_left_top_corner;
middle_names_separator << grid_symbols.bold_left_separator;
middle_values_separator << grid_symbols.left_separator;

View File

@ -134,6 +134,7 @@ void PrettyCompactBlockOutputFormat::writeBottom(const Widths & max_widths)
ascii_grid_symbols;
/// Create delimiters
std::stringstream bottom_separator;
bottom_separator.exceptions(std::ios::failbit);
bottom_separator << grid_symbols.left_bottom_corner;
for (size_t i = 0; i < max_widths.size(); ++i)

View File

@ -42,6 +42,7 @@ void CollapsingSortedAlgorithm::reportIncorrectData()
return;
std::stringstream s;
s.exceptions(std::ios::failbit);
auto & sort_columns = *last_row.sort_columns;
for (size_t i = 0, size = sort_columns.size(); i < size; ++i)
{

View File

@ -37,6 +37,7 @@ void ReplicasStatusHandler::handleRequest(Poco::Net::HTTPServerRequest & request
bool ok = true;
std::stringstream message;
message.exceptions(std::ios::failbit);
auto databases = DatabaseCatalog::instance().getDatabases();

View File

@ -437,6 +437,7 @@ bool TCPHandler::readDataNext(const size_t & poll_interval, const int & receive_
if (elapsed > receive_timeout)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "Timeout exceeded while receiving data from client.";
ss << " Waited for " << static_cast<size_t>(elapsed) << " seconds,";
ss << " timeout is " << receive_timeout << " seconds.";

View File

@ -148,6 +148,7 @@ void DistributedBlockOutputStream::writeAsync(const Block & block)
std::string DistributedBlockOutputStream::getCurrentStateDescription()
{
std::stringstream buffer;
buffer.exceptions(std::ios::failbit);
const auto & addresses = cluster->getShardsAddresses();
buffer << "Insertion status:\n";

View File

@ -247,6 +247,7 @@ Names StorageKafka::parseTopics(String topic_list)
String StorageKafka::getDefaultClientId(const StorageID & table_id_)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << VERSION_NAME << "-" << getFQDNOrHostName() << "-" << table_id_.database_name << "-" << table_id_.table_name;
return ss.str();
}
@ -400,6 +401,7 @@ ConsumerBufferPtr StorageKafka::createReadBuffer(const size_t consumer_number)
if (num_consumers > 1)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << client_id << "-" << consumer_number;
conf.set("client.id", ss.str());
}

View File

@ -33,6 +33,7 @@ namespace ErrorCodes
String Range::toString() const
{
std::stringstream str;
str.exceptions(std::ios::failbit);
if (!left_bounded)
str << "(-inf, ";
@ -1443,6 +1444,7 @@ String KeyCondition::RPNElement::toString() const
};
std::ostringstream ss;
ss.exceptions(std::ios::failbit);
switch (function)
{
case FUNCTION_AND:

View File

@ -3206,6 +3206,7 @@ void MergeTreeData::Transaction::rollbackPartsToTemporaryState()
if (!isEmpty())
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << " Rollbacking parts state to temporary and removing from working set:";
for (const auto & part : precommitted_parts)
ss << " " << part->relative_path;
@ -3224,6 +3225,7 @@ void MergeTreeData::Transaction::rollback()
if (!isEmpty())
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << " Removing parts:";
for (const auto & part : precommitted_parts)
ss << " " << part->relative_path;
@ -3759,6 +3761,7 @@ bool MergeTreeData::canUsePolymorphicParts(const MergeTreeSettings & settings, S
|| settings.min_rows_for_compact_part != 0 || settings.min_bytes_for_compact_part != 0))
{
std::ostringstream message;
message.exceptions(std::ios::failbit);
message << "Table can't create parts with adaptive granularity, but settings"
<< " min_rows_for_wide_part = " << settings.min_rows_for_wide_part
<< ", min_bytes_for_wide_part = " << settings.min_bytes_for_wide_part

View File

@ -443,6 +443,7 @@ void MinimalisticDataPartChecksums::checkEqualImpl(const MinimalisticDataPartChe
if (num_compressed_files != rhs.num_compressed_files || num_uncompressed_files != rhs.num_uncompressed_files)
{
std::stringstream error_msg;
error_msg.exceptions(std::ios::failbit);
error_msg << "Different number of files: " << rhs.num_compressed_files << " compressed (expected " << num_compressed_files << ")"
<< " and " << rhs.num_uncompressed_files << " uncompressed ones (expected " << num_uncompressed_files << ")";

View File

@ -228,6 +228,7 @@ Pipe MergeTreeDataSelectExecutor::readFromParts(
if (settings.force_primary_key && key_condition.alwaysUnknownOrTrue())
{
std::stringstream exception_message;
exception_message.exceptions(std::ios::failbit);
exception_message << "Primary key (";
for (size_t i = 0, size = primary_key_columns.size(); i < size; ++i)
exception_message << (i == 0 ? "" : ", ") << primary_key_columns[i];

View File

@ -942,6 +942,7 @@ size_t ReplicatedMergeTreeQueue::getConflictsCountForRange(
if (out_description)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "Can't execute command for range " << range.getPartName() << " (entry " << entry.znode_name << "). ";
ss << "There are " << conflicts.size() << " currently executing entries blocking it: ";
for (const auto & conflict : conflicts)
@ -1693,6 +1694,7 @@ std::vector<MergeTreeMutationStatus> ReplicatedMergeTreeQueue::getMutationsStatu
for (const MutationCommand & command : entry.commands)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
formatAST(*command.ast, ss, false, true);
result.push_back(MergeTreeMutationStatus
{

View File

@ -19,6 +19,7 @@ static String formattedAST(const ASTPtr & ast)
if (!ast)
return "";
std::stringstream ss;
ss.exceptions(std::ios::failbit);
formatAST(*ast, ss, false, true);
return ss.str();
}

View File

@ -127,6 +127,7 @@ std::shared_ptr<ASTAlterCommandList> MutationCommands::ast() const
void MutationCommands::writeText(WriteBuffer & out) const
{
std::stringstream commands_ss;
commands_ss.exceptions(std::ios::failbit);
formatAST(*ast(), commands_ss, /* hilite = */ false, /* one_line = */ true);
out << escape << commands_ss.str();
}

View File

@ -187,6 +187,7 @@ AMQP::ExchangeType StorageRabbitMQ::defineExchangeType(String exchange_type_)
String StorageRabbitMQ::getTableBasedName(String name, const StorageID & table_id)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
if (name.empty())
ss << table_id.database_name << "_" << table_id.table_name;

View File

@ -82,6 +82,7 @@ NamesAndTypesList StorageDictionary::getNamesAndTypes(const DictionaryStructure
String StorageDictionary::generateNamesAndTypesDescription(const NamesAndTypesList & list)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
bool first = true;
for (const auto & name_and_type : list)
{

View File

@ -176,6 +176,7 @@ UInt64 getMaximumFileNumber(const std::string & dir_path)
std::string makeFormattedListOfShards(const ClusterPtr & cluster)
{
std::ostringstream os;
os.exceptions(std::ios::failbit);
bool head = true;
os << "[";
@ -749,6 +750,7 @@ ClusterPtr StorageDistributed::getOptimizedCluster(const Context & context, cons
if (force)
{
std::stringstream exception_message;
exception_message.exceptions(std::ios::failbit);
if (!has_sharding_key)
exception_message << "No sharding key";
else if (!sharding_key_is_usable)

View File

@ -428,6 +428,7 @@ namespace
String listOfColumns(const NamesAndTypesList & available_columns)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
for (auto it = available_columns.begin(); it != available_columns.end(); ++it)
{
if (it != available_columns.begin())

View File

@ -555,6 +555,7 @@ std::vector<MergeTreeMutationStatus> StorageMergeTree::getMutationsStatus() cons
for (const MutationCommand & command : entry.commands)
{
std::stringstream ss;
ss.exceptions(std::ios::failbit);
formatAST(*command.ast, ss, false, true);
result.push_back(MergeTreeMutationStatus
{
@ -1030,6 +1031,7 @@ bool StorageMergeTree::optimize(
if (!merge(true, partition_id, true, deduplicate, &disable_reason))
{
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Cannot OPTIMIZE table";
if (!disable_reason.empty())
message << ": " << disable_reason;
@ -1052,6 +1054,7 @@ bool StorageMergeTree::optimize(
if (!merge(true, partition_id, final, deduplicate, &disable_reason))
{
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Cannot OPTIMIZE table";
if (!disable_reason.empty())
message << ": " << disable_reason;

View File

@ -460,6 +460,7 @@ void StorageReplicatedMergeTree::waitMutationToFinishOnReplicas(
if (!inactive_replicas.empty())
{
std::stringstream exception_message;
exception_message.exceptions(std::ios::failbit);
exception_message << "Mutation is not finished because";
if (!inactive_replicas.empty())
@ -1017,6 +1018,7 @@ void StorageReplicatedMergeTree::checkParts(bool skip_sanity_checks)
parts_to_fetch_blocks += get_blocks_count_in_data_part(name);
std::stringstream sanity_report;
sanity_report.exceptions(std::ios::failbit);
sanity_report << "There are "
<< unexpected_parts.size() << " unexpected parts with " << unexpected_parts_rows << " rows ("
<< unexpected_parts_nonnew << " of them is not just-written with " << unexpected_parts_rows << " rows), "
@ -1041,6 +1043,7 @@ void StorageReplicatedMergeTree::checkParts(bool skip_sanity_checks)
if (insane && !skip_sanity_checks)
{
std::stringstream why;
why.exceptions(std::ios::failbit);
why << "The local set of parts of table " << getStorageID().getNameForLogs() << " doesn't look like the set of parts "
<< "in ZooKeeper: "
<< formatReadableQuantity(unexpected_parts_rows) << " rows of " << formatReadableQuantity(total_rows_on_filesystem)
@ -1342,6 +1345,7 @@ bool StorageReplicatedMergeTree::tryExecuteMerge(const LogEntry & entry)
// Log source part names just in case
{
std::stringstream source_parts_msg;
source_parts_msg.exceptions(std::ios::failbit);
for (auto i : ext::range(0, entry.source_parts.size()))
source_parts_msg << (i != 0 ? ", " : "") << entry.source_parts[i];
@ -3824,6 +3828,7 @@ bool StorageReplicatedMergeTree::optimize(
if (!selected)
{
std::stringstream message;
message.exceptions(std::ios::failbit);
message << "Cannot select parts for optimization";
if (!disable_reason.empty())
message << ": " << disable_reason;

View File

@ -255,6 +255,7 @@ Strings listFilesWithRegexpMatching(Aws::S3::S3Client & client, const S3::URI &
if (!outcome.IsSuccess())
{
std::ostringstream message;
message.exceptions(std::ios::failbit);
message << "Could not list objects in bucket " << quoteString(request.GetBucket())
<< " with prefix " << quoteString(request.GetPrefix());

View File

@ -97,6 +97,7 @@ void StorageSystemUsers::fillData(MutableColumns & res_columns, const Context &
auth_params_json.set("server", authentication.getServerName());
std::ostringstream oss;
oss.exceptions(std::ios::failbit);
Poco::JSON::Stringifier::stringify(auth_params_json, oss);
const auto str = oss.str();

View File

@ -128,6 +128,7 @@ std::string readData(DB::StoragePtr & table, const DB::Context & context)
}
std::ostringstream ss;
ss.exceptions(std::ios::failbit);
WriteBufferFromOStream out_buf(ss);
BlockOutputStreamPtr output = FormatFactory::instance().getOutput("Values", out_buf, sample, context);

View File

@ -221,6 +221,7 @@ String transformQueryForExternalDatabase(
dropAliases(select_ptr);
std::stringstream out;
out.exceptions(std::ios::failbit);
IAST::FormatSettings settings(out, true);
settings.identifier_quoting_style = identifier_quoting_style;
settings.always_quote_identifiers = identifier_quoting_style != IdentifierQuotingStyle::None;

View File

@ -243,6 +243,7 @@ TableFunctionRemote::TableFunctionRemote(const std::string & name_, bool secure_
is_cluster_function = (name == "cluster" || name == "clusterAllReplicas");
std::stringstream ss;
ss.exceptions(std::ios::failbit);
ss << "Table function '" << name + "' requires from 2 to " << (is_cluster_function ? 3 : 5) << " parameters"
<< ": <addresses pattern or cluster name>, <name of remote database>, <name of remote table>"
<< (is_cluster_function ? "" : ", [username, [password]].");