Skip to content

Commit

Permalink
Fix bug with rescan.
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangyue-hashdata committed Jan 26, 2025
1 parent eca9ce2 commit 2ea19a0
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 4 deletions.
25 changes: 21 additions & 4 deletions src/backend/executor/nodeSeqscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,6 @@ SeqNext(SeqScanState *node)

if (scandesc == NULL)
{
int nkeys = 0;
ScanKey keys = NULL;

/*
Expand All @@ -84,15 +83,15 @@ SeqNext(SeqScanState *node)
* AM.
*/
if (gp_enable_runtime_filter_pushdown && !node->filter_in_seqscan)
keys = ScanKeyListToArray(node->filters, &nkeys);
keys = ScanKeyListToArray(node->filters, &node->num_scan_keys);

/*
* We reach here if the scan is not parallel, or if we're serially
* executing a scan that was planned to be parallel.
*/
scandesc = table_beginscan_es(node->ss.ss_currentRelation,
estate->es_snapshot,
nkeys, keys,
node->num_scan_keys, keys,
NULL,
&node->ss.ps);
node->ss.ss_currentScanDesc = scandesc;
Expand Down Expand Up @@ -283,12 +282,27 @@ void
ExecReScanSeqScan(SeqScanState *node)
{
TableScanDesc scan;
ScanKey keys;

scan = node->ss.ss_currentScanDesc;

/*
* Clear all the pushdown scan keys.
*/
keys = NULL;
if (node->num_scan_keys)
{
keys = (ScanKey)palloc(sizeof(ScanKeyData) * node->num_scan_keys);
for (int i = 0; i < node->num_scan_keys; ++i)
keys[i].sk_flags = SK_EMPYT;
}

if (scan != NULL)
table_rescan(scan, /* scan desc */
NULL); /* new scan keys */
keys); /* new scan keys */

if (keys)
pfree(keys);

ExecScanReScan((ScanState *) node);
}
Expand Down Expand Up @@ -455,7 +469,10 @@ ScanKeyListToArray(List *keys, int *num)
ScanKey sk;

if (list_length(keys) == 0)
{
*num = 0;
return NULL;
}

Assert(num);
*num = list_length(keys);
Expand Down
2 changes: 2 additions & 0 deletions src/include/nodes/execnodes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1553,6 +1553,8 @@ typedef struct SeqScanState
List *filters; /* the list of struct ScanKeyData */
bool filter_in_seqscan; /* check scan slot with runtime filters in
seqscan node or in am */
int num_scan_keys; /* valid if filter_in_seqscan is false,
number of pushdown scan keys */
} SeqScanState;

/* ----------------
Expand Down

0 comments on commit 2ea19a0

Please sign in to comment.