Claus Ibsen created CAMEL-25039:
-----------------------------------
Summary: camel-sql - say when a query uses a named parameter
without the # placeholder instead of passing it to the database
Key: CAMEL-25039
URL: https://issues.apache.org/jira/browse/CAMEL-25039
Project: Camel
Issue Type: Improvement
Components: camel-sql
Reporter: Claus Ibsen
The sql component takes named parameters as {{:#name}} or {{:#${simple}}}. A
query that uses any other shape is passed through to the database untouched,
and the database's complaint names neither Camel nor the right syntax.
{{DefaultSqlPrepareStatementStrategy.prepareQuery}} asks
{{hasNamedParameters(query)}} and, when the answer is no, returns the query
unchanged:
{code:java}
if (allowNamedParameters && hasNamedParameters(query)) {
...
answer = replaceParams(query);
} else {
answer = query;
}
{code}
The patterns it parses are {{:?name}} / {{:?${...}}} -- {{SqlComponent}} has
already regex-replaced the {{placeholder}} character ({{#}} by default) with
{{?}}. So {{:customer}} and {{:${body[customer]}}} match nothing, reach H2
verbatim, and come back as:
{noformat}
Syntax error in SQL statement "INSERT INTO customers (id, country, orders)
VALUES ([*]:$ body[customer] , :$ body[country] , 1) ..."
{noformat}
(the braces are blanked by H2's own JDBC-escape handling, which makes the
message harder still to connect back to the query as written).
Suggestion: when the query is passed through because nothing was recognised,
but it contains a {{:}} followed by a letter or {{$}}, say so once -- either a
WARN when the endpoint starts or a hint added to the failure -- naming the
supported form. It should stay a hint and never reject a query: a colon appears
legitimately in a Postgres {{::}} cast and in time literals, so the check must
skip a doubled colon and must not fail the endpoint.
Evidence: measuring how well a local model writes Camel routes, a step that
registers a row with named parameters was failed by all 20 attempts across two
10-pass runs. The attempts were {{:customer}} (Spring JDBC style, no {{#}}),
{{:${body[customer]}}} (no {{#}}), and the correct {{:#${body[customer]}}}
paired with a MySQL-dialect upsert. Only the last of those is the author's own
fault; the first two are shapes Camel could recognise as a mistake and name.
See also the sibling issue about the catalog documentation of a component not
carrying the syntax at all, only the option list.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)