From 6434fd8a47a4631a8d7b85229b71a219a74b2b36 Mon Sep 17 00:00:00 2001 From: Alexander Tokmakov Date: Wed, 26 Apr 2023 14:06:10 +0300 Subject: [PATCH] fix prepared statement insert already exists (#49154) --- src/Storages/StoragePostgreSQL.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Storages/StoragePostgreSQL.cpp b/src/Storages/StoragePostgreSQL.cpp index 8548d558fd3..e013199c584 100644 --- a/src/Storages/StoragePostgreSQL.cpp +++ b/src/Storages/StoragePostgreSQL.cpp @@ -345,6 +345,7 @@ private: PreparedInsert(pqxx::connection & connection_, const String & table, const String & schema, const ColumnsWithTypeAndName & columns, const String & on_conflict_) : Inserter(connection_) + , statement_name("insert_" + getHexUIntLowercase(thread_local_rng())) { WriteBufferFromOwnString buf; buf << getInsertQuery(schema, table, columns, IdentifierQuotingStyle::DoubleQuotes); @@ -357,12 +358,14 @@ private: } buf << ") "; buf << on_conflict_; - connection.prepare("insert", buf.str()); + connection.prepare(statement_name, buf.str()); + prepared = true; } void complete() override { - connection.unprepare("insert"); + connection.unprepare(statement_name); + prepared = false; tx.commit(); } @@ -371,8 +374,24 @@ private: pqxx::params params; params.reserve(row.size()); params.append_multi(row); - tx.exec_prepared("insert", params); + tx.exec_prepared(statement_name, params); } + + ~PreparedInsert() override + { + try + { + if (prepared) + connection.unprepare(statement_name); + } + catch (...) + { + tryLogCurrentException(__PRETTY_FUNCTION__); + } + } + + const String statement_name; + bool prepared = false; }; StorageMetadataPtr metadata_snapshot;