@@ -53,31 +53,67 @@ TString CollectTokens(const TRule_select_stmt& selectStatement) {
53
53
return tokenCollector.Tokens ;
54
54
}
55
55
56
- NSQLTranslation::TTranslationSettings CreateViewTranslationSettings (const NSQLTranslation::TTranslationSettings& base) {
57
- NSQLTranslation::TTranslationSettings settings;
56
+ bool RecreateContext (
57
+ TContext& ctx, const NSQLTranslation::TTranslationSettings& settings, const TString& recreationQuery
58
+ ) {
59
+ if (!recreationQuery) {
60
+ return true ;
61
+ }
62
+ const TString queryName = " context recreation query" ;
63
+
64
+ const auto * ast = NSQLTranslationV1::SqlAST (
65
+ recreationQuery, queryName, ctx.Issues ,
66
+ settings.MaxErrors , settings.AnsiLexer , settings.Arena
67
+ );
68
+ if (!ast) {
69
+ return false ;
70
+ }
58
71
59
- settings. ClusterMapping = base. ClusterMapping ;
60
- settings. Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW ;
72
+ TSqlQuery queryTranslator (ctx, ctx. Settings . Mode , true ) ;
73
+ auto node = queryTranslator. Build ( static_cast < const TSQLv1ParserAST&>(*ast)) ;
61
74
62
- return settings ;
75
+ return node && node-> Init (ctx, nullptr ) && node-> Translate (ctx) ;
63
76
}
64
77
65
- TNodePtr BuildViewSelect (const TRule_select_stmt& query, TContext& ctx) {
66
- const auto viewTranslationSettings = CreateViewTranslationSettings (ctx.Settings );
67
- TContext viewParsingContext (viewTranslationSettings, {}, ctx.Issues );
68
- TSqlSelect select (viewParsingContext, viewTranslationSettings.Mode );
69
- TPosition pos;
70
- auto source = select .Build (query, pos);
78
+ TNodePtr BuildViewSelect (
79
+ const TRule_select_stmt& selectStatement,
80
+ TContext& parentContext,
81
+ const TString& contextRecreationQuery
82
+ ) {
83
+ TIssues issues;
84
+ TContext context (parentContext.Settings , {}, issues);
85
+ if (!RecreateContext (context, context.Settings , contextRecreationQuery)) {
86
+ parentContext.Issues .AddIssues (issues);
87
+ return nullptr ;
88
+ }
89
+ issues.Clear ();
90
+
91
+ // Holds (among other things) subquery references.
92
+ // These references need to be passed to the parent context
93
+ // to be able to compile view queries with subqueries.
94
+ context.PushCurrentBlocks (&parentContext.GetCurrentBlocks ());
95
+
96
+ context.Settings .Mode = NSQLTranslation::ESqlMode::LIMITED_VIEW;
97
+
98
+ TSqlSelect selectTranslator (context, context.Settings .Mode );
99
+ TPosition pos = parentContext.Pos ();
100
+ auto source = selectTranslator.Build (selectStatement, pos);
71
101
if (!source) {
102
+ parentContext.Issues .AddIssues (issues);
72
103
return nullptr ;
73
104
}
74
- return BuildSelectResult (
105
+ auto node = BuildSelectResult (
75
106
pos,
76
107
std::move (source),
77
108
false ,
78
109
false ,
79
- viewParsingContext .Scoped
110
+ context .Scoped
80
111
);
112
+ if (!node) {
113
+ parentContext.Issues .AddIssues (issues);
114
+ return nullptr ;
115
+ }
116
+ return node;
81
117
}
82
118
83
119
}
@@ -4568,6 +4604,7 @@ bool TSqlTranslation::ValidateExternalTable(const TCreateTableParameters& params
4568
4604
return true ;
4569
4605
}
4570
4606
4607
+ <<<<<<< HEAD
4571
4608
bool TSqlTranslation::ParseViewOptions (std::map<TString, TDeferredAtom>& features,
4572
4609
const TRule_with_table_settings& options) {
4573
4610
const auto & firstEntry = options.GetRule_table_settings_entry3 ();
@@ -4600,6 +4637,34 @@ bool TSqlTranslation::ParseViewQuery(std::map<TString, TDeferredAtom>& features,
4600
4637
features[" query_text" ] = {Ctx.Pos (), queryText};
4601
4638
4602
4639
const auto viewSelect = BuildViewSelect (query, Ctx);
4640
+ =======
4641
+ bool TSqlTranslation::ParseViewQuery (
4642
+ std::map<TString, TDeferredAtom>& features,
4643
+ const TRule_select_stmt& query
4644
+ ) {
4645
+ TString queryText = CollectTokens (query);
4646
+ TString contextRecreationQuery;
4647
+ {
4648
+ const auto & service = Ctx.Scoped ->CurrService ;
4649
+ const auto & cluster = Ctx.Scoped ->CurrCluster ;
4650
+ const auto effectivePathPrefix = Ctx.GetPrefixPath (service, cluster);
4651
+
4652
+ // TO DO: capture all runtime pragmas in a similar fashion.
4653
+ if (effectivePathPrefix != Ctx.Settings .PathPrefix ) {
4654
+ contextRecreationQuery = TStringBuilder () << " PRAGMA TablePathPrefix = \" " << effectivePathPrefix << " \" ;\n " ;
4655
+ }
4656
+
4657
+ // TO DO: capture other compilation-affecting statements except USE.
4658
+ if (cluster.GetLiteral () && *cluster.GetLiteral () != Ctx.Settings .DefaultCluster ) {
4659
+ contextRecreationQuery = TStringBuilder () << " USE " << *cluster.GetLiteral () << " ;\n " ;
4660
+ }
4661
+ }
4662
+ features[" query_text" ] = { Ctx.Pos (), contextRecreationQuery + queryText };
4663
+
4664
+ // AST is needed for ready-made validation of CREATE VIEW statement.
4665
+ // Query is stored as plain text, not AST.
4666
+ const auto viewSelect = BuildViewSelect (query, Ctx, contextRecreationQuery);
4667
+ >>>>>>> 98132426f0 (24 -3 : Enable subqueries inside views (#10517 ) (#10632 ))
4603
4668
if (!viewSelect) {
4604
4669
return false ;
4605
4670
}
0 commit comments