lawofcycles opened a new issue, #1300:
URL: https://github.com/apache/arrow-java/issues/1300

   ### Describe the bug, including details regarding any error messages, 
version, and platform.
   
   `Format.asString` builds the parameterised format strings with 
`String.format("+w:%d", ...)` and no explicit `Locale`. `java.util.Formatter` 
localises the digits of `%d` with `Locale.getDefault(Locale.Category.FORMAT)`, 
so on a JVM whose default locale uses digits outside ASCII (`ar-EG`, `fa-IR`, 
`bn-BD`, `mr-IN`, 98 of the 1069 locales available on JDK 21) a 
`FixedSizeList(8)` is exported as `+w:٨` instead of `+w:8`. The same applies to 
`FixedSizeBinary` and `Decimal`.
   
   Affected calls:
   
   * 
https://github.com/apache/arrow-java/blob/v19.0.0/c/src/main/java/org/apache/arrow/c/Format.java#L66
   * 
https://github.com/apache/arrow-java/blob/v19.0.0/c/src/main/java/org/apache/arrow/c/Format.java#L68-L69
   * 
https://github.com/apache/arrow-java/blob/v19.0.0/c/src/main/java/org/apache/arrow/c/Format.java#L91
   * 
https://github.com/apache/arrow-java/blob/v19.0.0/c/src/main/java/org/apache/arrow/c/Format.java#L96
   
   Other implementations parse the parameter as an ASCII integer and reject the 
string. arrow-rs fails at 
https://github.com/apache/arrow-rs/blob/58.0.0/arrow-schema/src/ffi.rs#L494-L503
 with `C Data interface error: The FixedSizeList type requires an integer 
parameter representing number of elements per list`. The Java importer reads 
the parameter with `Integer.parseInt` 
(https://github.com/apache/arrow-java/blob/v19.0.0/c/src/main/java/org/apache/arrow/c/Format.java#L352-L354),
 which accepts Unicode digits, so a Java to Java round trip does not expose the 
problem.
   
   Reproduction (arrow-java 19.0.0 and 18.1.0, Temurin 21.0.6, run with 
`--add-opens=java.base/java.nio=ALL-UNNAMED`):
   
   ```java
   import java.nio.charset.StandardCharsets;
   import java.util.HexFormat;
   import java.util.List;
   import java.util.Locale;
   import org.apache.arrow.c.ArrowSchema;
   import org.apache.arrow.c.Data;
   import org.apache.arrow.c.NativeUtil;
   import org.apache.arrow.memory.BufferAllocator;
   import org.apache.arrow.memory.RootAllocator;
   import org.apache.arrow.vector.types.FloatingPointPrecision;
   import org.apache.arrow.vector.types.pojo.ArrowType;
   import org.apache.arrow.vector.types.pojo.Field;
   import org.apache.arrow.vector.types.pojo.FieldType;
   
   public class FormatLocale {
     public static void main(String[] args) {
       Locale.setDefault(Locale.forLanguageTag("ar-EG"));
       Field item = new Field("item",
           FieldType.nullable(new 
ArrowType.FloatingPoint(FloatingPointPrecision.SINGLE)), null);
       Field vec = new Field("vec", FieldType.nullable(new 
ArrowType.FixedSizeList(8)), List.of(item));
       try (BufferAllocator allocator = new RootAllocator()) {
         ArrowSchema schema = ArrowSchema.allocateNew(allocator);
         Data.exportField(allocator, vec, null, schema);
         String format = NativeUtil.toJavaString(schema.snapshot().format);
         System.out.println(format + "  "
             + HexFormat.ofDelimiter(" 
").formatHex(format.getBytes(StandardCharsets.UTF_8)));
         System.out.println("Java import: " + Data.importField(allocator, 
schema, null).getType());
       }
     }
   }
   ```
   
   ```
   +w:٨  2b 77 3a d9 a8
   Java import: FixedSizeList(8)
   ```
   
   With `Locale.US` the first line is `+w:8  2b 77 3a 38`.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to