diff --git a/src/common/backend/catalog/pg_enum.cpp b/src/common/backend/catalog/pg_enum.cpp index 449c7364e..058b770ad 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 --