RussellSpitzer opened a new issue, #6685:
URL: https://github.com/apache/iceberg/issues/6685

   ### Apache Iceberg version
   
   None
   
   ### Query engine
   
   None
   
   ### Please describe the bug 🐞
   
   Fanout writer, and several other pieces of code. Use StructCopy to copy 
partition data. The implementation accidentally copies Array references for 
Fixed data types which will lead to errors when containers are re-used and a 
Fixed type column is in use.
   
   Discovered while reviewing #6680 
   
   The underlying issue PartitionData should be copied like
   
   ```java
             case FIXED:
               byte[] buffer = (byte[]) data[i];
               copy[i] = Arrays.copyOf(buffer, buffer.length);
               break;
    ```
   but instead the StructCopy code always does this
   ```java
         if (value instanceof StructLike) {
           values[i] = copy((StructLike) value);
         } else {
           values[i] = value;
         }
   ```
   
   Here is a reproduction
   
   ```java
       public void testCopyFixed() {
           Types.StructType fixed = 
Types.StructType.of(Types.NestedField.required(0, "fix", 
Types.FixedType.ofLength(4)));
           byte[] originalBytes = "2468".getBytes();
           PartitionData p = new PartitionData(fixed);
           p.set(0, originalBytes);
   
           PartitionData pdCopy = p.copy();
           StructLike sLcopy = StructCopy.copy(p);
           Assert.assertArrayEquals(
                   pdCopy.get(0, ByteBuffer.class).array(),
                   sLcopy.get(0, ByteBuffer.class).array());
   
           originalBytes[0] = '8';
   
           Assert.assertArrayEquals(
                   pdCopy.get(0, ByteBuffer.class).array(),
                   "2468".getBytes()
           );
   
           // Fails because the sLCopy incorrectly refers to the originalBytes 
object which was modified.
           Assert.assertArrayEquals(
                           pdCopy.get(0, ByteBuffer.class).array(),
                           sLcopy.get(0, ByteBuffer.class).array());
       }
   
   ```
         
   


-- 
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: issues-unsubscr...@iceberg.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: issues-unsubscr...@iceberg.apache.org
For additional commands, e-mail: issues-h...@iceberg.apache.org

Reply via email to