Skip to content

Commit f5e7824

Browse files
authored
Merge 92e531a into 4bbfda7
2 parents 4bbfda7 + 92e531a commit f5e7824

File tree

6 files changed

+71
-27
lines changed

6 files changed

+71
-27
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
CREATE VIEW in_subquery WITH (security_invoker = TRUE) AS
2+
SELECT
3+
*
4+
FROM series
5+
WHERE series_id IN (
6+
SELECT
7+
series_id
8+
FROM series
9+
);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
DROP VIEW in_subquery;
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
SELECT
2+
*
3+
FROM (
4+
SELECT
5+
*
6+
FROM series
7+
WHERE series_id IN (
8+
SELECT
9+
series_id
10+
FROM series
11+
)
12+
);
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SELECT
2+
*
3+
FROM in_subquery;

ydb/core/kqp/ut/view/view_ut.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,10 +139,10 @@ void CompareResults(const NQuery::TExecuteQueryResult& first, const NQuery::TExe
139139
CompareResults(first.GetResultSets(), second.GetResultSets());
140140
}
141141

142-
void InitializeTablesAndSecondaryViews(TSession& session) {
142+
void InitializeTablesAndSecondaryViews(NQuery::TSession& session) {
143143
const auto inputFolder = ArcadiaFromCurrentLocation(__SOURCE_FILE__, "input");
144-
ExecuteDataDefinitionQuery(session, ReadWholeFile(inputFolder + "/create_tables_and_secondary_views.sql"));
145-
ExecuteDataModificationQuery(session, ReadWholeFile(inputFolder + "/fill_tables.sql"));
144+
ExecuteQuery(session, ReadWholeFile(inputFolder + "/create_tables_and_secondary_views.sql"));
145+
ExecuteQuery(session, ReadWholeFile(inputFolder + "/fill_tables.sql"));
146146
}
147147

148148
}
@@ -582,7 +582,7 @@ Y_UNIT_TEST_SUITE(TSelectFromViewTest) {
582582
Y_UNIT_TEST(ReadTestCasesFromFiles) {
583583
TKikimrRunner kikimr;
584584
EnableViewsFeatureFlag(kikimr);
585-
auto session = kikimr.GetTableClient().CreateSession().GetValueSync().GetSession();
585+
auto session = kikimr.GetQueryClient().GetSession().ExtractValueSync().GetSession();
586586

587587
InitializeTablesAndSecondaryViews(session);
588588
EnableLogging();
@@ -593,13 +593,13 @@ Y_UNIT_TEST_SUITE(TSelectFromViewTest) {
593593
TString testcase;
594594
while (testcase = testcases.Next()) {
595595
const auto pathPrefix = TStringBuilder() << testcasesFolder << '/' << testcase << '/';
596-
ExecuteDataDefinitionQuery(session, ReadWholeFile(pathPrefix + "create_view.sql"));
596+
ExecuteQuery(session, ReadWholeFile(pathPrefix + "create_view.sql"));
597597

598-
const auto etalonResults = ExecuteDataModificationQuery(session, ReadWholeFile(pathPrefix + "etalon_query.sql"));
599-
const auto selectFromViewResults = ExecuteDataModificationQuery(session, ReadWholeFile(pathPrefix + "select_from_view.sql"));
598+
const auto etalonResults = ExecuteQuery(session, ReadWholeFile(pathPrefix + "etalon_query.sql"));
599+
const auto selectFromViewResults = ExecuteQuery(session, ReadWholeFile(pathPrefix + "select_from_view.sql"));
600600
CompareResults(etalonResults, selectFromViewResults);
601601

602-
ExecuteDataDefinitionQuery(session, ReadWholeFile(pathPrefix + "drop_view.sql"));
602+
ExecuteQuery(session, ReadWholeFile(pathPrefix + "drop_view.sql"));
603603
}
604604
}
605605

ydb/library/yql/sql/v1/sql_translation.cpp

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -54,48 +54,67 @@ TString CollectTokens(const TRule_select_stmt& selectStatement) {
5454
return tokenCollector.Tokens;
5555
}
5656

57-
bool RestoreContext(
58-
TContext& ctx, const NSQLTranslation::TTranslationSettings& settings, const TString& contextRestorationQuery
57+
bool RecreateContext(
58+
TContext& ctx, const NSQLTranslation::TTranslationSettings& settings, const TString& recreationQuery
5959
) {
60-
const TString queryName = "context restoration query";
60+
if (!recreationQuery) {
61+
return true;
62+
}
63+
const TString queryName = "context recreation query";
6164

6265
const auto* ast = NSQLTranslationV1::SqlAST(
63-
contextRestorationQuery, queryName, ctx.Issues,
66+
recreationQuery, queryName, ctx.Issues,
6467
settings.MaxErrors, settings.AnsiLexer, settings.Arena
6568
);
6669
if (!ast) {
6770
return false;
6871
}
6972

70-
TSqlQuery query(ctx, ctx.Settings.Mode, true);
71-
auto node = query.Build(static_cast<const TSQLv1ParserAST&>(*ast));
73+
TSqlQuery queryTranslator(ctx, ctx.Settings.Mode, true);
74+
auto node = queryTranslator.Build(static_cast<const TSQLv1ParserAST&>(*ast));
7275

7376
return node && node->Init(ctx, nullptr) && node->Translate(ctx);
7477
}
7578

7679
TNodePtr BuildViewSelect(
77-
const TRule_select_stmt& selectQuery,
80+
const TRule_select_stmt& selectStatement,
7881
TContext& parentContext,
79-
const TString& contextRestorationQuery
82+
const TString& contextRecreationQuery
8083
) {
81-
TContext context(parentContext.Settings, {}, parentContext.Issues);
82-
RestoreContext(context, context.Settings, contextRestorationQuery);
84+
TIssues issues;
85+
TContext context(parentContext.Settings, {}, issues);
86+
if (!RecreateContext(context, context.Settings, contextRecreationQuery)) {
87+
parentContext.Issues.AddIssues(issues);
88+
return nullptr;
89+
}
90+
issues.Clear();
91+
92+
// Holds (among other things) subquery references.
93+
// These references need to be passed to the parent context
94+
// to be able to compile view queries with subqueries.
95+
context.PushCurrentBlocks(&parentContext.GetCurrentBlocks());
8396

8497
context.Settings.Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
8598

86-
TSqlSelect select(context, context.Settings.Mode);
87-
TPosition pos;
88-
auto source = select.Build(selectQuery, pos);
99+
TSqlSelect selectTranslator(context, context.Settings.Mode);
100+
TPosition pos = parentContext.Pos();
101+
auto source = selectTranslator.Build(selectStatement, pos);
89102
if (!source) {
103+
parentContext.Issues.AddIssues(issues);
90104
return nullptr;
91105
}
92-
return BuildSelectResult(
106+
auto node = BuildSelectResult(
93107
pos,
94108
std::move(source),
95109
false,
96110
false,
97111
context.Scoped
98112
);
113+
if (!node) {
114+
parentContext.Issues.AddIssues(issues);
115+
return nullptr;
116+
}
117+
return node;
99118
}
100119

101120
}
@@ -4589,27 +4608,27 @@ bool TSqlTranslation::ParseViewQuery(
45894608
const TRule_select_stmt& query
45904609
) {
45914610
TString queryText = CollectTokens(query);
4592-
TString contextRestorationQuery;
4611+
TString contextRecreationQuery;
45934612
{
45944613
const auto& service = Ctx.Scoped->CurrService;
45954614
const auto& cluster = Ctx.Scoped->CurrCluster;
45964615
const auto effectivePathPrefix = Ctx.GetPrefixPath(service, cluster);
45974616

45984617
// TO DO: capture all runtime pragmas in a similar fashion.
45994618
if (effectivePathPrefix != Ctx.Settings.PathPrefix) {
4600-
contextRestorationQuery = TStringBuilder() << "PRAGMA TablePathPrefix = \"" << effectivePathPrefix << "\";\n";
4619+
contextRecreationQuery = TStringBuilder() << "PRAGMA TablePathPrefix = \"" << effectivePathPrefix << "\";\n";
46014620
}
46024621

46034622
// TO DO: capture other compilation-affecting statements except USE.
46044623
if (cluster.GetLiteral() && *cluster.GetLiteral() != Ctx.Settings.DefaultCluster) {
4605-
contextRestorationQuery = TStringBuilder() << "USE " << *cluster.GetLiteral() << ";\n";
4624+
contextRecreationQuery = TStringBuilder() << "USE " << *cluster.GetLiteral() << ";\n";
46064625
}
46074626
}
4608-
features["query_text"] = { Ctx.Pos(), contextRestorationQuery + queryText };
4627+
features["query_text"] = { Ctx.Pos(), contextRecreationQuery + queryText };
46094628

46104629
// AST is needed for ready-made validation of CREATE VIEW statement.
46114630
// Query is stored as plain text, not AST.
4612-
const auto viewSelect = BuildViewSelect(query, Ctx, contextRestorationQuery);
4631+
const auto viewSelect = BuildViewSelect(query, Ctx, contextRecreationQuery);
46134632
if (!viewSelect) {
46144633
return false;
46154634
}

0 commit comments

Comments
 (0)