You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by ze...@apache.org on 2026/08/05 17:35:46 UTC

(arrow-go) branch main updated: fix(parquet/metadata): return schema initialization errors (#1056)

This is an automated email from the ASF dual-hosted git repository.

zeroshade pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-go.git


The following commit(s) were added to refs/heads/main by this push:
     new 52432460 fix(parquet/metadata): return schema initialization errors (#1056)
52432460 is described below

commit 52432460eac86ccc5ed5cd87b31691a661f37485
Author: Minh Vu <vu...@gmail.com>
AuthorDate: Wed Aug 5 19:35:42 2026 +0200

    fix(parquet/metadata): return schema initialization errors (#1056)
    
    ### Rationale for this change
    
    `NewFileMetaData` discarded the error from `initSchema` and immediately
    initialized column orders. When malformed metadata could not produce a
    schema, this could dereference the unset schema and panic.
    
    ### What changes are included in this PR?
    
    Return the schema initialization error before touching column orders.
    
    ### Are these changes tested?
    
    Yes. A regression test serializes invalid schema metadata and verifies
    an error with no result.
    
    `go test ./parquet/metadata -run TestNewFileMetaDataReturnsSchemaErrors`
    
    ### Are there any user-facing changes?
    
    Malformed metadata now returns its schema error instead of potentially
    panicking.
---
 parquet/metadata/file.go               |  4 +++-
 parquet/metadata/file_internal_test.go | 38 ++++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/parquet/metadata/file.go b/parquet/metadata/file.go
index 95a00571..2d4cf1b4 100644
--- a/parquet/metadata/file.go
+++ b/parquet/metadata/file.go
@@ -320,7 +320,9 @@ func NewFileMetaData(data []byte, fileDecryptor encryption.FileDecryptor) (*File
 		FileDecryptor: fileDecryptor,
 	}
 
-	f.initSchema()
+	if err := f.initSchema(); err != nil {
+		return nil, err
+	}
 	f.initColumnOrders()
 
 	return f, nil
diff --git a/parquet/metadata/file_internal_test.go b/parquet/metadata/file_internal_test.go
new file mode 100644
index 00000000..1b4c2790
--- /dev/null
+++ b/parquet/metadata/file_internal_test.go
@@ -0,0 +1,38 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+package metadata
+
+import (
+	"bytes"
+	"testing"
+
+	format "github.com/apache/arrow-go/v18/parquet/internal/gen-go/parquet"
+	"github.com/apache/arrow-go/v18/parquet/internal/thrift"
+	"github.com/stretchr/testify/require"
+)
+
+func TestNewFileMetaDataReturnsSchemaErrors(t *testing.T) {
+	fileMeta := format.NewFileMetaData()
+	var buf bytes.Buffer
+	_, err := thrift.NewThriftSerializer().Serialize(fileMeta, &buf, nil)
+	require.NoError(t, err)
+
+	meta, err := NewFileMetaData(buf.Bytes(), nil)
+	require.Error(t, err)
+	require.Nil(t, meta)
+}