@@ -172,6 +172,12 @@ FutureSetFromSubquery::FutureSetFromSubquery(
172172FutureSetFromSubquery::~FutureSetFromSubquery () = default ;
173173
174174SetPtr FutureSetFromSubquery::get () const
175+ {
176+ std::lock_guard lock (mutex);
177+ return get_unsafe ();
178+ }
179+
180+ SetPtr FutureSetFromSubquery::get_unsafe () const
175181{
176182 if (set_and_key->set != nullptr && set_and_key->set ->isCreated ())
177183 return set_and_key->set ;
@@ -181,20 +187,32 @@ SetPtr FutureSetFromSubquery::get() const
181187
182188void FutureSetFromSubquery::setQueryPlan (std::unique_ptr<QueryPlan> source_)
183189{
190+ std::lock_guard lock (mutex);
184191 source = std::move (source_);
185192 set_and_key->set ->setHeader (source->getCurrentHeader ()->getColumnsWithTypeAndName ());
186193}
187194
188- void FutureSetFromSubquery::setExternalTable (StoragePtr external_table_) { external_table = std::move (external_table_); }
195+ void FutureSetFromSubquery::setExternalTable (StoragePtr external_table_)
196+ {
197+ std::lock_guard lock (mutex);
198+ external_table = std::move (external_table_);
199+ }
189200
190201DataTypes FutureSetFromSubquery::getTypes () const
191202{
203+ std::lock_guard lock (mutex);
192204 return set_and_key->set ->getElementsTypes ();
193205}
194206
195207FutureSet::Hash FutureSetFromSubquery::getHash () const { return hash; }
196208
197209std::unique_ptr<QueryPlan> FutureSetFromSubquery::build (const SizeLimits & network_transfer_limits, const PreparedSetsCachePtr & prepared_sets_cache)
210+ {
211+ std::lock_guard lock (mutex);
212+ return build_unsafe (network_transfer_limits, prepared_sets_cache);
213+ }
214+
215+ std::unique_ptr<QueryPlan> FutureSetFromSubquery::build_unsafe (const SizeLimits & network_transfer_limits, const PreparedSetsCachePtr & prepared_sets_cache)
198216{
199217 if (set_and_key->set ->isCreated ())
200218 return nullptr ;
@@ -217,14 +235,16 @@ std::unique_ptr<QueryPlan> FutureSetFromSubquery::build(const SizeLimits & netwo
217235
218236void FutureSetFromSubquery::buildSetInplace (const ContextPtr & context)
219237{
238+ std::lock_guard lock (mutex);
239+
220240 if (external_table_set)
221241 external_table_set->buildSetInplace (context);
222242
223243 const auto & settings = context->getSettingsRef ();
224244 SizeLimits network_transfer_limits (settings[Setting::max_rows_to_transfer], settings[Setting::max_bytes_to_transfer], settings[Setting::transfer_overflow_mode]);
225245 auto prepared_sets_cache = context->getPreparedSetsCache ();
226246
227- auto plan = build (network_transfer_limits, prepared_sets_cache);
247+ auto plan = build_unsafe (network_transfer_limits, prepared_sets_cache);
228248
229249 if (!plan)
230250 return ;
@@ -242,7 +262,9 @@ SetPtr FutureSetFromSubquery::buildOrderedSetInplace(const ContextPtr & context)
242262 if (!context->getSettingsRef ()[Setting::use_index_for_in_with_subqueries])
243263 return nullptr ;
244264
245- if (auto set = get ())
265+ std::lock_guard lock (mutex);
266+
267+ if (auto set = get_unsafe ())
246268 {
247269 if (set->hasExplicitSetElements ())
248270 return set;
@@ -264,7 +286,7 @@ SetPtr FutureSetFromSubquery::buildOrderedSetInplace(const ContextPtr & context)
264286 SizeLimits network_transfer_limits (settings[Setting::max_rows_to_transfer], settings[Setting::max_bytes_to_transfer], settings[Setting::transfer_overflow_mode]);
265287 auto prepared_sets_cache = context->getPreparedSetsCache ();
266288
267- auto plan = build (network_transfer_limits, prepared_sets_cache);
289+ auto plan = build_unsafe (network_transfer_limits, prepared_sets_cache);
268290 if (!plan)
269291 return nullptr ;
270292
0 commit comments