diff --git a/src/main/java/io/r2dbc/mssql/codec/BinaryCodec.java b/src/main/java/io/r2dbc/mssql/codec/BinaryCodec.java index 5de4b125..d3af218e 100644 --- a/src/main/java/io/r2dbc/mssql/codec/BinaryCodec.java +++ b/src/main/java/io/r2dbc/mssql/codec/BinaryCodec.java @@ -90,7 +90,7 @@ public Encoded encode(ByteBufAllocator allocator, RpcParameterContext context, O byte[] bytes = (byte[]) value; - if (bytes.length >= Encode.U_SHORT_MAX_VALUE) { + if (exceedsBigVarbinary(bytes.length)) { return BlobCodec.INSTANCE.encode(allocator, context, Blob.from(Mono.just(ByteBuffer.wrap(bytes)))); } @@ -100,7 +100,7 @@ public Encoded encode(ByteBufAllocator allocator, RpcParameterContext context, O ByteBuffer bytes = (ByteBuffer) value; - if (bytes.remaining() >= Encode.U_SHORT_MAX_VALUE) { + if (exceedsBigVarbinary(bytes.remaining())) { return BlobCodec.INSTANCE.encode(allocator, context, Blob.from(Mono.just(bytes))); } @@ -206,4 +206,8 @@ public String getFormalType() { return FORMAL_TYPE; } } + + private static boolean exceedsBigVarbinary(int length) { + return length > TypeUtils.SHORT_VARTYPE_MAX_BYTES; + } } diff --git a/src/test/java/io/r2dbc/mssql/CodecIntegrationTests.java b/src/test/java/io/r2dbc/mssql/CodecIntegrationTests.java index e541ced0..60ac6a01 100644 --- a/src/test/java/io/r2dbc/mssql/CodecIntegrationTests.java +++ b/src/test/java/io/r2dbc/mssql/CodecIntegrationTests.java @@ -110,7 +110,6 @@ void shouldEncodeDoubleAsDecimal() { testType(connection, "DECIMAL(38,5)", new BigDecimal("12345.12345")); } - @Test void shouldEncodeDoubleAsDecimal1() { testType(connection, "DECIMAL(38,0)", new BigDecimal("12345")); @@ -254,6 +253,11 @@ void shouldEncodeByteBufferAsVarBinary() { @Test void shouldEncodeByteArrayAsVarBinaryMax() { testType(connection, "VARBINARY(MAX)", "foobarbaz".getBytes(), byte[].class, actual -> assertThat(actual).isEqualTo(ByteBuffer.wrap("foobarbaz".getBytes()))); + testType(connection, "VARBINARY(MAX)", new byte[8000], byte[].class, actual -> assertThat(actual).isEqualTo(ByteBuffer.wrap(new byte[8000]))); + testType(connection, "VARBINARY(MAX)", new byte[8001], byte[].class, actual -> assertThat(actual).isEqualTo(ByteBuffer.wrap(new byte[8001]))); + testType(connection, "VARBINARY(MAX)", new byte[65534], byte[].class, actual -> assertThat(actual).isEqualTo(ByteBuffer.wrap(new byte[65534]))); + testType(connection, "VARBINARY(MAX)", new byte[65535], byte[].class, actual -> assertThat(actual).isEqualTo(ByteBuffer.wrap(new byte[65535]))); + testType(connection, "VARBINARY(MAX)", new byte[65536], byte[].class, actual -> assertThat(actual).isEqualTo(ByteBuffer.wrap(new byte[65536]))); } @Test