[jira] [Created] (CALCITE-5119) SqlNode#unparse hides an alias table when using CTE

2022-04-27 Thread Mitsunori Komatsu (Jira)
Mitsunori Komatsu created CALCITE-5119:
--

 Summary: SqlNode#unparse hides an alias table when using CTE
 Key: CALCITE-5119
 URL: https://issues.apache.org/jira/browse/CALCITE-5119
 Project: Calcite
  Issue Type: Bug
  Components: core
Affects Versions: 1.30.0
Reporter: Mitsunori Komatsu


Hi team,

I found SqlNode#unparse hides an alias table when using CTE.

 
{code:java}
val planner = Frameworks.getPlanner(config)

val sql = """
WITH cte AS (
  select 42 as i
)
SELECT i FROM (
  SELECT [i] from cte
) AS [alias]
ORDER BY [alias].[i]
""".trimIndent()

val node = planner.parse(sql)
println(node.toSqlString { c ->
c.withDialect(PrestoSqlDialect.DEFAULT)
.withAlwaysUseParentheses(false)
.withSubQueryStyle(SqlWriter.SubQueryStyle.HYDE)
.withClauseStartsLine(false)
.withClauseEndsLine(false)
}) {code}
This code shows the following
{code:java}
WITH "cte" AS (SELECT 42 AS "i")
(SELECT "i" FROM (SELECT "i" FROM "cte") AS "alias")
ORDER BY "alias"."i"{code}
The `AS "alias"` is inside a block and the last `ORDER BY` can't find `alias` 
and this query fails with Presto. I think the output should be as follows
{code:java}
WITH "cte" AS (SELECT 42 AS "i")
SELECT "i" FROM (SELECT "i" FROM "cte") AS "alias"
ORDER BY "alias"."i"{code}
 



--
This message was sent by Atlassian Jira
(v8.20.7#820007)


[jira] [Created] (CALCITE-5135) Planner#parse can't parse DAY() function

2022-05-06 Thread Mitsunori Komatsu (Jira)
Mitsunori Komatsu created CALCITE-5135:
--

 Summary: Planner#parse can't parse DAY() function
 Key: CALCITE-5135
 URL: https://issues.apache.org/jira/browse/CALCITE-5135
 Project: Calcite
  Issue Type: Bug
  Components: core
Affects Versions: 1.30.0
Reporter: Mitsunori Komatsu


Hi team,

I might be missing something, but `Planner#parse` can't parse `DAY()` function 
while it can parse other YEAR(), MONTH(), HOUR() and so on.

 
{code:java}
import org.apache.calcite.sql.parser.SqlParseException;
import org.apache.calcite.sql.validate.SqlValidator;
import org.apache.calcite.tools.FrameworkConfig;
import org.apache.calcite.tools.Frameworks;
import org.apache.calcite.tools.Planner;

public class Main {
public static void main(String[] args) throws SqlParseException {
FrameworkConfig config = Frameworks.newConfigBuilder().build();
{
Planner planner = Frameworks.getPlanner(config);
System.out.println(planner.parse("select months(t) from tbl"));
}
{
Planner planner = Frameworks.getPlanner(config);
System.out.println(planner.parse("select month(t) from tbl"));
}
{
Planner planner = Frameworks.getPlanner(config);
System.out.println(planner.parse("select hours(t) from tbl"));
}
{
Planner planner = Frameworks.getPlanner(config);
System.out.println(planner.parse("select hour(t) from tbl"));
}
{
Planner planner = Frameworks.getPlanner(config);
System.out.println(planner.parse("select days(t) from tbl"));
}
{
Planner planner = Frameworks.getPlanner(config);
// This throws `org.apache.calcite.sql.parser.SqlParseException: 
Encountered "day" ...`
System.out.println(planner.parse("select day(t) from tbl"));
}
}
}
 {code}
Is this a bug? Is there any way to parse DAY() function? Thanks.



--
This message was sent by Atlassian Jira
(v8.20.7#820007)


[jira] [Created] (CALCITE-5143) Planner#parse fails to parse a function when HOUR is passed as an argument

2022-05-08 Thread Mitsunori Komatsu (Jira)
Mitsunori Komatsu created CALCITE-5143:
--

 Summary: Planner#parse fails to parse a function when HOUR is 
passed as an argument
 Key: CALCITE-5143
 URL: https://issues.apache.org/jira/browse/CALCITE-5143
 Project: Calcite
  Issue Type: Bug
  Components: core
Affects Versions: 1.30.0
Reporter: Mitsunori Komatsu


I'm trying to parse and rewrite some SQL dialects including SQL Server which 
supports some functions that receive HOUR as an argument using. But Calcite's 
Planner#parse can't handle this kind of SQL.
{code:java}
FrameworkConfig config = Frameworks.newConfigBuilder().build();
Planner planner = Frameworks.getPlanner(config);
System.out.println(planner.parse("SELECT DATEDIFF(HOUR, NOW(), NOW())")); {code}
{code:java}
Exception in thread "main" org.apache.calcite.sql.parser.SqlParseException: 
Incorrect syntax near the keyword 'HOUR' at line 2, column 21.
Was expecting one of:
    "ALL" ...
    "ARRAY" ...
    "CASE" ...
   :
    "GROUPING" ...
    "HOUR" ...
    "HOUR" "(" ...
    "*" ...
    ")" ...
    
    at 
org.apache.calcite.sql.parser.impl.SqlParserImpl.convertException(SqlParserImpl.java:389)
    at 
org.apache.calcite.sql.parser.impl.SqlParserImpl.normalizeException(SqlParserImpl.java:153)
    at 
org.apache.calcite.sql.parser.SqlParser.handleException(SqlParser.java:145)
    at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:160)
    at org.apache.calcite.sql.parser.SqlParser.parseStmt(SqlParser.java:185)
    at org.apache.calcite.prepare.PlannerImpl.parse(PlannerImpl.java:214)
    at org.apache.calcite.tools.Planner.parse(Planner.java:50) {code}
This issue happens with other date/time keyword-ish ones like YEAR.

I guess it happens because HOUR and YEAR are reserved keywords.

Is this an expected behavior? If so, is there any workaround?



--
This message was sent by Atlassian Jira
(v8.20.7#820007)