From c1757bc84f4cca4f9d3db79fd9452a6ed28ae40f Mon Sep 17 00:00:00 2001 From: Thomas Segismont Date: Mon, 2 Feb 2026 14:35:01 +0100 Subject: [PATCH] Expose compiled SQL for SqlTemplate to improve transparency (#1610) See #1609 The compiled SQL query is computed as soon as the template is created. It can be exposed for inspection by users (e.g. logging). Signed-off-by: Thomas Segismont --- .../io/vertx/sqlclient/templates/SqlTemplate.java | 6 ++++++ .../sqlclient/templates/impl/SqlTemplateImpl.java | 12 ++++++------ .../sqlclient/templates/PgTemplateTestBase.java | 10 ++++++---- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/SqlTemplate.java b/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/SqlTemplate.java index 33392a75f8..76d483fbe7 100644 --- a/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/SqlTemplate.java +++ b/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/SqlTemplate.java @@ -69,6 +69,12 @@ static SqlTemplate, SqlResult> forUpdate(SqlClient cli return new SqlTemplateImpl<>(client, sqlTemplate, query -> query.collecting(SqlTemplateImpl.NULL_COLLECTOR), sqlTemplate::mapTuple); } + + /** + * @return the computed SQL for this template + */ + String getSql(); + /** * Set a parameters user defined mapping function. * diff --git a/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/impl/SqlTemplateImpl.java b/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/impl/SqlTemplateImpl.java index f16134bcb8..aa282e32a5 100644 --- a/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/impl/SqlTemplateImpl.java +++ b/vertx-sql-client-templates/src/main/java/io/vertx/sqlclient/templates/impl/SqlTemplateImpl.java @@ -4,12 +4,7 @@ import io.vertx.core.Future; import io.vertx.core.Handler; import io.vertx.core.json.JsonObject; -import io.vertx.sqlclient.PreparedQuery; -import io.vertx.sqlclient.Row; -import io.vertx.sqlclient.RowSet; -import io.vertx.sqlclient.SqlClient; -import io.vertx.sqlclient.SqlResult; -import io.vertx.sqlclient.Tuple; +import io.vertx.sqlclient.*; import io.vertx.sqlclient.templates.RowMapper; import io.vertx.sqlclient.templates.TupleMapper; @@ -39,6 +34,11 @@ public SqlTemplateImpl(SqlClient client, this.tupleMapper = tupleMapper; } + @Override + public String getSql() { + return sqlTemplate.getSql(); + } + @Override public io.vertx.sqlclient.templates.SqlTemplate mapFrom(TupleMapper mapper) { return new SqlTemplateImpl<>(client, sqlTemplate, queryMapper, params -> mapper.map(sqlTemplate, sqlTemplate.numberOfParams(), params)); diff --git a/vertx-sql-client-templates/src/test/java/io/vertx/sqlclient/templates/PgTemplateTestBase.java b/vertx-sql-client-templates/src/test/java/io/vertx/sqlclient/templates/PgTemplateTestBase.java index f031869a2e..04db14eee6 100644 --- a/vertx-sql-client-templates/src/test/java/io/vertx/sqlclient/templates/PgTemplateTestBase.java +++ b/vertx-sql-client-templates/src/test/java/io/vertx/sqlclient/templates/PgTemplateTestBase.java @@ -6,7 +6,6 @@ import io.vertx.ext.unit.junit.VertxUnitRunner; import io.vertx.pgclient.PgConnectOptions; import io.vertx.pgclient.PgConnection; -import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; import org.junit.After; import org.junit.AfterClass; @@ -15,7 +14,6 @@ import org.junit.runner.RunWith; import org.testcontainers.containers.PostgreSQLContainer; -import java.util.Map; import java.util.function.Function; @RunWith(VertxUnitRunner.class) @@ -84,11 +82,15 @@ protected void testGet(TestContext ctx, Function extractor, String column) { Async async = ctx.async(); + String query = "SELECT %s :: %s \"%s\""; SqlTemplate> template = SqlTemplate - .forQuery(connection, "SELECT #{" + paramName + "} :: " + sqlType + " \"" + column + "\"") + .forQuery(connection, String.format(query, "#{" + paramName + "}", sqlType, column)) .mapFrom(paramsMapper) .mapTo(rowMapper); - template.execute(params, ctx.asyncAssertSuccess(result -> { + ctx.assertEquals(String.format(query, "$1", sqlType, column), template.getSql()); + template + .execute(params) + .onComplete(ctx.asyncAssertSuccess(result -> { ctx.assertEquals(1, result.size()); ctx.assertEquals(expected, extractor.apply(result.iterator().next())); async.complete();