Skip to content

Commit 5b66cd7

Browse files
committed
Fixed issue with column filtering and projection
* Fixed incorrect column id for query filtering * Writing output vector now works with/without projection information
1 parent ebe5014 commit 5b66cd7

5 files changed

+24
-20
lines changed

include/quack/quack_heap_seq_scan.hpp

+5-6
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class PostgresHeapSeqParallelScanState {
3939

4040
public:
4141
PostgresHeapSeqParallelScanState()
42-
: m_nblocks(InvalidBlockNumber), m_last_assigned_block_number(InvalidBlockNumber), m_count_tuple_only(false),
42+
: m_nblocks(InvalidBlockNumber), m_last_assigned_block_number(InvalidBlockNumber), m_count_tuples_only(false),
4343
m_total_row_count(0), m_last_prefetch_block(0), m_strategy(nullptr) {
4444
}
4545
~PostgresHeapSeqParallelScanState() {
@@ -51,9 +51,9 @@ class PostgresHeapSeqParallelScanState {
5151
std::mutex m_lock;
5252
BlockNumber m_nblocks;
5353
BlockNumber m_last_assigned_block_number;
54-
bool m_count_tuple_only;
55-
duckdb::map<duckdb::column_t, duckdb::idx_t> m_columns;
56-
duckdb::map<duckdb::idx_t, duckdb::column_t> m_projections;
54+
bool m_count_tuples_only;
55+
duckdb::map<duckdb::idx_t, duckdb::idx_t> m_columns;
56+
duckdb::map<duckdb::idx_t, duckdb::idx_t> m_projections;
5757
duckdb::TableFilterSet *m_filters = nullptr;
5858
std::atomic<std::uint32_t> m_total_row_count;
5959
BlockNumber m_last_prefetch_block;
@@ -71,8 +71,7 @@ class PostgresHeapSeqScan {
7171
PostgresHeapSeqScan(PostgresHeapSeqScan &&other);
7272

7373
public:
74-
void InitParallelScanState(const duckdb::vector<duckdb::column_t> &columns,
75-
const duckdb::vector<duckdb::idx_t> &projections, duckdb::TableFilterSet *filters);
74+
void InitParallelScanState( duckdb::TableFunctionInitInput &input);
7675
void
7776
SetSnapshot(Snapshot snapshot) {
7877
m_snapshot = snapshot;

src/quack_heap_scan.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ PostgresHeapScanFunctionData::~PostgresHeapScanFunctionData() {
3131
PostgresHeapScanGlobalState::PostgresHeapScanGlobalState(PostgresHeapSeqScan &relation,
3232
duckdb::TableFunctionInitInput &input) {
3333
elog(DEBUG3, "-- (DuckDB/PostgresHeapScanGlobalState) Running %lu threads -- ", MaxThreads());
34-
relation.InitParallelScanState(input.column_ids, input.projection_ids, input.filters.get());
34+
relation.InitParallelScanState(input);
3535
}
3636

3737
PostgresHeapScanGlobalState::~PostgresHeapScanGlobalState() {

src/quack_heap_seq_scan.cpp

+16-10
Original file line numberDiff line numberDiff line change
@@ -56,27 +56,33 @@ PostgresHeapSeqScan::PreparePageRead(PostgresHeapSeqScanThreadInfo &threadScanIn
5656
}
5757

5858
void
59-
PostgresHeapSeqScan::InitParallelScanState(const duckdb::vector<duckdb::column_t> &columns,
60-
const duckdb::vector<duckdb::idx_t> &projections,
61-
duckdb::TableFilterSet *filters) {
59+
PostgresHeapSeqScan::InitParallelScanState( duckdb::TableFunctionInitInput &input) {
6260
m_parallel_scan_state.m_nblocks = RelationGetNumberOfBlocks(m_rel);
6361

64-
if (columns.size() == 1 && columns[0] == UINT64_MAX) {
65-
m_parallel_scan_state.m_count_tuple_only = true;
62+
/* SELECT COUNT(*) FROM */
63+
if (input.column_ids.size() == 1 && input.column_ids[0] == UINT64_MAX) {
64+
m_parallel_scan_state.m_count_tuples_only = true;
6665
return;
6766
}
6867

6968
/* We need ordered columns ids for tuple fetch */
70-
for (duckdb::idx_t i = 0; i < columns.size(); i++) {
71-
m_parallel_scan_state.m_columns[columns[i]] = i;
69+
for (duckdb::idx_t i = 0; i < input.column_ids.size(); i++) {
70+
m_parallel_scan_state.m_columns[input.column_ids[i]] = i;
7271
}
7372

74-
for (duckdb::idx_t i = 0; i < columns.size(); i++) {
75-
m_parallel_scan_state.m_projections[projections[i]] = columns[i];
73+
if (input.CanRemoveFilterColumns()) {
74+
for (duckdb::idx_t i = 0; i < input.projection_ids.size(); i++) {
75+
m_parallel_scan_state.m_projections[input.projection_ids[i]] = input.column_ids[i];
76+
}
77+
} else {
78+
for (duckdb::idx_t i = 0; i < input.projection_ids.size(); i++) {
79+
m_parallel_scan_state.m_projections[i] = input.column_ids[i];
80+
}
7681
}
7782

83+
7884
//m_parallel_scan_state.PrefetchNextRelationPages(m_rel);
79-
m_parallel_scan_state.m_filters = filters;
85+
m_parallel_scan_state.m_filters = input.filters.get();
8086
}
8187

8288
bool

src/quack_select.cpp

-1
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ quack_execute_select(QueryDesc *query_desc, ScanDirection direction, uint64_t co
7878
column_count = res->ColumnCount();
7979

8080
while (true) {
81-
8281
auto chunk = res->Fetch();
8382

8483
if (!chunk || chunk->size() == 0) {

src/quack_types.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ InsertTupleIntoChunk(duckdb::DataChunk &output, PostgresHeapSeqScanThreadInfo &t
239239
PostgresHeapSeqParallelScanState &parallelScanState) {
240240
HeapTupleReadState heapTupleReadState = {};
241241

242-
if (parallelScanState.m_count_tuple_only) {
242+
if (parallelScanState.m_count_tuples_only) {
243243
threadScanInfo.m_output_vector_size++;
244244
return;
245245
}
@@ -253,7 +253,7 @@ InsertTupleIntoChunk(duckdb::DataChunk &output, PostgresHeapSeqScanThreadInfo &t
253253
values[valueIdx] = HeapTupleFetchNextColumnDatum(threadScanInfo.m_tuple_desc, &threadScanInfo.m_tuple,
254254
heapTupleReadState, columnIdx + 1, &nulls[valueIdx]);
255255
if (parallelScanState.m_filters &&
256-
(parallelScanState.m_filters->filters.find(columnIdx) != parallelScanState.m_filters->filters.end())) {
256+
(parallelScanState.m_filters->filters.find(valueIdx) != parallelScanState.m_filters->filters.end())) {
257257
auto &filter = parallelScanState.m_filters->filters[valueIdx];
258258
validTuple = ApplyValueFilter(*filter, values[valueIdx], nulls[valueIdx],
259259
threadScanInfo.m_tuple_desc->attrs[columnIdx].atttypid);

0 commit comments

Comments
 (0)