From ee4a2e51e8434fd707b4088bef4650e93df90a13 Mon Sep 17 00:00:00 2001 From: Sharang Gupta Date: Wed, 28 Oct 2026 22:01:19 +0000 Subject: [PATCH] Complete close() of a lazy prepared statement that was never executed When PREPARE fails with an indeterminate type error, PG falls back to a statement prepared on its first execution. Closing such a statement before any execution did nothing, so the returned future never completed. Complete the close and mark the statement closed, so that a later execution fails instead of preparing it. Signed-off-by: Sharang Gupta Assisted-by: Anthropic Claude (claude-opus-5-5) --- .../tests/pgclient/PreparedStatementTestBase.java | 11 +++++++++++ .../vertx/sqlclient/impl/PreparedStatementBase.java | 4 ++++ 2 files changed, 15 insertions(+) diff --git a/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PreparedStatementTestBase.java b/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PreparedStatementTestBase.java index ea51c34ca9..1dd2a3913e 100644 --- a/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PreparedStatementTestBase.java +++ b/vertx-pg-client/src/test/java/io/vertx/tests/pgclient/PreparedStatementTestBase.java @@ -587,6 +587,17 @@ public void testInferDataTypeLazy42P18(TestContext ctx) { })); } + @Test + public void testCloseLazyPreparedStatementNotExecuted42P18(TestContext ctx) { + PgConnection.connect(vertx, options()).onComplete(ctx.asyncAssertSuccess(conn -> { + conn + .prepare("SELECT CONCAT('HELLO', $1)") + .compose(PreparedStatement::close) + .eventually(() -> conn.close()) + .onComplete(ctx.asyncAssertSuccess()); + })); + } + @Test public void testInferDataTypeFailure42P18(TestContext ctx) { PgConnection.connect(vertx, options()).onComplete(ctx.asyncAssertSuccess(conn -> { diff --git a/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/PreparedStatementBase.java b/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/PreparedStatementBase.java index 793b501180..38e4f2dded 100644 --- a/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/PreparedStatementBase.java +++ b/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/PreparedStatementBase.java @@ -134,6 +134,10 @@ protected void close(Promise promise) { promise.fail(ar.cause()); } }); + } else { + // Never executed, so never prepared: nothing to close, and it must not be prepared afterwards + future = context.failedFuture("Prepared statement closed"); + promise.complete(); } } @Override