On 02.01.25 17:15, Tom Lane wrote:
It's a fair point that some documentation could be provided. I suppose
we don't want to verbosely explain each pragma individually. Should
there be some central explanation, maybe in src/tools/pginclude/README?
That might do, but perhaps instead in the "PostgreSQL Coding
Conventions" chapter of the SGML docs? Actually, I think we could do
with a centralized explanation of our inclusion conventions --- I'm
not sure that the whole business of "postgres.h or a sibling must be
first" is explained in any easy-to-find place. This topic would
likely fit well with such an explanation.
In this updated patch set, I've just added a bit of info into
src/tools/pginclude/README. Updating the coding convention
documentation like you suggest also sounds like a good idea, but from my
perspective I would need to do further research to pin down what those
actually are, so I'm leaving that as a separate project.
(See for example the business in src/tools/pginclude/headerscheck about
guessing which the appropriate first header file should be for each
component. That kind of thing perhaps ought to be more formalized.)
But really, the point I was trying to make above is that I don't
want this to break our very long-standing convention that headers
should be #include'd alphabetically and there is never a need to
impose some other order (at least not without lots of commentary
about it at the scene of the crime). The way you've done it here
is just asking for trouble, IMO. If that means redundant pragma
commands, so be it.
Yeah, that's a fair point. I have removed that part from my patch set.
From b185a841272ef14af7dcdf99759d0e6d775f6746 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Thu, 9 Jan 2025 12:34:09 +0100
Subject: [PATCH v2 1/3] IWYU widely useful pragmas
Add various widely useful "IWYU pragma" annotations, such as
- Common header files such as c.h, postgres.h should be "always_keep".
- System headers included in c.h, postgres.h etc. should be considered
"export".
- Some portability headers such as getopt_long.h should be
"always_keep", so they are not considered superfluous on some
platforms.
- Certain system headers included from portability headers should be
considered "export" because the purpose of the portability header is
to wrap them.
- Superfluous includes marked as "for backward compatibility" get a
formal IWYU annotation.
- Generated header included in utils/syscache.h is marked exported.
This is a very commonly used include and this avoids lots of
complaints.
Discussion:
https://www.postgresql.org/message-id/flat/9395d484-eff4-47c2-b276-8e228526c...@eisentraut.org
---
src/include/c.h | 5 +++++
src/include/getopt_long.h | 3 ++-
src/include/pg_getopt.h | 5 +++--
src/include/pg_trace.h | 2 +-
src/include/pgstat.h | 6 +++---
src/include/port/pg_iovec.h | 2 +-
src/include/port/pg_pthread.h | 2 +-
src/include/postgres.h | 5 +++++
src/include/postgres_ext.h | 1 +
src/include/postgres_fe.h | 5 +++++
src/include/utils/syscache.h | 2 +-
src/interfaces/libpq/libpq-int.h | 2 ++
12 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/src/include/c.h b/src/include/c.h
index ab6a49aeca4..a14c6315162 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -16,6 +16,7 @@
*
*-------------------------------------------------------------------------
*/
+/* IWYU pragma: always_keep */
/*
*----------------------------------------------------------------
* TABLE OF CONTENTS
@@ -46,6 +47,8 @@
#ifndef C_H
#define C_H
+/* IWYU pragma: begin_exports */
+
/*
* These headers must be included before any system headers, because on some
* platforms they affect the behavior of the system headers (for example, by
@@ -1327,4 +1330,6 @@ typedef intptr_t sigjmp_buf[5];
/* /port compatibility functions */
#include "port.h"
+/* IWYU pragma: end_exports */
+
#endif /* C_H */
diff --git a/src/include/getopt_long.h b/src/include/getopt_long.h
index 33b4755a664..e7bdf909f7b 100644
--- a/src/include/getopt_long.h
+++ b/src/include/getopt_long.h
@@ -6,10 +6,11 @@
*
* src/include/getopt_long.h
*/
+/* IWYU pragma: always_keep */
#ifndef GETOPT_LONG_H
#define GETOPT_LONG_H
-#include "pg_getopt.h"
+#include "pg_getopt.h" /* IWYU pragma: export */
#ifndef HAVE_STRUCT_OPTION
diff --git a/src/include/pg_getopt.h b/src/include/pg_getopt.h
index 2e2d64f4a26..aad0886c054 100644
--- a/src/include/pg_getopt.h
+++ b/src/include/pg_getopt.h
@@ -15,15 +15,16 @@
*
* src/include/pg_getopt.h
*/
+/* IWYU pragma: always_keep */
#ifndef PG_GETOPT_H
#define PG_GETOPT_H
/* POSIX says getopt() is provided by unistd.h */
-#include <unistd.h>
+#include <unistd.h> /* IWYU pragma: export */
/* rely on the system's getopt.h if present */
#ifdef HAVE_GETOPT_H
-#include <getopt.h>
+#include <getopt.h> /* IWYU pragma: export */
#endif
/*
diff --git a/src/include/pg_trace.h b/src/include/pg_trace.h
index aca6d727d30..c82f34726f7 100644
--- a/src/include/pg_trace.h
+++ b/src/include/pg_trace.h
@@ -12,6 +12,6 @@
#ifndef PG_TRACE_H
#define PG_TRACE_H
-#include "utils/probes.h"
+#include "utils/probes.h" /* IWYU pragma: export */
#endif /* PG_TRACE_H */
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 6475889c58c..8d1c8946b9d 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -16,10 +16,10 @@
#include "portability/instr_time.h"
#include "postmaster/pgarch.h" /* for MAX_XFN_CHARS */
#include "replication/conflict.h"
-#include "utils/backend_progress.h" /* for backward compatibility */
-#include "utils/backend_status.h" /* for backward compatibility */
+#include "utils/backend_progress.h" /* for backward compatibility */ /* IWYU
pragma: export */
+#include "utils/backend_status.h" /* for backward compatibility */
/* IWYU pragma: export */
#include "utils/relcache.h"
-#include "utils/wait_event.h" /* for backward compatibility */
+#include "utils/wait_event.h" /* for backward compatibility */ /* IWYU
pragma: export */
/* ----------
diff --git a/src/include/port/pg_iovec.h b/src/include/port/pg_iovec.h
index f3df9c94639..d9891d3805d 100644
--- a/src/include/port/pg_iovec.h
+++ b/src/include/port/pg_iovec.h
@@ -16,7 +16,7 @@
#ifndef WIN32
#include <limits.h>
-#include <sys/uio.h>
+#include <sys/uio.h> /* IWYU pragma: export */
#include <unistd.h>
#else
diff --git a/src/include/port/pg_pthread.h b/src/include/port/pg_pthread.h
index d102ce9d6f3..4dbb3c8a52f 100644
--- a/src/include/port/pg_pthread.h
+++ b/src/include/port/pg_pthread.h
@@ -13,7 +13,7 @@
#ifndef PG_PTHREAD_H
#define PG_PTHREAD_H
-#include <pthread.h>
+#include <pthread.h> /* IWYU pragma: export */
#ifndef HAVE_PTHREAD_BARRIER_WAIT
diff --git a/src/include/postgres.h b/src/include/postgres.h
index cdce4823e7e..8a41a668687 100644
--- a/src/include/postgres.h
+++ b/src/include/postgres.h
@@ -14,6 +14,7 @@
*
*-------------------------------------------------------------------------
*/
+/* IWYU pragma: always_keep */
/*
*----------------------------------------------------------------
* TABLE OF CONTENTS
@@ -42,10 +43,14 @@
#ifndef POSTGRES_H
#define POSTGRES_H
+/* IWYU pragma: begin_exports */
+
#include "c.h"
#include "utils/elog.h"
#include "utils/palloc.h"
+/* IWYU pragma: end_exports */
+
/* ----------------------------------------------------------------
* Section 1: Datum type + support functions
* ----------------------------------------------------------------
diff --git a/src/include/postgres_ext.h b/src/include/postgres_ext.h
index 202eb049622..9f2e3c52972 100644
--- a/src/include/postgres_ext.h
+++ b/src/include/postgres_ext.h
@@ -19,6 +19,7 @@
*
*-------------------------------------------------------------------------
*/
+/* IWYU pragma: always_keep */
#ifndef POSTGRES_EXT_H
#define POSTGRES_EXT_H
diff --git a/src/include/postgres_fe.h b/src/include/postgres_fe.h
index dc6dc6e812a..a3f65b1dca4 100644
--- a/src/include/postgres_fe.h
+++ b/src/include/postgres_fe.h
@@ -15,6 +15,7 @@
*
*-------------------------------------------------------------------------
*/
+/* IWYU pragma: always_keep */
#ifndef POSTGRES_FE_H
#define POSTGRES_FE_H
@@ -22,8 +23,12 @@
#define FRONTEND 1
#endif
+/* IWYU pragma: begin_exports */
+
#include "c.h"
#include "common/fe_memutils.h"
+/* IWYU pragma: end_exports */
+
#endif /* POSTGRES_FE_H */
diff --git a/src/include/utils/syscache.h b/src/include/utils/syscache.h
index 537fd03e8bd..3039713259e 100644
--- a/src/include/utils/syscache.h
+++ b/src/include/utils/syscache.h
@@ -20,7 +20,7 @@
#include "access/htup.h"
/* we intentionally do not include utils/catcache.h here */
-#include "catalog/syscache_ids.h"
+#include "catalog/syscache_ids.h" /* IWYU pragma: export */
extern void InitCatalogCache(void);
extern void InitCatalogCachePhase2(void);
diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h
index e9c74e1faf8..0a82e31d83a 100644
--- a/src/interfaces/libpq/libpq-int.h
+++ b/src/interfaces/libpq/libpq-int.h
@@ -41,6 +41,7 @@
#include "fe-auth-sasl.h"
#include "pqexpbuffer.h"
+/* IWYU pragma: begin_exports */
#ifdef ENABLE_GSS
#if defined(HAVE_GSSAPI_H)
#include <gssapi.h>
@@ -48,6 +49,7 @@
#include <gssapi/gssapi.h>
#endif
#endif
+/* IWYU pragma: end_exports */
#ifdef ENABLE_SSPI
#define SECURITY_WIN32
--
2.47.1
From f9c33711a2b96ea0aefdfd36b04cfdfb0b5303be Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Mon, 9 Dec 2024 12:25:25 +0100
Subject: [PATCH v2 2/3] IWYU pragmas for catalog headers
Add "IWYU pragma: export" annotations in each catalog header file so
that, for instance, including "catalog/pg_aggregate.h" is considered
acceptable in place of "catalog/pg_aggregate_d.h". This is very
common and it seems better to silence IWYU about it than trying to fix
this up.
Discussion:
https://www.postgresql.org/message-id/flat/9395d484-eff4-47c2-b276-8e228526c...@eisentraut.org
---
src/include/catalog/pg_aggregate.h | 2 +-
src/include/catalog/pg_am.h | 2 +-
src/include/catalog/pg_amop.h | 2 +-
src/include/catalog/pg_amproc.h | 2 +-
src/include/catalog/pg_attrdef.h | 2 +-
src/include/catalog/pg_attribute.h | 2 +-
src/include/catalog/pg_auth_members.h | 2 +-
src/include/catalog/pg_authid.h | 2 +-
src/include/catalog/pg_cast.h | 2 +-
src/include/catalog/pg_class.h | 2 +-
src/include/catalog/pg_collation.h | 2 +-
src/include/catalog/pg_constraint.h | 2 +-
src/include/catalog/pg_conversion.h | 2 +-
src/include/catalog/pg_database.h | 2 +-
src/include/catalog/pg_db_role_setting.h | 2 +-
src/include/catalog/pg_default_acl.h | 2 +-
src/include/catalog/pg_depend.h | 2 +-
src/include/catalog/pg_description.h | 2 +-
src/include/catalog/pg_enum.h | 2 +-
src/include/catalog/pg_event_trigger.h | 2 +-
src/include/catalog/pg_extension.h | 2 +-
src/include/catalog/pg_foreign_data_wrapper.h | 2 +-
src/include/catalog/pg_foreign_server.h | 2 +-
src/include/catalog/pg_foreign_table.h | 2 +-
src/include/catalog/pg_index.h | 2 +-
src/include/catalog/pg_inherits.h | 2 +-
src/include/catalog/pg_init_privs.h | 2 +-
src/include/catalog/pg_language.h | 2 +-
src/include/catalog/pg_largeobject.h | 2 +-
src/include/catalog/pg_largeobject_metadata.h | 2 +-
src/include/catalog/pg_namespace.h | 2 +-
src/include/catalog/pg_opclass.h | 2 +-
src/include/catalog/pg_operator.h | 2 +-
src/include/catalog/pg_opfamily.h | 2 +-
src/include/catalog/pg_parameter_acl.h | 2 +-
src/include/catalog/pg_partitioned_table.h | 2 +-
src/include/catalog/pg_policy.h | 2 +-
src/include/catalog/pg_proc.h | 2 +-
src/include/catalog/pg_publication.h | 2 +-
src/include/catalog/pg_publication_namespace.h | 2 +-
src/include/catalog/pg_publication_rel.h | 2 +-
src/include/catalog/pg_range.h | 2 +-
src/include/catalog/pg_replication_origin.h | 2 +-
src/include/catalog/pg_rewrite.h | 2 +-
src/include/catalog/pg_seclabel.h | 2 +-
src/include/catalog/pg_sequence.h | 2 +-
src/include/catalog/pg_shdepend.h | 2 +-
src/include/catalog/pg_shdescription.h | 2 +-
src/include/catalog/pg_shseclabel.h | 2 +-
src/include/catalog/pg_statistic.h | 2 +-
src/include/catalog/pg_statistic_ext.h | 2 +-
src/include/catalog/pg_statistic_ext_data.h | 2 +-
src/include/catalog/pg_subscription.h | 2 +-
src/include/catalog/pg_subscription_rel.h | 2 +-
src/include/catalog/pg_tablespace.h | 2 +-
src/include/catalog/pg_transform.h | 2 +-
src/include/catalog/pg_trigger.h | 2 +-
src/include/catalog/pg_ts_config.h | 2 +-
src/include/catalog/pg_ts_dict.h | 2 +-
src/include/catalog/pg_ts_parser.h | 2 +-
src/include/catalog/pg_ts_template.h | 2 +-
src/include/catalog/pg_type.h | 2 +-
src/include/catalog/pg_user_mapping.h | 2 +-
63 files changed, 63 insertions(+), 63 deletions(-)
diff --git a/src/include/catalog/pg_aggregate.h
b/src/include/catalog/pg_aggregate.h
index 80ae59716e4..c15f8d2c9fc 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -19,7 +19,7 @@
#define PG_AGGREGATE_H
#include "catalog/genbki.h"
-#include "catalog/pg_aggregate_d.h"
+#include "catalog/pg_aggregate_d.h" /* IWYU pragma: export */
#include "catalog/objectaddress.h"
#include "nodes/pg_list.h"
diff --git a/src/include/catalog/pg_am.h b/src/include/catalog/pg_am.h
index 603bb5b2dec..6e98a0930c2 100644
--- a/src/include/catalog/pg_am.h
+++ b/src/include/catalog/pg_am.h
@@ -19,7 +19,7 @@
#define PG_AM_H
#include "catalog/genbki.h"
-#include "catalog/pg_am_d.h"
+#include "catalog/pg_am_d.h" /* IWYU pragma: export */
/* ----------------
* pg_am definition. cpp turns this into
diff --git a/src/include/catalog/pg_amop.h b/src/include/catalog/pg_amop.h
index a68fc5931b3..cc71cab498b 100644
--- a/src/include/catalog/pg_amop.h
+++ b/src/include/catalog/pg_amop.h
@@ -44,7 +44,7 @@
#define PG_AMOP_H
#include "catalog/genbki.h"
-#include "catalog/pg_amop_d.h"
+#include "catalog/pg_amop_d.h" /* IWYU pragma: export */
/* ----------------
* pg_amop definition. cpp turns this into
diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h
index 5490bdc079a..bf8de4618c7 100644
--- a/src/include/catalog/pg_amproc.h
+++ b/src/include/catalog/pg_amproc.h
@@ -33,7 +33,7 @@
#define PG_AMPROC_H
#include "catalog/genbki.h"
-#include "catalog/pg_amproc_d.h"
+#include "catalog/pg_amproc_d.h" /* IWYU pragma: export */
/* ----------------
* pg_amproc definition. cpp turns this into
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index d38abb8d23c..192799cfed7 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -20,7 +20,7 @@
#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
-#include "catalog/pg_attrdef_d.h"
+#include "catalog/pg_attrdef_d.h" /* IWYU pragma: export */
/* ----------------
* pg_attrdef definition. cpp turns this into
diff --git a/src/include/catalog/pg_attribute.h
b/src/include/catalog/pg_attribute.h
index 557286f0480..b33c315d233 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -23,7 +23,7 @@
#define PG_ATTRIBUTE_H
#include "catalog/genbki.h"
-#include "catalog/pg_attribute_d.h"
+#include "catalog/pg_attribute_d.h" /* IWYU pragma: export */
/* ----------------
* pg_attribute definition. cpp turns this into
diff --git a/src/include/catalog/pg_auth_members.h
b/src/include/catalog/pg_auth_members.h
index 319960ac0e9..387316e44f0 100644
--- a/src/include/catalog/pg_auth_members.h
+++ b/src/include/catalog/pg_auth_members.h
@@ -20,7 +20,7 @@
#define PG_AUTH_MEMBERS_H
#include "catalog/genbki.h"
-#include "catalog/pg_auth_members_d.h"
+#include "catalog/pg_auth_members_d.h" /* IWYU pragma: export */
/* ----------------
* pg_auth_members definition. cpp turns this into
diff --git a/src/include/catalog/pg_authid.h b/src/include/catalog/pg_authid.h
index 93090c5c0f8..b2f3e9d01ee 100644
--- a/src/include/catalog/pg_authid.h
+++ b/src/include/catalog/pg_authid.h
@@ -21,7 +21,7 @@
#define PG_AUTHID_H
#include "catalog/genbki.h"
-#include "catalog/pg_authid_d.h"
+#include "catalog/pg_authid_d.h" /* IWYU pragma: export */
/* ----------------
* pg_authid definition. cpp turns this into
diff --git a/src/include/catalog/pg_cast.h b/src/include/catalog/pg_cast.h
index 69aa47922f7..6a0ca337153 100644
--- a/src/include/catalog/pg_cast.h
+++ b/src/include/catalog/pg_cast.h
@@ -22,7 +22,7 @@
#include "catalog/dependency.h"
#include "catalog/genbki.h"
-#include "catalog/pg_cast_d.h"
+#include "catalog/pg_cast_d.h" /* IWYU pragma: export */
/* ----------------
* pg_cast definition. cpp turns this into
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index d394db207cb..f0d612ca487 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -19,7 +19,7 @@
#define PG_CLASS_H
#include "catalog/genbki.h"
-#include "catalog/pg_class_d.h"
+#include "catalog/pg_class_d.h" /* IWYU pragma: export */
/* ----------------
* pg_class definition. cpp turns this into
diff --git a/src/include/catalog/pg_collation.h
b/src/include/catalog/pg_collation.h
index 1a774118edd..7c5d5b11300 100644
--- a/src/include/catalog/pg_collation.h
+++ b/src/include/catalog/pg_collation.h
@@ -19,7 +19,7 @@
#define PG_COLLATION_H
#include "catalog/genbki.h"
-#include "catalog/pg_collation_d.h"
+#include "catalog/pg_collation_d.h" /* IWYU pragma: export */
/* ----------------
* pg_collation definition. cpp turns this into
diff --git a/src/include/catalog/pg_constraint.h
b/src/include/catalog/pg_constraint.h
index ba35d481db3..708e656e63a 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -20,7 +20,7 @@
#include "catalog/dependency.h"
#include "catalog/genbki.h"
-#include "catalog/pg_constraint_d.h"
+#include "catalog/pg_constraint_d.h" /* IWYU pragma: export */
#include "nodes/pg_list.h"
/* ----------------
diff --git a/src/include/catalog/pg_conversion.h
b/src/include/catalog/pg_conversion.h
index b365efbe8f7..477b8d09ae5 100644
--- a/src/include/catalog/pg_conversion.h
+++ b/src/include/catalog/pg_conversion.h
@@ -19,7 +19,7 @@
#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
-#include "catalog/pg_conversion_d.h"
+#include "catalog/pg_conversion_d.h" /* IWYU pragma: export */
/* ----------------
* pg_conversion definition. cpp turns this into
diff --git a/src/include/catalog/pg_database.h
b/src/include/catalog/pg_database.h
index 9e34a091228..54f0d38c9c9 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -19,7 +19,7 @@
#define PG_DATABASE_H
#include "catalog/genbki.h"
-#include "catalog/pg_database_d.h"
+#include "catalog/pg_database_d.h" /* IWYU pragma: export */
/* ----------------
* pg_database definition. cpp turns this into
diff --git a/src/include/catalog/pg_db_role_setting.h
b/src/include/catalog/pg_db_role_setting.h
index c330941d7c3..be5cde02286 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -20,7 +20,7 @@
#define PG_DB_ROLE_SETTING_H
#include "catalog/genbki.h"
-#include "catalog/pg_db_role_setting_d.h"
+#include "catalog/pg_db_role_setting_d.h" /* IWYU pragma: export */
#include "utils/guc.h"
#include "utils/relcache.h"
diff --git a/src/include/catalog/pg_default_acl.h
b/src/include/catalog/pg_default_acl.h
index 6edf337253f..728024b1fa7 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -20,7 +20,7 @@
#define PG_DEFAULT_ACL_H
#include "catalog/genbki.h"
-#include "catalog/pg_default_acl_d.h"
+#include "catalog/pg_default_acl_d.h" /* IWYU pragma: export */
/* ----------------
* pg_default_acl definition. cpp turns this into
diff --git a/src/include/catalog/pg_depend.h b/src/include/catalog/pg_depend.h
index e9b34a32c2b..8d0daa9bb7a 100644
--- a/src/include/catalog/pg_depend.h
+++ b/src/include/catalog/pg_depend.h
@@ -32,7 +32,7 @@
#define PG_DEPEND_H
#include "catalog/genbki.h"
-#include "catalog/pg_depend_d.h"
+#include "catalog/pg_depend_d.h" /* IWYU pragma: export */
/* ----------------
* pg_depend definition. cpp turns this into
diff --git a/src/include/catalog/pg_description.h
b/src/include/catalog/pg_description.h
index 0cbfd468aac..4cd2bf90430 100644
--- a/src/include/catalog/pg_description.h
+++ b/src/include/catalog/pg_description.h
@@ -38,7 +38,7 @@
#define PG_DESCRIPTION_H
#include "catalog/genbki.h"
-#include "catalog/pg_description_d.h"
+#include "catalog/pg_description_d.h" /* IWYU pragma: export */
/* ----------------
* pg_description definition. cpp turns this into
diff --git a/src/include/catalog/pg_enum.h b/src/include/catalog/pg_enum.h
index ba5d003f5c0..7cb69ae013b 100644
--- a/src/include/catalog/pg_enum.h
+++ b/src/include/catalog/pg_enum.h
@@ -19,7 +19,7 @@
#define PG_ENUM_H
#include "catalog/genbki.h"
-#include "catalog/pg_enum_d.h"
+#include "catalog/pg_enum_d.h" /* IWYU pragma: export */
#include "nodes/pg_list.h"
diff --git a/src/include/catalog/pg_event_trigger.h
b/src/include/catalog/pg_event_trigger.h
index 8a5dc5d209e..bcb516c4f2d 100644
--- a/src/include/catalog/pg_event_trigger.h
+++ b/src/include/catalog/pg_event_trigger.h
@@ -19,7 +19,7 @@
#define PG_EVENT_TRIGGER_H
#include "catalog/genbki.h"
-#include "catalog/pg_event_trigger_d.h"
+#include "catalog/pg_event_trigger_d.h" /* IWYU pragma: export */
/* ----------------
* pg_event_trigger definition. cpp turns this into
diff --git a/src/include/catalog/pg_extension.h
b/src/include/catalog/pg_extension.h
index b9f921c0b4d..9214ebedafa 100644
--- a/src/include/catalog/pg_extension.h
+++ b/src/include/catalog/pg_extension.h
@@ -19,7 +19,7 @@
#define PG_EXTENSION_H
#include "catalog/genbki.h"
-#include "catalog/pg_extension_d.h"
+#include "catalog/pg_extension_d.h" /* IWYU pragma: export */
/* ----------------
* pg_extension definition. cpp turns this into
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h
b/src/include/catalog/pg_foreign_data_wrapper.h
index 6b8a89f466a..d03ab5a4f28 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -19,7 +19,7 @@
#define PG_FOREIGN_DATA_WRAPPER_H
#include "catalog/genbki.h"
-#include "catalog/pg_foreign_data_wrapper_d.h"
+#include "catalog/pg_foreign_data_wrapper_d.h" /* IWYU pragma: export */
/* ----------------
* pg_foreign_data_wrapper definition. cpp turns this into
diff --git a/src/include/catalog/pg_foreign_server.h
b/src/include/catalog/pg_foreign_server.h
index 3d9bd222792..d53f0974c68 100644
--- a/src/include/catalog/pg_foreign_server.h
+++ b/src/include/catalog/pg_foreign_server.h
@@ -18,7 +18,7 @@
#define PG_FOREIGN_SERVER_H
#include "catalog/genbki.h"
-#include "catalog/pg_foreign_server_d.h"
+#include "catalog/pg_foreign_server_d.h" /* IWYU pragma: export */
/* ----------------
* pg_foreign_server definition. cpp turns this into
diff --git a/src/include/catalog/pg_foreign_table.h
b/src/include/catalog/pg_foreign_table.h
index bc5c7c72b9c..aea94aa3faa 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -18,7 +18,7 @@
#define PG_FOREIGN_TABLE_H
#include "catalog/genbki.h"
-#include "catalog/pg_foreign_table_d.h"
+#include "catalog/pg_foreign_table_d.h" /* IWYU pragma: export */
/* ----------------
* pg_foreign_table definition. cpp turns this into
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index 9eb99d31fac..4392b9d221d 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -19,7 +19,7 @@
#define PG_INDEX_H
#include "catalog/genbki.h"
-#include "catalog/pg_index_d.h"
+#include "catalog/pg_index_d.h" /* IWYU pragma: export */
/* ----------------
* pg_index definition. cpp turns this into
diff --git a/src/include/catalog/pg_inherits.h
b/src/include/catalog/pg_inherits.h
index b32758ef02e..1d6765ae911 100644
--- a/src/include/catalog/pg_inherits.h
+++ b/src/include/catalog/pg_inherits.h
@@ -19,7 +19,7 @@
#define PG_INHERITS_H
#include "catalog/genbki.h"
-#include "catalog/pg_inherits_d.h"
+#include "catalog/pg_inherits_d.h" /* IWYU pragma: export */
#include "nodes/pg_list.h"
#include "storage/lock.h"
diff --git a/src/include/catalog/pg_init_privs.h
b/src/include/catalog/pg_init_privs.h
index 8ac47c3c59b..594efffca8f 100644
--- a/src/include/catalog/pg_init_privs.h
+++ b/src/include/catalog/pg_init_privs.h
@@ -36,7 +36,7 @@
#define PG_INIT_PRIVS_H
#include "catalog/genbki.h"
-#include "catalog/pg_init_privs_d.h"
+#include "catalog/pg_init_privs_d.h" /* IWYU pragma: export */
/* ----------------
* pg_init_privs definition. cpp turns this into
diff --git a/src/include/catalog/pg_language.h
b/src/include/catalog/pg_language.h
index 22a0fd02e92..3558b99858a 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -19,7 +19,7 @@
#define PG_LANGUAGE_H
#include "catalog/genbki.h"
-#include "catalog/pg_language_d.h"
+#include "catalog/pg_language_d.h" /* IWYU pragma: export */
/* ----------------
* pg_language definition. cpp turns this into
diff --git a/src/include/catalog/pg_largeobject.h
b/src/include/catalog/pg_largeobject.h
index a89e93c6f88..42971bf3bbb 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -19,7 +19,7 @@
#define PG_LARGEOBJECT_H
#include "catalog/genbki.h"
-#include "catalog/pg_largeobject_d.h"
+#include "catalog/pg_largeobject_d.h" /* IWYU pragma: export */
#include "utils/snapshot.h"
/* ----------------
diff --git a/src/include/catalog/pg_largeobject_metadata.h
b/src/include/catalog/pg_largeobject_metadata.h
index 2278fc9d661..e618cd51e03 100644
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -20,7 +20,7 @@
#define PG_LARGEOBJECT_METADATA_H
#include "catalog/genbki.h"
-#include "catalog/pg_largeobject_metadata_d.h"
+#include "catalog/pg_largeobject_metadata_d.h" /* IWYU pragma: export */
/* ----------------
* pg_largeobject_metadata definition. cpp turns this into
diff --git a/src/include/catalog/pg_namespace.h
b/src/include/catalog/pg_namespace.h
index d1d00421a1c..affb36f1140 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -19,7 +19,7 @@
#define PG_NAMESPACE_H
#include "catalog/genbki.h"
-#include "catalog/pg_namespace_d.h"
+#include "catalog/pg_namespace_d.h" /* IWYU pragma: export */
#include "utils/acl.h"
/* ----------------------------------------------------------------
diff --git a/src/include/catalog/pg_opclass.h b/src/include/catalog/pg_opclass.h
index eef76e3931e..cb63bd9ced6 100644
--- a/src/include/catalog/pg_opclass.h
+++ b/src/include/catalog/pg_opclass.h
@@ -39,7 +39,7 @@
#define PG_OPCLASS_H
#include "catalog/genbki.h"
-#include "catalog/pg_opclass_d.h"
+#include "catalog/pg_opclass_d.h" /* IWYU pragma: export */
/* ----------------
* pg_opclass definition. cpp turns this into
diff --git a/src/include/catalog/pg_operator.h
b/src/include/catalog/pg_operator.h
index 9525742c7d2..c3ddfb28fa4 100644
--- a/src/include/catalog/pg_operator.h
+++ b/src/include/catalog/pg_operator.h
@@ -20,7 +20,7 @@
#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
-#include "catalog/pg_operator_d.h"
+#include "catalog/pg_operator_d.h" /* IWYU pragma: export */
#include "nodes/pg_list.h"
/* ----------------
diff --git a/src/include/catalog/pg_opfamily.h
b/src/include/catalog/pg_opfamily.h
index 2e56d01523c..7472e7e9cfa 100644
--- a/src/include/catalog/pg_opfamily.h
+++ b/src/include/catalog/pg_opfamily.h
@@ -19,7 +19,7 @@
#define PG_OPFAMILY_H
#include "catalog/genbki.h"
-#include "catalog/pg_opfamily_d.h"
+#include "catalog/pg_opfamily_d.h" /* IWYU pragma: export */
/* ----------------
* pg_opfamily definition. cpp turns this into
diff --git a/src/include/catalog/pg_parameter_acl.h
b/src/include/catalog/pg_parameter_acl.h
index dfbf5ab3004..ae4049ba756 100644
--- a/src/include/catalog/pg_parameter_acl.h
+++ b/src/include/catalog/pg_parameter_acl.h
@@ -20,7 +20,7 @@
#define PG_PARAMETER_ACL_H
#include "catalog/genbki.h"
-#include "catalog/pg_parameter_acl_d.h"
+#include "catalog/pg_parameter_acl_d.h" /* IWYU pragma: export */
/* ----------------
* pg_parameter_acl definition. cpp turns this into
diff --git a/src/include/catalog/pg_partitioned_table.h
b/src/include/catalog/pg_partitioned_table.h
index 668547e77e4..0527f347690 100644
--- a/src/include/catalog/pg_partitioned_table.h
+++ b/src/include/catalog/pg_partitioned_table.h
@@ -20,7 +20,7 @@
#define PG_PARTITIONED_TABLE_H
#include "catalog/genbki.h"
-#include "catalog/pg_partitioned_table_d.h"
+#include "catalog/pg_partitioned_table_d.h" /* IWYU pragma: export */
/* ----------------
* pg_partitioned_table definition. cpp turns this into
diff --git a/src/include/catalog/pg_policy.h b/src/include/catalog/pg_policy.h
index 4fdb30a0a24..3c2498cdf11 100644
--- a/src/include/catalog/pg_policy.h
+++ b/src/include/catalog/pg_policy.h
@@ -19,7 +19,7 @@
#define PG_POLICY_H
#include "catalog/genbki.h"
-#include "catalog/pg_policy_d.h"
+#include "catalog/pg_policy_d.h" /* IWYU pragma: export */
/* ----------------
* pg_policy definition. cpp turns this into
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index fdb1e280711..7c2e8cb4bd3 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -19,7 +19,7 @@
#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
-#include "catalog/pg_proc_d.h"
+#include "catalog/pg_proc_d.h" /* IWYU pragma: export */
#include "nodes/pg_list.h"
/* ----------------
diff --git a/src/include/catalog/pg_publication.h
b/src/include/catalog/pg_publication.h
index 30c0574e858..3c2ae2a960c 100644
--- a/src/include/catalog/pg_publication.h
+++ b/src/include/catalog/pg_publication.h
@@ -19,7 +19,7 @@
#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
-#include "catalog/pg_publication_d.h"
+#include "catalog/pg_publication_d.h" /* IWYU pragma: export */
/* ----------------
* pg_publication definition. cpp turns this into
diff --git a/src/include/catalog/pg_publication_namespace.h
b/src/include/catalog/pg_publication_namespace.h
index e7f926bd437..3bf308d98bd 100644
--- a/src/include/catalog/pg_publication_namespace.h
+++ b/src/include/catalog/pg_publication_namespace.h
@@ -19,7 +19,7 @@
#define PG_PUBLICATION_NAMESPACE_H
#include "catalog/genbki.h"
-#include "catalog/pg_publication_namespace_d.h"
+#include "catalog/pg_publication_namespace_d.h" /* IWYU pragma: export */
/* ----------------
diff --git a/src/include/catalog/pg_publication_rel.h
b/src/include/catalog/pg_publication_rel.h
index 94eda9fe9dd..92cc36dfdf6 100644
--- a/src/include/catalog/pg_publication_rel.h
+++ b/src/include/catalog/pg_publication_rel.h
@@ -19,7 +19,7 @@
#define PG_PUBLICATION_REL_H
#include "catalog/genbki.h"
-#include "catalog/pg_publication_rel_d.h"
+#include "catalog/pg_publication_rel_d.h" /* IWYU pragma: export */
/* ----------------
* pg_publication_rel definition. cpp turns this into
diff --git a/src/include/catalog/pg_range.h b/src/include/catalog/pg_range.h
index aa23a78dd6a..3bba6162782 100644
--- a/src/include/catalog/pg_range.h
+++ b/src/include/catalog/pg_range.h
@@ -19,7 +19,7 @@
#define PG_RANGE_H
#include "catalog/genbki.h"
-#include "catalog/pg_range_d.h"
+#include "catalog/pg_range_d.h" /* IWYU pragma: export */
/* ----------------
* pg_range definition. cpp turns this into
diff --git a/src/include/catalog/pg_replication_origin.h
b/src/include/catalog/pg_replication_origin.h
index 92b4f720553..deb43065fe9 100644
--- a/src/include/catalog/pg_replication_origin.h
+++ b/src/include/catalog/pg_replication_origin.h
@@ -20,7 +20,7 @@
#include "access/xlogdefs.h"
#include "catalog/genbki.h"
-#include "catalog/pg_replication_origin_d.h"
+#include "catalog/pg_replication_origin_d.h" /* IWYU pragma: export */
/* ----------------
* pg_replication_origin. cpp turns this into
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index fb7d4fbc212..c70bc45d1b3 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -22,7 +22,7 @@
#define PG_REWRITE_H
#include "catalog/genbki.h"
-#include "catalog/pg_rewrite_d.h"
+#include "catalog/pg_rewrite_d.h" /* IWYU pragma: export */
/* ----------------
* pg_rewrite definition. cpp turns this into
diff --git a/src/include/catalog/pg_seclabel.h
b/src/include/catalog/pg_seclabel.h
index ba07b86f70a..5b1b433600f 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -18,7 +18,7 @@
#define PG_SECLABEL_H
#include "catalog/genbki.h"
-#include "catalog/pg_seclabel_d.h"
+#include "catalog/pg_seclabel_d.h" /* IWYU pragma: export */
/* ----------------
* pg_seclabel definition. cpp turns this into
diff --git a/src/include/catalog/pg_sequence.h
b/src/include/catalog/pg_sequence.h
index 88a00b4a3a2..580c7f2cbe6 100644
--- a/src/include/catalog/pg_sequence.h
+++ b/src/include/catalog/pg_sequence.h
@@ -18,7 +18,7 @@
#define PG_SEQUENCE_H
#include "catalog/genbki.h"
-#include "catalog/pg_sequence_d.h"
+#include "catalog/pg_sequence_d.h" /* IWYU pragma: export */
CATALOG(pg_sequence,2224,SequenceRelationId)
{
diff --git a/src/include/catalog/pg_shdepend.h
b/src/include/catalog/pg_shdepend.h
index 3d68e12d453..62df9f757f6 100644
--- a/src/include/catalog/pg_shdepend.h
+++ b/src/include/catalog/pg_shdepend.h
@@ -28,7 +28,7 @@
#define PG_SHDEPEND_H
#include "catalog/genbki.h"
-#include "catalog/pg_shdepend_d.h"
+#include "catalog/pg_shdepend_d.h" /* IWYU pragma: export */
/* ----------------
* pg_shdepend definition. cpp turns this into
diff --git a/src/include/catalog/pg_shdescription.h
b/src/include/catalog/pg_shdescription.h
index 2b1da021011..ccd1f2ecb4c 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -31,7 +31,7 @@
#define PG_SHDESCRIPTION_H
#include "catalog/genbki.h"
-#include "catalog/pg_shdescription_d.h"
+#include "catalog/pg_shdescription_d.h" /* IWYU pragma: export */
/* ----------------
* pg_shdescription definition. cpp turns this into
diff --git a/src/include/catalog/pg_shseclabel.h
b/src/include/catalog/pg_shseclabel.h
index a8bc9756115..523d6058b24 100644
--- a/src/include/catalog/pg_shseclabel.h
+++ b/src/include/catalog/pg_shseclabel.h
@@ -18,7 +18,7 @@
#define PG_SHSECLABEL_H
#include "catalog/genbki.h"
-#include "catalog/pg_shseclabel_d.h"
+#include "catalog/pg_shseclabel_d.h" /* IWYU pragma: export */
/* ----------------
* pg_shseclabel definition. cpp turns this into
diff --git a/src/include/catalog/pg_statistic.h
b/src/include/catalog/pg_statistic.h
index dbef8ca88d2..4216e27a8a4 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -19,7 +19,7 @@
#define PG_STATISTIC_H
#include "catalog/genbki.h"
-#include "catalog/pg_statistic_d.h"
+#include "catalog/pg_statistic_d.h" /* IWYU pragma: export */
/* ----------------
* pg_statistic definition. cpp turns this into
diff --git a/src/include/catalog/pg_statistic_ext.h
b/src/include/catalog/pg_statistic_ext.h
index 190322580df..d476095029c 100644
--- a/src/include/catalog/pg_statistic_ext.h
+++ b/src/include/catalog/pg_statistic_ext.h
@@ -23,7 +23,7 @@
#define PG_STATISTIC_EXT_H
#include "catalog/genbki.h"
-#include "catalog/pg_statistic_ext_d.h"
+#include "catalog/pg_statistic_ext_d.h" /* IWYU pragma: export */
/* ----------------
* pg_statistic_ext definition. cpp turns this into
diff --git a/src/include/catalog/pg_statistic_ext_data.h
b/src/include/catalog/pg_statistic_ext_data.h
index 17d8c40ed13..809b5251994 100644
--- a/src/include/catalog/pg_statistic_ext_data.h
+++ b/src/include/catalog/pg_statistic_ext_data.h
@@ -21,7 +21,7 @@
#define PG_STATISTIC_EXT_DATA_H
#include "catalog/genbki.h"
-#include "catalog/pg_statistic_ext_data_d.h"
+#include "catalog/pg_statistic_ext_data_d.h" /* IWYU pragma: export */
/* ----------------
* pg_statistic_ext_data definition. cpp turns this into
diff --git a/src/include/catalog/pg_subscription.h
b/src/include/catalog/pg_subscription.h
index 6194b757d59..20fc329992d 100644
--- a/src/include/catalog/pg_subscription.h
+++ b/src/include/catalog/pg_subscription.h
@@ -19,7 +19,7 @@
#include "access/xlogdefs.h"
#include "catalog/genbki.h"
-#include "catalog/pg_subscription_d.h"
+#include "catalog/pg_subscription_d.h" /* IWYU pragma: export */
#include "lib/stringinfo.h"
#include "nodes/pg_list.h"
diff --git a/src/include/catalog/pg_subscription_rel.h
b/src/include/catalog/pg_subscription_rel.h
index 75d6fdf1951..c91797c869c 100644
--- a/src/include/catalog/pg_subscription_rel.h
+++ b/src/include/catalog/pg_subscription_rel.h
@@ -20,7 +20,7 @@
#include "access/xlogdefs.h"
#include "catalog/genbki.h"
-#include "catalog/pg_subscription_rel_d.h"
+#include "catalog/pg_subscription_rel_d.h" /* IWYU pragma: export */
#include "nodes/pg_list.h"
/* ----------------
diff --git a/src/include/catalog/pg_tablespace.h
b/src/include/catalog/pg_tablespace.h
index 45208ffd736..5293488c630 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -19,7 +19,7 @@
#define PG_TABLESPACE_H
#include "catalog/genbki.h"
-#include "catalog/pg_tablespace_d.h"
+#include "catalog/pg_tablespace_d.h" /* IWYU pragma: export */
/* ----------------
* pg_tablespace definition. cpp turns this into
diff --git a/src/include/catalog/pg_transform.h
b/src/include/catalog/pg_transform.h
index 18f7bd922be..bc3d943230f 100644
--- a/src/include/catalog/pg_transform.h
+++ b/src/include/catalog/pg_transform.h
@@ -19,7 +19,7 @@
#define PG_TRANSFORM_H
#include "catalog/genbki.h"
-#include "catalog/pg_transform_d.h"
+#include "catalog/pg_transform_d.h" /* IWYU pragma: export */
/* ----------------
* pg_transform definition. cpp turns this into
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index 4208e7182ea..24a91528061 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -19,7 +19,7 @@
#define PG_TRIGGER_H
#include "catalog/genbki.h"
-#include "catalog/pg_trigger_d.h"
+#include "catalog/pg_trigger_d.h" /* IWYU pragma: export */
/* ----------------
* pg_trigger definition. cpp turns this into
diff --git a/src/include/catalog/pg_ts_config.h
b/src/include/catalog/pg_ts_config.h
index ee5bd23398c..0f5df37f097 100644
--- a/src/include/catalog/pg_ts_config.h
+++ b/src/include/catalog/pg_ts_config.h
@@ -20,7 +20,7 @@
#define PG_TS_CONFIG_H
#include "catalog/genbki.h"
-#include "catalog/pg_ts_config_d.h"
+#include "catalog/pg_ts_config_d.h" /* IWYU pragma: export */
/* ----------------
* pg_ts_config definition. cpp turns this into
diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h
index 1d32185c26c..86102c73a6b 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -19,7 +19,7 @@
#define PG_TS_DICT_H
#include "catalog/genbki.h"
-#include "catalog/pg_ts_dict_d.h"
+#include "catalog/pg_ts_dict_d.h" /* IWYU pragma: export */
/* ----------------
* pg_ts_dict definition. cpp turns this into
diff --git a/src/include/catalog/pg_ts_parser.h
b/src/include/catalog/pg_ts_parser.h
index 571a52d9671..f3a40e5d293 100644
--- a/src/include/catalog/pg_ts_parser.h
+++ b/src/include/catalog/pg_ts_parser.h
@@ -19,7 +19,7 @@
#define PG_TS_PARSER_H
#include "catalog/genbki.h"
-#include "catalog/pg_ts_parser_d.h"
+#include "catalog/pg_ts_parser_d.h" /* IWYU pragma: export */
/* ----------------
* pg_ts_parser definition. cpp turns this into
diff --git a/src/include/catalog/pg_ts_template.h
b/src/include/catalog/pg_ts_template.h
index 3a5cb45d2e4..aa06b7a840a 100644
--- a/src/include/catalog/pg_ts_template.h
+++ b/src/include/catalog/pg_ts_template.h
@@ -19,7 +19,7 @@
#define PG_TS_TEMPLATE_H
#include "catalog/genbki.h"
-#include "catalog/pg_ts_template_d.h"
+#include "catalog/pg_ts_template_d.h" /* IWYU pragma: export */
/* ----------------
* pg_ts_template definition. cpp turns this into
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index a020ebba044..ff666711a54 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -20,7 +20,7 @@
#include "catalog/genbki.h"
#include "catalog/objectaddress.h"
-#include "catalog/pg_type_d.h"
+#include "catalog/pg_type_d.h" /* IWYU pragma: export */
#include "nodes/nodes.h"
/* ----------------
diff --git a/src/include/catalog/pg_user_mapping.h
b/src/include/catalog/pg_user_mapping.h
index f6d447c8990..7a0465c4d97 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -18,7 +18,7 @@
#define PG_USER_MAPPING_H
#include "catalog/genbki.h"
-#include "catalog/pg_user_mapping_d.h"
+#include "catalog/pg_user_mapping_d.h" /* IWYU pragma: export */
/* ----------------
* pg_user_mapping definition. cpp turns this into
--
2.47.1
From 505da0262c1713afb0b700c1673dbbd882265d1f Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Fri, 10 Jan 2025 09:01:00 +0100
Subject: [PATCH v2 3/3] Add a bit of documentation related to IWYU
Add some basic information about IWYU to src/tools/pginclude/README.
Discussion:
https://www.postgresql.org/message-id/flat/9395d484-eff4-47c2-b276-8e228526c...@eisentraut.org
---
src/tools/pginclude/README | 42 ++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/src/tools/pginclude/README b/src/tools/pginclude/README
index 007d0397e79..2f8fe6b78ba 100644
--- a/src/tools/pginclude/README
+++ b/src/tools/pginclude/README
@@ -1,5 +1,47 @@
src/tools/pginclude/README
+This directory contains some scripts and information for managing
+header files and includes in PostgreSQL source code.
+
+
+include-what-you-use
+====================
+
+include-what-you-use (IWYU) (<https://include-what-you-use.org/>) is a
+tool for finding missing or superfluous includes in C source files.
+
+With a compilation database (compile_commands.json, produced by
+meson), it can be run like this, over the whole source tree:
+
+ iwyu_tool.py -p build .
+
+(this will likely be very noisy) or for individual files:
+
+ iwyu_tool.py -p build src/bin/psql/startup.c
+
+Various other invocation options are available.
+
+It is recommended to use at least version 0.23. Earlier versions give
+advice that is incompatible with the compiler warning option
+-Wmissing-variable-declarations.
+
+clangd (the language server) can automatically give IWYU-style advice;
+see <https://clangd.llvm.org/guides/include-cleaner>.
+
+The source code contains some "IWYU pragma" comments to tell IWYU
+about some PostgreSQL include file conventions (such as that a header
+such as "postgres.h" should always be included, even if it doesn't
+contribute any symbols used by the particular source file) and to
+silence a few warnings that are difficult to fix. See
+<https://github.com/include-what-you-use/include-what-you-use/blob/master/docs/IWYUPragmas.md>
+for documentation about those.
+
+Of course, any include changes suggested by this or other tools should
+be checked and verified carefully. Note that some includes are only
+used on some platforms or with some compilation options, so blindly
+following the produced advice is not recommended.
+
+
headerscheck
============
--
2.47.1