diff --git a/src/quack_filter.cpp b/src/quack_filter.cpp index a0a85cb..099cdb2 100644 --- a/src/quack_filter.cpp +++ b/src/quack_filter.cpp @@ -47,6 +47,11 @@ FilterOperationSwitch(Datum &value, duckdb::Value &constant, Oid typeOid) { return TemplatedFilterOperation(dateDatum, constant); break; } + case TIMESTAMPOID: { + Datum timeStampDatum = static_cast(value + quack::QUACK_DUCK_TIMESTAMP_OFFSET); + return TemplatedFilterOperation(timeStampDatum, constant); + break; + } default: elog(ERROR, "(DuckDB/FilterOperationSwitch) Unsupported quack type: %d", typeOid); } diff --git a/src/quack_node.cpp b/src/quack_node.cpp index 7cc4d3e..ccb32e1 100644 --- a/src/quack_node.cpp +++ b/src/quack_node.cpp @@ -52,8 +52,9 @@ Quack_BeginCustomScan(CustomScanState *cscanstate, EState *estate, int eflags) { static TupleTableSlot * Quack_ExecCustomScan(CustomScanState *node) { QuackScanState *quackScanState = (QuackScanState *)node; - TupleTableSlot *slot = quackScanState->css.ss.ss_ScanTupleSlot; + MemoryContext oldContext; + if (!quackScanState->is_executed) { quackScanState->queryResult = quackScanState->preparedStatement->Execute(); @@ -66,13 +67,18 @@ Quack_ExecCustomScan(CustomScanState *node) { quackScanState->currentRow = 0; quackScanState->fetch_next = false; if (!quackScanState->currentDataChunk || quackScanState->currentDataChunk->size() == 0) { + MemoryContextReset(quackScanState->css.ss.ps.ps_ExprContext->ecxt_per_tuple_memory); ExecClearTuple(slot); return slot; } } + MemoryContextReset(quackScanState->css.ss.ps.ps_ExprContext->ecxt_per_tuple_memory); ExecClearTuple(slot); + /* MemoryContext used for allocation */ + oldContext = MemoryContextSwitchTo(quackScanState->css.ss.ps.ps_ExprContext->ecxt_per_tuple_memory); + for (idx_t col = 0; col < quackScanState->columnCount; col++) { auto value = quackScanState->currentDataChunk->GetValue(col, quackScanState->currentRow); if (value.IsNull()) { @@ -83,6 +89,8 @@ Quack_ExecCustomScan(CustomScanState *node) { } } + MemoryContextSwitchTo(oldContext); + quackScanState->currentRow++; if (quackScanState->currentRow >= quackScanState->currentDataChunk->size()) { delete quackScanState->currentDataChunk.release(); diff --git a/src/quack_types.cpp b/src/quack_types.cpp index bacb377..34ca106 100644 --- a/src/quack_types.cpp +++ b/src/quack_types.cpp @@ -111,6 +111,8 @@ GetPostgresDuckDBType(duckdb::LogicalTypeId type) { return INT4OID; case duckdb::LogicalTypeId::BIGINT: return INT8OID; + case duckdb::LogicalTypeId::HUGEINT: + return NUMERICOID; case duckdb::LogicalTypeId::VARCHAR: return VARCHAROID; case duckdb::LogicalTypeId::DATE: