hack_hack_reverse_append_subpath_list.patch
application/octet-stream
Filename: hack_hack_reverse_append_subpath_list.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/nodes/list.c | 31 | 0 |
| src/backend/optimizer/path/allpaths.c | 1 | 1 |
| src/include/nodes/pg_list.h | 2 | 0 |
diff --git a/src/backend/nodes/list.c b/src/backend/nodes/list.c
index 1597b8e8127..cb686691bd9 100644
--- a/src/backend/nodes/list.c
+++ b/src/backend/nodes/list.c
@@ -1655,6 +1655,37 @@ list_copy_deep(const List *oldlist)
return newlist;
}
+/*
+ * Reverses the order of 'list' elements in place and returns the input list
+ */
+List *
+list_reverse(List *list)
+{
+ ListCell *head;
+ ListCell *tail;
+
+ if (list == NIL)
+ return NIL;
+
+ head = &list->elements[0];
+ tail = &list->elements[list->length - 1];
+
+ while (head < tail)
+ {
+ ListCell tmp;
+
+ /* Swap data at the head and tail position */
+ memcpy(&tmp, head, sizeof(ListCell));
+ memcpy(head, tail, sizeof(ListCell));
+ memcpy(tail, &tmp, sizeof(ListCell));
+
+ head++;
+ tail--;
+ }
+
+ return list;
+}
+
/*
* Sort a list according to the specified comparator function.
*
diff --git a/src/backend/optimizer/path/allpaths.c b/src/backend/optimizer/path/allpaths.c
index 6cc6966b060..a6ca409ac63 100644
--- a/src/backend/optimizer/path/allpaths.c
+++ b/src/backend/optimizer/path/allpaths.c
@@ -1523,7 +1523,7 @@ add_paths_to_append_rel(PlannerInfo *root, RelOptInfo *rel,
* if we have zero or one live subpath due to constraint exclusion.)
*/
if (subpaths_valid)
- add_path(rel, (Path *) create_append_path(root, rel, subpaths, NIL,
+ add_path(rel, (Path *) create_append_path(root, rel, list_reverse(subpaths), NIL,
NIL, NULL, 0, false,
-1));
diff --git a/src/include/nodes/pg_list.h b/src/include/nodes/pg_list.h
index 4d1cdbbcfdd..413549d8c3e 100644
--- a/src/include/nodes/pg_list.h
+++ b/src/include/nodes/pg_list.h
@@ -677,6 +677,8 @@ pg_nodiscard extern List *list_copy_head(const List *oldlist, int len);
pg_nodiscard extern List *list_copy_tail(const List *oldlist, int nskip);
pg_nodiscard extern List *list_copy_deep(const List *oldlist);
+extern List *list_reverse(List *list);
+
typedef int (*list_sort_comparator) (const ListCell *a, const ListCell *b);
extern void list_sort(List *list, list_sort_comparator cmp);