Add COPY_ARRAY_FIELD and COMPARE_ARRAY_FIELD

These handle node fields that are inline arrays (as opposed to
dynamically allocated arrays handled by COPY_POINTER_FIELD and
COMPARE_POINTER_FIELD).  These cases were hand-coded until now.

Reviewed-by: Jacob Champion <pchampion@vmware.com>
Discussion: https://www.postgresql.org/message-id/c091e5cd-45f8-69ee-6a9b-de86912cc7e7@enterprisedb.com
This commit is contained in:
Peter Eisentraut 2021-09-14 09:34:50 +02:00
parent 8539929197
commit 308da179e7
2 changed files with 14 additions and 4 deletions

View File

@ -53,6 +53,10 @@
#define COPY_STRING_FIELD(fldname) \ #define COPY_STRING_FIELD(fldname) \
(newnode->fldname = from->fldname ? pstrdup(from->fldname) : (char *) NULL) (newnode->fldname = from->fldname ? pstrdup(from->fldname) : (char *) NULL)
/* Copy a field that is an inline array */
#define COPY_ARRAY_FIELD(fldname) \
memcpy(newnode->fldname, from->fldname, sizeof(newnode->fldname))
/* Copy a field that is a pointer to a simple palloc'd object of size sz */ /* Copy a field that is a pointer to a simple palloc'd object of size sz */
#define COPY_POINTER_FIELD(fldname, sz) \ #define COPY_POINTER_FIELD(fldname, sz) \
do { \ do { \
@ -4947,10 +4951,9 @@ _copyForeignKeyCacheInfo(const ForeignKeyCacheInfo *from)
COPY_SCALAR_FIELD(conrelid); COPY_SCALAR_FIELD(conrelid);
COPY_SCALAR_FIELD(confrelid); COPY_SCALAR_FIELD(confrelid);
COPY_SCALAR_FIELD(nkeys); COPY_SCALAR_FIELD(nkeys);
/* COPY_SCALAR_FIELD might work for these, but let's not assume that */ COPY_ARRAY_FIELD(conkey);
memcpy(newnode->conkey, from->conkey, sizeof(newnode->conkey)); COPY_ARRAY_FIELD(confkey);
memcpy(newnode->confkey, from->confkey, sizeof(newnode->confkey)); COPY_ARRAY_FIELD(conpfeqop);
memcpy(newnode->conpfeqop, from->conpfeqop, sizeof(newnode->conpfeqop));
return newnode; return newnode;
} }

View File

@ -74,6 +74,13 @@
#define equalstr(a, b) \ #define equalstr(a, b) \
(((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b)) (((a) != NULL && (b) != NULL) ? (strcmp(a, b) == 0) : (a) == (b))
/* Compare a field that is an inline array */
#define COMPARE_ARRAY_FIELD(fldname) \
do { \
if (memcmp(a->fldname, b->fldname, sizeof(a->fldname)) != 0) \
return false; \
} while (0)
/* Compare a field that is a pointer to a simple palloc'd object of size sz */ /* Compare a field that is a pointer to a simple palloc'd object of size sz */
#define COMPARE_POINTER_FIELD(fldname, sz) \ #define COMPARE_POINTER_FIELD(fldname, sz) \
do { \ do { \