Make sure that remote query has non-zero columns

This commit is contained in:
Alexander Gololobov 2023-07-04 23:45:49 +02:00
parent 627e924a1b
commit 6d712f595a
2 changed files with 17 additions and 1 deletions

View File

@ -48,7 +48,9 @@ RemoteQueryExecutor::RemoteQueryExecutor(
: header(header_), query(query_), context(context_), scalars(scalars_) : header(header_), query(query_), context(context_), scalars(scalars_)
, external_tables(external_tables_), stage(stage_) , external_tables(external_tables_), stage(stage_)
, extension(extension_) , extension(extension_)
{} {
assertHeaderIsNotEmpty(header);
}
RemoteQueryExecutor::RemoteQueryExecutor( RemoteQueryExecutor::RemoteQueryExecutor(
Connection & connection, Connection & connection,
@ -91,6 +93,8 @@ RemoteQueryExecutor::RemoteQueryExecutor(
, scalars(scalars_), external_tables(external_tables_), stage(stage_) , scalars(scalars_), external_tables(external_tables_), stage(stage_)
, extension(extension_) , extension(extension_)
{ {
assertHeaderIsNotEmpty(header);
create_connections = [this, connections_, throttler, extension_](AsyncCallback) mutable { create_connections = [this, connections_, throttler, extension_](AsyncCallback) mutable {
auto res = std::make_unique<MultiplexedConnections>(std::move(connections_), context->getSettingsRef(), throttler); auto res = std::make_unique<MultiplexedConnections>(std::move(connections_), context->getSettingsRef(), throttler);
if (extension_ && extension_->replica_info) if (extension_ && extension_->replica_info)
@ -108,6 +112,8 @@ RemoteQueryExecutor::RemoteQueryExecutor(
, scalars(scalars_), external_tables(external_tables_), stage(stage_) , scalars(scalars_), external_tables(external_tables_), stage(stage_)
, extension(extension_) , extension(extension_)
{ {
assertHeaderIsNotEmpty(header);
create_connections = [this, pool, throttler, extension_](AsyncCallback async_callback)->std::unique_ptr<IConnections> create_connections = [this, pool, throttler, extension_](AsyncCallback async_callback)->std::unique_ptr<IConnections>
{ {
const Settings & current_settings = context->getSettingsRef(); const Settings & current_settings = context->getSettingsRef();
@ -754,4 +760,10 @@ bool RemoteQueryExecutor::hasThrownException() const
return got_exception_from_replica || got_unknown_packet_from_replica; return got_exception_from_replica || got_unknown_packet_from_replica;
} }
void RemoteQueryExecutor::assertHeaderIsNotEmpty(const Block & header)
{
if (header.columns() == 0)
throw Exception(ErrorCodes::LOGICAL_ERROR, "Remote query executor must not have header without columns");
}
} }

View File

@ -304,6 +304,10 @@ private:
/// Reads packet by packet /// Reads packet by packet
Block readPackets(); Block readPackets();
/// Block does not support passing 0 columns but non-zero rows.
/// We need to ensure that this is not happening.
static void assertHeaderIsNotEmpty(const Block & header);
}; };
} }