@@ -55,48 +55,67 @@ TString CollectTokens(const TRule_select_stmt& selectStatement) {
55
55
return tokenCollector.Tokens ;
56
56
}
57
57
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
60
60
) {
61
- const TString queryName = " context restoration query" ;
61
+ if (!recreationQuery) {
62
+ return true ;
63
+ }
64
+ const TString queryName = " context recreation query" ;
62
65
63
66
const auto * ast = NSQLTranslationV1::SqlAST (
64
- contextRestorationQuery , queryName, ctx.Issues ,
67
+ recreationQuery , queryName, ctx.Issues ,
65
68
settings.MaxErrors , settings.AnsiLexer , settings.Antlr4Parser , settings.TestAntlr4 , settings.Arena
66
69
);
67
70
if (!ast) {
68
71
return false ;
69
72
}
70
73
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));
73
76
74
77
return node && node->Init (ctx, nullptr ) && node->Translate (ctx);
75
78
}
76
79
77
80
TNodePtr BuildViewSelect (
78
- const TRule_select_stmt& selectQuery ,
81
+ const TRule_select_stmt& selectStatement ,
79
82
TContext& parentContext,
80
- const TString& contextRestorationQuery
83
+ const TString& contextRecreationQuery
81
84
) {
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 ());
84
97
85
98
context.Settings .Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
86
99
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);
90
103
if (!source) {
104
+ parentContext.Issues .AddIssues (issues);
91
105
return nullptr ;
92
106
}
93
- return BuildSelectResult (
107
+ auto node = BuildSelectResult (
94
108
pos,
95
109
std::move (source),
96
110
false ,
97
111
false ,
98
112
context.Scoped
99
113
);
114
+ if (!node) {
115
+ parentContext.Issues .AddIssues (issues);
116
+ return nullptr ;
117
+ }
118
+ return node;
100
119
}
101
120
102
121
}
@@ -4896,27 +4915,27 @@ bool TSqlTranslation::ParseViewQuery(
4896
4915
const TRule_select_stmt& query
4897
4916
) {
4898
4917
TString queryText = CollectTokens (query);
4899
- TString contextRestorationQuery ;
4918
+ TString contextRecreationQuery ;
4900
4919
{
4901
4920
const auto & service = Ctx.Scoped ->CurrService ;
4902
4921
const auto & cluster = Ctx.Scoped ->CurrCluster ;
4903
4922
const auto effectivePathPrefix = Ctx.GetPrefixPath (service, cluster);
4904
4923
4905
4924
// TO DO: capture all runtime pragmas in a similar fashion.
4906
4925
if (effectivePathPrefix != Ctx.Settings .PathPrefix ) {
4907
- contextRestorationQuery = TStringBuilder () << " PRAGMA TablePathPrefix = \" " << effectivePathPrefix << " \" ;\n " ;
4926
+ contextRecreationQuery = TStringBuilder () << " PRAGMA TablePathPrefix = \" " << effectivePathPrefix << " \" ;\n " ;
4908
4927
}
4909
4928
4910
4929
// TO DO: capture other compilation-affecting statements except USE.
4911
4930
if (cluster.GetLiteral () && *cluster.GetLiteral () != Ctx.Settings .DefaultCluster ) {
4912
- contextRestorationQuery = TStringBuilder () << " USE " << *cluster.GetLiteral () << " ;\n " ;
4931
+ contextRecreationQuery = TStringBuilder () << " USE " << *cluster.GetLiteral () << " ;\n " ;
4913
4932
}
4914
4933
}
4915
- features[" query_text" ] = { Ctx.Pos (), contextRestorationQuery + queryText };
4934
+ features[" query_text" ] = { Ctx.Pos (), contextRecreationQuery + queryText };
4916
4935
4917
4936
// AST is needed for ready-made validation of CREATE VIEW statement.
4918
4937
// Query is stored as plain text, not AST.
4919
- const auto viewSelect = BuildViewSelect (query, Ctx, contextRestorationQuery );
4938
+ const auto viewSelect = BuildViewSelect (query, Ctx, contextRecreationQuery );
4920
4939
if (!viewSelect) {
4921
4940
return false ;
4922
4941
}
0 commit comments