Skip to content

Commit d897bc5

Browse files
authored
Merge pull request #1150 from smvv/fix-retry-transaction
Fix off-by-one in retry transaction
2 parents c80b915 + 97e32ee commit d897bc5

14 files changed

Lines changed: 236 additions & 231 deletions

duckdb

Submodule duckdb updated 738 files

extension-ci-tools

src/common/ducklake_util.cpp

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
#include "duckdb/parser/parser.hpp"
66
#include "duckdb/common/file_system.hpp"
77
#include "storage/ducklake_metadata_manager.hpp"
8-
#include "duckdb/planner/filter/optional_filter.hpp"
9-
#include "duckdb/planner/filter/dynamic_filter.hpp"
8+
#include "duckdb/planner/filter/expression_filter.hpp"
9+
#include "duckdb/planner/filter/table_filter_functions.hpp"
1010
#include "duckdb/function/scalar/variant_utils.hpp"
1111

1212
#include <cmath>
@@ -321,19 +321,8 @@ string DuckLakeUtil::JoinPath(FileSystem &fs, const string &a, const string &b)
321321
}
322322
}
323323

324-
DynamicFilter *DuckLakeUtil::GetOptionalDynamicFilter(const TableFilter &filter) {
325-
if (filter.filter_type != TableFilterType::OPTIONAL_FILTER) {
326-
return nullptr;
327-
}
328-
auto &optional = filter.Cast<OptionalFilter>();
329-
if (!optional.child_filter || optional.child_filter->filter_type != TableFilterType::DYNAMIC_FILTER) {
330-
return nullptr;
331-
}
332-
auto &dynamic = optional.child_filter->Cast<DynamicFilter>();
333-
if (!dynamic.filter_data) {
334-
return nullptr;
335-
}
336-
return &dynamic;
324+
shared_ptr<DynamicFilterData> DuckLakeUtil::GetOptionalDynamicFilterData(const TableFilter &filter) {
325+
return ExpressionFilter::GetRootOptionalDynamicFilterData(filter);
337326
}
338327

339328
bool DuckLakeUtil::IsInlinedSystemColumn(const string &name) {

src/functions/ducklake_flush_inlined_data.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -738,8 +738,8 @@ static unique_ptr<LogicalOperator> FlushInlinedDataBind(ClientContext &context,
738738
unique_ptr<Expression> sum_col_ref = make_uniq<BoundColumnRefExpression>(aggregate->types[2], agg_bindings[2]);
739739
// Note: SUM(BIGINT) returns HUGEINT. We must use the its output type for the 0 constant
740740
unique_ptr<Expression> zero_const = make_uniq<BoundConstantExpression>(Value::Numeric(aggregate->types[2], 0));
741-
unique_ptr<Expression> filter_expr = make_uniq<BoundComparisonExpression>(
742-
ExpressionType::COMPARE_GREATERTHAN, std::move(sum_col_ref), std::move(zero_const));
741+
unique_ptr<Expression> filter_expr =
742+
BoundComparisonExpression::Create(ExpressionType::COMPARE_GREATERTHAN, std::move(sum_col_ref), std::move(zero_const));
743743

744744
auto filter = make_uniq<LogicalFilter>(std::move(filter_expr));
745745
filter->children.push_back(std::move(aggregate));

src/include/common/ducklake_util.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ namespace duckdb {
1616
class DuckLakeMetadataManager;
1717
class FileSystem;
1818
class TableFilter;
19-
class DynamicFilter;
19+
struct DynamicFilterData;
2020

2121
struct ParsedCatalogEntry {
2222
string schema;
@@ -36,7 +36,7 @@ class DuckLakeUtil {
3636
static ParsedCatalogEntry ParseCatalogEntry(const string &input);
3737
static string JoinPath(FileSystem &fs, const string &a, const string &b);
3838

39-
static DynamicFilter *GetOptionalDynamicFilter(const TableFilter &filter);
39+
static shared_ptr<DynamicFilterData> GetOptionalDynamicFilterData(const TableFilter &filter);
4040

4141
//! Create the data path directory if it does not yet exist
4242
static void EnsureDirectoryExists(FileSystem &fs, const string &data_path);

src/include/storage/ducklake_metadata_manager.hpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "common/ducklake_encryption.hpp"
2323
#include "common/ducklake_options.hpp"
2424
#include "common/index.hpp"
25+
#include "duckdb/planner/filter/expression_filter.hpp"
2526
#include "duckdb/planner/table_filter.hpp"
2627

2728
namespace duckdb {
@@ -33,7 +34,6 @@ class DuckLakeTransaction;
3334
class BoundAtClause;
3435
class QueryResult;
3536
class FileSystem;
36-
class ConstantFilter;
3737

3838
struct SnapshotAndStats;
3939
struct FlushedInlinedTableInfo;
@@ -62,16 +62,27 @@ struct FilterSQLResult {
6262
struct ColumnFilterInfo {
6363
idx_t column_field_index;
6464
LogicalType column_type;
65-
unique_ptr<TableFilter> table_filter;
65+
unique_ptr<ExpressionFilter> table_filter;
6666

67-
ColumnFilterInfo(idx_t col_idx, LogicalType type, unique_ptr<TableFilter> filter)
67+
ColumnFilterInfo(idx_t col_idx, LogicalType type, unique_ptr<ExpressionFilter> filter)
6868
: column_field_index(col_idx), column_type(std::move(type)), table_filter(std::move(filter)) {
6969
}
7070

7171
ColumnFilterInfo(const ColumnFilterInfo &other)
7272
: column_field_index(other.column_field_index), column_type(other.column_type),
7373
table_filter(other.table_filter->Copy()) {
7474
}
75+
76+
ColumnFilterInfo(ColumnFilterInfo &&other) = default;
77+
ColumnFilterInfo &operator=(ColumnFilterInfo &&other) = default;
78+
ColumnFilterInfo &operator=(const ColumnFilterInfo &other) {
79+
if (this != &other) {
80+
column_field_index = other.column_field_index;
81+
column_type = other.column_type;
82+
table_filter = other.table_filter ? other.table_filter->Copy() : nullptr;
83+
}
84+
return *this;
85+
}
7586
};
7687

7788
struct FilterPushdownInfo {
@@ -321,16 +332,19 @@ class DuckLakeMetadataManager {
321332
virtual FilterSQLResult ConvertFilterPushdownToSQL(const FilterPushdownInfo &filter_info);
322333
virtual string GenerateCTESectionFromRequirements(const unordered_map<idx_t, CTERequirement> &requirements,
323334
TableIndex table_id);
324-
virtual string GenerateFilterFromTableFilter(const TableFilter &filter, const LogicalType &type,
335+
virtual string GenerateFilterFromTableFilter(const ExpressionFilter &filter, const LogicalType &type,
325336
unordered_set<string> &referenced_stats);
337+
virtual string GenerateFilterFromExpression(const Expression &expr, const LogicalType *type,
338+
unordered_set<string> &referenced_stats);
326339
virtual bool ValueIsFinite(const Value &val);
327340
virtual string CastValueToTarget(const Value &val, const LogicalType &type);
328341
virtual string CastStatsToTarget(const string &stats, const LogicalType &type);
329-
virtual string GenerateConstantFilter(const ConstantFilter &constant_filter, const LogicalType &type,
342+
virtual string GenerateConstantFilter(ExpressionType comparison_type, const Value &constant, const LogicalType &type,
330343
unordered_set<string> &referenced_stats);
331-
virtual string GenerateConstantFilterDouble(const ConstantFilter &constant_filter, const LogicalType &type,
344+
virtual string GenerateConstantFilterDouble(ExpressionType comparison_type, const Value &constant,
345+
const LogicalType &type,
332346
unordered_set<string> &referenced_stats);
333-
virtual string GenerateFilterPushdown(const TableFilter &filter, unordered_set<string> &referenced_stats);
347+
virtual string GenerateFilterPushdown(const ExpressionFilter &filter, unordered_set<string> &referenced_stats);
334348

335349
public:
336350
//! Read inlined file deletions for regular table scans (no snapshot info per row)

src/storage/ducklake_delete_filter.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ DeleteFileScanResult DuckLakeDeleteFilter::ScanDeletionVectorFile(ClientContext
139139
unique_ptr<ExpressionFilter> MakeComparisonFilter(ExpressionType comparison_type, Value constant) {
140140
auto col_ref = make_uniq<BoundReferenceExpression>(LogicalType::BIGINT, storage_t(0));
141141
auto bound_constant = make_uniq<BoundConstantExpression>(std::move(constant));
142-
auto comparison = make_uniq<BoundComparisonExpression>(comparison_type, std::move(col_ref),
143-
std::move(bound_constant));
142+
auto comparison = BoundComparisonExpression::Create(comparison_type, std::move(col_ref),
143+
std::move(bound_constant));
144144
return make_uniq<ExpressionFilter>(std::move(comparison));
145145
}
146146

src/storage/ducklake_inlined_data_reader.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ AsyncResult DuckLakeInlinedDataReader::Scan(ClientContext &context, GlobalTableF
269269
if (filters) {
270270
for (auto &entry : *filters) {
271271
auto &filter = entry.Filter();
272-
if (filter.filter_type == TableFilterType::OPTIONAL_FILTER) {
272+
if (ExpressionFilter::IsRootOptionalFilter(filter)) {
273273
continue;
274274
}
275275
auto column_id = entry.GetIndex().GetIndex();

0 commit comments

Comments
 (0)