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

Steven Talbot commented on CALCITE-5311:
----------------------------------------

The best fix I can think of is to move that special case up into the 
"createCall" method, but not sure if that would have other implications.

> SqlNode.parserPosition missing closing ')' for expression subquery
> ------------------------------------------------------------------
>
>                 Key: CALCITE-5311
>                 URL: https://issues.apache.org/jira/browse/CALCITE-5311
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Steven Talbot
>            Priority: Major
>
> Here's an obscure one!
> Background: I'm trying to use the values of parserPos to recover the original 
> slices of SQL corresponding to various SQL entities. 
> When we parse a statement like 
>  
> {code:java}
> SELECT a IN (SELECT a FROM c WHERE d) FROM t{code}
> The parsed SqlNode corresponding to "a IN (SELECT a FROM c WHERE d)" stops at 
> the index of "d", not the ")".
>  
> I am almost sure this is due to this very original special case code in the 
> parser: 
> [https://github.com/apache/calcite/blame/a505b25eacc473c6ec0ef8abd40c1ccae86297b6/core/src/main/codegen/templates/Parser.jj#L3602]
> The parser drops the "list" of the single parenthesized query in favor of 
> just the query, which completely makes sense, but in doing so it discards the 
> parserPos of the list, which includes the index of ")", for the parserPos of 
> the query, which does not. Then, when the parserPositions of the arguments to 
> the IN are added together, the final parserPosition does not include the ')'.
> Test is perhaps easier to see:
>  
> {code:java}
> @Test
> void testSubqueryParserPosParse() throws SqlParseException {
>   String sql = "SELECT a IN (SELECT a FROM c WHERE d) FROM t";
>   SqlNode parsed = SqlParser.create(sql).parseQuery();
>   SqlCall inCall = (SqlCall) ((SqlSelect) parsed).getSelectList().get(0);
>   assertEquals("a IN (SELECT a FROM c WHERE d)",
>       sql.substring(
>           inCall.getParserPosition().getColumnNum() - 1, // pos is 1-indexed
>           inCall.getParserPosition().getEndColumnNum()   // but inclusive
>       ));
> } {code}
> {noformat}
> org.opentest4j.AssertionFailedError:
> Expected :a IN (SELECT a FROM c WHERE d)
> Actual   :a IN (SELECT a FROM c WHERE d
> {noformat}
>  
>  



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

Reply via email to