postgresql/src/include/utils
Álvaro Herrera 14e87ffa5c
Add pg_constraint rows for not-null constraints
We now create contype='n' pg_constraint rows for not-null constraints on
user tables.  Only one such constraint is allowed for a column.

We propagate these constraints to other tables during operations such as
adding inheritance relationships, creating and attaching partitions and
creating tables LIKE other tables.  These related constraints mostly
follow the well-known rules of conislocal and coninhcount that we have
for CHECK constraints, with some adaptations: for example, as opposed to
CHECK constraints, we don't match not-null ones by name when descending
a hierarchy to alter or remove it, instead matching by the name of the
column that they apply to.  This means we don't require the constraint
names to be identical across a hierarchy.

The inheritance status of these constraints can be controlled: now we
can be sure that if a parent table has one, then all children will have
it as well.  They can optionally be marked NO INHERIT, and then children
are free not to have one.  (There's currently no support for altering a
NO INHERIT constraint into inheriting down the hierarchy, but that's a
desirable future feature.)

This also opens the door for having these constraints be marked NOT
VALID, as well as allowing UNIQUE+NOT NULL to be used for functional
dependency determination, as envisioned by commit e49ae8d3bc.  It's
likely possible to allow DEFERRABLE constraints as followup work, as
well.

psql shows these constraints in \d+, though we may want to reconsider if
this turns out to be too noisy.  Earlier versions of this patch hid
constraints that were on the same columns of the primary key, but I'm
not sure that that's very useful.  If clutter is a problem, we might be
better off inventing a new \d++ command and not showing the constraints
in \d+.

For now, we omit these constraints on system catalog columns, because
they're unlikely to achieve anything.

The main difference to the previous attempt at this (b0e96f3119) is
that we now require that such a constraint always exists when a primary
key is in the column; we didn't require this previously which had a
number of unpalatable consequences.  With this requirement, the code is
easier to reason about.  For example:

- We no longer have "throwaway constraints" during pg_dump.  We needed
  those for the case where a table had a PK without a not-null
  underneath, to prevent a slow scan of the data during restore of the
  PK creation, which was particularly problematic for pg_upgrade.

- We no longer have to cope with attnotnull being set spuriously in
  case a primary key is dropped indirectly (e.g., via DROP COLUMN).

Some bits of code in this patch were authored by Jian He.

