Skip to content

Commit 6cf093b

Browse files
committed
fix: resolve SegFaults via proper PMR propagation and record boundaries
1 parent 548839c commit 6cf093b

8 files changed

Lines changed: 839 additions & 69 deletions

File tree

include/executor/operator.hpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,12 +74,12 @@ class Operator {
7474
[[nodiscard]] Transaction* get_txn() const { return txn_; }
7575
[[nodiscard]] LockManager* get_lock_manager() const { return lock_manager_; }
7676

77-
void set_memory_resource(std::pmr::memory_resource* mr) { mr_ = mr; }
77+
virtual void set_memory_resource(std::pmr::memory_resource* mr) { mr_ = mr; }
7878
[[nodiscard]] std::pmr::memory_resource* get_memory_resource() const {
7979
return mr_ ? mr_ : std::pmr::get_default_resource();
8080
}
8181

82-
void set_params(const std::vector<common::Value>* params) { params_ = params; }
82+
virtual void set_params(const std::vector<common::Value>* params) { params_ = params; }
8383
[[nodiscard]] const std::vector<common::Value>* get_params() const { return params_; }
8484

8585
virtual bool init() { return true; }
@@ -202,6 +202,9 @@ class FilterOperator : public Operator {
202202
void close() override;
203203
[[nodiscard]] Schema& output_schema() override;
204204
void add_child(std::unique_ptr<Operator> child) override;
205+
206+
void set_memory_resource(std::pmr::memory_resource* mr) override;
207+
void set_params(const std::vector<common::Value>* params) override;
205208
};
206209

207210
/**
@@ -223,6 +226,9 @@ class ProjectOperator : public Operator {
223226
void close() override;
224227
[[nodiscard]] Schema& output_schema() override;
225228
void add_child(std::unique_ptr<Operator> child) override;
229+
230+
void set_memory_resource(std::pmr::memory_resource* mr) override;
231+
void set_params(const std::vector<common::Value>* params) override;
226232
};
227233

228234
/**
@@ -247,6 +253,9 @@ class SortOperator : public Operator {
247253
bool next(Tuple& out_tuple) override;
248254
void close() override;
249255
[[nodiscard]] Schema& output_schema() override;
256+
257+
void set_memory_resource(std::pmr::memory_resource* mr) override;
258+
void set_params(const std::vector<common::Value>* params) override;
250259
};
251260

252261
/**
@@ -281,6 +290,9 @@ class AggregateOperator : public Operator {
281290
bool next(Tuple& out_tuple) override;
282291
void close() override;
283292
[[nodiscard]] Schema& output_schema() override;
293+
294+
void set_memory_resource(std::pmr::memory_resource* mr) override;
295+
void set_params(const std::vector<common::Value>* params) override;
284296
};
285297

286298
/**
@@ -330,6 +342,9 @@ class HashJoinOperator : public Operator {
330342
void close() override;
331343
[[nodiscard]] Schema& output_schema() override;
332344
void add_child(std::unique_ptr<Operator> child) override;
345+
346+
void set_memory_resource(std::pmr::memory_resource* mr) override;
347+
void set_params(const std::vector<common::Value>* params) override;
333348
};
334349

335350
/**
@@ -352,6 +367,9 @@ class LimitOperator : public Operator {
352367
void close() override;
353368
[[nodiscard]] Schema& output_schema() override;
354369
void add_child(std::unique_ptr<Operator> child) override;
370+
371+
void set_memory_resource(std::pmr::memory_resource* mr) override;
372+
void set_params(const std::vector<common::Value>* params) override;
355373
};
356374

357375
} // namespace cloudsql::executor

include/executor/types.hpp

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,12 @@
1111
#define CLOUDSQL_EXECUTOR_TYPES_HPP
1212

1313
#include <cstdint>
14-
#include <initializer_list>
1514
#include <memory>
1615
#include <memory_resource>
1716
#include <stdexcept>
1817
#include <string>
1918
#include <vector>
19+
#include <initializer_list>
2020

2121
#include "common/value.hpp"
2222

@@ -131,24 +131,29 @@ class Tuple {
131131

132132
public:
133133
Tuple() = default;
134-
134+
135135
// Explicit PMR vector constructor
136136
explicit Tuple(std::pmr::vector<common::Value> values) : values_(std::move(values)) {}
137-
138-
// Initializer list constructor to resolve ambiguity for {...}
137+
138+
// Initializer list constructor
139139
Tuple(std::initializer_list<common::Value> list) : values_(list) {}
140140

141141
// Support allocation from a custom memory resource
142-
explicit Tuple(std::pmr::memory_resource* mr) : values_(mr) {}
143-
144-
// Support construction from standard vector
145-
Tuple(const std::vector<common::Value>& values) : values_(values.begin(), values.end()) {}
146-
Tuple(std::vector<common::Value>&& values)
142+
explicit Tuple(std::pmr::memory_resource* mr)
143+
: values_(mr ? mr : std::pmr::get_default_resource()) {}
144+
145+
// Support construction from standard vector or PMR vector with specific resource
146+
template <typename VectorType,
147+
typename = std::enable_if_t<!std::is_same_v<std::decay_t<VectorType>, Tuple>>,
148+
typename std::enable_if_t<!std::is_same_v<std::decay_t<VectorType>, std::pmr::memory_resource*>>* = nullptr>
149+
Tuple(const VectorType& values, std::pmr::memory_resource* mr = nullptr)
150+
: values_(values.begin(), values.end(), mr ? mr : std::pmr::get_default_resource()) {}
151+
152+
template <typename VectorType,
153+
typename = std::enable_if_t<!std::is_same_v<std::decay_t<VectorType>, Tuple>>>
154+
explicit Tuple(VectorType&& values)
147155
: values_(std::make_move_iterator(values.begin()), std::make_move_iterator(values.end())) {}
148156

149-
Tuple(const std::vector<common::Value>& values, std::pmr::memory_resource* mr)
150-
: values_(values.begin(), values.end(), mr) {}
151-
152157
Tuple(const Tuple& other) = default;
153158
Tuple(Tuple&& other) noexcept = default;
154159
Tuple& operator=(const Tuple& other) = default;

include/storage/heap_table.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,12 @@ class HeapTable {
104104

105105
public:
106106
explicit Iterator(HeapTable& table, std::pmr::memory_resource* mr = nullptr);
107+
~Iterator() = default;
107108

109+
Iterator(const Iterator&) = default;
110+
Iterator& operator=(const Iterator&) = default;
111+
Iterator(Iterator&&) noexcept = default;
112+
Iterator& operator=(Iterator&&) noexcept = default;
108113
/**
109114
* @brief Fetches the next non-deleted record from the heap
110115
* @param[out] out_tuple Container for the retrieved record

0 commit comments

Comments
 (0)