From 0f5b0f4bbf907d6d603dbdf15fbe426ee5955bbb Mon Sep 17 00:00:00 2001 From: syj <904673462@qq.com> Date: Wed, 30 Dec 2020 11:58:08 +0800 Subject: [PATCH] Limit the max string length of enum type to NAMEDATALEN-1(64-1=63) --- src/common/backend/catalog/pg_enum.cpp | 2 +- src/test/regress/expected/enum.out | 22 ++++++++++++++++++++++ src/test/regress/sql/enum.sql | 10 ++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/common/backend/catalog/pg_enum.cpp b/src/common/backend/catalog/pg_enum.cpp index 9fabfd085..6f51612b1 100755 --- a/src/common/backend/catalog/pg_enum.cpp +++ b/src/common/backend/catalog/pg_enum.cpp @@ -34,7 +34,7 @@ static int sort_order_cmp(const void* p1, const void* p2); #define checkEnumLableValue(val) \ do { \ - if (NAMEDATALEN < strlen(val) || 0 == strlen(val)) { \ + if (NAMEDATALEN - 1 < strlen(val) || 0 == strlen(val)) { \ ereport(ERROR, \ (errcode(ERRCODE_INVALID_NAME), \ errmsg("invalid enum label \"%s\"", val), \ diff --git a/src/test/regress/expected/enum.out b/src/test/regress/expected/enum.out index b28571e38..2751a89b8 100644 --- a/src/test/regress/expected/enum.out +++ b/src/test/regress/expected/enum.out @@ -1,4 +1,26 @@ -- +-- Check max string length of enum type +-- +SELECT char_length('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZDQ'); + char_length +------------- + 64 +(1 row) + +CREATE TYPE over_enum AS ENUM('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZDQ'); +ERROR: invalid enum label "createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZDQ" +DETAIL: Labels must contain 1 to 63 characters. +DROP TYPE IF EXISTS over_enum; +NOTICE: type "over_enum" does not exist, skipping +SELECT char_length('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZD'); + char_length +------------- + 63 +(1 row) + +CREATE TYPE max_eunm AS ENUM('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZD'); +DROP TYPE IF EXISTS max_eunm; +-- -- Enum tests -- CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple'); diff --git a/src/test/regress/sql/enum.sql b/src/test/regress/sql/enum.sql index 704540b6d..2b6bff7f4 100644 --- a/src/test/regress/sql/enum.sql +++ b/src/test/regress/sql/enum.sql @@ -1,3 +1,13 @@ +-- +-- Check max string length of enum type +-- +SELECT char_length('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZDQ'); +CREATE TYPE over_enum AS ENUM('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZDQ'); +DROP TYPE IF EXISTS over_enum; +SELECT char_length('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZD'); +CREATE TYPE max_eunm AS ENUM('createcshksjdbnskjcbnskjcbnsjcbncbsxkcbscbKHWEIDHBIWFHBSBCISAZD'); +DROP TYPE IF EXISTS max_eunm; + -- -- Enum tests --