From a814e33694bf081db859b6fd6ff21e4fc49ce1df Mon Sep 17 00:00:00 2001 From: Uwe Maurer Date: Thu, 23 Oct 2025 16:10:43 +0200 Subject: [PATCH 1/2] support protobuf library version 4 The getSyntax method on messageDescriptor.getFile() got removed in protobuf version 4. This change gets the syntax information directly from the proto, this works in protobuf v3 and v4. fixes https://github.com/apache/parquet-java/issues/3175 see also https://github.com/apache/parquet-java/pull/3182 --- .../org/apache/parquet/proto/ProtoWriteSupport.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java b/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java index 637f6fda91..c51a9c4fab 100644 --- a/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java +++ b/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java @@ -445,10 +445,14 @@ final void writeField(Object value) { private void writeAllFields(MessageOrBuilder pb) { Descriptor messageDescriptor = pb.getDescriptorForType(); - Descriptors.FileDescriptor.Syntax syntax = - messageDescriptor.getFile().getSyntax(); + String syntax = + messageDescriptor.getFile().toProto().getSyntax(); + if ("editions".equals(syntax)) { + throw new UnsupportedOperationException("protocol buffers 'editions' not supported"); + } + boolean isProto2 = !"proto3".equals(syntax); - if (Descriptors.FileDescriptor.Syntax.PROTO2.equals(syntax)) { + if (isProto2) { // Returns changed fields with values. Map is ordered by id. Map changedPbFields = pb.getAllFields(); @@ -464,7 +468,7 @@ private void writeAllFields(MessageOrBuilder pb) { int fieldIndex = fieldDescriptor.getIndex(); fieldWriters[fieldIndex].writeField(entry.getValue()); } - } else if (Descriptors.FileDescriptor.Syntax.PROTO3.equals(syntax)) { + } else { List fieldDescriptors = messageDescriptor.getFields(); for (FieldDescriptor fieldDescriptor : fieldDescriptors) { FieldDescriptor.Type type = fieldDescriptor.getType(); From c4bcbdd9302e7506b2087f3aa0e9cc8c49463ff5 Mon Sep 17 00:00:00 2001 From: Uwe Maurer Date: Thu, 23 Oct 2025 23:57:31 +0200 Subject: [PATCH 2/2] fix formatting --- .../java/org/apache/parquet/proto/ProtoWriteSupport.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java b/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java index c51a9c4fab..389e842849 100644 --- a/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java +++ b/parquet-protobuf/src/main/java/org/apache/parquet/proto/ProtoWriteSupport.java @@ -445,10 +445,9 @@ final void writeField(Object value) { private void writeAllFields(MessageOrBuilder pb) { Descriptor messageDescriptor = pb.getDescriptorForType(); - String syntax = - messageDescriptor.getFile().toProto().getSyntax(); + String syntax = messageDescriptor.getFile().toProto().getSyntax(); if ("editions".equals(syntax)) { - throw new UnsupportedOperationException("protocol buffers 'editions' not supported"); + throw new UnsupportedOperationException("protocol buffers 'editions' not supported"); } boolean isProto2 = !"proto3".equals(syntax);