aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniil Demin <deminds@ydb.tech>2024-02-19 13:50:30 +0300
committerGitHub <noreply@github.com>2024-02-19 13:50:30 +0300
commit2582d2fe6a61e1b4f4c520879957d20848c7667c (patch)
tree5e309ee580145845ccb44d882555da641b30b0ad
parenteabc943aef2dff79017222b67911bc4ca7208980 (diff)
downloadydb-2582d2fe6a61e1b4f4c520879957d20848c7667c.tar.gz
Use empty parsing context to build view's select in CREATE VIEW statement (#2049)
-rw-r--r--ydb/core/kqp/ut/view/view_ut.cpp18
-rw-r--r--ydb/library/yql/sql/v1/sql_translation.cpp43
2 files changed, 49 insertions, 12 deletions
diff --git a/ydb/core/kqp/ut/view/view_ut.cpp b/ydb/core/kqp/ut/view/view_ut.cpp
index c3eb3bd492d..381dea85c6d 100644
--- a/ydb/core/kqp/ut/view/view_ut.cpp
+++ b/ydb/core/kqp/ut/view/view_ut.cpp
@@ -324,6 +324,24 @@ Y_UNIT_TEST_SUITE(TCreateAndDropViewTest) {
UNIT_ASSERT(dropResult.GetIssues().ToString().Contains("Error: Path does not exist"));
}
}
+
+ Y_UNIT_TEST(ContextPollution) {
+ TKikimrRunner kikimr(TKikimrSettings().SetWithSampleTables(false));
+ EnableViewsFeatureFlag(kikimr);
+ auto session = kikimr.GetTableClient().CreateSession().GetValueSync().GetSession();
+
+ ExecuteDataDefinitionQuery(session, R"(
+ CREATE VIEW InnerView WITH (security_invoker = TRUE) AS SELECT 1;
+ )");
+ 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;
+ )");
+ }
}
Y_UNIT_TEST_SUITE(TSelectFromViewTest) {
diff --git a/ydb/library/yql/sql/v1/sql_translation.cpp b/ydb/library/yql/sql/v1/sql_translation.cpp
index 5b8a7185254..55375971f15 100644
--- a/ydb/library/yql/sql/v1/sql_translation.cpp
+++ b/ydb/library/yql/sql/v1/sql_translation.cpp
@@ -53,6 +53,33 @@ TString CollectTokens(const TRule_select_stmt& selectStatement) {
return tokenCollector.Tokens;
}
+NSQLTranslation::TTranslationSettings CreateViewTranslationSettings(const NSQLTranslation::TTranslationSettings& base) {
+ NSQLTranslation::TTranslationSettings settings;
+
+ settings.ClusterMapping = base.ClusterMapping;
+ settings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
+
+ return settings;
+}
+
+TNodePtr BuildViewSelect(const TRule_select_stmt& query, TContext& ctx) {
+ const auto viewTranslationSettings = CreateViewTranslationSettings(ctx.Settings);
+ TContext viewParsingContext(viewTranslationSettings, {}, ctx.Issues);
+ TSqlSelect select(viewParsingContext, viewTranslationSettings.Mode);
+ TPosition pos;
+ auto source = select.Build(query, pos);
+ if (!source) {
+ return nullptr;
+ }
+ return BuildSelectResult(
+ pos,
+ std::move(source),
+ false,
+ false,
+ viewParsingContext.Scoped
+ );
+}
+
}
namespace NSQLTranslationV1 {
@@ -4493,19 +4520,11 @@ bool TSqlTranslation::ParseViewQuery(std::map<TString, TDeferredAtom>& features,
const TString queryText = CollectTokens(query);
features["query_text"] = {Ctx.Pos(), queryText};
- {
- TSqlSelect select(Ctx, Mode);
- TPosition pos;
- auto source = select.Build(query, pos);
- if (!source) {
- return false;
- }
- features["query_ast"] = {BuildSelectResult(pos,
- std::move(source),
- false,
- false,
- Ctx.Scoped), Ctx};
+ const auto viewSelect = BuildViewSelect(query, Ctx);
+ if (!viewSelect) {
+ return false;
}
+ features["query_ast"] = {viewSelect, Ctx};
return true;
}