From 6b787234ad012f2f3023f6f77f1d1a8e166e353e Mon Sep 17 00:00:00 2001 From: Alexey Milovidov Date: Fri, 19 Oct 2012 00:10:17 +0000 Subject: [PATCH] dbms: development [#CONV-2944]. --- .../DB/DataStreams/RemoteBlockInputStream.h | 17 +++++++---------- .../DB/DataStreams/UnionBlockInputStream.h | 1 + 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/dbms/include/DB/DataStreams/RemoteBlockInputStream.h b/dbms/include/DB/DataStreams/RemoteBlockInputStream.h index f7f4eec3bcb..773d613af5f 100644 --- a/dbms/include/DB/DataStreams/RemoteBlockInputStream.h +++ b/dbms/include/DB/DataStreams/RemoteBlockInputStream.h @@ -98,18 +98,19 @@ public: * - ничего не начинали делать; * - получили все пакеты до EndOfStream; * - получили с сервера эксепшен; + * - объект уничтожается из-за эксепшена; * - то больше читать ничего не нужно. */ - if (!sent_query || finished || got_exception_from_server) + if (!sent_query || finished || got_exception_from_server || std::uncaught_exception()) return; - + /** Если ещё прочитали не все данные, но они больше не нужны. * Это может быть из-за того, что данных достаточно (например, при использовании LIMIT), * или если на стороне клиента произошло исключение. */ /// Отправим просьбу прервать выполнение запроса, если ещё не отправляли. - if (!was_cancelled && !std::uncaught_exception()) + if (!was_cancelled) { LOG_TRACE(log, "Cancelling query because enough data has been read"); @@ -132,16 +133,12 @@ public: return; case Protocol::Server::Exception: - if (!got_exception_from_server && !std::uncaught_exception()) - { - got_exception_from_server = true; - packet.exception->rethrow(); - } + got_exception_from_server = true; + packet.exception->rethrow(); break; default: - if (!std::uncaught_exception()) - throw Exception("Unknown packet from server", ErrorCodes::UNKNOWN_PACKET_FROM_SERVER); + throw Exception("Unknown packet from server", ErrorCodes::UNKNOWN_PACKET_FROM_SERVER); } } } diff --git a/dbms/include/DB/DataStreams/UnionBlockInputStream.h b/dbms/include/DB/DataStreams/UnionBlockInputStream.h index a2ee74cc4f2..62ac7ec9e4b 100644 --- a/dbms/include/DB/DataStreams/UnionBlockInputStream.h +++ b/dbms/include/DB/DataStreams/UnionBlockInputStream.h @@ -187,6 +187,7 @@ private: { /// Попросим остальные потоки побыстрее прекратить работу. parent.finish = true; + parent.cancel(); /// Отдаём эксепшен в основной поток. parent.output_queue.push(exception);