[ https://issues.apache.org/jira/browse/BEAM-7621?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Andrew Pilloud updated BEAM-7621: --------------------------------- Fix Version/s: 2.16.0 > Selecting null row field's causes Null pointer Exception with BeamSql > --------------------------------------------------------------------- > > Key: BEAM-7621 > URL: https://issues.apache.org/jira/browse/BEAM-7621 > Project: Beam > Issue Type: Bug > Components: dsl-sql > Affects Versions: 2.14.0 > Reporter: Vishwas > Priority: Major > Fix For: 2.16.0 > > Time Spent: 3.5h > Remaining Estimate: 0h > > I have below schema of the row: > private static final Schema innerRowWithArraySchema = > Schema.builder() > .addStringField("string_field") > .addArrayField("array_field", FieldType.INT64) > .build(); > private static final Schema nullableNestedRowWithArraySchema = > Schema.builder() > > .addNullableField("field1",FieldType.row(innerRowWithArraySchema)) > .addNullableField("field2", > FieldType.array(FieldType.row(innerRowWithArraySchema))) > .build(); > > *// Create a row with null values* > Row nullRow = Row.nullRow(nullableNestedRowWithArraySchema); > > Now when we try to select nested row field's NPE is thrown: > .apply(SqlTransform.query("select PCOLLECTION.field1.string_field as > row_string_field, PCOLLECTION.field2[2].string_field as array_string_field > from PCOLLECTION")); > > Below is the exception thrown: > Caused by: java.lang.RuntimeException: CalcFn failed to evaluate: { > final org.apache.beam.sdk.values.Row current = > (org.apache.beam.sdk.values.Row) c.element(); > *final java.util.List inp1_ = > org.apache.beam.sdk.extensions.sql.impl.rel.BeamCalcRel.WrappedList.of(current.getRow(1));* > *final java.util.List inp2_ = > org.apache.beam.sdk.extensions.sql.impl.rel.BeamCalcRel.WrappedList.of(current.getArray(2));* > > c.output(org.apache.beam.sdk.values.Row.withSchema(outputSchema).addValue(inp1_ > == null ? (String) null : (String) > org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.runtime.SqlFunctions.structAccess(inp1_, > 0, > "string_field")).addValue(org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.runtime.SqlFunctions.arrayItemOptional(inp2_, > 2) == null ? (String) null : (String) > org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.runtime.SqlFunctions.structAccess(org.apache.beam.repackaged.beam_sdks_java_extensions_sql.org.apache.calcite.runtime.SqlFunctions.arrayItemOptional(inp2_, > 2), 0, "string_field")).build()); > } > at > org.apache.beam.sdk.extensions.sql.impl.rel.BeamCalcRel$CalcFn.processElement(BeamCalcRel.java:253) > Caused by: java.lang.NullPointerException > at > org.apache.beam.sdk.extensions.sql.impl.rel.BeamCalcRel$WrappedList.of(BeamCalcRel.java:459) > at SC.eval0(Unknown Source) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > In BeamCalcRel.class *field* method, null values are not handled for > composite types. > public Expression field(BlockBuilder list, int index, Type storageType) { > .... > } else if (fromType.getTypeName().isCompositeType() > || (fromType.getTypeName().isCollectionType() > && > fromType.getCollectionElementType().getTypeName().isCompositeType())) { > field = Expressions.call(WrappedList.class, "of", field); // > List.of() is passed with null values > } > ... > } > > -- This message was sent by Atlassian JIRA (v7.6.14#76016)