diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index 96e954cd75152557e65b2fdd71261964b2b8e7d0..bc29e008b7bf91344e2770d2a0d09bc36b69216c 100644 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -1692,6 +1692,9 @@ UserId: ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("syntax error at or near \"%s\"", $1), parser_errposition(@1))); if (strchr($1,'@')) ereport(ERROR,(errcode(ERRCODE_INVALID_NAME),errmsg("@ can't be allowed in username"))); + if (strlen($1) >= NAMEDATALEN) { + ereport(ERROR,(errcode(ERRCODE_INVALID_NAME),errmsg("String %s is too long for user name (should be no longer than 64)", $1))); + } $$ = $1; } | RoleId SET_USER_IDENT @@ -31352,6 +31355,9 @@ static char* GetValidUserHostId(char* userName, char* hostId) appendStringInfoString(&buf, userName); appendStringInfoString(&buf, "@"); appendStringInfoString(&buf, userHostId); + if (strlen(buf.data) >= NAMEDATALEN) { + ereport(ERROR,(errcode(ERRCODE_INVALID_NAME),errmsg("String %s is too long for user name (should be no longer than 64)", buf.data))); + } return buf.data; } diff --git a/src/test/regress/input/user_host_test.source b/src/test/regress/input/user_host_test.source index 12699ddddcb4af0db3c0ef595c40ccfcd6e7f241..e966eef47dddc31a89b3608974ee1402e4c936ab 100644 --- a/src/test/regress/input/user_host_test.source +++ b/src/test/regress/input/user_host_test.source @@ -17,6 +17,9 @@ create user 'test_user_host'@'127.0.%' password 'test123@'; create user 'test_user_host%' password 'test123@'; create user 'test_user_host'@'127.0.0.1' password 'test123@'; set b_compatibility_user_host_auth = on; +CREATE USER 'sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfk vjhsdkfuhc'@'%' PASSWORD 'test123@'; +CREATE USER 'sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfk vjhsdkfuhc' PASSWORD 'test123@'; +CREATE USER sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfkvjhsdkfu@127.0.0.1 PASSWORD 'test123@'; CREATE USER 'da@localhost'@'%' PASSWORD 'test123@'; create user if not exists 'test_user_host'@'%' password 'test123@'; alter user 'test_user_host'@'%' with account lock; diff --git a/src/test/regress/output/user_host_test.source b/src/test/regress/output/user_host_test.source index a150e999c06ad1a38b92ecc924c28b3cd3342fa1..fe89b8201cc2eaf554c209f243fd48f6c06f164c 100644 --- a/src/test/regress/output/user_host_test.source +++ b/src/test/regress/output/user_host_test.source @@ -48,6 +48,13 @@ LINE 1: create user 'test_user_host%' password 'test123@'; create user 'test_user_host'@'127.0.0.1' password 'test123@'; ERROR: user@host is only supported in b database when the b_compatibility_user_host_auth is on set b_compatibility_user_host_auth = on; +CREATE USER 'sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfk vjhsdkfuhc'@'%' PASSWORD 'test123@'; +ERROR: String sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfk vjhsdkfuhc@% is too long for user name (should be no longer than 64) +CREATE USER 'sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfk vjhsdkfuhc' PASSWORD 'test123@'; +ERROR: String sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfk vjhsdkfuhc is too long for user name (should be no longer than 64) +CREATE USER sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfkvjhsdkfu@127.0.0.1 PASSWORD 'test123@'; +NOTICE: identifier "sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfkvjhsdkfu" will be truncated to "sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfkvjhsdk" +ERROR: String sssssssssssssskkdcjhshfedrfbberfheurfhefhhdfjdfhkdfjshdfkvjhsdk@127.0.0.1 is too long for user name (should be no longer than 64) CREATE USER 'da@localhost'@'%' PASSWORD 'test123@'; ERROR: @ can't be allowed in username create user if not exists 'test_user_host'@'%' password 'test123@';