aboutsummaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql/v1/sql_translation.cpp
diff options
context:
space:
mode:
authorflown4qqqq <flown4qqqq@yandex-team.com>2024-12-24 13:03:06 +0300
committerflown4qqqq <flown4qqqq@yandex-team.com>2024-12-24 13:23:51 +0300
commitf872328e9834aeb436c174b0aca5108a8e943c1a (patch)
tree4502adfe038da859bf27d33701e8cdb7d247ea40 /yql/essentials/sql/v1/sql_translation.cpp
parent29d2318eb62c7e894d88fc6c82062edc7d28406a (diff)
downloadydb-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.cpp81
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;