Skip to content

Commit 572fa77

Browse files
committed
Do not append snipped plans when out memory
Do not try to snip it if there is not enough memory to append the whole plan, that is error prone and is not worth it. Instead, spit out a warning when this occurs.
1 parent 7d27ea2 commit 572fa77

File tree

1 file changed

+11
-12
lines changed

1 file changed

+11
-12
lines changed

pg_show_plans.c

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -280,24 +280,23 @@ append_query_plan(ExplainState *es)
280280

281281
offset = 0;
282282
for (i = 0; i < nest_level; i++)
283-
offset += pgsp_cache->plan_len[i] + 1;
283+
offset += pgsp_cache->plan_len[i] + 1; /* +1 for '\0'. */
284284
space_left = max_plan_length - offset;
285285

286286
if (pgsp->plan_format == EXPLAIN_FORMAT_TEXT)
287287
new_plan->len--; /* Discard '\n'. */
288288

289-
if (new_plan->len < space_left) { /* Enough space for a new plan. */
290-
memcpy(pgsp_cache->plan + offset,
291-
new_plan->data, new_plan->len);
292-
pgsp_cache->plan[offset + new_plan->len] = '\0';
293-
pgsp_cache->plan_len[nest_level] = new_plan->len;
294-
} else { /* No space left to hold a new plan, snip it. */
295-
memcpy(pgsp_cache->plan + offset,
296-
new_plan->data, space_left);
297-
pgsp_cache->plan[max_plan_length-1] = '\0';
298-
pgsp_cache->plan[max_plan_length-2] = '|'; /* Snip indicator. */
299-
pgsp_cache->plan_len[nest_level] = space_left;
289+
if (space_left < new_plan->len+1) {
290+
ereport(WARNING,
291+
errcode(ERRCODE_OUT_OF_MEMORY),
292+
errmsg("not enough memory to append new query plans"));
293+
return;
300294
}
295+
296+
memcpy(pgsp_cache->plan + offset,
297+
new_plan->data, new_plan->len);
298+
pgsp_cache->plan[offset + new_plan->len] = '\0';
299+
pgsp_cache->plan_len[nest_level] = new_plan->len;
301300
pgsp_cache->db_id = MyDatabaseId;
302301
pgsp_cache->n_plans = nest_level+1;
303302
}

0 commit comments

Comments
 (0)