[ https://issues.apache.org/jira/browse/CALCITE-5013?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17514391#comment-17514391 ]
Jiajun Xie commented on CALCITE-5013: ------------------------------------- Thank you very much for your guidance. I was confused before that there was no *SqlOperator* corresponding to LIMIT. From your code, I learned that *SqlinternalOperators* can create necessary operators. I cherry pick your commit and add it to https://github.com/apache/calcite/pull/2724 > JDBC adapter should retain parentheses if a query in a UNION has a LIMIT > clause > ------------------------------------------------------------------------------- > > Key: CALCITE-5013 > URL: https://issues.apache.org/jira/browse/CALCITE-5013 > Project: Calcite > Issue Type: Bug > Components: core > Reporter: Jiajun Xie > Priority: Major > > The JDBC adapter, when generating SQL, should retain parentheses if one of > the inputs to a set operator (e.g. UNION) has an LIMIT clause. > In standard SQL, the operand of UNION should not have LIMIT or ORDER BY. So > parse will fail in {{SqlParserTetest#testLimitUnion}} and > {{SqlParserTetest#OrderUnion}}. > When users use parentheses, most engines allow it. See the discussion: > CALCITE-1892. > For simple example, parentheses control the scope of the limit > {code:java} > select "product_id" from "product" > union all > (select "product_id" from "product" limit 10){code} > {{unparseBinarySyntax}} will miss parentheses, this change will affect > semantics > {code:java} > SELECT \"product_id\" FROM \"foodmart\".\"product\" > UNION ALL > SELECT \"product_id\" FROM \"foodmart\".\"product\" > FETCH NEXT 10 ROWS ONLY -- Affect semantics{code} -- This message was sent by Atlassian Jira (v8.20.1#820001)