diff options
author | flown4qqqq <flown4qqqq@yandex-team.com> | 2024-12-24 13:03:06 +0300 |
---|---|---|
committer | flown4qqqq <flown4qqqq@yandex-team.com> | 2024-12-24 13:23:51 +0300 |
commit | f872328e9834aeb436c174b0aca5108a8e943c1a (patch) | |
tree | 4502adfe038da859bf27d33701e8cdb7d247ea40 /yql/essentials/sql/v1/sql_translation.cpp | |
parent | 29d2318eb62c7e894d88fc6c82062edc7d28406a (diff) | |
download | ydb-f872328e9834aeb436c174b0aca5108a8e943c1a.tar.gz |
PR from branch users/flown4qqqq/yql-new-query-alter-user-login-nologin
New option in query:
```
CREATE USER user LOGIN;
CREATE USER user NOLOGIN;
ALTER USER user LOGIN;
ALTER USER user NOLOGIN;
```
> implementation in sql
> add ut
commit_hash:7d7c0f251711814d86ae6cb49b4d052317a74001
Diffstat (limited to 'yql/essentials/sql/v1/sql_translation.cpp')
-rw-r--r-- | yql/essentials/sql/v1/sql_translation.cpp | 81 |
1 files changed, 72 insertions, 9 deletions
diff --git a/yql/essentials/sql/v1/sql_translation.cpp b/yql/essentials/sql/v1/sql_translation.cpp index 61a273b260..16de88ffe0 100644 --- a/yql/essentials/sql/v1/sql_translation.cpp +++ b/yql/essentials/sql/v1/sql_translation.cpp @@ -3818,19 +3818,82 @@ bool TSqlTranslation::RoleNameClause(const TRule_role_name& node, TDeferredAtom& return true; } -bool TSqlTranslation::RoleParameters(const TRule_create_user_option& node, TRoleParameters& result) { - // create_user_option: ENCRYPTED? PASSWORD expr; +bool TSqlTranslation::RoleParameters(const std::vector<TRule_create_user_option>& optionsList, TRoleParameters& result, bool isCreateUser) { + enum class ECreateUserOption { + Login, + Password + }; + + std::set<ECreateUserOption> used = {}; + + auto ParseCreateUserOption = [&used, this](const TRule_create_user_option& option, TRoleParameters& result) -> bool { + // create_user_option: password_option | login_option; + // password_option: ENCRYPTED? PASSWORD expr; + // login_option: LOGIN | NOLOGIN; + + switch (option.Alt_case()) { + case TRule_create_user_option::kAltCreateUserOption1: + { + TSqlExpression expr(Ctx, Mode); + TNodePtr password = expr.Build(option.GetAlt_create_user_option1().GetRule_password_option1().GetRule_expr3()); + if (!password) { + Error() << "Couldn't parse the password"; + return false; + } + + result.IsPasswordEncrypted = option.GetAlt_create_user_option1().GetRule_password_option1().HasBlock1(); + if (!password->IsNull()) { + result.Password = MakeAtomFromExpression(Ctx.Pos(), Ctx, password); + } + + if (used.contains(ECreateUserOption::Password)) { + Error() << "Conflicting or redundant options"; + return false; + } + + used.insert(ECreateUserOption::Password); + + break; + } + case TRule_create_user_option::kAltCreateUserOption2: + { + if (used.contains(ECreateUserOption::Login)) { + Error() << "Conflicting or redundant options"; + return false; + } + + used.insert(ECreateUserOption::Login); + + const auto token = option.GetAlt_create_user_option2().GetRule_login_option1().GetToken1().GetId(); + if (IS_TOKEN(token, LOGIN)) { + result.CanLogin = TRoleParameters::ETypeOfLogin::Login; + } else if (IS_TOKEN(token, NOLOGIN)) { + result.CanLogin = TRoleParameters::ETypeOfLogin::NoLogin; + } else { + Y_ABORT("You should change implementation according to grammar changes"); + } + + break; + } + case TRule_create_user_option::ALT_NOT_SET: + { + Y_ABORT("You should change implementation according to grammar changes"); + } + } + + return true; + }; + result = TRoleParameters{}; - TSqlExpression expr(Ctx, Mode); - TNodePtr password = expr.Build(node.GetRule_expr3()); - if (!password) { - return false; + if (isCreateUser) { + result.CanLogin = TRoleParameters::ETypeOfLogin::NoLogin; } - result.IsPasswordEncrypted = node.HasBlock1(); - if (!password->IsNull()) { - result.Password = MakeAtomFromExpression(Ctx.Pos(), Ctx, password); + for (const auto& option : optionsList) { + if (!ParseCreateUserOption(option, result)) { + return false; + } } return true; |