diff --git a/dbms/include/DB/IO/CompressedWriteBuffer.h b/dbms/include/DB/IO/CompressedWriteBuffer.h index 6f724a6b72c..4de05a9d50e 100644 --- a/dbms/include/DB/IO/CompressedWriteBuffer.h +++ b/dbms/include/DB/IO/CompressedWriteBuffer.h @@ -71,7 +71,7 @@ public: try { - nextImpl(); + next(); } catch (...) { diff --git a/dbms/include/DB/IO/RemoteWriteBuffer.h b/dbms/include/DB/IO/RemoteWriteBuffer.h index 339f8097cb6..b4361eae497 100644 --- a/dbms/include/DB/IO/RemoteWriteBuffer.h +++ b/dbms/include/DB/IO/RemoteWriteBuffer.h @@ -93,7 +93,7 @@ public: try { - nextImpl(); + next(); Poco::Net::HTTPResponse response; std::istream & istr = session.receiveResponse(response); diff --git a/dbms/include/DB/IO/WriteBuffer.h b/dbms/include/DB/IO/WriteBuffer.h index ab02e783a13..c57575068b7 100644 --- a/dbms/include/DB/IO/WriteBuffer.h +++ b/dbms/include/DB/IO/WriteBuffer.h @@ -31,11 +31,24 @@ public: if (!offset()) return; bytes += offset(); - nextImpl(); + + try + { + nextImpl(); + } + catch (...) + { + /** Если вызов nextImpl() был неудачным, то переместим курсор в начало, + * чтобы потом (например, при развёртке стека) не было второй попытки записать данные. + */ + pos = working_buffer.begin(); + throw; + } + pos = working_buffer.begin(); } - /** желательно в наследниках поместить в деструктор вызов nextImpl(), + /** желательно в наследниках поместить в деструктор вызов next(), * чтобы последние данные записались */ virtual ~WriteBuffer() {} diff --git a/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h b/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h index e76f7e7de99..e9c1610d9de 100644 --- a/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h +++ b/dbms/include/DB/IO/WriteBufferFromFileDescriptor.h @@ -53,7 +53,7 @@ public: try { - nextImpl(); + next(); } catch (...) { diff --git a/dbms/include/DB/IO/WriteBufferFromOStream.h b/dbms/include/DB/IO/WriteBufferFromOStream.h index 671265d229f..682ba0cfe7f 100644 --- a/dbms/include/DB/IO/WriteBufferFromOStream.h +++ b/dbms/include/DB/IO/WriteBufferFromOStream.h @@ -39,7 +39,7 @@ public: try { - nextImpl(); + next(); } catch (...) {