So here is a patch for that.
There are a few cases that break when hiding all variable length fields:
Access to indclass in relcache.c, as discussed upthread, which should be
fixed.
Access to pg_largeobject.data. This is apparently OK, per comment in
inv_api.c.
Access to pg_proc.proargtypes in various places. This is clearly
useful, so we'll keep it visible.
So I think the relcache.c thing should be fixed and then this might be
good to go.
diff --git a/src/backend/catalog/Catalog.pm b/src/backend/catalog/Catalog.pm
index 1ba935c..1b8db1b 100644
--- a/src/backend/catalog/Catalog.pm
+++ b/src/backend/catalog/Catalog.pm
@@ -143,6 +143,7 @@ sub Catalogs
elsif ($declaring_attributes)
{
next if (/^{|^$/);
+ next if (/^#/);
if (/^}/)
{
undef $declaring_attributes;
@@ -150,6 +151,7 @@ sub Catalogs
else
{
my ($atttype, $attname) = split /\s+/, $_;
+ die unless $attname;
if (exists $RENAME_ATTTYPE{$atttype})
{
$atttype = $RENAME_ATTTYPE{$atttype};
diff --git a/src/include/catalog/genbki.h b/src/include/catalog/genbki.h
index 5fe3a5b..bcf31e6 100644
--- a/src/include/catalog/genbki.h
+++ b/src/include/catalog/genbki.h
@@ -22,6 +22,16 @@
/* Introduces a catalog's structure definition */
#define CATALOG(name,oid) typedef struct CppConcat(FormData_,name)
+/*
+ * This is never defined; it's here only for documentation.
+ *
+ * Variable-length catalog fields (except possibly the first not nullable one)
+ * should not be visible in C structures, so they are made invisible by #ifdefs
+ * of an undefined symbol. See also MARKNOTNULL in bootstrap.c for how this is
+ * handled.
+ */
+#undef CATALOG_VARLEN
+
/* Options that may appear after CATALOG (on the same line) */
#define BKI_BOOTSTRAP
#define BKI_SHARED_RELATION
diff --git a/src/include/catalog/pg_aggregate.h b/src/include/catalog/pg_aggregate.h
index 4e10021..c420bdb 100644
--- a/src/include/catalog/pg_aggregate.h
+++ b/src/include/catalog/pg_aggregate.h
@@ -44,7 +44,9 @@ CATALOG(pg_aggregate,2600) BKI_WITHOUT_OIDS
regproc aggfinalfn;
Oid aggsortop;
Oid aggtranstype;
+#ifdef CATALOG_VARLEN
text agginitval; /* VARIABLE LENGTH FIELD */
+#endif
} FormData_pg_aggregate;
/* ----------------
diff --git a/src/include/catalog/pg_attrdef.h b/src/include/catalog/pg_attrdef.h
index 01f663c..ee205ec 100644
--- a/src/include/catalog/pg_attrdef.h
+++ b/src/include/catalog/pg_attrdef.h
@@ -32,8 +32,10 @@ CATALOG(pg_attrdef,2604)
{
Oid adrelid; /* OID of table containing attribute */
int2 adnum; /* attnum of attribute */
+#ifdef CATALOG_VARLEN
pg_node_tree adbin; /* nodeToString representation of default */
text adsrc; /* human-readable representation of default */
+#endif
} FormData_pg_attrdef;
/* ----------------
diff --git a/src/include/catalog/pg_attribute.h b/src/include/catalog/pg_attribute.h
index 5cb16f6..7d6d0ac 100644
--- a/src/include/catalog/pg_attribute.h
+++ b/src/include/catalog/pg_attribute.h
@@ -151,6 +151,7 @@ CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BK
* NOTE: the following fields are not present in tuple descriptors!
*/
+#ifdef CATALOG_VARLEN
/* Column-level access permissions */
aclitem attacl[1];
@@ -159,6 +160,7 @@ CATALOG(pg_attribute,1249) BKI_BOOTSTRAP BKI_WITHOUT_OIDS BKI_ROWTYPE_OID(75) BK
/* Column-level FDW options */
text attfdwoptions[1];
+#endif
} FormData_pg_attribute;
/*
diff --git a/src/include/catalog/pg_class.h b/src/include/catalog/pg_class.h
index 829f9b9..97a51d3 100644
--- a/src/include/catalog/pg_class.h
+++ b/src/include/catalog/pg_class.h
@@ -74,8 +74,10 @@ CATALOG(pg_class,1259) BKI_BOOTSTRAP BKI_ROWTYPE_OID(83) BKI_SCHEMA_MACRO
* NOTE: these fields are not present in a relcache entry's rd_rel field.
*/
+#ifdef CATALOG_VARLEN
aclitem relacl[1]; /* access permissions */
text reloptions[1]; /* access-method-specific options */
+#endif
} FormData_pg_class;
/* Size of fixed part of pg_class tuples, not counting var-length fields */
diff --git a/src/include/catalog/pg_constraint.h b/src/include/catalog/pg_constraint.h
index c962834..91bcc54 100644
--- a/src/include/catalog/pg_constraint.h
+++ b/src/include/catalog/pg_constraint.h
@@ -130,6 +130,7 @@ CATALOG(pg_constraint,2606)
*/
Oid conexclop[1];
+#ifdef CATALOG_VARLEN
/*
* If a check constraint, nodeToString representation of expression
*/
@@ -139,6 +140,7 @@ CATALOG(pg_constraint,2606)
* If a check constraint, source-text representation of expression
*/
text consrc;
+#endif
} FormData_pg_constraint;
/* ----------------
diff --git a/src/include/catalog/pg_database.h b/src/include/catalog/pg_database.h
index 57537c8..3875d3f 100644
--- a/src/include/catalog/pg_database.h
+++ b/src/include/catalog/pg_database.h
@@ -42,7 +42,9 @@ CATALOG(pg_database,1262) BKI_SHARED_RELATION BKI_ROWTYPE_OID(1248) BKI_SCHEMA_M
Oid datlastsysoid; /* highest OID to consider a system OID */
TransactionId datfrozenxid; /* all Xids < this are frozen in this DB */
Oid dattablespace; /* default table space for this DB */
+#ifdef CATALOG_VARLEN
aclitem datacl[1]; /* access permissions (VAR LENGTH) */
+#endif
} FormData_pg_database;
/* ----------------
diff --git a/src/include/catalog/pg_db_role_setting.h b/src/include/catalog/pg_db_role_setting.h
index 1924043..573f83a 100644
--- a/src/include/catalog/pg_db_role_setting.h
+++ b/src/include/catalog/pg_db_role_setting.h
@@ -35,7 +35,9 @@ CATALOG(pg_db_role_setting,2964) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
{
Oid setdatabase; /* database */
Oid setrole; /* role */
+#ifdef CATALOG_VARLEN
text setconfig[1]; /* GUC settings to apply at login */
+#endif
} FormData_pg_db_role_setting;
typedef FormData_pg_db_role_setting *Form_pg_db_role_setting;
diff --git a/src/include/catalog/pg_default_acl.h b/src/include/catalog/pg_default_acl.h
index 9fd207d..63d9ed8 100644
--- a/src/include/catalog/pg_default_acl.h
+++ b/src/include/catalog/pg_default_acl.h
@@ -37,7 +37,9 @@ CATALOG(pg_default_acl,826)
* VARIABLE LENGTH FIELDS start here.
*/
+#ifdef CATALOG_VARLEN
aclitem defaclacl[1]; /* permissions to add at CREATE time */
+#endif
} FormData_pg_default_acl;
/* ----------------
diff --git a/src/include/catalog/pg_description.h b/src/include/catalog/pg_description.h
index 0e06500..6947608 100644
--- a/src/include/catalog/pg_description.h
+++ b/src/include/catalog/pg_description.h
@@ -50,7 +50,9 @@ CATALOG(pg_description,2609) BKI_WITHOUT_OIDS
Oid objoid; /* OID of object itself */
Oid classoid; /* OID of table containing object */
int4 objsubid; /* column number, or 0 if not used */
+#ifdef CATALOG_VARLEN
text description; /* description of object */
+#endif
} FormData_pg_description;
/* ----------------
diff --git a/src/include/catalog/pg_extension.h b/src/include/catalog/pg_extension.h
index 606ed9a..9f25f9c 100644
--- a/src/include/catalog/pg_extension.h
+++ b/src/include/catalog/pg_extension.h
@@ -40,9 +40,11 @@ CATALOG(pg_extension,3079)
*
* extversion should never be null, but the others can be.
*/
+#ifdef CATALOG_VARLEN
text extversion; /* extension version name */
Oid extconfig[1]; /* dumpable configuration tables */
text extcondition[1]; /* WHERE clauses for config tables */
+#endif
} FormData_pg_extension;
/* ----------------
diff --git a/src/include/catalog/pg_foreign_data_wrapper.h b/src/include/catalog/pg_foreign_data_wrapper.h
index 90a51a2..1dfc1b5 100644
--- a/src/include/catalog/pg_foreign_data_wrapper.h
+++ b/src/include/catalog/pg_foreign_data_wrapper.h
@@ -37,8 +37,10 @@ CATALOG(pg_foreign_data_wrapper,2328)
/* VARIABLE LENGTH FIELDS start here. */
+#ifdef CATALOG_VARLEN
aclitem fdwacl[1]; /* access permissions */
text fdwoptions[1]; /* FDW options */
+#endif
} FormData_pg_foreign_data_wrapper;
/* ----------------
diff --git a/src/include/catalog/pg_foreign_server.h b/src/include/catalog/pg_foreign_server.h
index a96328c..7a51eee 100644
--- a/src/include/catalog/pg_foreign_server.h
+++ b/src/include/catalog/pg_foreign_server.h
@@ -35,10 +35,12 @@ CATALOG(pg_foreign_server,1417)
/*
* VARIABLE LENGTH FIELDS start here. These fields may be NULL, too.
*/
+#ifdef CATALOG_VARLEN
text srvtype;
text srvversion;
aclitem srvacl[1]; /* access permissions */
text srvoptions[1]; /* FDW-specific options */
+#endif
} FormData_pg_foreign_server;
/* ----------------
diff --git a/src/include/catalog/pg_foreign_table.h b/src/include/catalog/pg_foreign_table.h
index 71992d3..7c85b93 100644
--- a/src/include/catalog/pg_foreign_table.h
+++ b/src/include/catalog/pg_foreign_table.h
@@ -30,7 +30,9 @@ CATALOG(pg_foreign_table,3118) BKI_WITHOUT_OIDS
{
Oid ftrelid; /* OID of foreign table */
Oid ftserver; /* OID of foreign server */
+#ifdef CATALOG_VARLEN
text ftoptions[1]; /* FDW-specific options */
+#endif
} FormData_pg_foreign_table;
/* ----------------
diff --git a/src/include/catalog/pg_index.h b/src/include/catalog/pg_index.h
index 6c301ff..0546f59 100644
--- a/src/include/catalog/pg_index.h
+++ b/src/include/catalog/pg_index.h
@@ -47,11 +47,14 @@ CATALOG(pg_index,2610) BKI_WITHOUT_OIDS BKI_SCHEMA_MACRO
oidvector indcollation; /* collation identifiers */
oidvector indclass; /* opclass identifiers */
int2vector indoption; /* per-column flags (AM-specific meanings) */
+/*FIXME*/
+#ifdef CATALOG_VARLEN
pg_node_tree indexprs; /* expression trees for index attributes that
* are not simple column references; one for
* each zero entry in indkey[] */
pg_node_tree indpred; /* expression tree for predicate, if a partial
* index; else NULL */
+#endif
} FormData_pg_index;
/* ----------------
diff --git a/src/include/catalog/pg_language.h b/src/include/catalog/pg_language.h
index fd8ea0b..8bd819d 100644
--- a/src/include/catalog/pg_language.h
+++ b/src/include/catalog/pg_language.h
@@ -37,7 +37,9 @@ CATALOG(pg_language,2612)
Oid lanplcallfoid; /* Call handler for PL */
Oid laninline; /* Optional anonymous-block handler function */
Oid lanvalidator; /* Optional validation function */
+#ifdef CATALOG_VARLEN
aclitem lanacl[1]; /* Access privileges */
+#endif
} FormData_pg_language;
/* ----------------
diff --git a/src/include/catalog/pg_largeobject.h b/src/include/catalog/pg_largeobject.h
index 7c53e1e..0f4965c 100644
--- a/src/include/catalog/pg_largeobject.h
+++ b/src/include/catalog/pg_largeobject.h
@@ -32,7 +32,9 @@ CATALOG(pg_largeobject,2613) BKI_WITHOUT_OIDS
{
Oid loid; /* Identifier of large object */
int4 pageno; /* Page number (starting from 0) */
+/*FIXME: #ifdef CATALOG_VARLEN*/
bytea data; /* Data for page (may be zero-length) */
+/*#endif*/
} FormData_pg_largeobject;
/* ----------------
diff --git a/src/include/catalog/pg_largeobject_metadata.h b/src/include/catalog/pg_largeobject_metadata.h
index dea4d12..7f235ee 100644
--- a/src/include/catalog/pg_largeobject_metadata.h
+++ b/src/include/catalog/pg_largeobject_metadata.h
@@ -31,7 +31,9 @@
CATALOG(pg_largeobject_metadata,2995)
{
Oid lomowner; /* OID of the largeobject owner */
+#ifdef CATALOG_VARLEN
aclitem lomacl[1]; /* access permissions */
+#endif
} FormData_pg_largeobject_metadata;
/* ----------------
diff --git a/src/include/catalog/pg_namespace.h b/src/include/catalog/pg_namespace.h
index 52a97f1..07e1b5e 100644
--- a/src/include/catalog/pg_namespace.h
+++ b/src/include/catalog/pg_namespace.h
@@ -37,7 +37,9 @@ CATALOG(pg_namespace,2615)
{
NameData nspname;
Oid nspowner;
+#ifdef CATALOG_VARLEN
aclitem nspacl[1]; /* VARIABLE LENGTH FIELD */
+#endif
} FormData_pg_namespace;
/* ----------------
diff --git a/src/include/catalog/pg_pltemplate.h b/src/include/catalog/pg_pltemplate.h
index ce249c0..29f356f 100644
--- a/src/include/catalog/pg_pltemplate.h
+++ b/src/include/catalog/pg_pltemplate.h
@@ -33,11 +33,13 @@ CATALOG(pg_pltemplate,1136) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
NameData tmplname; /* name of PL */
bool tmpltrusted; /* PL is trusted? */
bool tmpldbacreate; /* PL is installable by db owner? */
+#ifdef CATALOG_VARLEN
text tmplhandler; /* name of call handler function */
text tmplinline; /* name of anonymous-block handler, or NULL */
text tmplvalidator; /* name of validator function, or NULL */
text tmpllibrary; /* path of shared library */
aclitem tmplacl[1]; /* access privileges for template */
+#endif
} FormData_pg_pltemplate;
/* ----------------
diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h
index 355c61a..0a18685 100644
--- a/src/include/catalog/pg_proc.h
+++ b/src/include/catalog/pg_proc.h
@@ -55,6 +55,7 @@ CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO
/* VARIABLE LENGTH FIELDS: */
oidvector proargtypes; /* parameter types (excludes OUT params) */
+#ifdef CATALOG_VARLEN
Oid proallargtypes[1]; /* all param types (NULL if IN only) */
char proargmodes[1]; /* parameter modes (NULL if IN only) */
text proargnames[1]; /* parameter names (NULL if no names) */
@@ -64,6 +65,7 @@ CATALOG(pg_proc,1255) BKI_BOOTSTRAP BKI_ROWTYPE_OID(81) BKI_SCHEMA_MACRO
text probin; /* secondary procedure info (can be NULL) */
text proconfig[1]; /* procedure-local GUC settings */
aclitem proacl[1]; /* access permissions */
+#endif
} FormData_pg_proc;
/* ----------------
diff --git a/src/include/catalog/pg_rewrite.h b/src/include/catalog/pg_rewrite.h
index eb16b2d..997e0c3 100644
--- a/src/include/catalog/pg_rewrite.h
+++ b/src/include/catalog/pg_rewrite.h
@@ -41,8 +41,10 @@ CATALOG(pg_rewrite,2618)
bool is_instead;
/* NB: remaining fields must be accessed via heap_getattr */
+#ifdef CATALOG_VARLEN
pg_node_tree ev_qual;
pg_node_tree ev_action;
+#endif
} FormData_pg_rewrite;
/* ----------------
diff --git a/src/include/catalog/pg_seclabel.h b/src/include/catalog/pg_seclabel.h
index b468d69..fa9b1e1 100644
--- a/src/include/catalog/pg_seclabel.h
+++ b/src/include/catalog/pg_seclabel.h
@@ -25,8 +25,10 @@ CATALOG(pg_seclabel,3596) BKI_WITHOUT_OIDS
Oid objoid; /* OID of the object itself */
Oid classoid; /* OID of table containing the object */
int4 objsubid; /* column number, or 0 if not used */
+#ifdef CATALOG_VARLEN
text provider; /* name of label provider */
text label; /* security label of the object */
+#endif
} FormData_pg_seclabel;
/* ----------------
diff --git a/src/include/catalog/pg_shdescription.h b/src/include/catalog/pg_shdescription.h
index 6d0ee3b..c0f12e6 100644
--- a/src/include/catalog/pg_shdescription.h
+++ b/src/include/catalog/pg_shdescription.h
@@ -42,7 +42,9 @@ CATALOG(pg_shdescription,2396) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
{
Oid objoid; /* OID of object itself */
Oid classoid; /* OID of table containing object */
+#ifdef CATALOG_VARLEN
text description; /* description of object */
+#endif
} FormData_pg_shdescription;
/* ----------------
diff --git a/src/include/catalog/pg_shseclabel.h b/src/include/catalog/pg_shseclabel.h
index 235564f..0f10faf 100644
--- a/src/include/catalog/pg_shseclabel.h
+++ b/src/include/catalog/pg_shseclabel.h
@@ -24,8 +24,10 @@ CATALOG(pg_shseclabel,3592) BKI_SHARED_RELATION BKI_WITHOUT_OIDS
{
Oid objoid; /* OID of the shared object itself */
Oid classoid; /* OID of table containing the shared object */
+#ifdef CATALOG_VARLEN
text provider; /* name of label provider */
text label; /* security label of the object */
+#endif
} FormData_pg_shseclabel;
/* ----------------
diff --git a/src/include/catalog/pg_statistic.h b/src/include/catalog/pg_statistic.h
index 7d1d127..4625eab 100644
--- a/src/include/catalog/pg_statistic.h
+++ b/src/include/catalog/pg_statistic.h
@@ -121,10 +121,12 @@ CATALOG(pg_statistic,2619) BKI_WITHOUT_OIDS
* presently have to cheat quite a bit to allow polymorphic arrays of this
* kind, but perhaps someday it'll be a less bogus facility.
*/
+#ifdef CATALOG_VARLEN
anyarray stavalues1;
anyarray stavalues2;
anyarray stavalues3;
anyarray stavalues4;
+#endif
} FormData_pg_statistic;
#define STATISTIC_NUM_SLOTS 4
diff --git a/src/include/catalog/pg_tablespace.h b/src/include/catalog/pg_tablespace.h
index a6a0686..399bb64 100644
--- a/src/include/catalog/pg_tablespace.h
+++ b/src/include/catalog/pg_tablespace.h
@@ -32,8 +32,10 @@ CATALOG(pg_tablespace,1213) BKI_SHARED_RELATION
{
NameData spcname; /* tablespace name */
Oid spcowner; /* owner of tablespace */
+#ifdef CATALOG_VARLEN
aclitem spcacl[1]; /* access permissions (VAR LENGTH) */
text spcoptions[1]; /* per-tablespace options */
+#endif
} FormData_pg_tablespace;
/* ----------------
diff --git a/src/include/catalog/pg_trigger.h b/src/include/catalog/pg_trigger.h
index 1f29d21..7e5d9d0 100644
--- a/src/include/catalog/pg_trigger.h
+++ b/src/include/catalog/pg_trigger.h
@@ -52,8 +52,10 @@ CATALOG(pg_trigger,2620)
/* VARIABLE LENGTH FIELDS (note: tgattr and tgargs must not be null) */
int2vector tgattr; /* column numbers, if trigger is on columns */
+#ifdef CATALOG_VARLEN
bytea tgargs; /* first\000second\000tgnargs\000 */
pg_node_tree tgqual; /* WHEN expression, or NULL if none */
+#endif
} FormData_pg_trigger;
/* ----------------
diff --git a/src/include/catalog/pg_ts_dict.h b/src/include/catalog/pg_ts_dict.h
index 5036b8c..86e33e8 100644
--- a/src/include/catalog/pg_ts_dict.h
+++ b/src/include/catalog/pg_ts_dict.h
@@ -36,7 +36,9 @@ CATALOG(pg_ts_dict,3600)
Oid dictnamespace; /* name space */
Oid dictowner; /* owner */
Oid dicttemplate; /* dictionary's template */
+#ifdef CATALOG_VARLEN
text dictinitoption; /* options passed to dict_init() */
+#endif
} FormData_pg_ts_dict;
typedef FormData_pg_ts_dict *Form_pg_ts_dict;
diff --git a/src/include/catalog/pg_type.h b/src/include/catalog/pg_type.h
index e12efe4..b7fea03 100644
--- a/src/include/catalog/pg_type.h
+++ b/src/include/catalog/pg_type.h
@@ -200,6 +200,7 @@ CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71) BKI_SCHEMA_MACRO
*/
Oid typcollation;
+#ifdef CATALOG_VARLEN
/*
* If typdefaultbin is not NULL, it is the nodeToString representation of
* a default expression for the type. Currently this is only used for
@@ -221,6 +222,7 @@ CATALOG(pg_type,1247) BKI_BOOTSTRAP BKI_ROWTYPE_OID(71) BKI_SCHEMA_MACRO
* Access permissions
*/
aclitem typacl[1]; /* VARIABLE LENGTH FIELD */
+#endif
} FormData_pg_type;
/* ----------------
diff --git a/src/include/catalog/pg_user_mapping.h b/src/include/catalog/pg_user_mapping.h
index 551000f..76d7422 100644
--- a/src/include/catalog/pg_user_mapping.h
+++ b/src/include/catalog/pg_user_mapping.h
@@ -36,7 +36,9 @@ CATALOG(pg_user_mapping,1418)
* VARIABLE LENGTH FIELDS start here. These fields may be NULL, too.
*/
+#ifdef CATALOG_VARLEN
text umoptions[1]; /* user mapping options */
+#endif
} FormData_pg_user_mapping;
/* ----------------
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers