If hash_search(HASH_ENTER) succeeds, but make_plan() fails,
due to statement_timeout/deadlock, then HTAB entry will
contain invalid values which leads to crash on next call.
Fix it by always fully initializing struct before calling make_plan().
Debugged-by: Martin Pihlak
[backport from 3.0]
entry = hash_search(insert_cache, &queue_id, HASH_ENTER, &did_exist);
if (did_exist)
{
- if (state->cur_table == entry->cur_table)
+ if (entry->plan && state->cur_table == entry->cur_table)
return entry->plan;
- SPI_freeplan(entry->plan);
+ if (entry->plan)
+ SPI_freeplan(entry->plan);
}
entry->cur_table = state->cur_table;
+ entry->plan = NULL;
+
+ /* this can fail, struct must be valid before */
entry->plan = make_plan(state);
+
return entry->plan;
}