From 5a1f462b18b795f1ff0b81e98e587bb7069ff8dd Mon Sep 17 00:00:00 2001 From: nifinity <75512822@qq.com> Date: Thu, 6 Aug 2020 16:10:40 +0800 Subject: [PATCH 1/2] varchar len modify --- src/common/backend/catalog/system_views.sql | 4 ++-- src/common/backend/utils/adt/varchar.cpp | 6 ++++++ src/test/regress/expected/varchar.out | 12 ++++++++++++ src/test/regress/sql/varchar.sql | 4 ++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/common/backend/catalog/system_views.sql b/src/common/backend/catalog/system_views.sql index 760df349f7..e34f8f79ec 100644 --- a/src/common/backend/catalog/system_views.sql +++ b/src/common/backend/catalog/system_views.sql @@ -1656,8 +1656,8 @@ AS $$ SELECT CAST(float8out($1) AS VARCHAR2) $$ LANGUAGE SQL STRICT IMMUTABLE NOT FENCED; CREATE OR REPLACE FUNCTION to_char(TEXT) -RETURNS TEXT -AS $$ SELECT $1 $$ +RETURNS varchar +AS $$ SELECT $1::varchar(10485760) $$ LANGUAGE SQL STRICT IMMUTABLE NOT FENCED; CREATE OR REPLACE FUNCTION to_number(TEXT) diff --git a/src/common/backend/utils/adt/varchar.cpp b/src/common/backend/utils/adt/varchar.cpp index f36e493198..b3298d0bbb 100755 --- a/src/common/backend/utils/adt/varchar.cpp +++ b/src/common/backend/utils/adt/varchar.cpp @@ -572,6 +572,12 @@ Datum varchar(PG_FUNCTION_ARGS) /* only reach here if string is too long... */ + if (len > MaxAttrSize) { + ereport(ERROR, + (errcode(ERRCODE_STRING_DATA_RIGHT_TRUNCATION), + errmsg("value too long for type character varying maxlen(%d) input_len(%d)", MaxAttrSize, len))); + } + /* truncate multibyte string preserving multibyte boundary */ max_mb_len = pg_mbcharcliplen(s_data, len, max_len); diff --git a/src/test/regress/expected/varchar.out b/src/test/regress/expected/varchar.out index dc6474cc29..e088e15dae 100644 --- a/src/test/regress/expected/varchar.out +++ b/src/test/regress/expected/varchar.out @@ -108,3 +108,15 @@ SELECT '' AS four, * FROM VARCHAR_TBL ORDER BY f1; | abcd (4 rows) + +select char_length(to_char(lpad('abc', 1024 * 1024 *10, 'x'))); + char_length +------------- + 10485760 +(1 row) + +select char_length(to_char(lpad('abc', 1024 * 1024 *10 + 1, 'x'))); +ERROR: value too long for type character varying maxlen(10485760) input_len(10485761) +CONTEXT: referenced column: varchar +SQL function "to_char" statement 1 +referenced column: char_length \ No newline at end of file diff --git a/src/test/regress/sql/varchar.sql b/src/test/regress/sql/varchar.sql index f6daf1acaf..7cfbb6bde8 100644 --- a/src/test/regress/sql/varchar.sql +++ b/src/test/regress/sql/varchar.sql @@ -64,3 +64,7 @@ INSERT INTO VARCHAR_TBL (f1) VALUES ('abcde'); INSERT INTO VARCHAR_TBL (f1) VALUES ('abcd '); SELECT '' AS four, * FROM VARCHAR_TBL ORDER BY f1; + +select char_length(to_char(lpad('abc', 1024 * 1024 *10, 'x'))); + +select char_length(to_char(lpad('abc', 1024 * 1024 *10 + 1, 'x'))); -- Gitee From adb753db88e8c618f930fc0c492c09b753cc7ee9 Mon Sep 17 00:00:00 2001 From: nifinity <75512822@qq.com> Date: Thu, 6 Aug 2020 16:47:46 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/test/regress/expected/varchar.out | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/regress/expected/varchar.out b/src/test/regress/expected/varchar.out index e088e15dae..2759e06a24 100644 --- a/src/test/regress/expected/varchar.out +++ b/src/test/regress/expected/varchar.out @@ -108,7 +108,6 @@ SELECT '' AS four, * FROM VARCHAR_TBL ORDER BY f1; | abcd (4 rows) - select char_length(to_char(lpad('abc', 1024 * 1024 *10, 'x'))); char_length ------------- -- Gitee