tnakama created CALCITE-7546:
--------------------------------
Summary: NullPointerException in SqlToRelConverter for
UNNEST(array) AS alias under conformance with allowAliasUnnestItems=true
Key: CALCITE-7546
URL: https://issues.apache.org/jira/browse/CALCITE-7546
Project: Calcite
Issue Type: Bug
Components: core
Affects Versions: 1.40.0
Environment: - Calcite: 1.40.0
- JDK: Temurin 25+36-LTS
- OS: macOS (darwin 23.3.0)
- JUnit: 5
Reporter: tnakama
When SqlConformance#allowAliasUnnestItems() returns true (in stock Calcite
this is only SqlConformanceEnum.PRESTO; user-defined conformances overriding
this flag
are also affected), a query of the form
SELECT t FROM UNNEST(ARRAY[1, 2, 3]) AS t
throws NullPointerException: fieldNames during SQL-to-Rel conversion.
Root cause
In SqlToRelConverter#convertFrom, the AS branch with operandCount() == 2
(table alias only, no column list) delegates to convertUnnest with fieldNames
== null.
The allowAliasUnnestItems branch of convertUnnest then calls
Objects.requireNonNull(fieldNames, "fieldNames") and throws.
The bug is latent under the default conformance because
allowAliasUnnestItems() is false there, so the offending branch is never
entered. Adding an explicit
column list (AS t(x)) also avoids the NPE because convertFrom then routes
through the operandCount() == 3 branch that populates fieldNames.
Reproducer
---
package jp.co.plaid.mila.processing.sql.convert;
import org.junit.jupiter.api.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
class CalciteUnnestAliasNpeReproducerTest {
@Test
void unnestWithTableAliasOnly_throwsNpe_underPrestoConformance() throws
SQLException {
Properties info = new Properties();
info.setProperty("conformance", "PRESTO");
Connection conn = DriverManager.getConnection("jdbc:calcite:", info);
Statement stmt = conn.createStatement();
stmt.executeQuery("SELECT t FROM UNNEST(ARRAY[1, 2, 3]) AS t");
}
}
---
Expected behavior
UNNEST(array) AS alias under a conformance with allowAliasUnnestItems() ==
true should either:
- be treated as AS alias(alias) (single-column alias, matching common
BigQuery/Presto-like semantics), or
- produce a clear validation error rather than an internal NPE.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)