@@ -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
7679TNodePtr 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