diff --git a/src/gausskernel/storage/mot/core/storage/column.cpp b/src/gausskernel/storage/mot/core/storage/column.cpp index bee1541c4..543481112 100644 --- a/src/gausskernel/storage/mot/core/storage/column.cpp +++ b/src/gausskernel/storage/mot/core/storage/column.cpp @@ -29,6 +29,7 @@ #include "column.h" #include "utilities.h" #include "mot_error.h" +#include "knl/knl_session.h" extern uint16_t MOTTimestampToStr(uintptr_t src, char* destBuf, size_t len); extern uint16_t MOTTimestampTzToStr(uintptr_t src, char* destBuf, size_t len); @@ -893,11 +894,16 @@ uint16_t ColumnDECIMAL::PrintValue(uint8_t* data, char* destBuf, size_t len, boo bool ColumnVARCHAR::Pack(uint8_t* dest, uintptr_t src, size_t len) { - if (len > (m_size - 4)) { + size_t tlen = len; + if (u_sess->attr.attr_sql.sql_compatibility == B_FORMAT) { + /* use char length instead byte length */ + tlen = pg_mbstrlen_with_len((char*)src, (int) len); + } + if (tlen > (m_size - 4)) { return false; } *((uint32_t*)(dest + m_offset)) = len; - errno_t erc = memcpy_s(dest + m_offset + 4, m_size - 4, (void*)src, len); + errno_t erc = memcpy_s(dest + m_offset + 4, len > m_size - 4 ? len : m_size - 4, (void*)src, len); securec_check(erc, "\0", "\0"); return true; } diff --git a/src/gausskernel/storage/mot/core/storage/column.h b/src/gausskernel/storage/mot/core/storage/column.h index 65e81fdbf..07cbb0dea 100644 --- a/src/gausskernel/storage/mot/core/storage/column.h +++ b/src/gausskernel/storage/mot/core/storage/column.h @@ -28,6 +28,7 @@ #include "catalog_column_types.h" #include "utils/elog.h" #include "securec.h" +#include "postgres.h" #define MOT_MAXDATELEN 128 diff --git a/src/test/regress/expected/mot/single_varchar.out b/src/test/regress/expected/mot/single_varchar.out index d775efe6f..ed3597d5b 100644 --- a/src/test/regress/expected/mot/single_varchar.out +++ b/src/test/regress/expected/mot/single_varchar.out @@ -109,3 +109,11 @@ SELECT '' AS four, * FROM VARCHAR_TBL ORDER BY f1; (4 rows) DROP FOREIGN TABLE VARCHAR_TBL; +CREATE DATABASE db_varchar DBCOMPATIBILITY 'B' ENCODING 'UTF8'; +\c db_varchar +create Foreign table t_foreign1 (c1 int not null, c2 numeric, c3 char(30)); +insert into t_foreign1 values (1, 50, '嘿嘿'); +insert into t_foreign1 values (1, 50, '嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿'); +insert into t_foreign1 values (1, 50, '嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿'); +\c postgres +DROP DATABASE db_varchar; diff --git a/src/test/regress/sql/mot/single_varchar.sql b/src/test/regress/sql/mot/single_varchar.sql index 838239e79..31819f529 100644 --- a/src/test/regress/sql/mot/single_varchar.sql +++ b/src/test/regress/sql/mot/single_varchar.sql @@ -66,3 +66,13 @@ INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); SELECT '' AS four, * FROM VARCHAR_TBL ORDER BY f1; DROP FOREIGN TABLE VARCHAR_TBL; + +CREATE DATABASE db_varchar DBCOMPATIBILITY 'B' ENCODING 'UTF8'; +\c db_varchar +create Foreign table t_foreign1 (c1 int not null, c2 numeric, c3 char(30)); +insert into t_foreign1 values (1, 50, '嘿嘿'); +insert into t_foreign1 values (1, 50, '嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿'); +insert into t_foreign1 values (1, 50, '嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿'); +\c postgres +DROP DATABASE db_varchar; +