From 044f06917115df6bac5223da00b2df183e1c45d5 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 | 4 +++- 3 files changed, 15 insertions(+), 7 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 ed050a44b4..6d0e6e7d38 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 @@ -67,6 +67,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 94459358ac..3ef659dbdb 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 @@ -2,12 +2,7 @@ import io.vertx.core.Future; 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; @@ -37,6 +32,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/tests/sqlclient/templates/PgTemplateTestBase.java b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/PgTemplateTestBase.java index b21c847d69..5f2c4b196f 100644 --- a/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/PgTemplateTestBase.java +++ b/vertx-sql-client-templates/src/test/java/io/vertx/tests/sqlclient/templates/PgTemplateTestBase.java @@ -96,10 +96,12 @@ 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); + ctx.assertEquals(String.format(query, "$1", sqlType, column), template.getSql()); template .execute(params) .onComplete(ctx.asyncAssertSuccess(result -> {