Skip to content

Commit c7f87cd

Browse files
committed
[CALCITE-7246] UNNEST in Spark should convert to EXPLODE/POSEXPLODE
trigger CI build [CALCITE-7246] UNNEST in Spark should convert to EXPLODE/POSEXPLODE
1 parent 95350ed commit c7f87cd

2 files changed

Lines changed: 37 additions & 1 deletion

File tree

core/src/main/java/org/apache/calcite/sql/dialect/SparkSqlDialect.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.calcite.sql.SqlLiteral;
3131
import org.apache.calcite.sql.SqlNode;
3232
import org.apache.calcite.sql.SqlNodeList;
33+
import org.apache.calcite.sql.SqlUnnestOperator;
3334
import org.apache.calcite.sql.SqlUtil;
3435
import org.apache.calcite.sql.SqlWriter;
3536
import org.apache.calcite.sql.fun.SqlCase;
@@ -155,6 +156,20 @@ public SparkSqlDialect(SqlDialect.Context context) {
155156
case POSITION:
156157
SqlUtil.unparseFunctionSyntax(SqlStdOperatorTable.POSITION, writer, call, false);
157158
break;
159+
case UNNEST:
160+
if (call.getOperator() instanceof SqlUnnestOperator
161+
&& ((SqlUnnestOperator) call.getOperator()).withOrdinality) {
162+
writer.keyword("POSEXPLODE");
163+
} else {
164+
writer.keyword("EXPLODE");
165+
}
166+
final SqlWriter.Frame frame = writer.startList(SqlWriter.FrameTypeEnum.FUN_CALL, "(", ")");
167+
for (SqlNode operand : call.getOperandList()) {
168+
writer.sep(",");
169+
operand.unparse(writer, 0, 0);
170+
}
171+
writer.endList(frame);
172+
break;
158173
default:
159174
super.unparseCall(writer, call, leftPrec, rightPrec);
160175
}

core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7814,9 +7814,30 @@ private void checkLiteral2(String expression, String expected) {
78147814
final String expectedHsqldb = "SELECT *\n"
78157815
+ "FROM UNNEST((SELECT ARRAY[1, 2, 3]\n"
78167816
+ "FROM (VALUES (0)) AS t (ZERO))) AS t0 (col_0)";
7817+
final String expectedSpark = "SELECT *\n"
7818+
+ "FROM EXPLODE((SELECT ARRAY (1, 2, 3)\n"
7819+
+ "FROM (VALUES (0)) `t` (`ZERO`))) `t0` (`col_0`)";
78177820
sql(sql).ok(expected).
78187821
withPostgresql().ok(expectedPostgresql).
7819-
withHsqldb().ok(expectedHsqldb);
7822+
withHsqldb().ok(expectedHsqldb).
7823+
withSpark().ok(expectedSpark);
7824+
}
7825+
7826+
/** Test case for
7827+
* <a href="https://issues.apache.org/jira/browse/CALCITE-7246">[CALCITE-7246]
7828+
* UNNEST in spark should convert to EXPLODE/POSEXPLODE </a>.
7829+
*/
7830+
@Test void testUnnestArrayWithOrdinality() {
7831+
final String query = "SELECT * FROM UNNEST(ARRAY[1,2,3]) WITH ORDINALITY";
7832+
final String expected = "SELECT *\n"
7833+
+ "FROM UNNEST((SELECT ARRAY[1, 2, 3]\n"
7834+
+ "FROM (VALUES (0)) AS \"t\" (\"ZERO\"))) WITH ORDINALITY AS \"t0\" (\"col_0\", \"ORDINALITY\")";
7835+
final String expectedSpark = "SELECT *\n"
7836+
+ "FROM POSEXPLODE((SELECT ARRAY (1, 2, 3)\n"
7837+
+ "FROM (VALUES (0)) `t` (`ZERO`))) `t0` (`col_0`, `ORDINALITY`)";
7838+
sql(query)
7839+
.ok(expected)
7840+
.withSpark().ok(expectedSpark);
78207841
}
78217842

78227843
@Test void testWithinGroup1() {

0 commit comments

Comments
 (0)