From e8cbbffa09096f4d7d0b760bb3d6614c9d6833c5 Mon Sep 17 00:00:00 2001 From: zzy0310 Date: Wed, 29 Jun 2022 10:18:22 +0800 Subject: [PATCH] support number signs in user name. --- src/common/backend/parser/gram.y | 45 +++++++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index f26a6d1cb5..fedb2251a9 100644 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -223,6 +223,7 @@ static void check_outarg_info(const bool *have_assigend, const char *argmodes,const int proargnum); bool IsValidIdentClientKey(const char *input); bool IsValidIdent(char *input); +bool IsValidIdentUsername(char *input); bool IsValidGroupname(const char *input); static bool checkNlssortArgs(const char *argname); static void ParseUpdateMultiSet(List *set_target_list, SelectStmt *stmt, core_yyscan_t yyscanner); @@ -1167,7 +1168,7 @@ CreateRoleStmt: CreateRoleStmt *n = makeNode(CreateRoleStmt); n->stmt_type = ROLESTMT_ROLE; if (!isRestoreMode) - IsValidIdent($3); + IsValidIdentUsername($3); n->role = $3; n->options = $5; $$ = (Node *)n; @@ -1476,7 +1477,7 @@ CreateUserStmt: { CreateRoleStmt *n = makeNode(CreateRoleStmt); n->stmt_type = ROLESTMT_USER; - IsValidIdent($3); + IsValidIdentUsername($3); n->role = $3; n->options = $5; $$ = (Node *)n; @@ -12730,7 +12731,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name RenameStmt *n = makeNode(RenameStmt); n->renameType = OBJECT_ROLE; n->subname = $3; - IsValidIdent($6); + IsValidIdentUsername($6); n->newname = $6; n->missing_ok = false; $$ = (Node *)n; @@ -12740,7 +12741,7 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name RenameStmt *n = makeNode(RenameStmt); n->renameType = OBJECT_USER; n->subname = $3; - IsValidIdent($6); + IsValidIdentUsername($6); n->newname = $6; n->missing_ok = false; $$ = (Node *)n; @@ -23629,6 +23630,42 @@ IsValidIdent(char *input) return true; } +/* judge if username is valid + * Only letters, numbers, dollar signs ($), number signs (#) and the underscore are allowed in name + * and The first character must be letter or underscore +*/ +bool +IsValidIdentUsername(char *input) +{ + char c = input[0]; + /*The first character id numbers or dollar*/ + if ((c >= '0' && c <= '9') || c == '$') + { + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid name: %s", input))); + return false; + } + + int len = strlen(input); + for (int i = 0; i < len; i++) + { + c = input[i]; + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_' || c == '$' || c == '#') + { + continue; + } + else + { + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("invalid name: %s", input))); + return false; + } + } + return true; +} + /* judge if node group name is valid * Only ASCII character set is allowed in group name */ -- Gitee