You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2022/06/18 09:31:00 UTC
[jira] [Updated] (CALCITE-4802) Babel parser doesn't parse IF(condition, then, else) statements
[ https://issues.apache.org/jira/browse/CALCITE-4802?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
ASF GitHub Bot updated CALCITE-4802:
------------------------------------
Labels: pull-request-available (was: )
> Babel parser doesn't parse IF(condition, then, else) statements
> ---------------------------------------------------------------
>
> Key: CALCITE-4802
> URL: https://issues.apache.org/jira/browse/CALCITE-4802
> Project: Calcite
> Issue Type: Bug
> Components: babel
> Reporter: Florent Martineau
> Priority: Minor
> Labels: pull-request-available
> Time Spent: 10m
> Remaining Estimate: 0h
>
> Following my email on Calcite's dev mailing list, [~julianhyde] told me to open an issue as there is likely a bug in Babel's parser regarding IF statements.
>
> You can find the email with this title: _Error parsing DATE("2021-01-01") for BigQuery using Calcite_
>
> The symptoms are the following:
> * If I use SqlParserImpl.FACTORY, most statements work but DATE(string) fails, likely because it's a reserved keyword, as Julian pointed out in the mail thread. Statements such as IF(cond, then, else) work, as well as other dialect-specific functions such as CURRENT_DATETIME() [Bigquery].
> * If I use SqlBabelParserImpl.FACTORY, it will work for parsing DATE(string), it also works for dialect-specific functions, but it doesn't work for IF(cond, then, else).
>
> Here is a table to sum it up:
>
>
> ||Test||Normal parser||Babel||
> |1+(2*4) as foo|SUCCESS|SUCCESS|
> |CURRENT_DATE()|SUCCESS|SUCCESS|
> |CURRENT_DATETIME()|SUCCESS|SUCCESS|
> |DATE_FROM_UNIX(123456)|SUCCESS|SUCCESS|
> |IF(TRUE, 1, 2)|SUCCESS|FAILURE|
> |DATE("2021-01-01")|FAILURE|SUCCESS|
>
>
> Here is the code I use to check:
>
>
> {code:java}
> package test.Test;
> import org.apache.calcite.config.Lex;
> import org.apache.calcite.sql.SqlNode;
> import org.apache.calcite.sql.parser.SqlParseException;
> import org.apache.calcite.sql.parser.SqlParser;
> import org.apache.calcite.sql.parser.babel.SqlBabelParserImpl;
> import org.apache.calcite.sql.parser.impl.SqlParserImpl;
> import org.apache.calcite.sql.validate.SqlConformanceEnum;
> import org.apache.calcite.tools.FrameworkConfig;
> import org.apache.calcite.tools.Frameworks;
> import org.apache.calcite.tools.Planner;
> import java.util.HashMap;
> import java.util.Map;
> public class Test {
> public static void main(String[] args) {
> SqlParser.Config sqlParserConfigBabel = SqlParser.config().DEFAULT
> .withLex(Lex.BIG_QUERY)
> .withConformance(SqlConformanceEnum.BIG_QUERY)
> .withParserFactory(SqlBabelParserImpl.FACTORY);
> SqlParser.Config sqlParserConfigNotBabel = SqlParser.config().DEFAULT
> .withLex(Lex.BIG_QUERY)
> .withConformance(SqlConformanceEnum.BIG_QUERY)
> .withParserFactory(SqlParserImpl.FACTORY);
> Map<String, SqlParser.Config> parserConfigs = new HashMap<String, SqlParser.Config>();
> parserConfigs.put("With babel", sqlParserConfigBabel);
> parserConfigs.put("Without babel", sqlParserConfigNotBabel);
> String[] testSqlFragments = {
> "1+(2*4) as foo",
> "CURRENT_DATE()",
> "CURRENT_DATETIME()",
> "DATE_FROM_UNIX(123456)",
> "IF(TRUE, 1, 2)",
> "DATE('2021-01-01')",
> };
> for (String sqlFragment : testSqlFragments) {
> String query = "SELECT " + sqlFragment;
> System.out.println("Trying to parse : " + query);
> for (var config : parserConfigs.entrySet()) {
> System.out.print(config.getKey() + " : ");
> try {
> FrameworkConfig frameworkConfig = Frameworks.newConfigBuilder()
> .parserConfig(config.getValue())
> .build();
> Planner planner = Frameworks.getPlanner(frameworkConfig);
> SqlNode node = planner.parse(query);
> System.out.println("SUCCESS");
> } catch (SqlParseException e) {
> System.out.println("ERROR");
> }
> }
> }
> }
> }
> {code}
>
>
> And here is the output of that code:
>
> {code:java}
> Trying to parse : SELECT 1+(2*4) as foo
> Without babel : SUCCESS
> With babel : SUCCESS
> Trying to parse : SELECT CURRENT_DATE()
> Without babel : SUCCESS
> With babel : SUCCESS
> Trying to parse : SELECT CURRENT_DATETIME()
> Without babel : SUCCESS
> With babel : SUCCESS
> Trying to parse : SELECT DATE_FROM_UNIX(123456)
> Without babel : SUCCESS
> With babel : SUCCESS
> Trying to parse : SELECT IF(TRUE, 1, 2)
> Without babel : SUCCESS
> With babel : ERROR
> Trying to parse : SELECT DATE('2021-01-01')
> Without babel : ERROR
> With babel : SUCCESS
> Process finished with exit code 0
> {code}
>
>
> Please tell me if I can be of any help on this issue, or if it's too deep into the project and a newcomer can't solve this.
>
> Have a great day
--
This message was sent by Atlassian Jira
(v8.20.7#820007)