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);
   }
 

Reply via email to