diff --git a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java index 06851ef..7f73e6a 100644 --- a/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java +++ b/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java @@ -2655,8 +2655,9 @@ public class PgResultSet implements ResultSet, org.postgresql.PGRefCursorResultS int oid = fields[columnIndex - 1].getOID(); if (oid == Oid.BYTEA) { return trimBytes(columnIndex, PGbytea.toBytes(this_row[columnIndex - 1])); - } else if (oid == Oid.BLOB) { - return toBytes(getString(columnIndex)); + } else if (oid == Oid.BLOB || blobSet.contains(getPGType(columnIndex))) { + String result = new String(this_row[columnIndex - 1]); + return toBytes(result); } else if (oid == Oid.BIT && connection.getPgDatabase().isDec()) { return toDecBytes(fields[columnIndex - 1].getMod(), getString(columnIndex)); } else { diff --git a/pgjdbc/src/test/java/org/postgresql/test/dolphintest/BlobTest.java b/pgjdbc/src/test/java/org/postgresql/test/dolphintest/BlobTest.java index 188c7bd..f87a1ff 100644 --- a/pgjdbc/src/test/java/org/postgresql/test/dolphintest/BlobTest.java +++ b/pgjdbc/src/test/java/org/postgresql/test/dolphintest/BlobTest.java @@ -20,6 +20,7 @@ import java.sql.Statement; import java.util.Properties; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; public class BlobTest extends BaseTest4B { @@ -107,4 +108,54 @@ public class BlobTest extends BaseTest4B { } } } + + @Test + public void testStringToBlob() throws SQLException { + String sql = "INSERT INTO test_blob_b VALUES (2,'1234'::tinyblob," + + "'1234'::blob,'1234'::mediumblob,'1234'::longblob)"; + try (PreparedStatement pstmt = con.prepareStatement(sql)) { + pstmt.execute(); + } + + try (Statement statement = con.createStatement(); + ResultSet rs = statement.executeQuery("SELECT * FROM test_blob_b")) { + while (rs.next()) { + assertEquals("1234", new String(rs.getBlob(2).getBytes(1, 4), + StandardCharsets.UTF_8)); + assertEquals("1234", new String(rs.getBlob(3).getBytes(1, 4), + StandardCharsets.UTF_8)); + assertEquals("1234", new String(rs.getBlob(4).getBytes(1, 4), + StandardCharsets.UTF_8)); + assertEquals("1234", new String(rs.getBlob(5).getBytes(1, 4), + StandardCharsets.UTF_8)); + } + } + } + + /** + * test blob by getBytes + * + * @throws SQLException sql exception + */ + @Test + public void testBlobToBytes() throws SQLException { + String sql = "INSERT INTO test_blob_b VALUES (1,'abcd'::tinyblob," + + "'abcd'::blob,'abcd'::mediumblob,'abcd'::longblob)"; + try (PreparedStatement pstmt = con.prepareStatement(sql)) { + pstmt.execute(); + } + + try (Statement statement = con.createStatement(); + ResultSet rs = statement.executeQuery("SELECT * FROM test_blob_b")) { + assertTrue(rs.next()); + assertEquals("abcd", new String(rs.getBytes(2), + StandardCharsets.UTF_8)); + assertEquals("abcd", new String(rs.getBytes(3), + StandardCharsets.UTF_8)); + assertEquals("abcd", new String(rs.getBytes(4), + StandardCharsets.UTF_8)); + assertEquals("abcd", new String(rs.getBytes(5), + StandardCharsets.UTF_8)); + } + } } diff --git a/pgjdbc/src/test/java/org/postgresql/test/jdbc4/BlobTest.java b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/BlobTest.java new file mode 100644 index 0000000..367585b --- /dev/null +++ b/pgjdbc/src/test/java/org/postgresql/test/jdbc4/BlobTest.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) Huawei Technologies Co., Ltd. 2024. All rights reserved. + * + * openGauss is licensed under Mulan PSL v2. + * You can use this software according to the terms and conditions of the Mulan PSL v2. + * You may obtain a copy of Mulan PSL v2 at: + * + * http://license.coscl.org.cn/MulanPSL2 + * + * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, + * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, + * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. + * See the Mulan PSL v2 for more details. + */ + +package org.postgresql.test.jdbc4; + +import org.junit.Test; +import org.postgresql.core.types.PGBlob; +import org.postgresql.test.TestUtil; +import org.postgresql.test.jdbc2.BaseTest4; + +import java.nio.charset.StandardCharsets; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +import static org.junit.Assert.assertEquals; + +/** + * test blob + * + * @author zhangting + * @since 2024-08-23 + */ +public class BlobTest extends BaseTest4 { + @Test + public void testStringToBlob() throws SQLException { + TestUtil.createTable(con, "test_blob_a", "id int, c1 blob"); + try (PreparedStatement pstmt = con.prepareStatement("INSERT INTO test_blob_a VALUES (?,?)")) { + pstmt.setInt(1, 1); + PGBlob blob = new PGBlob(); + blob.setBytes(1, "1234".getBytes(StandardCharsets.UTF_8)); + pstmt.setBlob(2, blob); + pstmt.execute(); + } + String sql = "INSERT INTO test_blob_a VALUES (2,'31323334'::blob)"; + try (PreparedStatement pstmt = con.prepareStatement(sql)) { + pstmt.execute(); + } + + try (Statement statement = con.createStatement(); + ResultSet rs = statement.executeQuery("SELECT * FROM test_blob_a")) { + while (rs.next()) { + assertEquals("1234", new String(rs.getBlob(2).getBytes(1, 4), + StandardCharsets.UTF_8)); + assertEquals("1234", new String(rs.getBytes(2), StandardCharsets.UTF_8)); + } + } + TestUtil.dropTable(con, "test_blob_a"); + } +}