diff --git a/ydb/core/kqp/gateway/behaviour/view/manager.cpp b/ydb/core/kqp/gateway/behaviour/view/manager.cpp index cfe2a73ac7d5..236125c0e85a 100644 --- a/ydb/core/kqp/gateway/behaviour/view/manager.cpp +++ b/ydb/core/kqp/gateway/behaviour/view/manager.cpp @@ -2,6 +2,7 @@ #include #include +#include #include namespace NKikimr::NKqp { @@ -36,6 +37,15 @@ std::pair SplitPathByDb(const TString& objectId, return pathPair; } +std::pair SplitPathByObjectId(const TString& objectId) { + std::pair pathPair; + TString error; + if (!NSchemeHelpers::TrySplitTablePath(objectId, pathPair, error)) { + ythrow TBadArgumentException() << error; + } + return pathPair; +} + void FillCreateViewProposal(NKikimrSchemeOp::TModifyScheme& modifyScheme, const NYql::TCreateObjectSettings& settings, const TString& database) { @@ -54,10 +64,9 @@ void FillCreateViewProposal(NKikimrSchemeOp::TModifyScheme& modifyScheme, } void FillDropViewProposal(NKikimrSchemeOp::TModifyScheme& modifyScheme, - const NYql::TDropObjectSettings& settings, - const TString& database) { + const NYql::TDropObjectSettings& settings) { - const auto pathPair = SplitPathByDb(settings.GetObjectId(), database); + const auto pathPair = SplitPathByObjectId(settings.GetObjectId()); modifyScheme.SetWorkingDir(pathPair.first); modifyScheme.SetOperationType(NKikimrSchemeOp::ESchemeOpDropView); @@ -103,7 +112,7 @@ NThreading::TFuture DropView(const NYql::TDropObjectSettin proposal->Record.SetUserToken(context.GetExternalData().GetUserToken()->GetSerializedToken()); } auto& schemeTx = *proposal->Record.MutableTransaction()->MutableModifyScheme(); - FillDropViewProposal(schemeTx, settings, context.GetExternalData().GetDatabase()); + FillDropViewProposal(schemeTx, settings); return SendSchemeRequest(proposal.Release(), context.GetExternalData().GetActorSystem(), false); } @@ -115,9 +124,8 @@ void PrepareCreateView(NKqpProto::TKqpSchemeOperation& schemeOperation, } void PrepareDropView(NKqpProto::TKqpSchemeOperation& schemeOperation, - const NYql::TObjectSettingsImpl& settings, - TInternalModificationContext& context) { - FillDropViewProposal(*schemeOperation.MutableDropView(), settings, context.GetExternalData().GetDatabase()); + const NYql::TObjectSettingsImpl& settings) { + FillDropViewProposal(*schemeOperation.MutableDropView(), settings); } } @@ -173,7 +181,7 @@ TViewManager::TYqlConclusionStatus TViewManager::DoPrepare(NKqpProto::TKqpScheme PrepareCreateView(schemeOperation, settings, context); break; case EActivityType::Drop: - PrepareDropView(schemeOperation, settings, context); + PrepareDropView(schemeOperation, settings); break; } } catch (...) { diff --git a/ydb/core/kqp/ut/view/view_ut.cpp b/ydb/core/kqp/ut/view/view_ut.cpp index 381dea85c6d9..056a16b7958f 100644 --- a/ydb/core/kqp/ut/view/view_ut.cpp +++ b/ydb/core/kqp/ut/view/view_ut.cpp @@ -162,7 +162,7 @@ Y_UNIT_TEST_SUITE(TCreateAndDropViewTest) { )", path ); - + DisableViewsFeatureFlag(kikimr); const auto creationResult = session.ExecuteSchemeQuery(creationQuery).ExtractValueSync(); UNIT_ASSERT(!creationResult.IsSuccess()); @@ -325,6 +325,32 @@ Y_UNIT_TEST_SUITE(TCreateAndDropViewTest) { } } + Y_UNIT_TEST(DropViewInFolder) { + TKikimrRunner kikimr(TKikimrSettings().SetWithSampleTables(false)); + EnableViewsFeatureFlag(kikimr); + auto& runtime = *kikimr.GetTestServer().GetRuntime(); + auto session = kikimr.GetTableClient().CreateSession().GetValueSync().GetSession(); + + constexpr const char* path = "/Root/some/path/to/TheView"; + constexpr const char* queryInView = "SELECT 1"; + + const TString creationQuery = std::format(R"( + CREATE VIEW `{}` WITH (security_invoker = true) AS {}; + )", + path, + queryInView + ); + ExecuteDataDefinitionQuery(session, creationQuery); + + const TString dropQuery = std::format(R"( + DROP VIEW `{}`; + )", + path + ); + ExecuteDataDefinitionQuery(session, dropQuery); + ExpectUnknownEntry(runtime, path); + } + Y_UNIT_TEST(ContextPollution) { TKikimrRunner kikimr(TKikimrSettings().SetWithSampleTables(false)); EnableViewsFeatureFlag(kikimr); @@ -336,7 +362,7 @@ Y_UNIT_TEST_SUITE(TCreateAndDropViewTest) { ExecuteDataDefinitionQuery(session, R"( CREATE VIEW OuterView WITH (security_invoker = TRUE) AS SELECT * FROM InnerView; )"); - + ExecuteDataDefinitionQuery(session, R"( DROP VIEW OuterView; CREATE VIEW OuterView WITH (security_invoker = TRUE) AS SELECT * FROM InnerView;