This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new d58a108b5d [CALCITE-6944] Align toSqlString with SQL std for Table
Args in PTF
d58a108b5d is described below
commit d58a108b5d7f4362bf7fb1749c71294b1f2c0770
Author: Juntao Zhang <[email protected]>
AuthorDate: Wed Apr 9 19:29:53 2025 +0800
[CALCITE-6944] Align toSqlString with SQL std for Table Args in PTF
---
.../main/java/org/apache/calcite/sql/SqlCall.java | 17 +++++++++----
.../apache/calcite/sql/parser/SqlParserTest.java | 28 ++++++++++++++--------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/sql/SqlCall.java
b/core/src/main/java/org/apache/calcite/sql/SqlCall.java
index f77aab9d7b..f3edc22a36 100755
--- a/core/src/main/java/org/apache/calcite/sql/SqlCall.java
+++ b/core/src/main/java/org/apache/calcite/sql/SqlCall.java
@@ -116,16 +116,23 @@ public int operandCount() {
getOperandList());
}
+ private boolean needsParentheses(SqlWriter writer, int leftPrec, int
rightPrec) {
+ if (getKind() == SqlKind.SET_SEMANTICS_TABLE) {
+ return false;
+ }
+ final SqlOperator operator = getOperator();
+ return leftPrec > operator.getLeftPrec()
+ || (operator.getRightPrec() <= rightPrec && (rightPrec != 0))
+ || writer.isAlwaysUseParentheses() && isA(SqlKind.EXPRESSION)
+ || (operator.getRightPrec() <= rightPrec + 1 &&
isA(SqlKind.COMPARISON));
+ }
+
@Override public void unparse(
SqlWriter writer,
int leftPrec,
int rightPrec) {
- final SqlOperator operator = getOperator();
final SqlDialect dialect = writer.getDialect();
- if (leftPrec > operator.getLeftPrec()
- || (operator.getRightPrec() <= rightPrec && (rightPrec != 0))
- || writer.isAlwaysUseParentheses() && isA(SqlKind.EXPRESSION)
- || (operator.getRightPrec() <= rightPrec + 1 &&
isA(SqlKind.COMPARISON))) {
+ if (needsParentheses(writer, leftPrec, rightPrec)) {
final SqlWriter.Frame frame = writer.startList("(", ")");
dialect.unparseCall(writer, this, 0, 0);
writer.endList(frame);
diff --git
a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java
b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java
index 42c384870f..a01a8c77d1 100644
--- a/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java
+++ b/testkit/src/main/java/org/apache/calcite/sql/parser/SqlParserTest.java
@@ -4733,7 +4733,15 @@ void checkPeriodPredicate(Checker checker) {
// test one partition key for input table
final String sql = "select * from table(topn(table orders partition by
productid, 3))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`TOPN`(((TABLE `ORDERS`) PARTITION BY `PRODUCTID`), 3))";
+ + "FROM TABLE(`TOPN`((TABLE `ORDERS`) PARTITION BY `PRODUCTID`, 3))";
+ sql(sql).ok(expected);
+ }
+
+ @Test void testTableFunctionWithNamedArgAndPartitionKey() {
+ final String sql = "select * "
+ + "from table(topn(data=>table orders partition by (productid),
col=>3))";
+ final String expected = "SELECT *\n"
+ + "FROM TABLE(`TOPN`(`DATA` => (TABLE `ORDERS`) PARTITION BY
`PRODUCTID`, `COL` => 3))";
sql(sql).ok(expected);
}
@@ -4742,7 +4750,7 @@ void checkPeriodPredicate(Checker checker) {
final String sql =
"select * from table(topn(table orders partition by (orderId,
productid), 3))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`TOPN`(((TABLE `ORDERS`) PARTITION BY `ORDERID`,
`PRODUCTID`), 3))";
+ + "FROM TABLE(`TOPN`((TABLE `ORDERS`) PARTITION BY `ORDERID`,
`PRODUCTID`, 3))";
sql(sql).ok(expected);
}
@@ -4751,7 +4759,7 @@ void checkPeriodPredicate(Checker checker) {
final String sql =
"select * from table(topn(table orders order by orderId, 3))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`TOPN`(((TABLE `ORDERS`) ORDER BY `ORDERID`), 3))";
+ + "FROM TABLE(`TOPN`((TABLE `ORDERS`) ORDER BY `ORDERID`, 3))";
sql(sql).ok(expected);
}
@@ -4760,7 +4768,7 @@ void checkPeriodPredicate(Checker checker) {
final String sql =
"select * from table(topn(table orders order by (orderId, productid),
3))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`TOPN`(((TABLE `ORDERS`) ORDER BY `ORDERID`,
`PRODUCTID`), 3))";
+ + "FROM TABLE(`TOPN`((TABLE `ORDERS`) ORDER BY `ORDERID`, `PRODUCTID`,
3))";
sql(sql).ok(expected);
}
@@ -4769,7 +4777,7 @@ void checkPeriodPredicate(Checker checker) {
final String sql =
"select * from table(topn(table orders order by (orderId desc,
productid asc), 3))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`TOPN`(((TABLE `ORDERS`) ORDER BY `ORDERID` DESC,
`PRODUCTID`), 3))";
+ + "FROM TABLE(`TOPN`((TABLE `ORDERS`) ORDER BY `ORDERID` DESC,
`PRODUCTID`, 3))";
sql(sql).ok(expected);
}
@@ -4778,7 +4786,7 @@ void checkPeriodPredicate(Checker checker) {
final String sql =
"select * from table(topn(table orders partition by productid order by
orderId, 3))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`TOPN`(((TABLE `ORDERS`) PARTITION BY `PRODUCTID` ORDER
BY `ORDERID`), 3))";
+ + "FROM TABLE(`TOPN`((TABLE `ORDERS`) PARTITION BY `PRODUCTID` ORDER
BY `ORDERID`, 3))";
sql(sql).ok(expected);
}
@@ -4788,8 +4796,8 @@ void checkPeriodPredicate(Checker checker) {
"select * from table(topn(select * from Orders partition by productid "
+ "order by orderId, 3))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`TOPN`(((SELECT *\n"
- + "FROM `ORDERS`) PARTITION BY `PRODUCTID` ORDER BY `ORDERID`), 3))";
+ + "FROM TABLE(`TOPN`((SELECT *\n"
+ + "FROM `ORDERS`) PARTITION BY `PRODUCTID` ORDER BY `ORDERID`, 3))";
sql(sql).ok(expected);
}
@@ -4806,8 +4814,8 @@ void checkPeriodPredicate(Checker checker) {
+ " table emp partition by deptno order by empno, "
+ " table emp_b partition by deptno order by empno))";
final String expected = "SELECT *\n"
- + "FROM TABLE(`SIMILARLITY`(((TABLE `EMP`) PARTITION BY `DEPTNO` ORDER
BY `EMPNO`), "
- + "((TABLE `EMP_B`) PARTITION BY `DEPTNO` ORDER BY `EMPNO`)))";
+ + "FROM TABLE(`SIMILARLITY`((TABLE `EMP`) PARTITION BY `DEPTNO` ORDER
BY `EMPNO`, "
+ + "(TABLE `EMP_B`) PARTITION BY `DEPTNO` ORDER BY `EMPNO`))";
sql(sql).ok(expected);
}