mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-22 09:40:49 +00:00
Fix "server failed to start" error
This commit is contained in:
parent
4e85d6a4c3
commit
fd84d16387
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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:";
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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 : ";
|
||||
|
@ -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, ','))
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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();
|
||||
|
@ -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
|
||||
|
@ -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 == '*'))
|
||||
|
@ -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"};
|
||||
|
@ -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");
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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()
|
||||
|
@ -360,6 +360,7 @@ Block IBlockInputStream::getExtremes()
|
||||
String IBlockInputStream::getTreeID() const
|
||||
{
|
||||
std::stringstream s;
|
||||
s.exceptions(std::ios::failbit);
|
||||
s << getName();
|
||||
|
||||
if (!children.empty())
|
||||
|
@ -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())
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
};
|
||||
|
@ -231,6 +231,7 @@ std::string DictionaryStructure::getKeyDescription() const
|
||||
return "UInt64";
|
||||
|
||||
std::ostringstream out;
|
||||
out.exceptions(std::ios::failbit);
|
||||
|
||||
out << '(';
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -21,6 +21,7 @@ try
|
||||
using namespace DB;
|
||||
|
||||
std::stringstream s;
|
||||
s.exceptions(std::ios::failbit);
|
||||
|
||||
{
|
||||
std::string src = "1";
|
||||
|
@ -17,6 +17,7 @@ int main(int, char **)
|
||||
DB::String d = "'xyz\\";
|
||||
|
||||
std::stringstream s;
|
||||
s.exceptions(std::ios::failbit);
|
||||
|
||||
{
|
||||
DB::WriteBufferFromOStream out(s);
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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("");
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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 << "'";
|
||||
|
@ -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());
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
}
|
@ -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)
|
||||
{
|
||||
|
@ -95,6 +95,7 @@ public:
|
||||
DebugASTLog()
|
||||
: log(nullptr)
|
||||
{
|
||||
ss.exceptions(std::ios::failbit);
|
||||
if constexpr (_enable)
|
||||
log = &Poco::Logger::get("AST");
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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.";
|
||||
|
@ -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";
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -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 << ")";
|
||||
|
||||
|
@ -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];
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
|
@ -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())
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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]].");
|
||||
|
Loading…
Reference in New Issue
Block a user