Author: Álvaro Herrera <alvherre@alvh.no-ip.org>
Author: Bernd Helmle <mailings@oopsware.de>
Reviewed-by: 何建 (jian he) <jian.universality@gmail.com>
Reviewed-by: 王刚 (Tender Wang) <tndrwang@gmail.com>
Reviewed-by: Justin Pryzby <pryzby@telsasoft.com>
Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com>
Reviewed-by: Dean Rasheed <dean.a.rasheed@gmail.com>
Discussion: https://postgr.es/m/202408310358.sdhumtyuy2ht@alvherre.pgsql
2024-11-08 13:28:48 +01:00
..
.gitignore Generate automatically code and documentation related to wait events 2023-07-05 10:53:11 +09:00
acl.h Improve tracking of role dependencies of pg_init_privs entries. 2024-06-17 12:55:10 -04:00
aclchk_internal.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
array.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
arrayaccess.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
ascii.h Move is_valid_ascii() to ascii.h. 2024-01-29 12:08:57 -06:00
attoptcache.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
backend_progress.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
backend_status.h Rename some shared memory initialization routines 2024-08-29 09:46:21 +03:00
builtins.h Adjust populate_record_field() to handle errors softly 2024-01-24 15:04:33 +09:00
bytea.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
cash.h Convert *GetDatum() and DatumGet*() macros to inline functions 2022-09-27 20:50:21 +02:00
catcache.h For inplace update, send nontransactional invalidations. 2024-10-25 06:51:02 -07:00
combocid.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
conffiles.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
date.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
datetime.h Support TZ and OF format codes in to_timestamp(). 2024-01-25 17:47:08 -05:00
datum.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
dsa.h Allow specifying initial and maximum segment sizes for DSA. 2024-03-27 11:43:29 +09:00
dynahash.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
elog.h Don't advance origin during apply failure. 2024-08-21 09:22:32 +05:30
evtcache.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
expandeddatum.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
expandedrecord.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
float.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
fmgrtab.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
formatting.h Add SQL/JSON query functions 2024-03-21 17:07:03 +09:00
freepage.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
geo_decls.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
guc.h Apply PGDLLIMPORT markings to some GUC variables 2024-08-14 11:36:12 +02:00
guc_hooks.h Restrict accesses to non-system views and foreign tables during pg_dump. 2024-08-05 06:05:33 -07:00
guc_tables.h Rename COMPAT_OPTIONS_CLIENT to COMPAT_OPTIONS_OTHER. 2024-03-27 10:45:28 -04:00
help_config.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
hsearch.h Introduce hash_search_with_hash_value() function 2024-08-07 07:06:17 +03:00
index_selfuncs.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
inet.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
injection_point.h Fix typos and grammar in code comments and docs 2024-09-03 14:49:04 +09:00
inval.h Fix inplace update buffer self-deadlock. 2024-11-02 09:04:56 -07:00
json.h Optimize escaping of JSON strings 2024-07-27 23:46:07 +12:00
jsonb.h Add SQL/JSON query functions 2024-03-21 17:07:03 +09:00
jsonfuncs.h Make nullSemAction const, add 'const' decorators to related functions 2024-08-06 23:04:22 +03:00
jsonpath.h SQL/JSON: Correct jsonpath variable name matching 2024-06-19 15:22:06 +09:00
logtape.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
lsyscache.h ATTACH PARTITION: Don't match a PK with a UNIQUE constraint 2024-04-15 15:07:47 +02:00
memdebug.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
memutils.h Add pg_memory_is_all_zeros() in memutils.h 2024-11-01 11:35:46 +09:00
memutils_internal.h Introduce a bump memory allocator 2024-04-08 00:02:43 +12:00
memutils_memorychunk.h Enlarge bit-space for MemoryContextMethodID 2024-04-07 23:32:00 +12:00
meson.build Update copyright for 2024 2024-01-03 20:49:05 -05:00
multirangetypes.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
numeric.h Add functions to generate random numbers in a specified range. 2024-03-27 10:12:39 +00:00
palloc.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
partcache.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
pg_crc.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
pg_locale.h Simplify checking for xlocale.h 2024-10-01 07:23:45 -04:00
pg_lsn.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
pg_rusage.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
pgstat_internal.h Extend PgStat_HashKey.objid from 4 to 8 bytes 2024-09-18 12:44:15 +09:00
pidfile.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
plancache.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
portal.h Update comment in portal.h. 2024-08-01 17:45:00 +09:00
ps_status.h Speedup and increase usability of set proc title functions 2023-02-20 16:18:27 +13:00
queryenvironment.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
rangetypes.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
regproc.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
rel.h Revert: Allow table AM to store complex data structures in rd_amcache 2024-04-11 16:02:49 +03:00
relcache.h Add pg_constraint rows for not-null constraints 2024-11-08 13:28:48 +01:00
relfilenumbermap.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
relmapper.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
relptr.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
reltrigger.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
resowner.h Harmonize function parameter names for Postgres 17. 2024-06-12 17:01:51 -04:00
rls.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
ruleutils.h Revert support for ALTER TABLE ... MERGE/SPLIT PARTITION(S) commands 2024-08-24 18:48:48 +03:00
sampling.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
selfuncs.h Enhance nbtree ScalarArrayOp execution. 2024-04-06 11:47:10 -04:00
sharedtuplestore.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
snapmgr.h Remove GlobalVisTestNonRemovable[Full]Horizon, not used anymore 2024-04-17 11:21:17 -07:00
snapshot.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
sortsupport.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
spccache.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
syscache.h For inplace update durability, make heap_update() callers wait. 2024-09-24 15:25:18 -07:00
timeout.h Introduce transaction_timeout 2024-02-15 23:56:12 +02:00
timestamp.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
tuplesort.h Harmonize function parameter names for Postgres 17. 2024-06-12 17:01:51 -04:00
tuplestore.h Adjust tuplestore stats API 2024-09-12 16:02:01 +12:00
typcache.h Avoid looping over all type cache entries in TypeCacheRelCallback() 2024-10-24 14:35:52 +03:00
tzparser.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
usercontext.h Perform logical replication actions as the table owner. 2023-04-04 11:25:23 -04:00
uuid.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
varbit.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
varlena.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
wait_event.h Add wait event type "InjectionPoint", a custom type like "Extension". 2024-06-27 19:21:05 -07:00
xid8.h Update copyright for 2024 2024-01-03 20:49:05 -05:00
xml.h Update copyright for 2024 2024-01-03 20:49:05 -05:00