[ https://issues.apache.org/jira/browse/FLINK-21584?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17924913#comment-17924913 ]
Gustavo de Morais commented on FLINK-21584: ------------------------------------------- Reading the logs reported by [~nkruber], the issue for the example query is something else. LEFT JOINS require a condition (ON ...) which was missing in the query and thus the error reported. This is expected and correct (y) > Support UNNEST in LEFT JOINs > ---------------------------- > > Key: FLINK-21584 > URL: https://issues.apache.org/jira/browse/FLINK-21584 > Project: Flink > Issue Type: New Feature > Components: Table SQL / API > Affects Versions: 1.12.1 > Reporter: Nico Kruber > Priority: Not a Priority > Labels: auto-deprioritized-major, auto-deprioritized-minor > > Currently, UNNEST (for arrays and maps) is only supported in CROSS JOIN > operations, but you may actually also want this in a LEFT JOIN fashion in > which case you would get {{NULL}} values for the expanded fields. > h1. Example > {code:sql} > CREATE TEMPORARY VIEW input ( f1, f2 ) > AS VALUES ('A', STR_TO_MAP('')), ('B', STR_TO_MAP('1, 2')); > SELECT * FROM input LEFT JOIN UNNEST(f2); > {code} > This currently results in the following exception: > {code} > org.apache.flink.table.api.ValidationException: SQL validation failed. From > line 1, column 26 to line 1, column 29: INNER, LEFT, RIGHT or FULL join > requires a condition (NATURAL keyword or ON or USING clause) > at > org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:152) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.calcite.FlinkPlannerImpl.validate(FlinkPlannerImpl.scala:111) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:189) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.delegation.ParserImpl.parse(ParserImpl.java:77) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.LocalExecutor$1.lambda$parse$0(LocalExecutor.java:336) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.ExecutionContext.wrapClassLoader(ExecutionContext.java:256) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.LocalExecutor$1.parse(LocalExecutor.java:336) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.cli.SqlCommandParser.parseBySqlParser(SqlCommandParser.java:99) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > ... 6 more > Caused by: org.apache.calcite.runtime.CalciteContextException: From line 1, > column 26 to line 1, column 29: INNER, LEFT, RIGHT or FULL join requires a > condition (NATURAL keyword or ON or USING clause) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > Method) ~[?:1.8.0_282] > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) > ~[?:1.8.0_282] > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > ~[?:1.8.0_282] > at java.lang.reflect.Constructor.newInstance(Constructor.java:423) > ~[?:1.8.0_282] > at > org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:467) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:883) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:868) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:5043) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateJoin(SqlValidatorImpl.java:3333) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.calcite.FlinkCalciteSqlValidator.validateJoin(FlinkCalciteSqlValidator.java:100) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3196) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3461) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1067) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1041) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:232) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1016) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:724) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:147) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.calcite.FlinkPlannerImpl.validate(FlinkPlannerImpl.scala:111) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:189) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.delegation.ParserImpl.parse(ParserImpl.java:77) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.LocalExecutor$1.lambda$parse$0(LocalExecutor.java:336) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.ExecutionContext.wrapClassLoader(ExecutionContext.java:256) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.LocalExecutor$1.parse(LocalExecutor.java:336) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.cli.SqlCommandParser.parseBySqlParser(SqlCommandParser.java:99) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > ... 6 more > Caused by: org.apache.calcite.sql.validate.SqlValidatorException: INNER, > LEFT, RIGHT or FULL join requires a condition (NATURAL keyword or ON or USING > clause) > at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native > Method) ~[?:1.8.0_282] > at > sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) > ~[?:1.8.0_282] > at > sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) > ~[?:1.8.0_282] > at java.lang.reflect.Constructor.newInstance(Constructor.java:423) > ~[?:1.8.0_282] > at > org.apache.calcite.runtime.Resources$ExInstWithCause.ex(Resources.java:467) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at org.apache.calcite.runtime.Resources$ExInst.ex(Resources.java:560) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:883) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at org.apache.calcite.sql.SqlUtil.newContextException(SqlUtil.java:868) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.newValidationError(SqlValidatorImpl.java:5043) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateJoin(SqlValidatorImpl.java:3333) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.calcite.FlinkCalciteSqlValidator.validateJoin(FlinkCalciteSqlValidator.java:100) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateFrom(SqlValidatorImpl.java:3196) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateSelect(SqlValidatorImpl.java:3461) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SelectNamespace.validateImpl(SelectNamespace.java:60) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.AbstractNamespace.validate(AbstractNamespace.java:84) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateNamespace(SqlValidatorImpl.java:1067) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateQuery(SqlValidatorImpl.java:1041) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at org.apache.calcite.sql.SqlSelect.validate(SqlSelect.java:232) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validateScopedExpression(SqlValidatorImpl.java:1016) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.calcite.sql.validate.SqlValidatorImpl.validate(SqlValidatorImpl.java:724) > ~[flink-table_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.calcite.FlinkPlannerImpl.org$apache$flink$table$planner$calcite$FlinkPlannerImpl$$validate(FlinkPlannerImpl.scala:147) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.calcite.FlinkPlannerImpl.validate(FlinkPlannerImpl.scala:111) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.operations.SqlToOperationConverter.convert(SqlToOperationConverter.java:189) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.planner.delegation.ParserImpl.parse(ParserImpl.java:77) > ~[flink-table-blink_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.LocalExecutor$1.lambda$parse$0(LocalExecutor.java:336) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.ExecutionContext.wrapClassLoader(ExecutionContext.java:256) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.gateway.local.LocalExecutor$1.parse(LocalExecutor.java:336) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > at > org.apache.flink.table.client.cli.SqlCommandParser.parseBySqlParser(SqlCommandParser.java:99) > ~[flink-sql-client_2.12-1.12.1.jar:1.12.1] > ... 6 more > {code} > h1. Current workaround > {code:sql} > CREATE TEMPORARY VIEW input ( f1, f2 ) > AS VALUES ('A', STR_TO_MAP('')), ('B', STR_TO_MAP('1, 2')); > SELECT * FROM input CROSS JOIN UNNEST(f2) > UNION ALL SELECT *, NULLIF('1', '1') AS `KEY`, NULLIF('1', '1') as `VALUE` > FROM input WHERE f2 IS NULL OR CARDINALITY(f2) = 0; > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010)