Skip to content

Commit 2a56c2b

Browse files
committed
Avoid mutating the value of byte buffer literal
1 parent 0b4ef10 commit 2a56c2b

2 files changed

Lines changed: 14 additions & 7 deletions

File tree

api/src/main/java/org/apache/iceberg/expressions/UnboundPredicate.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -291,9 +291,9 @@ public String toString() {
291291
case ST_INTERSECTS:
292292
case ST_DISJOINT:
293293
{
294-
ByteBuffer serializedBoundingBox = (ByteBuffer) literal().value();
295-
serializedBoundingBox.order(ByteOrder.LITTLE_ENDIAN);
296-
BoundingBox boundingBox = BoundingBox.fromByteBuffer(serializedBoundingBox);
294+
BoundingBox boundingBox =
295+
BoundingBox.fromByteBuffer(
296+
((ByteBuffer) literal().value()).duplicate().order(ByteOrder.LITTLE_ENDIAN));
297297
String functionName = op().name().toLowerCase(Locale.ROOT);
298298
return functionName + "(" + term() + ", " + boundingBox + ")";
299299
}

core/src/main/java/org/apache/iceberg/expressions/ExpressionParser.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import java.io.UncheckedIOException;
2626
import java.math.BigDecimal;
2727
import java.nio.ByteBuffer;
28+
import java.nio.ByteOrder;
2829
import java.util.Locale;
2930
import java.util.UUID;
3031
import java.util.function.Function;
@@ -163,8 +164,11 @@ public <T> Void predicate(BoundPredicate<T> pred) {
163164
if (pred.isLiteralPredicate()) {
164165
gen.writeFieldName(VALUE);
165166
if (pred.op() == Operation.ST_INTERSECTS || pred.op() == Operation.ST_DISJOINT) {
166-
ByteBuffer value = (ByteBuffer) pred.asLiteralPredicate().literal().value();
167-
geospatialBoundingBox(BoundingBox.fromByteBuffer(value));
167+
geospatialBoundingBox(
168+
BoundingBox.fromByteBuffer(
169+
((ByteBuffer) pred.asLiteralPredicate().literal().value())
170+
.duplicate()
171+
.order(ByteOrder.LITTLE_ENDIAN)));
168172
} else {
169173
SingleValueParser.toJson(
170174
pred.term().type(), pred.asLiteralPredicate().literal().value(), gen);
@@ -203,8 +207,11 @@ public <T> Void predicate(UnboundPredicate<T> pred) {
203207
} else if (pred.op() == Expression.Operation.ST_INTERSECTS
204208
|| pred.op() == Expression.Operation.ST_DISJOINT) {
205209
gen.writeFieldName(VALUE);
206-
ByteBuffer value = (ByteBuffer) pred.literal().value();
207-
geospatialBoundingBox(BoundingBox.fromByteBuffer(value));
210+
geospatialBoundingBox(
211+
BoundingBox.fromByteBuffer(
212+
((ByteBuffer) pred.literal().value())
213+
.duplicate()
214+
.order(ByteOrder.LITTLE_ENDIAN)));
208215
} else {
209216
gen.writeFieldName(VALUE);
210217
unboundLiteral(pred.literal().value());

0 commit comments

Comments
 (0)