From ca90f163e3774ccdb170bdd2f6151acc43743223 Mon Sep 17 00:00:00 2001 From: Ayush Saxena Date: Sat, 4 Apr 2026 16:52:03 +0530 Subject: [PATCH 1/2] HIVE-29544: Fix Vectorized Parquet reading Struct columns with all fields null --- .../positive/iceberg_default_column.q.out | 2 +- .../vector/BaseVectorizedColumnReader.java | 11 +++ .../vector/VectorizedColumnReader.java | 4 + .../vector/VectorizedParquetRecordReader.java | 17 ++-- .../VectorizedPrimitiveColumnReader.java | 2 + .../vector/VectorizedStructColumnReader.java | 35 ++++++-- .../VectorizedColumnReaderTestBase.java | 15 ++-- .../parquet_struct_with_null_vectorization.q | 31 +++++++ ...rquet_struct_with_null_vectorization.q.out | 85 +++++++++++++++++++ 9 files changed, 182 insertions(+), 20 deletions(-) create mode 100644 ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q create mode 100644 ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out diff --git a/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out b/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out index e2e90caed20d..8400d21d3572 100644 --- a/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out +++ b/iceberg/iceberg-handler/src/test/results/positive/iceberg_default_column.q.out @@ -174,7 +174,7 @@ POSTHOOK: Output: hdfs://### HDFS PATH ### 3 {"x":100,"y":99} unknown 25 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general NULL 4 {"x":100,"y":99} NULL 25 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general NULL 5 {"x":100,"y":99} custom_name 30 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general NULL -6 NULL unknown 25 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general NULL +6 {"x":null,"y":null} unknown 25 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general NULL 7 NULL null NULL 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general NULL 8 NULL null NULL 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general {"name":"John","address":{"street":"Main St","city":"New York"}} 9 NULL null NULL 50000.0 true 2024-01-01 2024-01-01 10:00:00 100.00 general {"name":null,"address":{"street":null,"city":"Bangalore"}} diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/BaseVectorizedColumnReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/BaseVectorizedColumnReader.java index e6c07cea43d7..e33261ad183c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/BaseVectorizedColumnReader.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/BaseVectorizedColumnReader.java @@ -87,6 +87,9 @@ public abstract class BaseVectorizedColumnReader implements VectorizedColumnRead protected int definitionLevel; protected int repetitionLevel; + protected int[] currentDefLevels; + protected int defLevelIndex = 0; + /** * Repetition/Definition/Value readers. */ @@ -154,6 +157,9 @@ public BaseVectorizedColumnReader( protected void readRepetitionAndDefinitionLevels() { repetitionLevel = repetitionLevelColumn.nextInt(); definitionLevel = definitionLevelColumn.nextInt(); + if (currentDefLevels != null && defLevelIndex < currentDefLevels.length) { + currentDefLevels[defLevelIndex++] = definitionLevel; + } valuesRead++; } @@ -309,4 +315,9 @@ int nextInt() { return 0; } } + + @Override + public int[] getDefinitionLevels() { + return currentDefLevels; + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedColumnReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedColumnReader.java index e329d9ef3ee2..5611f5a37894 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedColumnReader.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedColumnReader.java @@ -36,4 +36,8 @@ void readBatch( int total, ColumnVector column, TypeInfo columnType) throws IOException; + + default int[] getDefinitionLevels() { + return null; + } } diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedParquetRecordReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedParquetRecordReader.java index 5c108e8e588d..fbffab44a64c 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedParquetRecordReader.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedParquetRecordReader.java @@ -459,14 +459,14 @@ private void checkEndOfRowGroup() throws IOException { columnReaders[i] = buildVectorizedParquetReader(columnTypesList.get(colsToInclude.get(i)), types.get(i), pages, requestedSchema.getColumns(), skipTimestampConversion, writerTimezone, skipProlepticConversion, - legacyConversionEnabled, 0); + legacyConversionEnabled, 0, 0); } } } else { for (int i = 0; i < types.size(); ++i) { columnReaders[i] = buildVectorizedParquetReader(columnTypesList.get(i), types.get(i), pages, requestedSchema.getColumns(), skipTimestampConversion, writerTimezone, skipProlepticConversion, - legacyConversionEnabled, 0); + legacyConversionEnabled, 0, 0); } } @@ -522,7 +522,12 @@ private VectorizedColumnReader buildVectorizedParquetReader( ZoneId writerTimezone, boolean skipProlepticConversion, boolean legacyConversionEnabled, - int depth) throws IOException { + int depth, int currentDefLevel) throws IOException { + + int typeDefLevel = currentDefLevel; + if (type.isRepetition(Type.Repetition.OPTIONAL) || type.isRepetition(Type.Repetition.REPEATED)) { + typeDefLevel++; + } List descriptors = getAllColumnDescriptorByType(depth, type, columnDescriptors); // Support for schema evolution: if the column from the current @@ -549,8 +554,8 @@ private VectorizedColumnReader buildVectorizedParquetReader( List types = type.asGroupType().getFields(); for (int i = 0; i < fieldTypes.size(); i++) { VectorizedColumnReader r = - buildVectorizedParquetReader(fieldTypes.get(i), types.get(i), pages, descriptors, - skipTimestampConversion, writerTimezone, skipProlepticConversion, legacyConversionEnabled, depth + 1); + buildVectorizedParquetReader(fieldTypes.get(i), types.get(i), pages, descriptors, skipTimestampConversion, + writerTimezone, skipProlepticConversion, legacyConversionEnabled, depth + 1, typeDefLevel); if (r != null) { fieldReaders.add(r); } else { @@ -559,7 +564,7 @@ private VectorizedColumnReader buildVectorizedParquetReader( .getTypeName() + " and Parquet type" + types.get(i).toString()); } } - return new VectorizedStructColumnReader(fieldReaders); + return new VectorizedStructColumnReader(fieldReaders, typeDefLevel); case LIST: checkListColumnSupport(((ListTypeInfo) typeInfo).getListElementTypeInfo()); if (columnDescriptors == null || columnDescriptors.isEmpty()) { diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedPrimitiveColumnReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedPrimitiveColumnReader.java index db52d6a2964b..c25475733ee4 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedPrimitiveColumnReader.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedPrimitiveColumnReader.java @@ -64,6 +64,8 @@ public void readBatch( int total, ColumnVector column, TypeInfo columnType) throws IOException { + this.currentDefLevels = new int[total]; + this.defLevelIndex = 0; int rowId = 0; while (total > 0) { // Compute the number of values we want to read in this page. diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java index 61dc7d72a222..3da289d0aa34 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java @@ -29,9 +29,11 @@ public class VectorizedStructColumnReader implements VectorizedColumnReader { private final List fieldReaders; + private final int structDefLevel; - public VectorizedStructColumnReader(List fieldReaders) { + public VectorizedStructColumnReader(List fieldReaders, int structDefLevel) { this.fieldReaders = fieldReaders; + this.structDefLevel = structDefLevel; } @Override @@ -46,14 +48,35 @@ public void readBatch( fieldReaders.get(i) .readBatch(total, vectors[i], structTypeInfo.getAllStructFieldTypeInfos().get(i)); structColumnVector.isRepeating = structColumnVector.isRepeating && vectors[i].isRepeating; + } + int[] defLevels = null; + for (VectorizedColumnReader reader : fieldReaders) { + defLevels = reader.getDefinitionLevels(); + if (defLevels != null) { + break; + } + } - for (int j = 0; j < vectors[i].isNull.length; j++) { - structColumnVector.isNull[j] = - (i == 0) ? vectors[i].isNull[j] : structColumnVector.isNull[j] && vectors[i].isNull[j]; + // Evaluate struct nullability using Parquet Definition Levels + if (defLevels != null) { + for (int j = 0; j < total; j++) { + if (defLevels[j] < structDefLevel) { + // The D-Level boundary crossed the struct. The whole struct is null. + structColumnVector.isNull[j] = true; + structColumnVector.noNulls = false; + } } - structColumnVector.noNulls = - (i == 0) ? vectors[i].noNulls : structColumnVector.noNulls && vectors[i].noNulls; } + } + @Override + public int[] getDefinitionLevels() { + for (VectorizedColumnReader reader : fieldReaders) { + int[] defLevels = reader.getDefinitionLevels(); + if (defLevels != null) { + return defLevels; + } + } + return null; } } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java b/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java index df78eb697586..d8e83317720f 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java @@ -317,14 +317,15 @@ protected static void writeData(ParquetWriter writer, boolean isDictionar g.addGroup("nsf").append("c", intVal).append("d", intVal); g.append("e", doubleVal); - Group some_null_g = group.addGroup("struct_field_some_null"); - if (i % 2 != 0) { - some_null_g.append("f", intVal); - } - if (i % 3 != 0) { - some_null_g.append("g", doubleVal); + if (i % 6 != 0) { + Group some_null_g = group.addGroup("struct_field_some_null"); + if (i % 2 != 0) { + some_null_g.append("f", intVal); + } + if (i % 3 != 0) { + some_null_g.append("g", doubleVal); + } } - Group mapGroup = group.addGroup("map_field"); if (i % 13 != 1) { mapGroup.addGroup("map").append("key", binary).append("value", "abc"); diff --git a/ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q b/ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q new file mode 100644 index 000000000000..3f677b7b918c --- /dev/null +++ b/ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q @@ -0,0 +1,31 @@ +SET hive.vectorized.execution.enabled=true; +set hive.vectorized.execution.reduce.enabled=true; +SET hive.fetch.task.conversion=none; + +CREATE TABLE test_parquet_struct_nulls ( + id INT, + st_prim STRUCT +) STORED AS PARQUET; + +INSERT INTO test_parquet_struct_nulls VALUES + (1, named_struct('x', CAST(NULL AS INT), 'y', CAST(NULL AS INT))), + (2, if(1=0, named_struct('x', 1, 'y', 1), null)), + (3, named_struct('x', 3, 'y', CAST(NULL AS INT))), + (4, named_struct('x', 4, 'y', 4)); + +-- Test A: Full table scan to check JSON representation +SELECT * FROM test_parquet_struct_nulls ORDER BY id; + +-- Test B: Verify IS NULL evaluates correctly +SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NULL; + +-- Test C: Verify IS NOT NULL evaluates correctly +SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL ORDER BY id; + +-- Test D: Verify field-level null evaluation inside a valid struct +SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL AND st_prim.x IS NULL; + +-- Validate withou vectorization +SET hive.vectorized.execution.enabled=true; +SET hive.vectorized.execution.reduce.enabled=false; +SELECT * FROM test_parquet_struct_nulls ORDER BY id; \ No newline at end of file diff --git a/ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out b/ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out new file mode 100644 index 000000000000..1f22d52546a1 --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out @@ -0,0 +1,85 @@ +PREHOOK: query: CREATE TABLE test_parquet_struct_nulls ( + id INT, + st_prim STRUCT +) STORED AS PARQUET +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@test_parquet_struct_nulls +POSTHOOK: query: CREATE TABLE test_parquet_struct_nulls ( + id INT, + st_prim STRUCT +) STORED AS PARQUET +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@test_parquet_struct_nulls +PREHOOK: query: INSERT INTO test_parquet_struct_nulls VALUES + (1, named_struct('x', CAST(NULL AS INT), 'y', CAST(NULL AS INT))), + (2, if(1=0, named_struct('x', 1, 'y', 1), null)), + (3, named_struct('x', 3, 'y', CAST(NULL AS INT))), + (4, named_struct('x', 4, 'y', 4)) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@test_parquet_struct_nulls +POSTHOOK: query: INSERT INTO test_parquet_struct_nulls VALUES + (1, named_struct('x', CAST(NULL AS INT), 'y', CAST(NULL AS INT))), + (2, if(1=0, named_struct('x', 1, 'y', 1), null)), + (3, named_struct('x', 3, 'y', CAST(NULL AS INT))), + (4, named_struct('x', 4, 'y', 4)) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@test_parquet_struct_nulls +POSTHOOK: Lineage: test_parquet_struct_nulls.id SCRIPT [] +POSTHOOK: Lineage: test_parquet_struct_nulls.st_prim SCRIPT [] +PREHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +PREHOOK: type: QUERY +PREHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +1 {"x":null,"y":null} +2 NULL +3 {"x":3,"y":null} +4 {"x":4,"y":4} +PREHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NULL +PREHOOK: type: QUERY +PREHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +POSTHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NULL +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +2 +PREHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL ORDER BY id +PREHOOK: type: QUERY +PREHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +POSTHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL ORDER BY id +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +1 +3 +4 +PREHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL AND st_prim.x IS NULL +PREHOOK: type: QUERY +PREHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +POSTHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL AND st_prim.x IS NULL +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +1 +PREHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +PREHOOK: type: QUERY +PREHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +POSTHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test_parquet_struct_nulls +#### A masked pattern was here #### +1 {"x":null,"y":null} +2 NULL +3 {"x":3,"y":null} +4 {"x":4,"y":4} From fe1726ef827d3bdbbe127daed706ce82e5321eee Mon Sep 17 00:00:00 2001 From: Ayush Saxena Date: Wed, 8 Apr 2026 23:03:17 +0530 Subject: [PATCH 2/2] Review Comments --- .../parquet/vector/VectorizedStructColumnReader.java | 10 ++-------- .../io/parquet/VectorizedColumnReaderTestBase.java | 2 +- .../parquet_struct_with_null_vectorization.q | 10 +++++----- .../parquet_struct_with_null_vectorization.q.out | 12 ++++++------ 4 files changed, 14 insertions(+), 20 deletions(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java index 3da289d0aa34..3440af1ca978 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/io/parquet/vector/VectorizedStructColumnReader.java @@ -49,19 +49,13 @@ public void readBatch( .readBatch(total, vectors[i], structTypeInfo.getAllStructFieldTypeInfos().get(i)); structColumnVector.isRepeating = structColumnVector.isRepeating && vectors[i].isRepeating; } - int[] defLevels = null; - for (VectorizedColumnReader reader : fieldReaders) { - defLevels = reader.getDefinitionLevels(); - if (defLevels != null) { - break; - } - } + int[] defLevels = getDefinitionLevels(); // Evaluate struct nullability using Parquet Definition Levels if (defLevels != null) { for (int j = 0; j < total; j++) { if (defLevels[j] < structDefLevel) { - // The D-Level boundary crossed the struct. The whole struct is null. + // The Definition Level boundary crossed the struct. The whole struct is null. structColumnVector.isNull[j] = true; structColumnVector.noNulls = false; } diff --git a/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java b/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java index d8e83317720f..dcf7571aa1d4 100644 --- a/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java +++ b/ql/src/test/org/apache/hadoop/hive/ql/io/parquet/VectorizedColumnReaderTestBase.java @@ -317,7 +317,7 @@ protected static void writeData(ParquetWriter writer, boolean isDictionar g.addGroup("nsf").append("c", intVal).append("d", intVal); g.append("e", doubleVal); - if (i % 6 != 0) { + if (i % 2 != 0 || i % 3 != 0) { Group some_null_g = group.addGroup("struct_field_some_null"); if (i % 2 != 0) { some_null_g.append("f", intVal); diff --git a/ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q b/ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q index 3f677b7b918c..c4f7c53d301a 100644 --- a/ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q +++ b/ql/src/test/queries/clientpositive/parquet_struct_with_null_vectorization.q @@ -1,3 +1,4 @@ +-- SORT_QUERY_RESULTS SET hive.vectorized.execution.enabled=true; set hive.vectorized.execution.reduce.enabled=true; SET hive.fetch.task.conversion=none; @@ -14,18 +15,17 @@ INSERT INTO test_parquet_struct_nulls VALUES (4, named_struct('x', 4, 'y', 4)); -- Test A: Full table scan to check JSON representation -SELECT * FROM test_parquet_struct_nulls ORDER BY id; +SELECT * FROM test_parquet_struct_nulls; -- Test B: Verify IS NULL evaluates correctly SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NULL; -- Test C: Verify IS NOT NULL evaluates correctly -SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL ORDER BY id; +SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL; -- Test D: Verify field-level null evaluation inside a valid struct SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL AND st_prim.x IS NULL; --- Validate withou vectorization +-- Validate without vectorization SET hive.vectorized.execution.enabled=true; -SET hive.vectorized.execution.reduce.enabled=false; -SELECT * FROM test_parquet_struct_nulls ORDER BY id; \ No newline at end of file +SELECT * FROM test_parquet_struct_nulls; \ No newline at end of file diff --git a/ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out b/ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out index 1f22d52546a1..25604cfe5f36 100644 --- a/ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out +++ b/ql/src/test/results/clientpositive/llap/parquet_struct_with_null_vectorization.q.out @@ -30,11 +30,11 @@ POSTHOOK: Input: _dummy_database@_dummy_table POSTHOOK: Output: default@test_parquet_struct_nulls POSTHOOK: Lineage: test_parquet_struct_nulls.id SCRIPT [] POSTHOOK: Lineage: test_parquet_struct_nulls.st_prim SCRIPT [] -PREHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +PREHOOK: query: SELECT * FROM test_parquet_struct_nulls PREHOOK: type: QUERY PREHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here #### -POSTHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +POSTHOOK: query: SELECT * FROM test_parquet_struct_nulls POSTHOOK: type: QUERY POSTHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here #### @@ -51,11 +51,11 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here #### 2 -PREHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL ORDER BY id +PREHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL PREHOOK: type: QUERY PREHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here #### -POSTHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL ORDER BY id +POSTHOOK: query: SELECT id FROM test_parquet_struct_nulls WHERE st_prim IS NOT NULL POSTHOOK: type: QUERY POSTHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here #### @@ -71,11 +71,11 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here #### 1 -PREHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +PREHOOK: query: SELECT * FROM test_parquet_struct_nulls PREHOOK: type: QUERY PREHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here #### -POSTHOOK: query: SELECT * FROM test_parquet_struct_nulls ORDER BY id +POSTHOOK: query: SELECT * FROM test_parquet_struct_nulls POSTHOOK: type: QUERY POSTHOOK: Input: default@test_parquet_struct_nulls #### A masked pattern was here ####