pg_identify_object_as_address-crash.patch
text/x-diff
Filename: pg_identify_object_as_address-crash.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/catalog/objectaddress.c | 16 | 4 |
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index bd55dfd08e3..479087592da 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -3576,7 +3576,10 @@ pg_identify_object_as_address(PG_FUNCTION_ARGS)
pfree(identity);
/* object_names */
- values[1] = PointerGetDatum(strlist_to_textarray(names));
+ if (names != NIL)
+ values[1] = PointerGetDatum(strlist_to_textarray(names));
+ else
+ values[1] = PointerGetDatum(construct_empty_array(TEXTOID));
nulls[1] = false;
/* object_args */
@@ -4803,10 +4806,12 @@ strlist_to_textarray(List *list)
{
ArrayType *arr;
Datum *datums;
+ bool *nulls;
int j = 0;
ListCell *cell;
MemoryContext memcxt;
MemoryContext oldcxt;
+ int one = 1;
memcxt = AllocSetContextCreate(CurrentMemoryContext,
"strlist to array",
@@ -4814,17 +4819,24 @@ strlist_to_textarray(List *list)
oldcxt = MemoryContextSwitchTo(memcxt);
datums = palloc(sizeof(text *) * list_length(list));
+ nulls = palloc(sizeof(bool) * list_length(list));
foreach(cell, list)
{
char *name = lfirst(cell);
- datums[j++] = CStringGetTextDatum(name);
+ if (name)
+ {
+ nulls[j] = false;
+ datums[j++] = CStringGetTextDatum(name);
+ }
+ else
+ nulls[j++] = true;
}
MemoryContextSwitchTo(oldcxt);
- arr = construct_array(datums, list_length(list),
- TEXTOID, -1, false, 'i');
+ arr = construct_md_array(datums, nulls, 1, &j,
+ &one, TEXTOID, -1, false, 'i');
MemoryContextDelete(memcxt);
return arr;