You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Claus Ibsen (Jira)" <ji...@apache.org> on 2026/09/17 18:52:00 UTC

[jira] [Commented] (CAMEL-24801) camel-sql - sql-stored: allow parentheses inside ${...} simple expressions in the template grammar

    [ https://issues.apache.org/jira/browse/CAMEL-24801?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18116458#comment-18116458 ] 

Claus Ibsen commented on CAMEL-24801:
-------------------------------------

Fixed on main by https://github.com/apache/camel/pull/26560 (Camel 4.23.0).

_Claude Code on behalf of davsclaus_

> camel-sql - sql-stored: allow parentheses inside ${...} simple expressions in the template grammar
> --------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-24801
>                 URL: https://issues.apache.org/jira/browse/CAMEL-24801
>             Project: Camel
>          Issue Type: Improvement
>          Components: camel-sql
>            Reporter: Claus Ibsen
>            Assignee: Claus Ibsen
>            Priority: Major
>             Fix For: 4.23.0
>
>
> The sql-stored template grammar ({{components/camel-sql/src/main/java/org/apache/camel/component/sql/stored/template/grammar/sspt.jj}}) rejects simple functions inside {{${...}}} parameters because the {{SIMPLE_EXP_TOKEN}} character set does not include parentheses:
> {code}
> <SIMPLE_EXP_TOKEN: "${"(<LETTER>|<DIGIT> | <SPECIAL> | " ")+ "}">
> <#SPECIAL: ([":","#","_","-","'",".","$","{","}","\"","[","]"])>
> {code}
> This works:
> {code}
> sql-stored:SCH_GetCalendarForPeriod( TIMESTAMP :#startDate, TIMESTAMP :#endDate, INTEGER ${header.notType})
> {code}
> This fails:
> {code}
> sql-stored:SCH_GetCalendarForPeriod( TIMESTAMP :#startDate, TIMESTAMP :#endDate, INTEGER ${val(1)})
> {code}
> with
> {noformat}
> org.apache.camel.component.sql.stored.template.ast.ParseRuntimeException: org.apache.camel.component.sql.stored.template.generated.ParseException: Encountered " <IDENTIFIER> "${val "" at line 1, column 83. Was expecting one of: <SIMPLE_EXP_TOKEN> ... <PARAMETER_POS_TOKEN> ... <PARAMETER_NAME> ...
> {noformat}
> Since {{$}} and {{{}} are in {{SPECIAL}}, the lexer falls back to matching {{${val}} as an {{IDENTIFIER}} and then chokes on {{(}}. The evaluation side is not the problem: {{InParameter}} / {{InOutParameter}} hand the whole token string to the simple language, so any function would work once it gets through the lexer.
> Proposal: add {{(}} and {{)}} to the {{SIMPLE_EXP_TOKEN}} character set. This is safe with JavaCC longest-match because the token must end with {{}}}, so {{${val(1)})}} stops at the {{}}} before the procedure's closing parenthesis. It enables single-argument built-in functions such as {{${val(1)}}}, {{${bodyAs(String)}}}, and custom simple functions taking one argument.
> Scope: this is deliberately *not* full simple support. Commas cannot be added to the token (longest match would turn {{${a}, INTEGER ${b}}} into one token), so multi-argument functions like {{${replace(a,b)}}} and nested functions remain unsupported in the template. Users needing those should compute the value into a header first and reference it with {{${header.xxx}}}.
> Add test cases to {{ParserTest}} / {{TemplateParserLexicalErrorTest}} and document the supported subset in the sql-stored component docs.
> Reported by a user on Zulip.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)