From 163c6ac6be11d786ee54e9645af3e27ad6b07878 Mon Sep 17 00:00:00 2001 From: Mikita Hradovich Date: Thu, 6 Nov 2025 19:56:05 +0100 Subject: [PATCH] [java-driver#755] Handling empty `resultMetadataId` in `Execute` message. --- .../com/datastax/driver/core/Requests.java | 16 +++-- .../datastax/driver/core/RequestsTest.java | 65 +++++++++++++++++++ 2 files changed, 77 insertions(+), 4 deletions(-) create mode 100644 driver-core/src/test/java/com/datastax/driver/core/RequestsTest.java diff --git a/driver-core/src/main/java/com/datastax/driver/core/Requests.java b/driver-core/src/main/java/com/datastax/driver/core/Requests.java index fb27c7ac079..2084cb9d569 100644 --- a/driver-core/src/main/java/com/datastax/driver/core/Requests.java +++ b/driver-core/src/main/java/com/datastax/driver/core/Requests.java @@ -224,6 +224,8 @@ public String toString() { static class Execute extends Message.Request { + public static final byte[] EMPTY_BYTES = new byte[0]; + static final Message.Coder coder = new Message.Coder() { @Override @@ -233,8 +235,11 @@ public void encode( ProtocolVersion version, ProtocolFeatureStore featureStore) { CBUtil.writeShortBytes(msg.statementId.bytes, dest); - if (ProtocolFeatures.PREPARED_METADATA_CHANGES.isSupportedBy(version, featureStore)) - CBUtil.writeShortBytes(msg.resultMetadataId.bytes, dest); + if (ProtocolFeatures.PREPARED_METADATA_CHANGES.isSupportedBy(version, featureStore)) { + byte[] bytes = + msg.resultMetadataId != null ? msg.resultMetadataId.bytes : EMPTY_BYTES; + CBUtil.writeShortBytes(bytes, dest); + } msg.options.encode(dest, version); } @@ -242,8 +247,11 @@ public void encode( public int encodedSize( Execute msg, ProtocolVersion version, ProtocolFeatureStore featureStore) { int size = CBUtil.sizeOfShortBytes(msg.statementId.bytes); - if (ProtocolFeatures.PREPARED_METADATA_CHANGES.isSupportedBy(version, featureStore)) - size += CBUtil.sizeOfShortBytes(msg.resultMetadataId.bytes); + if (ProtocolFeatures.PREPARED_METADATA_CHANGES.isSupportedBy(version, featureStore)) { + byte[] bytes = + msg.resultMetadataId != null ? msg.resultMetadataId.bytes : EMPTY_BYTES; + size += CBUtil.sizeOfShortBytes(bytes); + } size += msg.options.encodedSize(version); return size; } diff --git a/driver-core/src/test/java/com/datastax/driver/core/RequestsTest.java b/driver-core/src/test/java/com/datastax/driver/core/RequestsTest.java new file mode 100644 index 00000000000..d04da9ecf22 --- /dev/null +++ b/driver-core/src/test/java/com/datastax/driver/core/RequestsTest.java @@ -0,0 +1,65 @@ +package com.datastax.driver.core; + +import static org.testng.Assert.assertEquals; + +import com.datastax.driver.core.utils.Bytes; +import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; + +public class RequestsTest { + + public static class ExecuteTest { + + @Test(groups = "unit", dataProvider = "shouldProperlyEncodeMessages") + void should_properly_encode_messages( + MD5Digest resultMetadataId, + ProtocolVersion protocolVersion, + ProtocolFeatureStore protocolFeatureStore, + int expectedSize) { + // given + ByteBuf destination = ByteBufAllocator.DEFAULT.buffer(); + Requests.Execute request = + new Requests.Execute( + MD5Digest.wrap(Bytes.fromHexString("0xcafebabe").array()), + resultMetadataId, + Requests.QueryProtocolOptions.DEFAULT, + false); + + // when + int size = Requests.Execute.coder.encodedSize(request, protocolVersion, protocolFeatureStore); + Requests.Execute.coder.encode(request, destination, protocolVersion, protocolFeatureStore); + + // then + assertEquals(size, expectedSize); + assertEquals(destination.writerIndex(), expectedSize); + } + + @DataProvider + Object[][] shouldProperlyEncodeMessages() { + return new Object[][] { + { + MD5Digest.wrap(Bytes.fromHexString("0xdeadbeef").array()), + ProtocolVersion.V4, + new ProtocolFeatureStore(null, null, null, false), + 9 + }, + { + MD5Digest.wrap(Bytes.fromHexString("0xdeadbeef").array()), + ProtocolVersion.V4, + new ProtocolFeatureStore(null, null, null, true), + 15 + }, + {null, ProtocolVersion.V4, new ProtocolFeatureStore(null, null, null, true), 11}, + { + MD5Digest.wrap(Bytes.fromHexString("0xdeadbeef").array()), + ProtocolVersion.V5, + new ProtocolFeatureStore(null, null, null, false), + 18 + }, + {null, ProtocolVersion.V5, new ProtocolFeatureStore(null, null, null, false), 14}, + }; + } + } +}