@@ -55,48 +55,67 @@ TString CollectTokens(const TRule_select_stmt& selectStatement) {
5555 return tokenCollector.Tokens ;
5656}
5757
58- bool RestoreContext (
59- TContext& ctx, const NSQLTranslation::TTranslationSettings& settings, const TString& contextRestorationQuery
58+ bool RecreateContext (
59+ TContext& ctx, const NSQLTranslation::TTranslationSettings& settings, const TString& recreationQuery
6060) {
61- const TString queryName = " context restoration query" ;
61+ if (!recreationQuery) {
62+ return true ;
63+ }
64+ const TString queryName = " context recreation query" ;
6265
6366 const auto * ast = NSQLTranslationV1::SqlAST (
64- contextRestorationQuery , queryName, ctx.Issues ,
67+ recreationQuery , queryName, ctx.Issues ,
6568 settings.MaxErrors , settings.AnsiLexer , settings.Antlr4Parser , settings.TestAntlr4 , settings.Arena
6669 );
6770 if (!ast) {
6871 return false ;
6972 }
7073
71- TSqlQuery query (ctx, ctx.Settings .Mode , true );
72- auto node = query .Build (static_cast <const TSQLv1ParserAST&>(*ast));
74+ TSqlQuery queryTranslator (ctx, ctx.Settings .Mode , true );
75+ auto node = queryTranslator .Build (static_cast <const TSQLv1ParserAST&>(*ast));
7376
7477 return node && node->Init (ctx, nullptr ) && node->Translate (ctx);
7578}
7679
7780TNodePtr BuildViewSelect (
78- const TRule_select_stmt& selectQuery ,
81+ const TRule_select_stmt& selectStatement ,
7982 TContext& parentContext,
80- const TString& contextRestorationQuery
83+ const TString& contextRecreationQuery
8184) {
82- TContext context (parentContext.Settings , {}, parentContext.Issues );
83- RestoreContext (context, context.Settings , contextRestorationQuery);
85+ TIssues issues;
86+ TContext context (parentContext.Settings , {}, issues);
87+ if (!RecreateContext (context, context.Settings , contextRecreationQuery)) {
88+ parentContext.Issues .AddIssues (issues);
89+ return nullptr ;
90+ }
91+ issues.Clear ();
92+
93+ // Holds (among other things) subquery references.
94+ // These references need to be passed to the parent context
95+ // to be able to compile view queries with subqueries.
96+ context.PushCurrentBlocks (&parentContext.GetCurrentBlocks ());
8497
8598 context.Settings .Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
8699
87- TSqlSelect select (context, context.Settings .Mode );
88- TPosition pos;
89- auto source = select .Build (selectQuery , pos);
100+ TSqlSelect selectTranslator (context, context.Settings .Mode );
101+ TPosition pos = parentContext. Pos () ;
102+ auto source = selectTranslator .Build (selectStatement , pos);
90103 if (!source) {
104+ parentContext.Issues .AddIssues (issues);
91105 return nullptr ;
92106 }
93- return BuildSelectResult (
107+ auto node = BuildSelectResult (
94108 pos,
95109 std::move (source),
96110 false ,
97111 false ,
98112 context.Scoped
99113 );
114+ if (!node) {
115+ parentContext.Issues .AddIssues (issues);
116+ return nullptr ;
117+ }
118+ return node;
100119}
101120
102121}
@@ -4883,27 +4902,27 @@ bool TSqlTranslation::ParseViewQuery(
48834902 const TRule_select_stmt& query
48844903) {
48854904 TString queryText = CollectTokens (query);
4886- TString contextRestorationQuery ;
4905+ TString contextRecreationQuery ;
48874906 {
48884907 const auto & service = Ctx.Scoped ->CurrService ;
48894908 const auto & cluster = Ctx.Scoped ->CurrCluster ;
48904909 const auto effectivePathPrefix = Ctx.GetPrefixPath (service, cluster);
48914910
48924911 // TO DO: capture all runtime pragmas in a similar fashion.
48934912 if (effectivePathPrefix != Ctx.Settings .PathPrefix ) {
4894- contextRestorationQuery = TStringBuilder () << " PRAGMA TablePathPrefix = \" " << effectivePathPrefix << " \" ;\n " ;
4913+ contextRecreationQuery = TStringBuilder () << " PRAGMA TablePathPrefix = \" " << effectivePathPrefix << " \" ;\n " ;
48954914 }
48964915
48974916 // TO DO: capture other compilation-affecting statements except USE.
48984917 if (cluster.GetLiteral () && *cluster.GetLiteral () != Ctx.Settings .DefaultCluster ) {
4899- contextRestorationQuery = TStringBuilder () << " USE " << *cluster.GetLiteral () << " ;\n " ;
4918+ contextRecreationQuery = TStringBuilder () << " USE " << *cluster.GetLiteral () << " ;\n " ;
49004919 }
49014920 }
4902- features[" query_text" ] = { Ctx.Pos (), contextRestorationQuery + queryText };
4921+ features[" query_text" ] = { Ctx.Pos (), contextRecreationQuery + queryText };
49034922
49044923 // AST is needed for ready-made validation of CREATE VIEW statement.
49054924 // Query is stored as plain text, not AST.
4906- const auto viewSelect = BuildViewSelect (query, Ctx, contextRestorationQuery );
4925+ const auto viewSelect = BuildViewSelect (query, Ctx, contextRecreationQuery );
49074926 if (!viewSelect) {
49084927 return false ;
49094928 }
0 commit comments