From 552959df2d01e2805288b6a509efe0395b39bd7b Mon Sep 17 00:00:00 2001 From: 1fanwang <1fannnw@gmail.com> Date: Sat, 29 Aug 2026 08:38:00 -0400 Subject: [PATCH] [fix](fe) Accept BLOB prepared statement parameters ### What problem does this PR solve? Issue Number: close https://github.com/apache/doris/issues/67301 Problem Summary: Doris rejects wide ODBC strings because their prepared parameters use BLOB type codes. ### Release note Prepared statements accept MySQL BLOB string parameters. ### Check List (For Author) - Test: Unit Test - Behavior changed: Yes - Documentation: No Signed-off-by: 1fanwang <1fannnw@gmail.com> --- .../trees/expressions/literal/Literal.java | 4 +++ .../trees/expressions/LiteralTest.java | 26 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java index 1c368179005be3..8e73124831fae3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/expressions/literal/Literal.java @@ -562,6 +562,10 @@ public static Literal getLiteralByMysqlType(MysqlColType mysqlType, boolean isUn case MYSQL_TYPE_TIMESTAMP2: literal = handleDateTimeLiteral(data); break; + case MYSQL_TYPE_TINY_BLOB: + case MYSQL_TYPE_MEDIUM_BLOB: + case MYSQL_TYPE_LONG_BLOB: + case MYSQL_TYPE_BLOB: case MYSQL_TYPE_STRING: case MYSQL_TYPE_VARSTRING: literal = handleStringLiteral(data); diff --git a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/LiteralTest.java b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/LiteralTest.java index 4964414e6b3db5..4cddc446332532 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/LiteralTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/trees/expressions/LiteralTest.java @@ -17,6 +17,8 @@ package org.apache.doris.nereids.trees.expressions; +import org.apache.doris.catalog.MysqlColType; +import org.apache.doris.mysql.MysqlSerializer; import org.apache.doris.nereids.trees.expressions.literal.ArrayLiteral; import org.apache.doris.nereids.trees.expressions.literal.BooleanLiteral; import org.apache.doris.nereids.trees.expressions.literal.IntegerLiteral; @@ -36,6 +38,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -57,6 +61,28 @@ public void testEqual() { Assertions.assertTrue(Literal.of(false) instanceof BooleanLiteral); } + @Test + public void testMysqlBlobParameter() { + String value = "Doris 数据"; + for (MysqlColType mysqlType : Arrays.asList( + MysqlColType.MYSQL_TYPE_TINY_BLOB, + MysqlColType.MYSQL_TYPE_MEDIUM_BLOB, + MysqlColType.MYSQL_TYPE_LONG_BLOB, + MysqlColType.MYSQL_TYPE_BLOB)) { + MysqlSerializer serializer = MysqlSerializer.newInstance(); + serializer.writeLenEncodedString(value); + serializer.writeInt1(0x7f); + ByteBuffer data = serializer.toByteBuffer().order(ByteOrder.LITTLE_ENDIAN); + + Literal literal = Literal.getLiteralByMysqlType(mysqlType, false, data); + + Assertions.assertTrue(literal instanceof StringLiteral, mysqlType.name()); + Assertions.assertEquals(value, literal.getStringValue(), mysqlType.name()); + Assertions.assertEquals(1, data.remaining(), mysqlType.name()); + Assertions.assertEquals(0x7f, Byte.toUnsignedInt(data.get()), mysqlType.name()); + } + } + @Test public void testGetResultExpressionArrayInt() { int num = 10;