From 3c1db774cf8f9efe2ef338c16b8a7d158f4fc22d Mon Sep 17 00:00:00 2001 From: Thomas Segismont Date: Fri, 21 Nov 2025 16:19:01 +0100 Subject: [PATCH] Cursor.close() does not complete if it was already called See #1410 Signed-off-by: Thomas Segismont --- .../mysqlclient/tck/ProxySQLPreparedQueryTest.java | 7 +++++++ .../java/io/vertx/sqlclient/impl/CursorImpl.java | 2 ++ .../tests/sqlclient/tck/PreparedQueryTestBase.java | 14 ++++++++++++++ 3 files changed, 23 insertions(+) diff --git a/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/tck/ProxySQLPreparedQueryTest.java b/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/tck/ProxySQLPreparedQueryTest.java index 8cc6fcf0d..bdae2151c 100644 --- a/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/tck/ProxySQLPreparedQueryTest.java +++ b/vertx-mysql-client/src/test/java/io/vertx/tests/mysqlclient/tck/ProxySQLPreparedQueryTest.java @@ -45,6 +45,13 @@ public void testQueryCloseCursor(TestContext ctx) { super.testQueryCloseCursor(ctx); } + @Test + @Ignore("Fetch command not supported by ProxySQL") + @Override + public void testQueryCloseCursorTwice(TestContext ctx) { + super.testQueryCloseCursorTwice(ctx); + } + @Test @Ignore("Fetch command not supported by ProxySQL") @Override diff --git a/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/CursorImpl.java b/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/CursorImpl.java index c525e6dba..029474bc0 100644 --- a/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/CursorImpl.java +++ b/vertx-sql-client/src/main/java/io/vertx/sqlclient/impl/CursorImpl.java @@ -98,6 +98,8 @@ private synchronized void close(Promise promise) { result = null; ps.closeCursor(id, promise); } + } else { + promise.complete(); } } } diff --git a/vertx-sql-client/src/test/java/io/vertx/tests/sqlclient/tck/PreparedQueryTestBase.java b/vertx-sql-client/src/test/java/io/vertx/tests/sqlclient/tck/PreparedQueryTestBase.java index c07370885..7f2222120 100644 --- a/vertx-sql-client/src/test/java/io/vertx/tests/sqlclient/tck/PreparedQueryTestBase.java +++ b/vertx-sql-client/src/test/java/io/vertx/tests/sqlclient/tck/PreparedQueryTestBase.java @@ -11,6 +11,7 @@ package io.vertx.tests.sqlclient.tck; import io.vertx.core.AsyncResult; +import io.vertx.core.Future; import io.vertx.core.Handler; import io.vertx.core.Vertx; import io.vertx.ext.unit.Async; @@ -305,6 +306,19 @@ public void testQueryCloseCursor(TestContext ctx) { }); } + @Test + public void testQueryCloseCursorTwice(TestContext ctx) { + Async async = ctx.async(); + testCursor(ctx, conn -> { + conn + .prepare("SELECT * FROM immutable") + .onComplete(ctx.asyncAssertSuccess(ps -> { + Cursor cursor = ps.cursor(Tuple.tuple()); + Future.all(cursor.close(), cursor.close()).onComplete(ctx.asyncAssertSuccess(v -> async.complete())); + })); + }); + } + @Test public void testQueryStreamCloseCursor(TestContext ctx) { Async async = ctx.async();