@@ -178,22 +178,18 @@ public void testAvroKeyPayloadSchemaPrimitiveKey() {
178178
179179 @ Test
180180 public void convertsNestedArray () {
181- // Create a RelDataType with an array of structs
182- RelDataTypeFactory typeFactory = new SqlTypeFactoryImpl (RelDataTypeSystem .DEFAULT );
183-
184- // Create a struct type for array elements
185- RelDataTypeFactory .Builder elementBuilder = new RelDataTypeFactory .Builder (typeFactory );
186- elementBuilder .add ("field1" , typeFactory .createSqlType (SqlTypeName .VARCHAR ));
187- elementBuilder .add ("field2" , typeFactory .createSqlType (SqlTypeName .INTEGER ));
188- RelDataType structType = elementBuilder .build ();
189-
190- // Create array of structs type
191- RelDataType arrayOfStructsType = typeFactory .createArrayType (structType , -1 );
192-
193- // Test with a struct containing an array of structs field
194- RelDataTypeFactory .Builder containerBuilder = new RelDataTypeFactory .Builder (typeFactory );
195- containerBuilder .add ("arrayOfStructsField" , arrayOfStructsType );
196- RelDataType containerType = containerBuilder .build ();
181+ String schemaString =
182+ "{\" type\" :\" record\" ,\" name\" :\" record\" ,\" namespace\" :\" ns\" ,\" fields\" :["
183+ + "{\" name\" :\" arrayOfStructsField\" ,\" type\" :{\" type\" :\" array\" ,\" items\" :{\" type\" :\" record\" ,\" name\" :\" record_event1\" ,\" fields\" :["
184+ + "{\" name\" :\" field1\" ,\" type\" :\" string\" },{\" name\" :\" field2\" ,\" type\" :\" int\" }]}}}]}" ;
185+ Schema avroSchema = (new Schema .Parser ()).parse (schemaString );
186+ RelDataType containerType = AvroConverter .rel (avroSchema ); // Ensure parsing works
187+ // Calcite does not support inner array fields as NOT NULL.
188+ assertEquals (1 , containerType .getFieldList ().size ());
189+ assertFalse (containerType .getFieldList ().get (0 ).getType ().isNullable ());
190+ assertEquals (2 , containerType .getFieldList ().get (0 ).getType ().getComponentType ().getFieldList ().size ());
191+ assertTrue (containerType .getFieldList ().get (0 ).getType ().getComponentType ().getFieldList ().get (0 ).getType ().isNullable ());
192+ assertEquals ("RecordType(RecordType(VARCHAR field1, INTEGER field2) ARRAY arrayOfStructsField) NOT NULL" , containerType .getFullTypeString ());
197193
198194 Schema containerSchema = AvroConverter .avro ("test" , "Record" , containerType );
199195 assertNotNull (containerSchema );
@@ -204,10 +200,21 @@ public void convertsNestedArray() {
204200 assertEquals (Schema .Type .ARRAY , arrayFieldSchema .getType ());
205201
206202 Schema structElementSchema = arrayFieldSchema .getElementType ();
207- assertEquals (Schema .Type .RECORD , structElementSchema .getType ());
208- assertEquals (2 , structElementSchema .getFields ().size ());
209- assertEquals ("field1" , structElementSchema .getFields ().get (0 ).name ());
210- assertEquals ("field2" , structElementSchema .getFields ().get (1 ).name ());
203+ assertEquals (Schema .Type .UNION , structElementSchema .getType ());
204+ assertEquals (2 , structElementSchema .getTypes ().size ());
205+ assertEquals (Schema .Type .NULL , structElementSchema .getTypes ().get (0 ).getType ());
206+ assertEquals (Schema .Type .RECORD , structElementSchema .getTypes ().get (1 ).getType ());
207+
208+ Schema innerRecord = structElementSchema .getTypes ().get (1 );
209+ assertEquals (2 , innerRecord .getFields ().size ());
210+ assertEquals ("field1" , innerRecord .getFields ().get (0 ).name ());
211+ assertEquals ("field2" , innerRecord .getFields ().get (1 ).name ());
212+ assertEquals (2 , innerRecord .getFields ().size ());
213+
214+ Schema innermostField = innerRecord .getFields ().get (0 ).schema ();
215+ assertEquals (2 , innermostField .getTypes ().size ());
216+ assertEquals (Schema .Type .NULL , innermostField .getTypes ().get (0 ).getType ());
217+ assertEquals (Schema .Type .STRING , innermostField .getTypes ().get (1 ).getType ());
211218 }
212219
213220 @ Test
0 commit comments