You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Steven Talbot (Jira)" <ji...@apache.org> on 2022/10/06 20:46:00 UTC

[jira] [Commented] (CALCITE-5311) SqlNode.parserPosition missing closing ')' for expression subquery

    [ 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)