100#include "utils/fmgroids.h"
167#define AT_NUM_PASSES (AT_PASS_MISC + 1)
266 gettext_noop(
"sequence \"%s\" does not exist, skipping"),
268 gettext_noop(
"Use DROP SEQUENCE to remove a sequence.")},
277 gettext_noop(
"materialized view \"%s\" does not exist"),
278 gettext_noop(
"materialized view \"%s\" does not exist, skipping"),
280 gettext_noop(
"Use DROP MATERIALIZED VIEW to remove a materialized view.")},
282 ERRCODE_UNDEFINED_OBJECT,
287 {RELKIND_COMPOSITE_TYPE,
288 ERRCODE_UNDEFINED_OBJECT,
293 {RELKIND_FOREIGN_TABLE,
294 ERRCODE_UNDEFINED_OBJECT,
296 gettext_noop(
"foreign table \"%s\" does not exist, skipping"),
298 gettext_noop(
"Use DROP FOREIGN TABLE to remove a foreign table.")},
299 {RELKIND_PARTITIONED_TABLE,
305 {RELKIND_PARTITIONED_INDEX,
306 ERRCODE_UNDEFINED_OBJECT,
311 {
'\0', 0, NULL, NULL, NULL, NULL}
329#define ATT_TABLE 0x0001
330#define ATT_VIEW 0x0002
331#define ATT_MATVIEW 0x0004
332#define ATT_INDEX 0x0008
333#define ATT_COMPOSITE_TYPE 0x0010
334#define ATT_FOREIGN_TABLE 0x0020
335#define ATT_PARTITIONED_INDEX 0x0040
336#define ATT_SEQUENCE 0x0080
337#define ATT_PARTITIONED_TABLE 0x0100
366#define child_dependency_type(child_is_partition) \
367 ((child_is_partition) ? DEPENDENCY_AUTO : DEPENDENCY_NORMAL)
375 bool is_partition,
List **supconstr,
383 bool child_is_partition);
386 bool child_is_partition);
403 Oid ReferencedParentDelTrigger,
404 Oid ReferencedParentUpdTrigger,
405 Oid ReferencingParentInsTrigger,
406 Oid ReferencingParentUpdTrigger);
415 bool deferrable,
bool initdeferred,
421 Oid ReferencedParentDelTrigger,
422 Oid ReferencedParentUpdTrigger,
423 Oid ReferencingParentInsTrigger,
424 Oid ReferencingParentUpdTrigger);
433 bool recurse,
bool recursing,
LOCKMODE lockmode);
438 bool recurse,
bool recursing,
LOCKMODE lockmode);
440 HeapTuple contuple,
bool recurse,
bool recursing,
447 Oid *opclasses,
bool *pk_has_without_overlaps);
449 int numattrs,
int16 *attnums,
450 bool with_period,
Oid *opclasses,
451 bool *pk_has_without_overlaps);
457 Oid pkindOid,
Oid constraintOid,
bool hasperiod);
463 bool recurse,
bool recursing,
LOCKMODE lockmode,
495 bool recurse,
bool recursing,
505 bool is_valid,
bool queue_validation);
507 char *conName,
char *colName,
508 bool recurse,
bool recursing,
512 List *testConstraint,
List *provenConstraint);
518 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing);
520 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing);
522 bool recurse,
bool recursing);
538 bool recurse,
bool recursing,
551 Constraint *newConstraint,
bool recurse,
bool is_readd,
559 bool recurse,
bool recursing,
bool is_readd,
563 bool recurse,
bool recursing,
566 int numfksetcols,
int16 *fksetcolsattnums,
569 char *constraintname,
574 Oid *pfeqoperators,
Oid *ppeqoperators,
575 Oid *ffeqoperators,
int numfkdelsetcols,
576 int16 *fkdelsetcols,
bool is_internal,
581 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
582 int numfkdelsetcols,
int16 *fkdelsetcols,
584 Oid parentDelTrigger,
Oid parentUpdTrigger,
589 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
590 int numfkdelsetcols,
int16 *fkdelsetcols,
591 bool old_check_ok,
LOCKMODE lockmode,
592 Oid parentInsTrigger,
Oid parentUpdTrigger,
602 Oid parentInsTrigger,
Oid parentUpdTrigger,
603 Oid *insertTrigOid,
Oid *updateTrigOid);
607 Oid parentDelTrigger,
Oid parentUpdTrigger,
608 Oid *deleteTrigOid,
Oid *updateTrigOid);
612 Oid parentConstrOid,
int numfks,
615 Oid parentInsTrigger,
616 Oid parentUpdTrigger,
619 Oid partConstrOid,
Oid parentConstrOid,
620 Oid parentInsTrigger,
Oid parentUpdTrigger,
623 Oid conoid,
Oid conrelid);
625 Oid confrelid,
Oid conrelid);
628 Oid *deleteTriggerOid,
629 Oid *updateTriggerOid);
632 Oid *insertTriggerOid,
633 Oid *updateTriggerOid);
636 bool missing_ok,
LOCKMODE lockmode);
639 bool recurse,
bool recursing,
640 bool missing_ok,
LOCKMODE lockmode);
643 bool recurse,
bool recursing,
661 const char *conname);
667 Oid oldOwnerId,
Oid newOwnerId);
678 const char *tablespacename,
LOCKMODE lockmode);
685 char fires_when,
bool skip_system,
bool recurse,
688 char fires_when,
LOCKMODE lockmode);
707 Oid oldRelOid,
void *
arg);
712 List **partexprs,
Oid *partopclass,
Oid *partcollation,
716 bool expect_detached);
722 List *partConstraint,
723 bool validate_default);
731 bool concurrent,
Oid defaultPartOid);
775 List *old_constraints;
778 List *cookedDefaults;
800 &&
stmt->relation->relpersistence != RELPERSISTENCE_TEMP)
802 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
803 errmsg(
"ON COMMIT can only be used on temporary tables")));
805 if (
stmt->partspec != NULL)
807 if (relkind != RELKIND_RELATION)
808 elog(
ERROR,
"unexpected relkind: %d", (
int) relkind);
810 relkind = RELKIND_PARTITIONED_TABLE;
816 if (relkind == RELKIND_PARTITIONED_TABLE &&
817 stmt->relation->relpersistence == RELPERSISTENCE_UNLOGGED)
819 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
820 errmsg(
"partitioned tables cannot be unlogged")));
836 if (
stmt->relation->relpersistence == RELPERSISTENCE_TEMP
839 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
840 errmsg(
"cannot create temporary table within security-restricted operation")));
863 foreach(listptr,
stmt->inhRelations)
875 (
errcode(ERRCODE_DUPLICATE_TABLE),
876 errmsg(
"relation \"%s\" would be inherited from more than once",
886 if (
stmt->tablespacename)
892 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
893 errmsg(
"cannot specify default tablespace for partitioned relations")));
895 else if (
stmt->partbound)
921 if (tablespaceId == GLOBALTABLESPACE_OID)
923 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
924 errmsg(
"only shared relations can be placed in pg_global tablespace")));
941 case RELKIND_PARTITIONED_TABLE:
948 if (
stmt->ofTypename)
968 stmt->relation->relpersistence,
969 stmt->partbound != NULL,
970 &old_constraints, &old_notnulls);
989 cookedDefaults =
NIL;
992 foreach(listptr,
stmt->tableElts)
1007 rawDefaults =
lappend(rawDefaults, rawEnt);
1016 cooked->
name = NULL;
1024 cookedDefaults =
lappend(cookedDefaults, cooked);
1033 if (
stmt->accessMethod != NULL)
1035 Assert(RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE);
1038 else if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE)
1040 if (
stmt->partbound)
1046 if (RELKIND_HAS_TABLE_AM(relkind) && !
OidIsValid(accessMethodId))
1067 stmt->relation->relpersistence,
1106 true,
true,
false, queryString);
1114 if (
stmt->partbound)
1131 if (parent->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
1133 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1134 errmsg(
"\"%s\" is not partitioned",
1172 NULL,
false,
false);
1227 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
1228 errmsg(
"cannot partition using more than %d columns",
1240 partattrs, &partexprs, partopclass,
1241 partcollation,
stmt->partspec->strategy);
1245 partopclass, partcollation);
1258 if (
stmt->partbound)
1272 foreach(cell, idxlist)
1279 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
1283 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1284 errmsg(
"cannot create foreign partition of partitioned table \"%s\"",
1286 errdetail(
"Table \"%s\" contains indexes that are unique.",
1300 attmap, &constraintOid);
1307 false,
false,
false,
false,
false);
1335 if (
stmt->constraints)
1337 true,
true,
false, queryString);
1415 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1416 errmsg(
"too many array dimensions"));
1420 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
1421 errmsg(
"column \"%s\" cannot be declared SETOF",
1425 atttypid, atttypmod, attdim);
1434 att->attinhcount = entry->
inhcount;
1435 att->attidentity = entry->
identity;
1439 att->attstorage = entry->
storage;
1464 (
errcode(ERRCODE_UNDEFINED_SCHEMA),
1470 (
errmsg(
"schema \"%s\" does not exist, skipping",
1478 if (rentry->
kind == rightkind)
1508 if (rentry->
kind == rightkind)
1513 if (wentry->
kind == wrongkind)
1518 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1549 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1550 errmsg(
"DROP INDEX CONCURRENTLY does not support dropping multiple objects")));
1553 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1554 errmsg(
"DROP INDEX CONCURRENTLY does not support CASCADE")));
1567 relkind = RELKIND_RELATION;
1571 relkind = RELKIND_INDEX;
1575 relkind = RELKIND_SEQUENCE;
1579 relkind = RELKIND_VIEW;
1583 relkind = RELKIND_MATVIEW;
1587 relkind = RELKIND_FOREIGN_TABLE;
1591 elog(
ERROR,
"unrecognized drop object type: %d",
1620 state.expected_relkind = relkind;
1643 state.actual_relpersistence != RELPERSISTENCE_TEMP)
1655 state.actual_relkind == RELKIND_PARTITIONED_INDEX)
1657 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1658 errmsg(
"cannot drop partitioned index \"%s\" concurrently",
1668 if (
state.actual_relkind == RELKIND_PARTITIONED_INDEX)
1670 state.heap_lockmode,
1674 obj.
classId = RelationRelationId;
1702 bool invalid_system_index =
false;
1737 is_partition = classform->relispartition;
1740 state->actual_relkind = classform->relkind;
1741 state->actual_relpersistence = classform->relpersistence;
1751 if (classform->relkind == RELKIND_PARTITIONED_TABLE)
1753 else if (classform->relkind == RELKIND_PARTITIONED_INDEX)
1760 state->expected_relkind);
1775 if (
IsSystemClass(relOid, classform) && classform->relkind == RELKIND_INDEX)
1789 indisvalid = indexform->indisvalid;
1794 invalid_system_index =
true;
1800 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1801 errmsg(
"permission denied: \"%s\" is a system catalog",
1815 relOid != oldRelOid)
1828 if (is_partition && relOid != oldRelOid)
1862 foreach(cell,
stmt->relations)
1866 bool recurse = rv->
inh;
1892 relids_logged =
lappend_oid(relids_logged, myrelid);
1901 foreach(child, children)
1940 relids_logged =
lappend_oid(relids_logged, childrelid);
1943 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
1945 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1946 errmsg(
"cannot truncate only a partitioned table"),
1947 errhint(
"Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly.")));
1951 stmt->behavior,
stmt->restart_seqs,
false);
1978 List *relids_logged,
1980 bool run_as_table_owner)
1984 HTAB *ft_htab = NULL;
2010 if (newrelids ==
NIL)
2013 foreach(cell, newrelids)
2020 (
errmsg(
"truncate cascades to table \"%s\"",
2030 relids_logged =
lappend_oid(relids_logged, relid);
2040#ifdef USE_ASSERT_CHECKING
2061 foreach(seqcell, seqlist)
2095 resultRelInfo = resultRelInfos;
2116 resultRelInfo = resultRelInfos;
2121 if (run_as_table_owner)
2125 if (run_as_table_owner)
2140 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
2150 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
2161 memset(&hctl, 0,
sizeof(
HASHCTL));
2166 ft_htab =
hash_create(
"TRUNCATE for Foreign Tables",
2226 toast_relid = rel->
rd_rel->reltoastrelid;
2233 toastrel->
rd_rel->relpersistence);
2279 foreach(cell, seq_relids)
2293 if (relids_logged !=
NIL)
2302 foreach(cell, relids_logged)
2325 resultRelInfo = resultRelInfos;
2330 if (run_as_table_owner)
2334 if (run_as_table_owner)
2373 if (reltuple->relkind == RELKIND_FOREIGN_TABLE)
2380 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2381 errmsg(
"cannot truncate foreign table \"%s\"",
2384 else if (reltuple->relkind != RELKIND_RELATION &&
2385 reltuple->relkind != RELKIND_PARTITIONED_TABLE)
2387 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2400 (relid != LargeObjectRelationId &&
2401 relid != LargeObjectMetadataRelationId)))
2403 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2404 errmsg(
"permission denied: \"%s\" is a system catalog",
2440 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2441 errmsg(
"cannot truncate temporary tables of other sessions")));
2459 case TYPSTORAGE_PLAIN:
2461 case TYPSTORAGE_EXTERNAL:
2463 case TYPSTORAGE_EXTENDED:
2465 case TYPSTORAGE_MAIN:
2541 bool is_partition,
List **supconstr,
List **supnotnulls)
2546 bool have_bogus_defaults =
false;
2548 static Node bogus_marker = {0};
2565 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
2566 errmsg(
"tables can have at most %d columns",
2583 for (
int coldefpos = 0; coldefpos <
list_length(columns); coldefpos++)
2587 if (!is_partition && coldef->
typeName == NULL)
2596 (
errcode(ERRCODE_UNDEFINED_COLUMN),
2597 errmsg(
"column \"%s\" does not exist",
2602 for (
int restpos = coldefpos + 1; restpos <
list_length(columns);)
2622 (
errcode(ERRCODE_DUPLICATE_COLUMN),
2623 errmsg(
"column \"%s\" specified more than once",
2638 saved_columns = columns;
2654 List *inherited_defaults;
2655 List *cols_with_defaults;
2676 if (relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !is_partition)
2678 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2679 errmsg(
"cannot inherit from partitioned table \"%s\"",
2681 if (relation->
rd_rel->relispartition && !is_partition)
2683 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2684 errmsg(
"cannot inherit from partition \"%s\"",
2687 if (relation->
rd_rel->relkind != RELKIND_RELATION &&
2688 relation->
rd_rel->relkind != RELKIND_FOREIGN_TABLE &&
2689 relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
2691 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2692 errmsg(
"inherited relation \"%s\" is not a table or foreign table",
2700 relation->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
2701 relpersistence == RELPERSISTENCE_TEMP)
2703 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2704 errmsg(
"cannot create a temporary relation as partition of permanent relation \"%s\"",
2708 if (relpersistence != RELPERSISTENCE_TEMP &&
2709 relation->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
2711 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2713 ?
"cannot inherit from temporary relation \"%s\""
2714 :
"cannot create a permanent relation as partition of temporary relation \"%s\"",
2720 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2722 ?
"cannot inherit from temporary relation of another session"
2723 :
"cannot create as partition of temporary relation of another session")));
2734 constr = tupleDesc->
constr;
2744 inherited_defaults = cols_with_defaults =
NIL;
2760 char *attributeName =
NameStr(attribute->attname);
2768 if (attribute->attisdropped)
2775 attribute->atttypmod, attribute->attcollation);
2776 newdef->
storage = attribute->attstorage;
2777 newdef->
generated = attribute->attgenerated;
2788 newdef->
identity = attribute->attidentity;
2795 if (exist_attno > 0)
2802 newattmap->
attnums[parent_attno - 1] = exist_attno;
2817 inh_columns =
lappend(inh_columns, newdef);
2819 newattmap->
attnums[parent_attno - 1] = ++child_attno;
2832 if (attribute->atthasdef)
2837 if (this_default == NULL)
2838 elog(
ERROR,
"default expression not found for attribute %d of relation \"%s\"",
2847 inherited_defaults =
lappend(inherited_defaults, this_default);
2848 cols_with_defaults =
lappend(cols_with_defaults, mergeddef);
2856 forboth(lc1, inherited_defaults, lc2, cols_with_defaults)
2860 bool found_whole_row;
2874 if (found_whole_row)
2876 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2877 errmsg(
"cannot convert whole-row table reference"),
2878 errdetail(
"Generation expression for column \"%s\" contains a whole-row reference to table \"%s\".",
2894 have_bogus_defaults =
true;
2911 bool found_whole_row;
2914 if (check[
i].ccnoinherit)
2928 if (found_whole_row)
2930 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2931 errmsg(
"cannot convert whole-row table reference"),
2932 errdetail(
"Constraint \"%s\" contains a whole-row reference to table \"%s\".",
2937 check[
i].ccenforced);
2949 nn->attnum = newattmap->
attnums[nn->attnum - 1];
2951 nnconstraints =
lappend(nnconstraints, nn);
2970 if (inh_columns !=
NIL)
2972 int newcol_attno = 0;
2974 foreach(lc, columns)
2977 char *attributeName = newdef->
colname;
2992 if (exist_attno > 0)
3004 inh_columns =
lappend(inh_columns, newdef);
3008 columns = inh_columns;
3016 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
3017 errmsg(
"tables can have at most %d columns",
3028 foreach(lc, saved_columns)
3053 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3054 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3058 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3059 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3066 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3067 errmsg(
"child column \"%s\" specifies generation expression",
3069 errhint(
"A child table column cannot be generated unless its parent column is.")));
3074 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3075 errmsg(
"column \"%s\" inherits from generated column of different kind",
3077 errdetail(
"Parent column is %s, child column is %s.",
3078 coldef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3079 restdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3103 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3104 errmsg(
"column \"%s\" does not exist",
3113 if (have_bogus_defaults)
3115 foreach(lc, columns)
3123 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3124 errmsg(
"column \"%s\" inherits conflicting generation expressions",
3126 errhint(
"To resolve the conflict, specify a generation expression explicitly.")));
3129 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3130 errmsg(
"column \"%s\" inherits conflicting default values",
3132 errhint(
"To resolve the conflict, specify a default explicitly.")));
3137 *supconstr = constraints;
3138 *supnotnulls = nnconstraints;
3165 foreach(lc, constraints)
3181 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3182 errmsg(
"too many inheritance parents"));
3199 errmsg(
"check constraint name \"%s\" appears multiple times but with different expressions",
3210 newcon->
expr = expr;
3214 return lappend(constraints, newcon);
3241 char *attributeName = newdef->
colname;
3250 if (exist_attno == newcol_attno)
3252 (
errmsg(
"merging column \"%s\" with inherited definition",
3256 (
errmsg(
"moving and merging column \"%s\" with inherited definition", attributeName),
3257 errdetail(
"User-specified column moved to the position of the inherited column.")));
3266 if (inhtypeid != newtypeid || inhtypmod != newtypmod)
3268 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3269 errmsg(
"column \"%s\" has a type conflict",
3280 if (inhcollid != newcollid)
3282 (
errcode(ERRCODE_COLLATION_MISMATCH),
3283 errmsg(
"column \"%s\" has a collation conflict",
3302 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3303 errmsg(
"column \"%s\" has a storage parameter conflict",
3318 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3319 errmsg(
"column \"%s\" has a compression method conflict",
3347 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3348 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3352 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3353 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3360 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3361 errmsg(
"child column \"%s\" specifies generation expression",
3363 errhint(
"A child table column cannot be generated unless its parent column is.")));
3368 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3369 errmsg(
"column \"%s\" inherits from generated column of different kind",
3371 errdetail(
"Parent column is %s, child column is %s.",
3372 inhdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3373 newdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3413 char *attributeName = newdef->
colname;
3423 (
errmsg(
"merging multiple inherited definitions of column \"%s\"",
3432 if (prevtypeid != newtypeid || prevtypmod != newtypmod)
3434 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3435 errmsg(
"inherited column \"%s\" has a type conflict",
3446 if (prevcollid != newcollid)
3448 (
errcode(ERRCODE_COLLATION_MISMATCH),
3449 errmsg(
"inherited column \"%s\" has a collation conflict",
3462 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3463 errmsg(
"inherited column \"%s\" has a storage parameter conflict",
3478 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3479 errmsg(
"column \"%s\" has a compression method conflict",
3490 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3491 errmsg(
"inherited column \"%s\" has a generation conflict",
3501 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3502 errmsg(
"too many inheritance parents"));
3515 bool child_is_partition)
3541 foreach(entry, supers)
3546 child_is_partition);
3560 bool child_is_partition)
3571 parentobject.
classId = RelationRelationId;
3574 childobject.
classId = RelationRelationId;
3608 foreach(lc, columns)
3657 elog(
ERROR,
"cache lookup failed for relation %u", relationId);
3660 if (classtuple->relhassubclass != relhassubclass)
3662 classtuple->relhassubclass = relhassubclass;
3688 Oid oldTableSpaceId;
3694 oldTableSpaceId = rel->
rd_rel->reltablespace;
3695 if (newTableSpaceId == oldTableSpaceId ||
3705 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3706 errmsg(
"cannot move system relation \"%s\"",
3710 if (newTableSpaceId == GLOBALTABLESPACE_OID)
3712 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3713 errmsg(
"only shared relations can be placed in pg_global tablespace")));
3721 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3722 errmsg(
"cannot move temporary tables of other sessions")));
3744 Oid newTableSpaceId,
3760 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
3768 rd_rel->relfilenode = newRelFilenumber;
3776 if (!RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
3778 rd_rel->reltablespace);
3790 char relkind = classform->relkind;
3792 if (classform->reloftype && !recursing)
3794 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3795 errmsg(
"cannot rename column of typed table")));
3804 if (relkind != RELKIND_RELATION &&
3805 relkind != RELKIND_VIEW &&
3806 relkind != RELKIND_MATVIEW &&
3807 relkind != RELKIND_COMPOSITE_TYPE &&
3808 relkind != RELKIND_INDEX &&
3809 relkind != RELKIND_PARTITIONED_INDEX &&
3810 relkind != RELKIND_FOREIGN_TABLE &&
3811 relkind != RELKIND_PARTITIONED_TABLE)
3813 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3814 errmsg(
"cannot rename columns of relation \"%s\"",
3826 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
3827 errmsg(
"permission denied: \"%s\" is a system catalog",
3828 NameStr(classform->relname))));
3838 const char *oldattname,
3839 const char *newattname,
3842 int expected_parents,
3886 forboth(lo, child_oids, li, child_numparents)
3891 if (childrelid == myrelid)
3894 renameatt_internal(childrelid, oldattname, newattname,
false,
true, numparents, behavior);
3905 if (expected_parents == 0 &&
3908 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3909 errmsg(
"inherited column \"%s\" must be renamed in child tables too",
3914 if (targetrelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
3923 foreach(lo, child_oids)
3932 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3933 errmsg(
"column \"%s\" does not exist",
3937 attnum = attform->attnum;
3940 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3941 errmsg(
"cannot rename system column \"%s\"",
3953 if (attform->attinhcount > expected_parents)
3955 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3956 errmsg(
"cannot rename inherited column \"%s\"",
4017 (
errmsg(
"relation \"%s\" does not exist, skipping",
4018 stmt->relation->relname)));
4026 stmt->relation->inh,
4042 const char *oldconname,
4043 const char *newconname,
4046 int expected_parents)
4054 Assert(!myrelid || !mytypid);
4075 elog(
ERROR,
"cache lookup failed for constraint %u",
4080 (con->contype == CONSTRAINT_CHECK ||
4081 con->contype == CONSTRAINT_NOTNULL) &&
4094 forboth(lo, child_oids, li, child_numparents)
4099 if (childrelid == myrelid)
4107 if (expected_parents == 0 &&
4110 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4111 errmsg(
"inherited constraint \"%s\" must be renamed in child tables too",
4115 if (con->coninhcount > expected_parents)
4117 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4118 errmsg(
"cannot rename inherited constraint \"%s\"",
4123 && (con->contype == CONSTRAINT_PRIMARY
4124 || con->contype == CONSTRAINT_UNIQUE
4125 || con->contype == CONSTRAINT_EXCLUSION))
4163 elog(
ERROR,
"cache lookup failed for type %u", typid);
4178 (
errmsg(
"relation \"%s\" does not exist, skipping",
4179 stmt->relation->relname)));
4189 stmt->relation->inh),
4230 (
errmsg(
"relation \"%s\" does not exist, skipping",
4231 stmt->relation->relname)));
4242 obj_is_index = (relkind == RELKIND_INDEX ||
4243 relkind == RELKIND_PARTITIONED_INDEX);
4244 if (obj_is_index || is_index_stmt == obj_is_index)
4248 is_index_stmt = obj_is_index;
4292 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4298 (
errcode(ERRCODE_DUPLICATE_TABLE),
4299 errmsg(
"relation \"%s\" already exists",
4309 is_index == (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4310 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX));
4332 newrelname, namespaceId);
4337 if (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4338 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
4369 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4411 int expected_refcnt;
4416 (
errcode(ERRCODE_OBJECT_IN_USE),
4418 errmsg(
"cannot %s \"%s\" because it is being used by active queries in this session",
4421 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
4422 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
4425 (
errcode(ERRCODE_OBJECT_IN_USE),
4427 errmsg(
"cannot %s \"%s\" because it has pending trigger events",
4452 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4453 errmsg(
"cannot alter temporary tables of other sessions")));
4565 ATController(NULL, rel, cmds, recurse, lockmode, NULL);
4841 elog(
ERROR,
"unrecognized alter table type: %d",
4849 if (cmd_lockmode > lockmode)
4850 lockmode = cmd_lockmode;
4875 ATPrepCmd(&wqueue, rel, cmd, recurse,
false, lockmode, context);
4899 bool recurse,
bool recursing,
LOCKMODE lockmode,
4912 if (rel->
rd_rel->relispartition &&
4916 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
4917 errmsg(
"cannot alter partition \"%s\" with an incomplete detach",
4919 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
5145 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5146 errmsg(
"cannot change persistence setting twice")));
5162 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5163 errmsg(
"cannot have multiple SET ACCESS METHOD subcommands")));
5276 elog(
ERROR,
"unrecognized alter table type: %d",
5310 foreach(ltab, *wqueue)
5326 foreach(lcmd, subcmds)
5329 lockmode, pass, context);
5348 foreach(ltab, *wqueue)
5357 if (((tab->
relkind == RELKIND_RELATION ||
5358 tab->
relkind == RELKIND_PARTITIONED_TABLE) &&
5360 tab->
relkind == RELKIND_MATVIEW)
5382 lockmode, cur_pass, context);
5410 cmd->
recurse,
false, lockmode);
5463 cmd->
recurse,
false, lockmode);
5468 true,
true, lockmode);
5530 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
5541 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
5542 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
5651 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
5663 Assert(rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
5672 elog(
ERROR,
"unrecognized alter table type: %d",
5732 foreach(lc, beforeStmts)
5741 foreach(lc, atstmt->
cmds)
5793 if (pass < cur_pass)
5796 elog(
ERROR,
"ALTER TABLE scheduling failure: too late for pass %d",
5799 else if (pass > cur_pass)
5816 elog(
ERROR,
"ALTER TABLE scheduling failure: bogus item for pass %d",
5837 foreach(ltab, *wqueue)
5842 if (!RELKIND_HAS_STORAGE(tab->
relkind))
5883 Oid NewAccessMethod;
5896 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5897 errmsg(
"cannot rewrite system relation \"%s\"",
5902 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5903 errmsg(
"cannot rewrite table \"%s\" used as a catalog table",
5914 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5915 errmsg(
"cannot rewrite temporary tables of other sessions")));
5924 NewTableSpace = OldHeap->
rd_rel->reltablespace;
5933 NewAccessMethod = OldHeap->
rd_rel->relam;
5976 persistence, lockmode);
6035 foreach(lc, seqlist)
6051 foreach(ltab, *wqueue)
6058 if (!RELKIND_HAS_STORAGE(tab->
relkind))
6097 foreach(ltab, *wqueue)
6125 bool needscan =
false;
6126 List *notnull_attrs;
6127 List *notnull_virtual_attrs;
6192 elog(
ERROR,
"unrecognized constraint type: %d",
6212 notnull_attrs = notnull_virtual_attrs =
NIL;
6225 for (
i = 0;
i < newTupDesc->
natts;
i++)
6234 if (wholeatt->attgenerated != ATTRIBUTE_GENERATED_VIRTUAL)
6235 notnull_attrs =
lappend_int(notnull_attrs, wholeatt->attnum);
6237 notnull_virtual_attrs =
lappend_int(notnull_virtual_attrs,
6241 if (notnull_attrs || notnull_virtual_attrs)
6245 if (newrel || needscan)
6263 if (notnull_virtual_attrs !=
NIL)
6338 for (
i = 0;
i < newTupDesc->
natts;
i++)
6374 foreach(lc, dropped_attrs)
6428 insertslot = newslot;
6437 insertslot = oldslot;
6450 (
errcode(ERRCODE_NOT_NULL_VIOLATION),
6451 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6458 if (notnull_virtual_attrs !=
NIL)
6464 notnull_virtual_attrs);
6470 errcode(ERRCODE_NOT_NULL_VIOLATION),
6471 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6487 (
errcode(ERRCODE_CHECK_VIOLATION),
6488 errmsg(
"check constraint \"%s\" of relation \"%s\" is violated by some row",
6498 elog(
ERROR,
"unrecognized constraint type: %d",
6503 if (partqualstate && !
ExecCheck(partqualstate, econtext))
6507 (
errcode(ERRCODE_CHECK_VIOLATION),
6508 errmsg(
"updated partition constraint for default partition \"%s\" would be violated by some row",
6513 (
errcode(ERRCODE_CHECK_VIOLATION),
6514 errmsg(
"partition constraint of relation \"%s\" is violated by some row",
6522 ti_options, bistate);
6561 foreach(ltab, *wqueue)
6564 if (tab->
relid == relid)
6583 *wqueue =
lappend(*wqueue, tab);
6595 return "ADD COLUMN";
6598 return "ALTER COLUMN ... SET DEFAULT";
6600 return "ALTER COLUMN ... DROP NOT NULL";
6602 return "ALTER COLUMN ... SET NOT NULL";
6604 return "ALTER COLUMN ... SET EXPRESSION";
6606 return "ALTER COLUMN ... DROP EXPRESSION";
6608 return "ALTER COLUMN ... SET STATISTICS";
6610 return "ALTER COLUMN ... SET";
6612 return "ALTER COLUMN ... RESET";
6614 return "ALTER COLUMN ... SET STORAGE";
6616 return "ALTER COLUMN ... SET COMPRESSION";
6618 return "DROP COLUMN";
6626 return "ADD CONSTRAINT";
6628 return "ALTER CONSTRAINT";
6630 return "VALIDATE CONSTRAINT";
6632 return "DROP CONSTRAINT";
6636 return "ALTER COLUMN ... SET DATA TYPE";
6638 return "ALTER COLUMN ... OPTIONS";
6642 return "CLUSTER ON";
6644 return "SET WITHOUT CLUSTER";
6646 return "SET ACCESS METHOD";
6648 return "SET LOGGED";
6650 return "SET UNLOGGED";
6652 return "SET WITHOUT OIDS";
6654 return "SET TABLESPACE";
6662 return "ENABLE TRIGGER";
6664 return "ENABLE ALWAYS TRIGGER";
6666 return "ENABLE REPLICA TRIGGER";
6668 return "DISABLE TRIGGER";
6670 return "ENABLE TRIGGER ALL";
6672 return "DISABLE TRIGGER ALL";
6674 return "ENABLE TRIGGER USER";
6676 return "DISABLE TRIGGER USER";
6678 return "ENABLE RULE";
6680 return "ENABLE ALWAYS RULE";
6682 return "ENABLE REPLICA RULE";
6684 return "DISABLE RULE";
6688 return "NO INHERIT";
6694 return "REPLICA IDENTITY";
6696 return "ENABLE ROW SECURITY";
6698 return "DISABLE ROW SECURITY";
6700 return "FORCE ROW SECURITY";
6702 return "NO FORCE ROW SECURITY";
6706 return "ATTACH PARTITION";
6708 return "DETACH PARTITION";
6710 return "DETACH PARTITION ... FINALIZE";
6712 return "ALTER COLUMN ... ADD IDENTITY";
6714 return "ALTER COLUMN ... SET";
6716 return "ALTER COLUMN ... DROP IDENTITY";
6736 switch (rel->
rd_rel->relkind)
6738 case RELKIND_RELATION:
6741 case RELKIND_PARTITIONED_TABLE:
6747 case RELKIND_MATVIEW:
6753 case RELKIND_PARTITIONED_INDEX:
6756 case RELKIND_COMPOSITE_TYPE:
6759 case RELKIND_FOREIGN_TABLE:
6762 case RELKIND_SEQUENCE:
6771 if ((actual_target & allowed_targets) == 0)
6777 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
6779 errmsg(
"ALTER action %s cannot be performed on relation \"%s\"",
6784 elog(
ERROR,
"invalid ALTER action attempted on relation \"%s\"",
6795 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
6796 errmsg(
"permission denied: \"%s\" is a system catalog",
6817 if (recurse && rel->
rd_rel->relhassubclass)
6830 foreach(child, children)
6835 if (childrelid == relid)
6840 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
6856 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
6890 Assert(rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
6896 foreach(child, children)
6903 ATPrepCmd(wqueue, childrel, cmd,
true,
true, lockmode, context);
6930 const char *origTypeName)
6947 Anum_pg_depend_refclassid,
6951 Anum_pg_depend_refobjid,
6966 if (pg_depend->classid == TypeRelationId)
6975 origRelation, origTypeName);
6980 if (pg_depend->classid != RelationRelationId)
6999 if (pg_depend->objsubid > 0 && pg_depend->objsubid <= tupleDesc->
natts)
7004 for (
int attno = 1; attno <= tupleDesc->
natts; attno++)
7007 if (att->atttypid == typeOid && !att->attisdropped)
7028 if (RELKIND_HAS_STORAGE(rel->
rd_rel->relkind) ||
7029 RELKIND_HAS_PARTITIONS(rel->
rd_rel->relkind))
7033 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7034 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7038 else if (origRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7040 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7041 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7045 else if (origRelation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
7047 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7048 errmsg(
"cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type",
7054 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7055 errmsg(
"cannot alter table \"%s\" because column \"%s.%s\" uses its row type",
7067 origRelation, origTypeName);
7098 Anum_pg_class_reloftype,
7110 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
7111 errmsg(
"cannot alter type \"%s\" because it is the type of a typed table",
7113 errhint(
"Use ALTER ... CASCADE to alter the typed tables too.")));
7139 bool typeOk =
false;
7141 if (typ->typtype == TYPTYPE_COMPOSITE)
7147 typeOk = (typeRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
7158 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7159 errmsg(
"type %s is the row type of another table",
7161 errdetail(
"A typed table must use a stand-alone composite type created with CREATE TYPE.")));
7165 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7166 errmsg(
"type %s is not a composite type",
7190 if (rel->
rd_rel->reloftype && !recursing)
7192 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7193 errmsg(
"cannot add column to typed table")));
7195 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7198 if (recurse && !is_view)
7217 bool if_not_exists = (*cmd)->missing_ok;
7240 if (rel->
rd_rel->relispartition && !recursing)
7242 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7243 errmsg(
"cannot add column to a partition")));
7268 if (ctypeId != childatt->atttypid ||
7269 ctypmod != childatt->atttypmod)
7271 (
errcode(ERRCODE_DATATYPE_MISMATCH),
7272 errmsg(
"child table \"%s\" has different type for column \"%s\"",
7275 if (ccollid != childatt->attcollation)
7277 (
errcode(ERRCODE_COLLATION_MISMATCH),
7278 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
7286 &childatt->attinhcount))
7288 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7289 errmsg(
"too many inheritance parents"));
7296 (
errmsg(
"merging definition of column \"%s\" for child \"%s\"",
7326 if (context != NULL && !recursing)
7345 rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE &&
7348 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7349 errmsg(
"cannot recursively add identity column to table that has child tables")));
7355 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
7357 relkind = relform->relkind;
7360 newattnum = relform->relnatts + 1;
7363 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
7364 errmsg(
"tables can have at most %d columns",
7375 attribute->attnum = newattnum;
7389 relform->relnatts = newattnum;
7411 rawEnt->
attnum = attribute->attnum;
7420 false,
true,
false, NULL);
7458 if (RELKIND_HAS_STORAGE(relkind))
7460 bool has_domain_constraints;
7461 bool has_missing =
false;
7472 nve->
typeId = attribute->atttypid;
7474 defval = (
Expr *) nve;
7481 if (!defval && has_domain_constraints)
7487 baseTypeMod = attribute->atttypmod;
7494 attribute->atttypid,
7495 attribute->atttypmod,
7500 elog(
ERROR,
"failed to coerce base type to domain");
7512 newval->attnum = attribute->attnum;
7527 if (rel->
rd_rel->relkind == RELKIND_RELATION &&
7529 !has_domain_constraints &&
7560 if (colDef->
generated != ATTRIBUTE_GENERATED_VIRTUAL)
7593 if (children && !recurse)
7595 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7596 errmsg(
"column must be added to child tables too")));
7609 foreach(child, children)
7624 &childcmd, recurse,
true,
7625 lockmode, cur_pass, context);
7665 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7666 errmsg(
"column name \"%s\" conflicts with a system column name",
7673 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7674 errmsg(
"column \"%s\" of relation \"%s\" already exists, skipping",
7680 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7681 errmsg(
"column \"%s\" of relation \"%s\" already exists",
7697 myself.
classId = RelationRelationId;
7700 referenced.
classId = TypeRelationId;
7718 myself.
classId = RelationRelationId;
7721 referenced.
classId = CollationRelationId;
7753 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7754 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7762 if (!attTup->attnotnull)
7771 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7772 errmsg(
"cannot alter system column \"%s\"",
7775 if (attTup->attidentity)
7777 (
errcode(ERRCODE_SYNTAX_ERROR),
7778 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
7784 if (rel->
rd_rel->relispartition)
7791 parent_attnum =
get_attnum(parentId, colName);
7794 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7795 errmsg(
"column \"%s\" is marked NOT NULL in parent table",
7806 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
7834 bool is_valid,
bool queue_validation)
7839 Assert(!queue_validation || wqueue);
7848 if (attr->attisdropped)
7851 if (!attr->attnotnull)
7860 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
7868 attr->attnotnull =
true;
7875 if (queue_validation && wqueue &&
7907 bool recurse,
bool recursing,
LOCKMODE lockmode)
7915 bool is_no_inherit =
false;
7931 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7932 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7938 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7939 errmsg(
"cannot alter system column \"%s\"",
7947 bool changed =
false;
7952 if (conForm->connoinherit && recurse)
7954 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7955 errmsg(
"cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"",
7967 &conForm->coninhcount))
7969 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7970 errmsg(
"too many inheritance parents"));
7973 else if (!conForm->conislocal)
7975 conForm->conislocal =
true;
7978 else if (!conForm->convalidated)
7985 recurse, recursing, lockmode);
8014 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
8016 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8017 errmsg(
"constraint must be added to child tables too"),
8018 errhint(
"Do not specify the ONLY keyword."));
8020 is_no_inherit =
true;
8031 colName,
"not_null",
8038 constraint->
conname = conName;
8042 false, !recursing,
false, NULL);
8069 recurse,
true, lockmode);
8099 nnulltest->argisrow =
false;
8105 (
errmsg_internal(
"existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls",
8132 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8133 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8139 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8140 errmsg(
"cannot alter system column \"%s\"",
8145 (
errcode(ERRCODE_SYNTAX_ERROR),
8146 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
8149 newDefault ? 0 :
errhint(
"Use %s instead.",
8150 "ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY")));
8154 (
errcode(ERRCODE_SYNTAX_ERROR),
8155 errmsg(
"column \"%s\" of relation \"%s\" is a generated column",
8159 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION") :
8161 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION") : 0)));
8173 newDefault != NULL);
8190 false,
true,
false, NULL);
8234 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing)
8244 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8245 if (ispartitioned && !recurse)
8247 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8248 errmsg(
"cannot add identity to a column of only the partitioned table"),
8249 errhint(
"Do not specify the ONLY keyword.")));
8251 if (rel->
rd_rel->relispartition && !recursing)
8253 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8254 errmsg(
"cannot add identity to a column of a partition"));
8261 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8262 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8270 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8271 errmsg(
"cannot alter system column \"%s\"",
8279 if (!attTup->attnotnull)
8281 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8282 errmsg(
"column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added",
8285 if (attTup->attidentity)
8287 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8288 errmsg(
"column \"%s\" of relation \"%s\" is already an identity column",
8291 if (attTup->atthasdef)
8293 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8294 errmsg(
"column \"%s\" of relation \"%s\" already has a default value",
8297 attTup->attidentity = cdef->
identity;
8313 if (recurse && ispartitioned)
8320 foreach(lc, children)
8340 LOCKMODE lockmode,
bool recurse,
bool recursing)
8351 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8352 if (ispartitioned && !recurse)
8354 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8355 errmsg(
"cannot change identity column of only the partitioned table"),
8356 errhint(
"Do not specify the ONLY keyword.")));
8358 if (rel->
rd_rel->relispartition && !recursing)
8360 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8361 errmsg(
"cannot change identity column of a partition"));
8367 if (strcmp(defel->
defname,
"generated") == 0)
8371 (
errcode(ERRCODE_SYNTAX_ERROR),
8372 errmsg(
"conflicting or redundant options")));
8373 generatedEl = defel;
8376 elog(
ERROR,
"option \"%s\" not recognized",
8390 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8391 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8399 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8400 errmsg(
"cannot alter system column \"%s\"",
8403 if (!attTup->attidentity)
8405 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8406 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8430 if (generatedEl && recurse && ispartitioned)
8437 foreach(lc, children)
8457 bool recurse,
bool recursing)
8468 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8469 if (ispartitioned && !recurse)
8471 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8472 errmsg(
"cannot drop identity from a column of only the partitioned table"),
8473 errhint(
"Do not specify the ONLY keyword.")));
8475 if (rel->
rd_rel->relispartition && !recursing)
8477 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8478 errmsg(
"cannot drop identity from a column of a partition"));
8484 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8485 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8493 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8494 errmsg(
"cannot alter system column \"%s\"",
8497 if (!attTup->attidentity)
8501 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8502 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8507 (
errmsg(
"column \"%s\" of relation \"%s\" is not an identity column, skipping",
8515 attTup->attidentity =
'\0';
8531 if (recurse && ispartitioned)
8538 foreach(lc, children)
8555 seqaddress.
classId = RelationRelationId;
8587 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8588 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8596 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8597 errmsg(
"cannot alter system column \"%s\"",
8600 attgenerated = attTup->attgenerated;
8603 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8604 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8611 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8614 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8615 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables with check constraints"),
8616 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8619 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL && attTup->attnotnull)
8629 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8632 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8633 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables that are part of a publication"),
8634 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8637 rewrite = (attgenerated == ATTRIBUTE_GENERATED_STORED);
8667 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8690 false,
true,
false, NULL);
8703 newval->is_generated =
true;
8739 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8740 errmsg(
"ALTER TABLE / DROP EXPRESSION must be applied to child tables too")));
8753 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8754 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8759 if (attTup->attinhcount > 0)
8761 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8762 errmsg(
"cannot drop generation expression from inherited column")));
8783 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8784 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8792 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8793 errmsg(
"cannot alter system column \"%s\"",
8802 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8804 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8805 errmsg(
"ALTER TABLE / DROP EXPRESSION is not supported for virtual generated columns"),
8806 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8809 if (!attTup->attgenerated)
8813 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8814 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8819 (
errmsg(
"column \"%s\" of relation \"%s\" is not a generated column, skipping",
8831 attTup->attgenerated =
'\0';
8848 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8877 bool newtarget_default;
8884 Datum repl_val[Natts_pg_attribute];
8885 bool repl_null[Natts_pg_attribute];
8886 bool repl_repl[Natts_pg_attribute];
8892 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
8893 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
8896 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8897 errmsg(
"cannot refer to non-index column by number")));
8900 if (newValue &&
intVal(newValue) != -1)
8902 newtarget =
intVal(newValue);
8903 newtarget_default =
false;
8906 newtarget_default =
true;
8908 if (!newtarget_default)
8916 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8917 errmsg(
"statistics target %d is too low",
8924 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8925 errmsg(
"lowering statistics target to %d",
8938 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8939 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8948 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8949 errmsg(
"column number %d of relation \"%s\" does not exist",
8955 attnum = attrtuple->attnum;
8958 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8959 errmsg(
"cannot alter system column \"%s\"",
8966 if (attrtuple->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8968 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8969 errmsg(
"cannot alter statistics on virtual generated column \"%s\"",
8972 if (rel->
rd_rel->relkind == RELKIND_INDEX ||
8973 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
8977 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8978 errmsg(
"cannot alter statistics on included column \"%s\" of index \"%s\"",
8982 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8983 errmsg(
"cannot alter statistics on non-expression column \"%s\" of index \"%s\"",
8985 errhint(
"Alter statistics on table column instead.")));
8989 memset(repl_null,
false,
sizeof(repl_null));
8990 memset(repl_repl,
false,
sizeof(repl_repl));
8991 if (!newtarget_default)
8992 repl_val[Anum_pg_attribute_attstattarget - 1] =
Int16GetDatum(newtarget);
8994 repl_null[Anum_pg_attribute_attstattarget - 1] =
true;
8995 repl_repl[Anum_pg_attribute_attstattarget - 1] =
true;
8997 repl_val, repl_null, repl_repl);
9031 Datum repl_val[Natts_pg_attribute];
9032 bool repl_null[Natts_pg_attribute];
9033 bool repl_repl[Natts_pg_attribute];
9041 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9042 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9046 attnum = attrtuple->attnum;
9049 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9050 errmsg(
"cannot alter system column \"%s\"",
9063 memset(repl_null,
false,
sizeof(repl_null));
9064 memset(repl_repl,
false,
sizeof(repl_repl));
9065 if (newOptions != (
Datum) 0)
9066 repl_val[Anum_pg_attribute_attoptions - 1] = newOptions;
9068 repl_null[Anum_pg_attribute_attoptions - 1] =
true;
9069 repl_repl[Anum_pg_attribute_attoptions - 1] =
true;
9071 repl_val, repl_null, repl_repl);
9100 bool setstorage,
char newstorage,
9101 bool setcompression,
char newcompression,
9115 for (
int i = 0;
i < indrel->
rd_index->indnatts;
i++)
9137 attrtuple->attstorage = newstorage;
9140 attrtuple->attcompression = newcompression;
9175 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9176 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9180 attnum = attrtuple->attnum;
9183 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9184 errmsg(
"cannot alter system column \"%s\"",
9200 true, attrtuple->attstorage,
9228 if (rel->
rd_rel->reloftype && !recursing)
9230 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
9231 errmsg(
"cannot drop column from typed table")));
9233 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
9254 bool recurse,
bool recursing,
9255 bool missing_ok,
LOCKMODE lockmode,
9271 Assert(!recursing || addrs != NULL);
9288 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9289 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9295 (
errmsg(
"column \"%s\" of relation \"%s\" does not exist, skipping",
9302 attnum = targetatt->attnum;
9307 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9308 errmsg(
"cannot drop system column \"%s\"",
9315 if (targetatt->attinhcount > 0 && !recursing)
9317 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9318 errmsg(
"cannot drop inherited column \"%s\"",
9330 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9331 errmsg(
"cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"",
9353 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
9355 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9356 errmsg(
"cannot drop column from only the partitioned table when partitions exist"),
9357 errhint(
"Do not specify the ONLY keyword.")));
9360 foreach(child, children)
9372 elog(
ERROR,
"cache lookup failed for attribute \"%s\" of relation %u",
9373 colName, childrelid);
9376 if (childatt->attinhcount <= 0)
9377 elog(
ERROR,
"relation %u has non-inherited attribute \"%s\"",
9378 childrelid, colName);
9387 if (childatt->attinhcount == 1 && !childatt->attislocal)
9391 behavior,
true,
true,
9392 false, lockmode, addrs);
9397 childatt->attinhcount--;
9412 childatt->attinhcount--;
9413 childatt->attislocal =
true;
9429 object.classId = RelationRelationId;
9431 object.objectSubId =
attnum;
9473 bool got_children =
false;
9511 got_children =
true;
9521 errmsg(
"column \"%s\" of table \"%s\" is not marked NOT NULL",
9535 newcmd->
def = (
Node *) nnconstr;
9537 ATPrepCmd(wqueue, rel, newcmd,
true,
false, lockmode, context);
9550 if (conForm->contype != CONSTRAINT_NOTNULL)
9551 elog(
ERROR,
"constraint %u is not a not-null constraint", conForm->oid);
9554 if (conForm->connoinherit)
9556 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9557 errmsg(
"cannot create primary key on column \"%s\"", colname),
9559 errdetail(
"The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key.",
9560 NameStr(conForm->conname), colname,
9562 errhint(
"You might need to make the existing constraint inheritable using %s.",
9563 "ALTER TABLE ... ALTER CONSTRAINT ... INHERIT"));
9566 if (!conForm->convalidated)
9568 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9569 errmsg(
"cannot create primary key on column \"%s\"", colname),
9571 errdetail(
"The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key.",
9572 NameStr(conForm->conname), colname,
9574 errhint(
"You might need to validate it using %s.",
9575 "ALTER TABLE ... VALIDATE CONSTRAINT"));
9603 check_rights = !is_rebuild;
9675 Oid index_oid =
stmt->indexOid;
9679 char *constraintName;
9680 char constraintType;
9692 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
9694 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9695 errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables")));
9705 elog(
ERROR,
"index \"%s\" is not unique", indexName);
9714 constraintName =
stmt->idxname;
9715 if (constraintName == NULL)
9716 constraintName = indexName;
9717 else if (strcmp(constraintName, indexName) != 0)
9720 (
errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"",
9721 indexName, constraintName)));
9731 constraintType = CONSTRAINT_PRIMARY;
9733 constraintType = CONSTRAINT_UNIQUE;
9765 Constraint *newConstraint,
bool recurse,
bool is_readd,
9777 switch (newConstraint->
contype)
9783 newConstraint, recurse,
false, is_readd,
9799 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
9818 elog(
ERROR,
"unrecognized constraint type: %d",
9819 (
int) newConstraint->
contype);
9845 foreach(lc, colnames)
9850 buf[buflen++] =
'_';
9857 buflen += strlen(
buf + buflen);
9881 Constraint *constr,
bool recurse,
bool recursing,
9910 recursing || is_readd,
9920 foreach(lcon, newcons)
9988 if (!recurse && children !=
NIL)
9990 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9991 errmsg(
"constraint must be added to child tables too")));
9996 foreach(child, children)
10011 constr, recurse,
true, is_readd, lockmode);
10037 bool recurse,
bool recursing,
LOCKMODE lockmode)
10052 bool pk_has_without_overlaps;
10075 if (!recurse && rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10077 errcode(ERRCODE_WRONG_OBJECT_TYPE),
10078 errmsg(
"cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"",
10082 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10083 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10085 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10086 errmsg(
"referenced relation \"%s\" is not a table",
10091 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
10092 errmsg(
"permission denied: \"%s\" is a system catalog",
10103 switch (rel->
rd_rel->relpersistence)
10105 case RELPERSISTENCE_PERMANENT:
10108 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10109 errmsg(
"constraints on permanent tables may reference only permanent tables")));
10111 case RELPERSISTENCE_UNLOGGED:
10113 && pkrel->
rd_rel->relpersistence != RELPERSISTENCE_UNLOGGED)
10115 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10116 errmsg(
"constraints on unlogged tables may reference only permanent or unlogged tables")));
10118 case RELPERSISTENCE_TEMP:
10119 if (pkrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
10121 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10122 errmsg(
"constraints on temporary tables may reference only temporary tables")));
10125 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10126 errmsg(
"constraints on temporary tables must involve temporary tables of this session")));
10136 fkattnum, fktypoid, fkcolloid);
10140 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10141 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10145 fkdelsetcols, NULL, NULL);
10162 pkattnum, pktypoid, pkcolloid,
10163 opclasses, &pk_has_without_overlaps);
10168 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10169 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10175 pkattnum, pktypoid, pkcolloid);
10180 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10181 errmsg(
"foreign key uses PERIOD on the referencing table but not the referenced table"));
10185 with_period, opclasses, &pk_has_without_overlaps);
10192 if (pk_has_without_overlaps && !with_period)
10194 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10195 errmsg(
"foreign key must use PERIOD when referencing a primary key using WITHOUT OVERLAPS"));
10205 for (
i = 0;
i < numfks;
i++)
10218 (
errcode(ERRCODE_SYNTAX_ERROR),
10219 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10224 (
errcode(ERRCODE_SYNTAX_ERROR),
10225 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10237 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
10239 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10240 errmsg(
"foreign key constraints on virtual generated columns are not supported")));
10253 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10254 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10262 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10263 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10275 if (numfks != numpks)
10277 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
10278 errmsg(
"number of referencing and referenced columns for foreign key disagree")));
10287 for (
i = 0;
i < numpks;
i++)
10289 Oid pktype = pktypoid[
i];
10290 Oid fktype = fktypoid[
i];
10292 Oid pkcoll = pkcolloid[
i];
10293 Oid fkcoll = fkcolloid[
i];
10310 elog(
ERROR,
"cache lookup failed for opclass %u", opclasses[
i]);
10312 amid = cla_tup->opcmethod;
10313 opfamily = cla_tup->opcfamily;
10314 opcintype = cla_tup->opcintype;
10327 for_overlaps = with_period &&
i == numpks - 1;
10332 errcode(ERRCODE_UNDEFINED_OBJECT),
10334 ?
errmsg(
"could not identify an overlaps operator for foreign key")
10335 :
errmsg(
"could not identify an equality operator for foreign key"),
10336 errdetail(
"Could not translate compare type %d for operator family \"%s\" of access method \"%s\".",
10347 elog(
ERROR,
"missing operator %d(%u,%u) in opfamily %u",
10348 eqstrategy, opcintype, opcintype, opfamily);
10360 pfeqop_right = fktyped;
10382 Oid input_typeids[2];
10383 Oid target_typeids[2];
10385 input_typeids[0] = pktype;
10386 input_typeids[1] = fktype;
10387 target_typeids[0] = opcintype;
10388 target_typeids[1] = opcintype;
10392 pfeqop = ffeqop = ppeqop;
10393 pfeqop_right = opcintype;
10399 (
errcode(ERRCODE_DATATYPE_MISMATCH),
10400 errmsg(
"foreign key constraint \"%s\" cannot be implemented",
10402 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10403 "are of incompatible types: %s and %s.",
10414 elog(
ERROR,
"key columns are not both collatable");
10431 if ((!pkcolldet || !fkcolldet) && pkcoll != fkcoll)
10433 (
errcode(ERRCODE_COLLATION_MISMATCH),
10434 errmsg(
"foreign key constraint \"%s\" cannot be implemented", fkconstraint->
conname),
10435 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10436 "have incompatible collations: \"%s\" and \"%s\". "
10437 "If either collation is nondeterministic, then both collations have to be the same.",
10452 old_check_ok = (pfeqop ==
lfirst_oid(old_pfeqop_item));
10474 old_fktype = attr->atttypid;
10475 new_fktype = fktype;
10481 old_fkcoll = attr->attcollation;
10482 new_fkcoll = fkcoll;
10517 old_check_ok = (new_pathtype == old_pathtype &&
10518 new_castfunc == old_castfunc &&
10519 (!IsPolymorphicType(pfeqop_right) ||
10520 new_fktype == old_fktype) &&
10521 (new_fkcoll == old_fkcoll ||
10525 pfeqoperators[
i] = pfeqop;
10526 ppeqoperators[
i] = ppeqop;
10527 ffeqoperators[
i] = ffeqop;
10541 Oid aggedperiodoperoid;
10542 Oid intersectoperoid;
10545 &intersectoperoid);
10550 fkconstraint->
conname, fkconstraint, rel, pkrel,
10615 int numfksetcols,
int16 *fksetcolsattnums,
10618 int numcolsout = 0;
10620 for (
int i = 0;
i < numfksetcols;
i++)
10622 int16 setcol_attnum = fksetcolsattnums[
i];
10626 for (
int j = 0;
j < numfks;
j++)
10628 if (fkattnums[
j] == setcol_attnum)
10640 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
10641 errmsg(
"column \"%s\" referenced in ON DELETE SET action must be part of foreign key", col)));
10646 for (
int j = 0;
j < numcolsout;
j++)
10648 if (fksetcolsattnums[
j] == setcol_attnum)
10655 fksetcolsattnums[numcolsout++] = setcol_attnum;
10691 char *constraintname,
Constraint *fkconstraint,
10693 int numfks,
int16 *pkattnum,
10694 int16 *fkattnum,
Oid *pfeqoperators,
Oid *ppeqoperators,
10695 Oid *ffeqoperators,
int numfkdelsetcols,
int16 *fkdelsetcols,
10696 bool is_internal,
bool with_period)
10709 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10710 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10712 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10713 errmsg(
"referenced relation \"%s\" is not a table",
10730 conname = constraintname;
10732 if (fkconstraint->
conname == NULL)
10737 conislocal =
false;
10739 connoinherit =
false;
10749 connoinherit = rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE;
10757 CONSTRAINT_FOREIGN,
10872 Oid *ppeqoperators,
Oid *ffeqoperators,
10873 int numfkdelsetcols,
int16 *fkdelsetcols,
10875 Oid parentDelTrigger,
Oid parentUpdTrigger,
10892 parentConstr, indexOid,
10893 parentDelTrigger, parentUpdTrigger,
10894 &deleteTriggerOid, &updateTriggerOid);
10901 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10926 for (
int j = 0;
j < numfks;
j++)
10927 mapped_pkattnum[
j] = map->
attnums[pkattnum[
j] - 1];
10930 mapped_pkattnum = pkattnum;
10935 elog(
ERROR,
"index for %u not found in partition %s",
10940 fkconstraint->
conname, fkconstraint, rel,
10941 partRel, partIndexId, parentConstr,
10942 numfks, mapped_pkattnum,
10943 fkattnum, pfeqoperators, ppeqoperators,
10944 ffeqoperators, numfkdelsetcols,
10945 fkdelsetcols,
true, with_period);
10948 partIndexId, address.
objectId, numfks,
10949 mapped_pkattnum, fkattnum,
10950 pfeqoperators, ppeqoperators, ffeqoperators,
10951 numfkdelsetcols, fkdelsetcols,
10953 deleteTriggerOid, updateTriggerOid,
10960 pfree(mapped_pkattnum);
11008 int numfks,
int16 *pkattnum,
int16 *fkattnum,
11009 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
11010 int numfkdelsetcols,
int16 *fkdelsetcols,
11011 bool old_check_ok,
LOCKMODE lockmode,
11012 Oid parentInsTrigger,
Oid parentUpdTrigger,
11022 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
11024 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
11025 errmsg(
"foreign key constraints are not supported on foreign tables")));
11039 parentInsTrigger, parentUpdTrigger,
11040 &insertTriggerOid, &updateTriggerOid);
11042 if (rel->
rd_rel->relkind == RELKIND_RELATION)
11065 newcon->
conid = parentConstr;
11067 newcon->
qual = (
Node *) fkconstraint;
11072 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11104 for (
int j = 0;
j < numfks;
j++)
11105 mapped_fkattnum[
j] = attmap->
attnums[fkattnum[
j] - 1];
11138 fkconstraint->
conname, fkconstraint,
11139 partition, pkrel, indexOid, parentConstr,
11141 mapped_fkattnum, pfeqoperators,
11142 ppeqoperators, ffeqoperators,
11143 numfkdelsetcols, fkdelsetcols,
true,
11189 Assert(parentRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
11264 foreach(cell, clone)
11278 int numfkdelsetcols;
11287 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
11303 indexOid = constrForm->conindid;
11314 for (
int i = 0;
i < numfks;
i++)
11315 mapped_confkey[
i] = attmap->
attnums[confkey[
i] - 1];
11318 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11320 fkconstraint->
deferrable = constrForm->condeferrable;
11323 fkconstraint->
pktable = NULL;
11326 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11332 fkconstraint->
is_enforced = constrForm->conenforced;
11337 for (
int i = 0;
i < numfks;
i++)
11354 elog(
ERROR,
"index for %u not found in partition %s",
11362 if (constrForm->conenforced)
11364 constrForm->confrelid, constrForm->conrelid,
11365 &deleteTriggerOid, &updateTriggerOid);
11369 fkconstraint->
conname, fkconstraint, fkRel,
11370 partitionRel, partIndexId, constrOid,
11371 numfks, mapped_confkey,
11372 conkey, conpfeqop, conppeqop, conffeqop,
11373 numfkdelsetcols, confdelsetcols,
false,
11374 constrForm->conperiod);
11392 constrForm->conperiod);
11440 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
11441 errmsg(
"cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"",
11455 if (partRel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
11457 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
11458 errmsg(
"foreign key constraints are not supported on foreign tables")));
11478 foreach(cell, clone)
11491 int numfkdelsetcols;
11504 elog(
ERROR,
"cache lookup failed for constraint %u",
11520 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11525 conpfeqop, conppeqop, conffeqop,
11526 &numfkdelsetcols, confdelsetcols);
11527 for (
int i = 0;
i < numfks;
i++)
11528 mapped_conkey[
i] = attmap->
attnums[conkey[
i] - 1];
11539 if (constrForm->conenforced)
11541 constrForm->confrelid, constrForm->conrelid,
11542 &insertTriggerOid, &updateTriggerOid);
11552 foreach(lc, partFKs)
11581 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11583 fkconstraint->
deferrable = constrForm->condeferrable;
11586 fkconstraint->
pktable = NULL;
11589 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11595 fkconstraint->
is_enforced = constrForm->conenforced;
11598 for (
int i = 0;
i < numfks;
i++)
11603 mapped_conkey[
i] - 1);
11608 indexOid = constrForm->conindid;
11609 with_period = constrForm->conperiod;
11613 NameStr(constrForm->conname), fkconstraint,
11614 partRel, pkrel, indexOid, parentConstrOid,
11616 mapped_conkey, conpfeqop,
11617 conppeqop, conffeqop,
11618 numfkdelsetcols, confdelsetcols,
11619 false, with_period);
11665 Oid parentConstrOid,
11670 Oid parentInsTrigger,
11671 Oid parentUpdTrigger,
11682 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11689 if (fk->
confrelid != parentConstr->confrelid || fk->
nkeys != numfks)
11694 for (
int i = 0;
i < numfks;
i++)
11696 if (fk->conkey[
i] != mapped_conkey[
i] ||
11697 fk->confkey[
i] != confkey[
i] ||
11698 fk->conpfeqop[
i] != conpfeqop[
i])
11719 if (partConstr->conenforced != parentConstr->conenforced)
11721 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
11722 errmsg(
"constraint \"%s\" enforceability conflicts with constraint \"%s\" on relation \"%s\"",
11723 NameStr(parentConstr->conname),
11724 NameStr(partConstr->conname),
11728 partConstr->condeferrable != parentConstr->condeferrable ||
11729 partConstr->condeferred != parentConstr->condeferred ||
11730 partConstr->confupdtype != parentConstr->confupdtype ||
11731 partConstr->confdeltype != parentConstr->confdeltype ||
11732 partConstr->confmatchtype != parentConstr->confmatchtype)
11744 parentConstrOid, parentInsTrigger,
11745 parentUpdTrigger, trigrel);
11761 Oid parentConstrOid,
11762 Oid parentInsTrigger,
11763 Oid parentUpdTrigger,
11770 bool queueValidation;
11771 Oid partConstrFrelid;
11772 Oid partConstrRelid;
11773 bool parentConstrIsEnforced;
11779 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11781 parentConstrIsEnforced = parentConstr->conenforced;
11787 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11789 partConstrFrelid = partConstr->confrelid;
11790 partConstrRelid = partConstr->conrelid;
11812 queueValidation = parentConstr->convalidated && !partConstr->convalidated;
11834 if (parentConstrIsEnforced)
11836 Oid insertTriggerOid,
11840 partConstrOid, partConstrFrelid, partConstrRelid,
11841 &insertTriggerOid, &updateTriggerOid);
11861 if (queueValidation)
11870 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11899 Anum_pg_constraint_conrelid,
11904 ConstraintRelidTypidNameIndexId,
11905 true, NULL, 1, &
key);
11911 if (conform->conparentid != conoid)
11930 ConstraintRelationId,
11939 Anum_pg_trigger_tgconstraint,
11943 true, NULL, 1, &key2);
11979 Anum_pg_trigger_tgconstraint,
11992 if (
OidIsValid(conrelid) && trgform->tgconstrrelid != conrelid)
11994 if (
OidIsValid(confrelid) && trgform->tgrelid != confrelid)
11998 Assert(trgform->tgfoid == F_RI_FKEY_CHECK_INS ||
11999 trgform->tgfoid == F_RI_FKEY_CHECK_UPD ||
12000 trgform->tgfoid == F_RI_FKEY_CASCADE_DEL ||
12001 trgform->tgfoid == F_RI_FKEY_CASCADE_UPD ||
12002 trgform->tgfoid == F_RI_FKEY_RESTRICT_DEL ||
12003 trgform->tgfoid == F_RI_FKEY_RESTRICT_UPD ||
12004 trgform->tgfoid == F_RI_FKEY_SETNULL_DEL ||
12005 trgform->tgfoid == F_RI_FKEY_SETNULL_UPD ||
12006 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_DEL ||
12007 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_UPD ||
12008 trgform->tgfoid == F_RI_FKEY_NOACTION_DEL ||
12009 trgform->tgfoid == F_RI_FKEY_NOACTION_UPD);
12040 Oid conoid,
Oid confrelid,
Oid conrelid,
12041 Oid *deleteTriggerOid,
12042 Oid *updateTriggerOid)
12048 *deleteTriggerOid = *updateTriggerOid =
InvalidOid;
12050 Anum_pg_trigger_tgconstraint,
12060 if (trgform->tgconstrrelid != conrelid)
12062 if (trgform->tgrelid != confrelid)
12067 if (TRIGGER_FOR_DELETE(trgform->tgtype))
12070 *deleteTriggerOid = trgform->oid;
12072 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12075 *updateTriggerOid = trgform->oid;
12077#ifndef USE_ASSERT_CHECKING
12085 elog(
ERROR,
"could not find ON DELETE action trigger of foreign key constraint %u",
12088 elog(
ERROR,
"could not find ON UPDATE action trigger of foreign key constraint %u",
12101 Oid conoid,
Oid confrelid,
Oid conrelid,
12102 Oid *insertTriggerOid,
12103 Oid *updateTriggerOid)
12109 *insertTriggerOid = *updateTriggerOid =
InvalidOid;
12111 Anum_pg_trigger_tgconstraint,
12121 if (trgform->tgconstrrelid != confrelid)
12123 if (trgform->tgrelid != conrelid)
12128 if (TRIGGER_FOR_INSERT(trgform->tgtype))
12131 *insertTriggerOid = trgform->oid;
12133 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12136 *updateTriggerOid = trgform->oid;
12138#ifndef USE_ASSERT_CHECKING
12146 elog(
ERROR,
"could not find ON INSERT check triggers of foreign key constraint %u",
12149 elog(
ERROR,
"could not find ON UPDATE check triggers of foreign key constraint %u",
12181 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
12183 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
12184 errmsg(
"constraint must be altered in child tables too"),
12185 errhint(
"Do not specify the ONLY keyword."));
12195 Anum_pg_constraint_conrelid,
12199 Anum_pg_constraint_contypid,
12203 Anum_pg_constraint_conname,
12207 true, NULL, 3, skey);
12212 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12213 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12219 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12220 errmsg(
"constraint \"%s\" of relation \"%s\" is not a foreign key constraint",
12224 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12225 errmsg(
"cannot alter enforceability of constraint \"%s\" of relation \"%s\"",
12228 currcon->contype != CONSTRAINT_NOTNULL)
12230 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12231 errmsg(
"constraint \"%s\" of relation \"%s\" is not a not-null constraint",
12236 cmdcon->
noinherit && currcon->coninhcount > 0)
12238 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12239 errmsg(
"cannot alter inherited constraint \"%s\" on relation \"%s\"",
12255 Oid parent = currcon->conparentid;
12256 char *ancestorname = NULL;
12257 char *ancestortable = NULL;
12273 parent = contup->conparentid;
12278 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12279 errmsg(
"cannot alter constraint \"%s\" on relation \"%s\"",
12281 ancestorname && ancestortable ?
12282 errdetail(
"Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\".",
12283 cmdcon->
conname, ancestorname, ancestortable) : 0,
12284 errhint(
"You may alter the constraint it derives from instead.")));
12293 contuple, recurse, lockmode))
12315 bool changed =
false;
12334 currcon->conrelid, currcon->confrelid,
12341 contuple, recurse, &otherrelids,
12382 Oid fkrelid,
Oid pkrelid,
12384 Oid ReferencedParentDelTrigger,
12385 Oid ReferencedParentUpdTrigger,
12386 Oid ReferencingParentInsTrigger,
12387 Oid ReferencingParentUpdTrigger)
12392 bool changed =
false;
12400 conoid = currcon->oid;
12403 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12405 rel =
table_open(currcon->conrelid, lockmode);
12421 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12424 fkrelid, pkrelid, contuple,
12447 if (currcon->conrelid == fkrelid)
12449 currcon->confrelid,
12453 ReferencedParentDelTrigger,
12454 ReferencedParentUpdTrigger,
12455 &ReferencedDelTriggerOid,
12456 &ReferencedUpdTriggerOid);
12459 if (currcon->confrelid == pkrelid)
12465 ReferencingParentInsTrigger,
12466 ReferencingParentUpdTrigger,
12467 &ReferencingInsTriggerOid,
12468 &ReferencingUpdTriggerOid);
12476 if (rel->
rd_rel->relkind == RELKIND_RELATION &&
12477 currcon->confrelid == pkrelid)
12485 newcon->
refrelid = currcon->confrelid;
12486 newcon->
refindid = currcon->conindid;
12487 newcon->
conid = currcon->oid;
12488 newcon->
qual = (
Node *) fkconstraint;
12500 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12503 fkrelid, pkrelid, contuple,
12504 lockmode, ReferencedDelTriggerOid,
12505 ReferencedUpdTriggerOid,
12506 ReferencingInsTriggerOid,
12507 ReferencingUpdTriggerOid);
12533 bool changed =
false;
12541 refrelid = currcon->confrelid;
12544 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12550 if (currcon->condeferrable != cmdcon->
deferrable ||
12569 if (recurse && changed &&
12570 (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12573 contuple, recurse, otherrelids,
12597 Assert(currcon->contype == CONSTRAINT_NOTNULL);
12603 if (cmdcon->
noinherit == currcon->connoinherit)
12611 colName =
get_attname(currcon->conrelid, colNum,
false);
12630 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
12631 colName, childoid);
12633 Assert(childcon->coninhcount > 0);
12634 childcon->coninhcount--;
12635 childcon->conislocal =
true;
12644 colName,
true,
true, lockmode);
12663 bool deferrable,
bool initdeferred,
12664 List **otherrelids)
12671 Anum_pg_trigger_tgconstraint,
12698 if (tgform->tgfoid != F_RI_FKEY_NOACTION_DEL &&
12699 tgform->tgfoid != F_RI_FKEY_NOACTION_UPD &&
12700 tgform->tgfoid != F_RI_FKEY_CHECK_INS &&
12701 tgform->tgfoid != F_RI_FKEY_CHECK_UPD)
12707 copy_tg->tgdeferrable = deferrable;
12708 copy_tg->tginitdeferred = initdeferred;
12733 Oid fkrelid,
Oid pkrelid,
12735 Oid ReferencedParentDelTrigger,
12736 Oid ReferencedParentUpdTrigger,
12737 Oid ReferencingParentInsTrigger,
12738 Oid ReferencingParentUpdTrigger)
12747 conoid = currcon->oid;
12750 Anum_pg_constraint_conparentid,
12755 true, NULL, 1, &pkey);
12759 pkrelid, childtup, lockmode,
12760 ReferencedParentDelTrigger,
12761 ReferencedParentUpdTrigger,
12762 ReferencingParentInsTrigger,
12763 ReferencingParentUpdTrigger);
12792 conoid = currcon->oid;
12795 Anum_pg_constraint_conparentid,
12800 true, NULL, 1, &pkey);
12807 childrel =
table_open(childcon->conrelid, lockmode);
12810 childtup, recurse, otherrelids, lockmode);
12849 copy_con->condeferrable = cmdcon->
deferrable;
12853 copy_con->connoinherit = cmdcon->
noinherit;
12877 bool recurse,
bool recursing,
LOCKMODE lockmode)
12892 Anum_pg_constraint_conrelid,
12896 Anum_pg_constraint_contypid,
12900 Anum_pg_constraint_conname,
12904 true, NULL, 3, skey);
12909 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12910 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12914 if (con->contype != CONSTRAINT_FOREIGN &&
12915 con->contype != CONSTRAINT_CHECK &&
12916 con->contype != CONSTRAINT_NOTNULL)
12918 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12919 errmsg(
"cannot validate constraint \"%s\" of relation \"%s\"",
12921 errdetail(
"This operation is not supported for this type of constraint."));
12923 if (!con->conenforced)
12925 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12926 errmsg(
"cannot validate NOT ENFORCED constraint")));
12928 if (!con->convalidated)
12930 if (con->contype == CONSTRAINT_FOREIGN)
12935 else if (con->contype == CONSTRAINT_CHECK)
12938 tuple, recurse, recursing, lockmode);
12940 else if (con->contype == CONSTRAINT_NOTNULL)
12943 tuple, recurse, recursing, lockmode);
12975 Assert(con->contype == CONSTRAINT_FOREIGN);
12976 Assert(!con->convalidated);
12987 if (fkrel->
rd_rel->relkind == RELKIND_RELATION &&
12988 con->confrelid == pkrelid)
13001 newcon->
refrelid = con->confrelid;
13003 newcon->
conid = con->oid;
13004 newcon->
qual = (
Node *) fkconstraint;
13016 if (fkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
13024 Anum_pg_constraint_conparentid,
13029 true, NULL, 1, &pkey);
13043 if (childcon->convalidated)
13046 childrel =
table_open(childcon->conrelid, lockmode);
13053 childtup, lockmode);
13069 copy_con->convalidated =
true;
13087 bool recurse,
bool recursing,
LOCKMODE lockmode)
13101 Assert(con->contype == CONSTRAINT_CHECK);
13108 if (!recursing && !con->connoinherit)
13119 foreach(child, children)
13134 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13135 errmsg(
"constraint must be validated on child tables too")));
13147 newcon->
name = constrName;
13151 newcon->
conid = con->oid;
13154 Anum_pg_constraint_conbin);
13172 copy_con->convalidated =
true;
13189 HeapTuple contuple,
bool recurse,
bool recursing,
13201 Assert(con->contype == CONSTRAINT_NOTNULL);
13213 if (!recursing && !con->connoinherit)
13234 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13235 errmsg(
"constraint must be validated on child tables too"));
13243 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
13246 if (childcon->convalidated)
13255 false,
true, lockmode);
13275 copy_con->convalidated =
true;
13302 foreach(l, colList)
13311 (
errcode(ERRCODE_UNDEFINED_COLUMN),
13312 errmsg(
"column \"%s\" referenced in foreign key constraint does not exist",
13315 if (attform->attnum < 0)
13317 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
13318 errmsg(
"system columns cannot be used in foreign keys")));
13321 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
13322 errmsg(
"cannot have more than %d keys in a foreign key",
13324 attnums[
attnum] = attform->attnum;
13325 if (atttypids != NULL)
13326 atttypids[
attnum] = attform->atttypid;
13327 if (attcollids != NULL)
13328 attcollids[
attnum] = attform->attcollation;
13351 List **attnamelist,
13353 Oid *opclasses,
bool *pk_has_without_overlaps)
13355 List *indexoidlist;
13359 Datum indclassDatum;
13372 foreach(indexoidscan, indexoidlist)
13378 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13380 if (indexStruct->indisprimary && indexStruct->indisvalid)
13387 if (!indexStruct->indimmediate)
13389 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13390 errmsg(
"cannot use a deferrable primary key for referenced table \"%s\"",
13393 *indexOid = indexoid;
13406 (
errcode(ERRCODE_UNDEFINED_OBJECT),
13407 errmsg(
"there is no primary key for referenced table \"%s\"",
13412 Anum_pg_index_indclass);
13419 *attnamelist =
NIL;
13420 for (
i = 0;
i < indexStruct->indnkeyatts;
i++)
13422 int pkattno = indexStruct->indkey.values[
i];
13424 attnums[
i] = pkattno;
13427 opclasses[
i] = indclass->
values[
i];
13428 *attnamelist =
lappend(*attnamelist,
13432 *pk_has_without_overlaps = indexStruct->indisexclusion;
13454 int numattrs,
int16 *attnums,
13455 bool with_period,
Oid *opclasses,
13456 bool *pk_has_without_overlaps)
13459 bool found =
false;
13460 bool found_deferrable =
false;
13461 List *indexoidlist;
13473 for (
i = 0;
i < numattrs;
i++)
13475 for (
j =
i + 1;
j < numattrs;
j++)
13477 if (attnums[
i] == attnums[
j])
13479 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13480 errmsg(
"foreign key referenced-columns list must not contain duplicates")));
13491 foreach(indexoidscan, indexoidlist)
13499 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13507 if (indexStruct->indnkeyatts == numattrs &&
13508 (with_period ? indexStruct->indisexclusion : indexStruct->indisunique) &&
13509 indexStruct->indisvalid &&
13513 Datum indclassDatum;
13518 Anum_pg_index_indclass);
13531 for (
i = 0;
i < numattrs;
i++)
13534 for (
j = 0;
j < numattrs;
j++)
13536 if (attnums[
i] == indexStruct->indkey.values[
j])
13538 opclasses[
i] = indclass->
values[
j];
13547 if (found && with_period)
13549 int16 periodattnum = attnums[numattrs - 1];
13551 found = (periodattnum == indexStruct->indkey.values[numattrs - 1]);
13559 if (found && !indexStruct->indimmediate)
13565 found_deferrable =
true;
13571 *pk_has_without_overlaps = indexStruct->indisexclusion;
13580 if (found_deferrable)
13582 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13583 errmsg(
"cannot use a deferrable unique constraint for referenced table \"%s\"",
13587 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13588 errmsg(
"there is no unique constraint matching given keys for referenced table \"%s\"",
13608 if (targetTypeId == sourceTypeId)
13619 elog(
ERROR,
"could not find cast from %u to %u",
13620 sourceTypeId, targetTypeId);
13645 for (
i = 0;
i < natts;
i++)
13677 (
errmsg_internal(
"validating foreign key constraint \"%s\"", conname)));
13712 "validateForeignKeyConstraint",
13733 trigdata.
type = T_TriggerData;
13740 fcinfo->context = (
Node *) &trigdata;
13763 Oid constraintOid,
Oid indexOid,
Oid parentTrigOid,
13781 fk_trigger->
trigname =
"RI_ConstraintTrigger_c";
13788 fk_trigger->
events = TRIGGER_TYPE_INSERT;
13793 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13797 fk_trigger->
row =
true;
13798 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13806 trigAddress =
CreateTrigger(fk_trigger, NULL, myRelOid, refRelOid,
13808 parentTrigOid, NULL,
true,
false);
13826 Oid constraintOid,
Oid indexOid,
13827 Oid parentDelTrigger,
Oid parentUpdTrigger,
13828 Oid *deleteTrigOid,
Oid *updateTrigOid)
13840 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13843 fk_trigger->
row =
true;
13844 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13845 fk_trigger->
events = TRIGGER_TYPE_DELETE;
13879 elog(
ERROR,
"unrecognized FK action type: %d",
13884 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13886 parentDelTrigger, NULL,
true,
false);
13888 *deleteTrigOid = trigAddress.
objectId;
13900 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13903 fk_trigger->
row =
true;
13904 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13905 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13939 elog(
ERROR,
"unrecognized FK action type: %d",
13944 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13946 parentUpdTrigger, NULL,
true,
false);
13948 *updateTrigOid = trigAddress.
objectId;
13963 Oid parentInsTrigger,
Oid parentUpdTrigger,
13964 Oid *insertTrigOid,
Oid *updateTrigOid)
13967 constraintOid, indexOid,
13968 parentInsTrigger,
true);
13970 constraintOid, indexOid,
13971 parentUpdTrigger,
false);
13982 bool missing_ok,
LOCKMODE lockmode)
13988 bool found =
false;
13996 Anum_pg_constraint_conrelid,
14000 Anum_pg_constraint_contypid,
14004 Anum_pg_constraint_conname,
14008 true, NULL, 3, skey);
14014 missing_ok, lockmode);
14024 errcode(ERRCODE_UNDEFINED_OBJECT),
14025 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
14029 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist, skipping",
14046 bool recurse,
bool recursing,
bool missing_ok,
14053 bool is_no_inherit_constraint =
false;
14055 char *colname = NULL;
14068 constrName =
NameStr(con->conname);
14071 if (con->coninhcount > 0 && !recursing)
14073 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14074 errmsg(
"cannot drop inherited constraint \"%s\" of relation \"%s\"",
14084 if (con->contype == CONSTRAINT_NOTNULL)
14105 if (pkattrs == NULL &&
14106 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14115 for (
int i = 0;
i < pk->
rd_index->indnkeyatts;
i++)
14125 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14126 errmsg(
"column \"%s\" is in a primary key",
14133 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14134 errmsg(
"column \"%s\" is in index used as replica identity",
14140 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
14143 if (attForm->attidentity !=
'\0')
14145 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
14146 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
14152 if (attForm->attnotnull)
14154 attForm->attnotnull =
false;
14161 is_no_inherit_constraint = con->connoinherit;
14170 if (con->contype == CONSTRAINT_FOREIGN &&
14191 if (con->contype != CONSTRAINT_CHECK &&
14192 con->contype != CONSTRAINT_NOTNULL &&
14193 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14204 if (!is_no_inherit_constraint)
14223 if (con->contype == CONSTRAINT_NOTNULL)
14227 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
14236 Anum_pg_constraint_conrelid,
14240 Anum_pg_constraint_contypid,
14244 Anum_pg_constraint_conname,
14248 true, NULL, 3, skey);
14253 (
errcode(ERRCODE_UNDEFINED_OBJECT),
14254 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
14264 if (childcon->contype != CONSTRAINT_CHECK &&
14265 childcon->contype != CONSTRAINT_NOTNULL)
14266 elog(
ERROR,
"inherited constraint is not a CHECK or not-null constraint");
14268 if (childcon->coninhcount <= 0)
14269 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
14270 childrelid,
NameStr(childcon->conname));
14278 if (childcon->coninhcount == 1 && !childcon->conislocal)
14282 recurse,
true, missing_ok,
14288 childcon->coninhcount--;
14303 childcon->coninhcount--;
14304 if (childcon->coninhcount == 0)
14305 childcon->conislocal =
true;
14343 bool recurse,
bool recursing,
14347 char *colName = cmd->
name;
14355 int32 targettypmod;
14364 if (rel->
rd_rel->reloftype && !recursing)
14366 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14367 errmsg(
"cannot alter column type of typed table"),
14374 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14375 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14379 attnum = attTup->attnum;
14384 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14385 errmsg(
"cannot alter system column \"%s\"", colName),
14394 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
14395 errmsg(
"cannot specify USING when altering type of generated column"),
14396 errdetail(
"Column \"%s\" is a generated column.", colName),
14404 if (attTup->attinhcount > 0 && !recursing)
14406 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14407 errmsg(
"cannot alter inherited column \"%s\"", colName),
14415 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14416 errmsg(
"cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"",
14435 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14439 else if (tab->
relkind == RELKIND_RELATION ||
14440 tab->
relkind == RELKIND_PARTITIONED_TABLE)
14454 attTup->atttypid, attTup->atttypmod,
14455 attTup->attcollation,
14461 targettype, targettypmod,
14465 if (transform == NULL)
14470 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14471 errmsg(
"result of USING clause for column \"%s\""
14472 " cannot be cast automatically to type %s",
14474 errhint(
"You might need to add an explicit cast.")));
14477 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14478 errmsg(
"column \"%s\" cannot be cast automatically to type %s",
14480 !attTup->attgenerated ?
14482 errhint(
"You might need to specify \"USING %s::%s\".",
14485 targettypmod)) : 0));
14504 newval->is_generated =
false;
14510 else if (transform)
14512 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14513 errmsg(
"\"%s\" is not a table",
14516 if (!RELKIND_HAS_STORAGE(tab->
relkind) || attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14545 &child_numparents);
14552 forboth(lo, child_oids, li, child_numparents)
14560 if (childrelid == relid)
14577 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14578 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14582 if (childattTup->attinhcount > numparents)
14584 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14585 errmsg(
"cannot alter inherited column \"%s\" of relation \"%s\"",
14597 bool found_whole_row;
14610 if (found_whole_row)
14612 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14613 errmsg(
"cannot convert whole-row table reference"),
14614 errdetail(
"USING expression contains a whole-row table reference.")));
14617 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
14621 else if (!recursing &&
14624 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14625 errmsg(
"type of inherited column \"%s\" must be changed in child tables too",
14628 if (tab->
relkind == RELKIND_COMPOSITE_TYPE)
14654 if (
IsA(expr,
Var) && ((
Var *) expr)->varattno == varattno)
14672 case F_TIMESTAMPTZ_TIMESTAMP:
14673 case F_TIMESTAMP_TIMESTAMPTZ:
14697 char *colName = cmd->
name;
14707 int32 targettypmod;
14738 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14739 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14742 attnum = attTup->attnum;
14746 if (attTup->atttypid != attOldTup->atttypid ||
14747 attTup->atttypmod != attOldTup->atttypmod)
14749 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14750 errmsg(
"cannot alter type of column \"%s\" twice",
14754 typeTuple =
typenameType(NULL, typeName, &targettypmod);
14756 targettype = tform->oid;
14772 if (attTup->atthasdef)
14778 defaultexpr,
exprType(defaultexpr),
14779 targettype, targettypmod,
14783 if (defaultexpr == NULL)
14785 if (attTup->attgenerated)
14787 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14788 errmsg(
"generation expression for column \"%s\" cannot be cast automatically to type %s",
14792 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14793 errmsg(
"default for column \"%s\" cannot be cast automatically to type %s",
14798 defaultexpr = NULL;
14819 Anum_pg_depend_classid,
14823 Anum_pg_depend_objid,
14827 Anum_pg_depend_objsubid,
14839 foundObject.
classId = foundDep->refclassid;
14840 foundObject.
objectId = foundDep->refobjid;
14844 elog(
ERROR,
"found unexpected dependency type '%c'",
14845 foundDep->deptype);
14846 if (!(foundDep->refclassid == TypeRelationId &&
14847 foundDep->refobjid == attTup->atttypid) &&
14848 !(foundDep->refclassid == CollationRelationId &&
14849 foundDep->refobjid == attTup->attcollation))
14850 elog(
ERROR,
"found unexpected dependency for column: %s",
14865 if (attTup->atthasmissing)
14875 Anum_pg_attribute_attmissingval,
14876 attrelation->rd_att,
14892 Datum valuesAtt[Natts_pg_attribute] = {0};
14893 bool nullsAtt[Natts_pg_attribute] = {0};
14894 bool replacesAtt[Natts_pg_attribute] = {0};
14912 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
14913 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
14914 nullsAtt[Anum_pg_attribute_attmissingval - 1] =
false;
14917 valuesAtt, nullsAtt, replacesAtt);
14924 attTup->atttypid = targettype;
14925 attTup->atttypmod = targettypmod;
14926 attTup->attcollation = targetcollid;
14929 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
14930 errmsg(
"too many array dimensions"));
14931 attTup->attndims =
list_length(typeName->arrayBounds);
14932 attTup->attlen = tform->typlen;
14933 attTup->attbyval = tform->typbyval;
14934 attTup->attalign = tform->typalign;
14935 attTup->attstorage = tform->typstorage;
14970 if (attTup->attgenerated)
14975 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
15024 Anum_pg_depend_refclassid,
15028 Anum_pg_depend_refobjid,
15032 Anum_pg_depend_refobjsubid,
15044 foundObject.
classId = foundDep->classid;
15045 foundObject.
objectId = foundDep->objid;
15050 case RelationRelationId:
15054 if (relKind == RELKIND_INDEX ||
15055 relKind == RELKIND_PARTITIONED_INDEX)
15060 else if (relKind == RELKIND_SEQUENCE)
15071 elog(
ERROR,
"unexpected object depending on column: %s",
15077 case ConstraintRelationId:
15082 case ProcedureRelationId:
15096 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15097 errmsg(
"cannot alter type of a column used by a function or procedure"),
15098 errdetail(
"%s depends on column \"%s\"",
15103 case RewriteRelationId:
15111 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15112 errmsg(
"cannot alter type of a column used by a view or rule"),
15113 errdetail(
"%s depends on column \"%s\"",
15118 case TriggerRelationId:
15131 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15132 errmsg(
"cannot alter type of a column used in a trigger definition"),
15133 errdetail(
"%s depends on column \"%s\"",
15138 case PolicyRelationId:
15150 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15151 errmsg(
"cannot alter type of a column used in a policy definition"),
15152 errdetail(
"%s depends on column \"%s\"",
15157 case AttrDefaultRelationId:
15181 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15182 errmsg(
"cannot alter type of a column used by a generated column"),
15183 errdetail(
"Column \"%s\" is used by generated column \"%s\".",
15192 case StatisticExtRelationId:
15201 case PublicationRelRelationId:
15209 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15210 errmsg(
"cannot alter type of a column used by a publication WHERE clause"),
15211 errdetail(
"%s depends on column \"%s\"",
15222 elog(
ERROR,
"unexpected object depending on column: %s",
15243 elog(
ERROR,
"relation %u has multiple indexes marked as replica identity", tab->
relid);
15258 elog(
ERROR,
"relation %u has multiple clustered indexes", tab->
relid);
15446 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15449 relid = con->conrelid;
15455 elog(
ERROR,
"could not identify relation associated with constraint %u", oldId);
15457 confrelid = con->confrelid;
15458 conislocal = con->conislocal;
15480 if (relid != tab->
relid)
15484 (
char *)
lfirst(def_item),
15485 wqueue, lockmode, tab->
rewrite);
15487 forboth(oid_item, tab->changedIndexOids,
15488 def_item, tab->changedIndexDefs)
15499 if (relid != tab->relid)
15503 (
char *)
lfirst(def_item),
15504 wqueue, lockmode, tab->rewrite);
15511 forboth(oid_item, tab->changedStatisticsOids,
15512 def_item, tab->changedStatisticsDefs)
15529 if (relid != tab->relid)
15533 (
char *)
lfirst(def_item),
15534 wqueue, lockmode, tab->rewrite);
15543 if (tab->replicaIdentityIndex)
15549 subcmd->
name = tab->replicaIdentityIndex;
15561 if (tab->clusterOnIndex)
15566 cmd->
name = tab->clusterOnIndex;
15599 List *raw_parsetree_list;
15600 List *querytree_list;
15611 querytree_list =
NIL;
15612 foreach(list_item, raw_parsetree_list)
15618 querytree_list =
lappend(querytree_list,
15632 querytree_list =
list_concat(querytree_list, beforeStmts);
15634 querytree_list =
list_concat(querytree_list, afterStmts);
15637 querytree_list =
lappend(querytree_list,
15656 foreach(list_item, querytree_list)
15670 stmt->reset_default_tblspc =
true;
15685 foreach(lcmd,
stmt->cmds)
15701 RelationRelationId, 0);
15723 !rewrite && tab->
rewrite == 0)
15747 elog(
ERROR,
"unexpected statement subtype: %d",
15774 elog(
ERROR,
"unexpected statement subtype: %d",
15775 (
int)
stmt->subtype);
15783 stmt->stxcomment =
GetComment(oldId, StatisticExtRelationId, 0);
15792 elog(
ERROR,
"unexpected statement type: %d",
15812 const char *conname)
15819 comment_str =
GetComment(objid, ConstraintRelationId, 0);
15820 if (comment_str == NULL)
15857 stmt->accessMethod,
15859 stmt->excludeOpNames,
15860 stmt->iswithoutoverlaps))
15865 if (irel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
15897 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15900 Anum_pg_constraint_conpfeqop);
15907 elog(
ERROR,
"conpfeqop is not a 1-D Oid array");
15911 for (
i = 0;
i < numkeys;
i++)
15924 const char *colName,
15935 Datum repl_val[Natts_pg_attribute];
15936 bool repl_null[Natts_pg_attribute];
15937 bool repl_repl[Natts_pg_attribute];
15952 (
errcode(ERRCODE_UNDEFINED_OBJECT),
15953 errmsg(
"foreign table \"%s\" does not exist",
15966 (
errcode(ERRCODE_UNDEFINED_COLUMN),
15967 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
15972 attnum = atttableform->attnum;
15975 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15976 errmsg(
"cannot alter system column \"%s\"", colName)));
15980 memset(repl_val, 0,
sizeof(repl_val));
15981 memset(repl_null,
false,
sizeof(repl_null));
15982 memset(repl_repl,
false,
sizeof(repl_repl));
15987 Anum_pg_attribute_attfdwoptions,
15999 repl_val[Anum_pg_attribute_attfdwoptions - 1] = datum;
16001 repl_null[Anum_pg_attribute_attfdwoptions - 1] =
true;
16003 repl_repl[Anum_pg_attribute_attfdwoptions - 1] =
true;
16008 repl_val, repl_null, repl_repl);
16014 atttableform->attnum);
16058 elog(
ERROR,
"cache lookup failed for relation %u", relationOid);
16062 switch (tuple_class->relkind)
16064 case RELKIND_RELATION:
16066 case RELKIND_MATVIEW:
16067 case RELKIND_FOREIGN_TABLE:
16068 case RELKIND_PARTITIONED_TABLE:
16071 case RELKIND_INDEX:
16081 if (tuple_class->relowner != newOwnerId)
16083 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16084 errmsg(
"cannot change owner of index \"%s\"",
16085 NameStr(tuple_class->relname)),
16086 errhint(
"Change the ownership of the index's table instead.")));
16088 newOwnerId = tuple_class->relowner;
16091 case RELKIND_PARTITIONED_INDEX:
16095 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16096 errmsg(
"cannot change owner of index \"%s\"",
16097 NameStr(tuple_class->relname)),
16098 errhint(
"Change the ownership of the index's table instead.")));
16100 case RELKIND_SEQUENCE:
16102 tuple_class->relowner != newOwnerId)
16111 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16112 errmsg(
"cannot change owner of sequence \"%s\"",
16113 NameStr(tuple_class->relname)),
16114 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
16115 NameStr(tuple_class->relname),
16119 case RELKIND_COMPOSITE_TYPE:
16123 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16124 errmsg(
"\"%s\" is a composite type",
16125 NameStr(tuple_class->relname)),
16130 case RELKIND_TOASTVALUE:
16136 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16137 errmsg(
"cannot change owner of relation \"%s\"",
16138 NameStr(tuple_class->relname)),
16146 if (tuple_class->relowner != newOwnerId)
16148 Datum repl_val[Natts_pg_class];
16149 bool repl_null[Natts_pg_class];
16150 bool repl_repl[Natts_pg_class];
16162 Oid namespaceOid = tuple_class->relnamespace;
16174 aclresult =
object_aclcheck(NamespaceRelationId, namespaceOid, newOwnerId,
16182 memset(repl_null,
false,
sizeof(repl_null));
16183 memset(repl_repl,
false,
sizeof(repl_repl));
16185 repl_repl[Anum_pg_class_relowner - 1] =
true;
16193 Anum_pg_class_relacl,
16198 tuple_class->relowner, newOwnerId);
16199 repl_repl[Anum_pg_class_relacl - 1] =
true;
16214 tuple_class->relowner,
16222 if (tuple_class->relkind != RELKIND_COMPOSITE_TYPE &&
16223 tuple_class->relkind != RELKIND_INDEX &&
16224 tuple_class->relkind != RELKIND_PARTITIONED_INDEX &&
16225 tuple_class->relkind != RELKIND_TOASTVALUE)
16240 if (tuple_class->relkind == RELKIND_RELATION ||
16241 tuple_class->relkind == RELKIND_PARTITIONED_TABLE ||
16242 tuple_class->relkind == RELKIND_MATVIEW ||
16243 tuple_class->relkind == RELKIND_TOASTVALUE)
16245 List *index_oid_list;
16252 foreach(
i, index_oid_list)
16259 if (tuple_class->reltoastrelid !=
InvalidOid)
16290 Anum_pg_attribute_attrelid,
16294 true, NULL, 1,
key);
16298 Datum repl_val[Natts_pg_attribute];
16299 bool repl_null[Natts_pg_attribute];
16300 bool repl_repl[Natts_pg_attribute];
16307 if (att->attisdropped)
16311 Anum_pg_attribute_attacl,
16318 memset(repl_null,
false,
sizeof(repl_null));
16319 memset(repl_repl,
false,
sizeof(repl_repl));
16322 oldOwnerId, newOwnerId);
16323 repl_repl[Anum_pg_attribute_attacl - 1] =
true;
16328 repl_val, repl_null, repl_repl);
16360 Anum_pg_depend_refclassid,
16364 Anum_pg_depend_refobjid,
16378 if (depForm->refobjsubid == 0 ||
16379 depForm->classid != RelationRelationId ||
16380 depForm->objsubid != 0 ||
16424 (
errcode(ERRCODE_UNDEFINED_OBJECT),
16425 errmsg(
"index \"%s\" for table \"%s\" does not exist",
16435 RelationRelationId, indexOid);
16468 if (amname != NULL)
16470 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
16476 if (rel->
rd_rel->relam == amoid)
16496 Oid oldAccessMethodId;
16512 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
16516 oldAccessMethodId = rd_rel->relam;
16517 rd_rel->relam = newAccessMethodId;
16520 if (rd_rel->relam == oldAccessMethodId)
16556 AccessMethodRelationId,
16566 AccessMethodRelationId,
16567 oldAccessMethodId, rd_rel->relam);
16603 (
errcode(ERRCODE_SYNTAX_ERROR),
16604 errmsg(
"cannot have multiple SET TABLESPACE subcommands")));
16622 Datum repl_val[Natts_pg_class];
16623 bool repl_null[Natts_pg_class];
16624 bool repl_repl[Natts_pg_class];
16636 elog(
ERROR,
"cache lookup failed for relation %u", relid);
16662 switch (rel->
rd_rel->relkind)
16664 case RELKIND_RELATION:
16665 case RELKIND_MATVIEW:
16668 case RELKIND_PARTITIONED_TABLE:
16674 case RELKIND_INDEX:
16675 case RELKIND_PARTITIONED_INDEX:
16678 case RELKIND_TOASTVALUE:
16682 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16683 errmsg(
"cannot set options for relation \"%s\"",
16690 if (rel->
rd_rel->relkind == RELKIND_VIEW)
16695 bool check_option =
false;
16697 foreach(cell, view_options)
16701 if (strcmp(defel->
defname,
"check_option") == 0)
16702 check_option =
true;
16711 const char *view_updatable_error =
16714 if (view_updatable_error)
16716 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16717 errmsg(
"WITH CHECK OPTION is supported only on automatically updatable views"),
16718 errhint(
"%s",
_(view_updatable_error))));
16726 memset(repl_val, 0,
sizeof(repl_val));
16727 memset(repl_null,
false,
sizeof(repl_null));
16728 memset(repl_repl,
false,
sizeof(repl_repl));
16730 if (newOptions != (
Datum) 0)
16731 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16733 repl_null[Anum_pg_class_reloptions - 1] =
true;
16735 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16738 repl_val, repl_null, repl_repl);
16753 Oid toastid = rel->
rd_rel->reltoastrelid;
16760 elog(
ERROR,
"cache lookup failed for relation %u", toastid);
16786 memset(repl_val, 0,
sizeof(repl_val));
16787 memset(repl_null,
false,
sizeof(repl_null));
16788 memset(repl_repl,
false,
sizeof(repl_repl));
16790 if (newOptions != (
Datum) 0)
16791 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16793 repl_null[Anum_pg_class_reloptions - 1] =
true;
16795 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16798 repl_val, repl_null, repl_repl);
16844 reltoastrelid = rel->
rd_rel->reltoastrelid;
16859 rel->
rd_rel->relpersistence);
16863 newrlocator.
relNumber = newrelfilenumber;
16864 newrlocator.
spcOid = newTableSpace;
16867 if (rel->
rd_rel->relkind == RELKIND_INDEX)
16899 foreach(lc, reltoastidxids)
16961 Oid orig_tablespaceoid;
16962 Oid new_tablespaceoid;
16969 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16970 errmsg(
"only tables, indexes, and materialized views exist in tablespaces")));
16978 if (orig_tablespaceoid == GLOBALTABLESPACE_OID ||
16979 new_tablespaceoid == GLOBALTABLESPACE_OID)
16981 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16982 errmsg(
"cannot move relations in to or out of pg_global tablespace")));
17011 if (orig_tablespaceoid == new_tablespaceoid)
17012 return new_tablespaceoid;
17019 Anum_pg_class_reltablespace,
17028 Oid relOid = relForm->oid;
17039 relForm->relisshared ||
17046 relForm->relkind != RELKIND_RELATION &&
17047 relForm->relkind != RELKIND_PARTITIONED_TABLE) ||
17049 relForm->relkind != RELKIND_INDEX &&
17050 relForm->relkind != RELKIND_PARTITIONED_INDEX) ||
17052 relForm->relkind != RELKIND_MATVIEW))
17070 if (
stmt->nowait &&
17073 (
errcode(ERRCODE_OBJECT_IN_USE),
17074 errmsg(
"aborting because lock on relation \"%s.%s\" is not available",
17076 NameStr(relForm->relname))));
17087 if (relations ==
NIL)
17089 (
errcode(ERRCODE_NO_DATA_FOUND),
17090 errmsg(
"no matching relations in tablespace \"%s\" found",
17091 orig_tablespaceoid ==
InvalidOid ?
"(database default)" :
17095 foreach(l, relations)
17101 cmd->
name =
stmt->new_tablespacename;
17111 return new_tablespaceoid;
17138 rel->
rd_rel->relpersistence);
17153 (rel->
rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED &&
17157 rel->
rd_rel->relpersistence);
17173 char fires_when,
bool skip_system,
bool recurse,
17177 fires_when, skip_system, recurse,
17191 char fires_when,
LOCKMODE lockmode)
17209 if (child_rel->
rd_rel->reloftype)
17211 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17212 errmsg(
"cannot change inheritance of typed table")));
17214 if (child_rel->
rd_rel->relispartition)
17216 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17217 errmsg(
"cannot change inheritance of a partition")));
17219 if (child_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17221 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17222 errmsg(
"cannot change inheritance of partitioned table")));
17234 const char *trigger_name;
17250 if (parent_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17251 child_rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
17253 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17254 errmsg(
"cannot inherit from temporary relation \"%s\"",
17260 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17261 errmsg(
"cannot inherit from temporary relation of another session")));
17266 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17267 errmsg(
"cannot inherit to temporary relation of another session")));
17270 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17272 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17273 errmsg(
"cannot inherit from partitioned table \"%s\"",
17277 if (parent_rel->
rd_rel->relispartition)
17279 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17280 errmsg(
"cannot inherit from a partition")));
17301 (
errcode(ERRCODE_DUPLICATE_TABLE),
17302 errmsg(
"circular inheritance not allowed"),
17303 errdetail(
"\"%s\" is already a child of \"%s\".",
17313 if (trigger_name != NULL)
17315 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
17316 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming an inheritance child",
17318 errdetail(
"ROW triggers with transition tables are not supported in inheritance hierarchies.")));
17361 Anum_pg_inherits_inhrelid,
17365 true, NULL, 1, &
key);
17375 (
errcode(ERRCODE_DUPLICATE_TABLE),
17376 errmsg(
"relation \"%s\" would be inherited from more than once",
17379 if (inh->inhseqno > inhseqno)
17380 inhseqno = inh->inhseqno;
17397 parent_rel->
rd_rel->relkind ==
17398 RELKIND_PARTITIONED_TABLE);
17417 attr =
heap_getattr(contup, Anum_pg_constraint_conbin, tupdesc, &isnull);
17419 elog(
ERROR,
"null conbin for constraint %u", con->oid);
17442 if (acon->condeferrable != bcon->condeferrable ||
17443 acon->condeferred != bcon->condeferred ||
17474 for (
AttrNumber parent_attno = 1; parent_attno <= parent_desc->
natts; parent_attno++)
17477 char *parent_attname =
NameStr(parent_att->attname);
17481 if (parent_att->attisdropped)
17490 if (parent_att->atttypid != child_att->atttypid ||
17491 parent_att->atttypmod != child_att->atttypmod)
17493 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17494 errmsg(
"child table \"%s\" has different type for column \"%s\"",
17497 if (parent_att->attcollation != child_att->attcollation)
17499 (
errcode(ERRCODE_COLLATION_MISMATCH),
17500 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
17509 if (parent_att->attnotnull && !child_att->attnotnull)
17514 parent_att->attnum);
17518 errcode(ERRCODE_DATATYPE_MISMATCH),
17519 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17526 if (parent_att->attgenerated && !child_att->attgenerated)
17528 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17529 errmsg(
"column \"%s\" in child table must be a generated column", parent_attname)));
17530 if (child_att->attgenerated && !parent_att->attgenerated)
17532 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17533 errmsg(
"column \"%s\" in child table must not be a generated column", parent_attname)));
17535 if (parent_att->attgenerated && child_att->attgenerated && child_att->attgenerated != parent_att->attgenerated)
17537 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17538 errmsg(
"column \"%s\" inherits from generated column of different kind", parent_attname),
17539 errdetail(
"Parent column is %s, child column is %s.",
17540 parent_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
17541 child_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
17549 child_att->attidentity = parent_att->attidentity;
17556 &child_att->attinhcount))
17558 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17559 errmsg(
"too many inheritance parents"));
17566 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17568 Assert(child_att->attinhcount == 1);
17569 child_att->attislocal =
false;
17578 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17579 errmsg(
"child table is missing column \"%s\"", parent_attname)));
17617 Anum_pg_constraint_conrelid,
17621 true, NULL, 1, &parent_key);
17634 bool found =
false;
17636 if (parent_con->contype != CONSTRAINT_CHECK &&
17637 parent_con->contype != CONSTRAINT_NOTNULL)
17641 if (parent_con->connoinherit)
17644 if (parent_con->contype == CONSTRAINT_NOTNULL)
17651 Anum_pg_constraint_conrelid,
17655 true, NULL, 1, &child_key);
17662 if (child_con->contype != parent_con->contype)
17669 if (child_con->contype == CONSTRAINT_CHECK)
17671 if (strcmp(
NameStr(parent_con->conname),
17672 NameStr(child_con->conname)) != 0)
17675 else if (child_con->contype == CONSTRAINT_NOTNULL)
17683 if (parent_attno != attmap->
attnums[child_attno - 1])
17688 if (parent_attr->attisdropped || child_attr->attisdropped)
17689 elog(
ERROR,
"found not-null constraint on dropped columns");
17692 if (child_con->contype == CONSTRAINT_CHECK &&
17695 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17696 errmsg(
"child table \"%s\" has different definition for check constraint \"%s\"",
17702 if (child_con->connoinherit)
17704 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17705 errmsg(
"constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"",
17712 if (parent_con->convalidated && child_con->conenforced &&
17713 !child_con->convalidated)
17715 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17716 errmsg(
"constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"",
17724 if (parent_con->conenforced && !child_con->conenforced)
17726 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17727 errmsg(
"constraint \"%s\" conflicts with NOT ENFORCED constraint on child table \"%s\"",
17738 &child_con->coninhcount))
17740 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17741 errmsg(
"too many inheritance parents"));
17748 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17750 Assert(child_con->coninhcount == 1);
17751 child_con->conislocal =
false;
17765 if (parent_con->contype == CONSTRAINT_NOTNULL)
17767 errcode(ERRCODE_DATATYPE_MISMATCH),
17768 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17775 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17776 errmsg(
"child table is missing constraint \"%s\"",
17777 NameStr(parent_con->conname))));
17796 if (rel->
rd_rel->relispartition)
17798 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17799 errmsg(
"cannot change inheritance of a partition")));
17839 bool found =
false;
17841 Assert(parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17849 Anum_pg_inherits_inhparent,
17853 true, NULL, 1, &
key);
17860 if (inhForm->inhdetachpending)
17862 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
17863 errmsg(
"partition \"%s\" already pending detach in partitioned table \"%s.%s\"",
17867 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
17892 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17927 bool is_partitioning;
17929 is_partitioning = (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17937 if (is_partitioning)
17940 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17946 errmsg(
"relation \"%s\" is not a parent of relation \"%s\"",
17956 Anum_pg_attribute_attrelid,
17960 true, NULL, 1,
key);
17966 if (att->attisdropped)
17968 if (att->attinhcount <= 0)
17978 copy_att->attinhcount--;
17979 if (copy_att->attinhcount == 0)
17980 copy_att->attislocal =
true;
18004 Anum_pg_constraint_conrelid,
18008 true, NULL, 1,
key);
18017 if (con->connoinherit)
18020 if (con->contype == CONSTRAINT_CHECK)
18022 if (con->contype == CONSTRAINT_NOTNULL)
18034 Anum_pg_constraint_conrelid,
18038 true, NULL, 1,
key);
18043 bool match =
false;
18049 if (con->contype == CONSTRAINT_CHECK)
18053 if (con->contype == CONSTRAINT_CHECK &&
18054 strcmp(
NameStr(con->conname), chkname) == 0)
18062 else if (con->contype == CONSTRAINT_NOTNULL)
18068 if (prevattno == child_attno)
18085 if (copy_con->coninhcount <= 0)
18086 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
18089 copy_con->coninhcount--;
18090 if (copy_con->coninhcount == 0)
18091 copy_con->conislocal =
true;
18099 if (connames !=
NIL || nncolumns !=
NIL)
18100 elog(
ERROR,
"%d unmatched constraints while removing inheritance from \"%s\" to \"%s\"",
18108 RelationRelationId,
18141 Anum_pg_depend_classid,
18145 Anum_pg_depend_objid,
18149 Anum_pg_depend_objsubid,
18160 if (dep->refclassid == refclassid &&
18161 dep->refobjid == refobjid &&
18162 dep->refobjsubid == 0 &&
18163 dep->deptype == deptype)
18204 typeid = typeform->oid;
18209 Anum_pg_inherits_inhrelid,
18213 true, NULL, 1, &
key);
18216 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18217 errmsg(
"typed tables cannot inherit")));
18228 for (type_attno = 1; type_attno <= typeTupleDesc->
natts; type_attno++)
18232 const char *type_attname,
18237 if (type_attr->attisdropped)
18239 type_attname =
NameStr(type_attr->attname);
18244 if (table_attno > tableTupleDesc->
natts)
18246 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18247 errmsg(
"table is missing column \"%s\"",
18249 table_attr =
TupleDescAttr(tableTupleDesc, table_attno - 1);
18251 }
while (table_attr->attisdropped);
18252 table_attname =
NameStr(table_attr->attname);
18255 if (strncmp(table_attname, type_attname,
NAMEDATALEN) != 0)
18257 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18258 errmsg(
"table has column \"%s\" where type requires \"%s\"",
18259 table_attname, type_attname)));
18262 if (table_attr->atttypid != type_attr->atttypid ||
18263 table_attr->atttypmod != type_attr->atttypmod ||
18264 table_attr->attcollation != type_attr->attcollation)
18266 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18267 errmsg(
"table \"%s\" has different type for column \"%s\"",
18273 for (; table_attno <= tableTupleDesc->
natts; table_attno++)
18278 if (!table_attr->attisdropped)
18280 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18281 errmsg(
"table has extra column \"%s\"",
18282 NameStr(table_attr->attname))));
18286 if (rel->
rd_rel->reloftype)
18291 tableobj.
classId = RelationRelationId;
18294 typeobj.
classId = TypeRelationId;
18303 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18332 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18333 errmsg(
"\"%s\" is not a typed table",
18348 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18386 elog(
ERROR,
"cache lookup failed for relation \"%s\"",
18389 if (pg_class_form->relreplident != ri_type)
18391 pg_class_form->relreplident = ri_type;
18404 bool dirty =
false;
18409 elog(
ERROR,
"cache lookup failed for index %u", thisIndexOid);
18412 if (thisIndexOid == indexOid)
18415 if (!pg_index_form->indisreplident)
18418 pg_index_form->indisreplident =
true;
18424 if (pg_index_form->indisreplident)
18427 pg_index_form->indisreplident =
false;
18462 if (
stmt->identity_type == REPLICA_IDENTITY_DEFAULT)
18467 else if (
stmt->identity_type == REPLICA_IDENTITY_FULL)
18472 else if (
stmt->identity_type == REPLICA_IDENTITY_NOTHING)
18477 else if (
stmt->identity_type == REPLICA_IDENTITY_INDEX)
18482 elog(
ERROR,
"unexpected identity type %u",
stmt->identity_type);
18488 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18489 errmsg(
"index \"%s\" for table \"%s\" does not exist",
18498 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18499 errmsg(
"\"%s\" is not an index for table \"%s\"",
18509 !indexRel->
rd_index->indisunique) &&
18512 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18513 errmsg(
"cannot use non-unique index \"%s\" as replica identity",
18516 if (!indexRel->
rd_index->indimmediate)
18518 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18519 errmsg(
"cannot use non-immediate index \"%s\" as replica identity",
18524 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18525 errmsg(
"cannot use expression index \"%s\" as replica identity",
18530 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18531 errmsg(
"cannot use partial index \"%s\" as replica identity",
18547 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
18548 errmsg(
"index \"%s\" cannot be used as replica identity because column %d is a system column",
18552 if (!attr->attnotnull)
18554 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18555 errmsg(
"index \"%s\" cannot be used as replica identity because column \"%s\" is nullable",
18584 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18613 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18636 Datum repl_val[Natts_pg_foreign_table];
18637 bool repl_null[Natts_pg_foreign_table];
18638 bool repl_repl[Natts_pg_foreign_table];
18651 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18652 errmsg(
"foreign table \"%s\" does not exist",
18658 memset(repl_val, 0,
sizeof(repl_val));
18659 memset(repl_null,
false,
sizeof(repl_null));
18660 memset(repl_repl,
false,
sizeof(repl_repl));
18665 Anum_pg_foreign_table_ftoptions,
18677 repl_val[Anum_pg_foreign_table_ftoptions - 1] = datum;
18679 repl_null[Anum_pg_foreign_table_ftoptions - 1] =
true;
18681 repl_repl[Anum_pg_foreign_table_ftoptions - 1] =
true;
18686 repl_val, repl_null, repl_repl);
18711 const char *column,
18723 compression =
strVal(newValue);
18731 (
errcode(ERRCODE_UNDEFINED_COLUMN),
18732 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
18737 attnum = atttableform->attnum;
18740 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18741 errmsg(
"cannot alter system column \"%s\"", column)));
18750 atttableform->attcompression = cmethod;
18799 switch (rel->
rd_rel->relpersistence)
18801 case RELPERSISTENCE_TEMP:
18803 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18804 errmsg(
"cannot change logged status of table \"%s\" because it is temporary",
18808 case RELPERSISTENCE_PERMANENT:
18813 case RELPERSISTENCE_UNLOGGED:
18827 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
18828 errmsg(
"cannot change table \"%s\" to unlogged because it is part of a publication",
18830 errdetail(
"Unlogged relations cannot be replicated.")));
18844 toLogged ? Anum_pg_constraint_conrelid :
18845 Anum_pg_constraint_confrelid,
18849 toLogged ? ConstraintRelidTypidNameIndexId :
InvalidOid,
18850 true, NULL, 1, skey);
18856 if (con->contype == CONSTRAINT_FOREIGN)
18862 foreignrelid = toLogged ? con->confrelid : con->conrelid;
18874 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18875 errmsg(
"could not change table \"%s\" to logged because it references unlogged table \"%s\"",
18884 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18885 errmsg(
"could not change table \"%s\" to unlogged because it references logged table \"%s\"",
18930 (
errmsg(
"relation \"%s\" does not exist, skipping",
18931 stmt->relation->relname)));
18940 if (rel->
rd_rel->relkind == RELKIND_SEQUENCE)
18948 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18949 errmsg(
"cannot move an owned sequence into another schema"),
18950 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
18969 *oldschema = oldNspOid;
18988 Assert(objsMoved != NULL);
18994 nspOid,
true, objsMoved);
19021 Oid oldNspOid,
Oid newNspOid,
19022 bool hasDependEntry,
19028 bool already_done =
false;
19033 elog(
ERROR,
"cache lookup failed for relation %u", relOid);
19036 Assert(classForm->relnamespace == oldNspOid);
19038 thisobj.
classId = RelationRelationId;
19048 if (!already_done && oldNspOid != newNspOid)
19056 (
errcode(ERRCODE_DUPLICATE_TABLE),
19057 errmsg(
"relation \"%s\" already exists in schema \"%s\"",
19062 classForm->relnamespace = newNspOid;
19069 if (hasDependEntry &&
19072 NamespaceRelationId,
19075 elog(
ERROR,
"could not change schema dependency for relation \"%s\"",
19076 NameStr(classForm->relname));
19105 foreach(l, indexList)
19110 thisobj.
classId = RelationRelationId;
19125 oldNspOid, newNspOid,
19158 Anum_pg_depend_refclassid,
19162 Anum_pg_depend_refobjid,
19176 if (depForm->refobjsubid == 0 ||
19177 depForm->classid != RelationRelationId ||
19178 depForm->objsubid != 0 ||
19195 oldNspOid, newNspOid,
19271 if (oc->
relid == relid)
19289 List *oids_to_truncate =
NIL;
19330 if (oids_to_truncate !=
NIL)
19333 if (oids_to_drop !=
NIL)
19337 foreach(l, oids_to_drop)
19341 object.
classId = RelationRelationId;
19343 object.objectSubId = 0;
19365#ifdef USE_ASSERT_CHECKING
19478 if (relkind != RELKIND_RELATION && relkind != RELKIND_TOASTVALUE &&
19479 relkind != RELKIND_MATVIEW && relkind != RELKIND_PARTITIONED_TABLE)
19481 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19482 errmsg(
"\"%s\" is not a table or materialized view", relation->
relname)));
19507 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19531 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19540 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19541 errmsg(
"permission denied: \"%s\" is a system catalog",
19566 relkind = classform->relkind;
19575 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19576 errmsg(
"permission denied: \"%s\" is a system catalog",
19587 aclresult =
object_aclcheck(NamespaceRelationId, classform->relnamespace,
19614 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19617 if (reltype ==
OBJECT_VIEW && relkind != RELKIND_VIEW)
19619 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19624 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19625 errmsg(
"\"%s\" is not a materialized view", rv->
relname)));
19629 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19632 if (reltype ==
OBJECT_TYPE && relkind != RELKIND_COMPOSITE_TYPE)
19634 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19637 if (reltype ==
OBJECT_INDEX && relkind != RELKIND_INDEX &&
19638 relkind != RELKIND_PARTITIONED_INDEX
19641 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19648 if (reltype !=
OBJECT_TYPE && relkind == RELKIND_COMPOSITE_TYPE)
19650 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19662 if (relkind == RELKIND_INDEX || relkind == RELKIND_PARTITIONED_INDEX)
19664 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19665 errmsg(
"cannot change schema of index \"%s\"",
19667 errhint(
"Change the schema of the table instead.")));
19668 else if (relkind == RELKIND_COMPOSITE_TYPE)
19670 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19671 errmsg(
"cannot change schema of composite type \"%s\"",
19676 else if (relkind == RELKIND_TOASTVALUE)
19678 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19679 errmsg(
"cannot change schema of TOAST table \"%s\"",
19681 errhint(
"Change the schema of the table instead.")));
19710 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19711 errmsg(
"cannot use \"list\" partition strategy with more than one column")));
19719 NULL,
false,
true);
19752 List **partexprs,
Oid *partopclass,
Oid *partcollation,
19760 foreach(lc, partParams)
19766 if (pelem->
name != NULL)
19776 (
errcode(ERRCODE_UNDEFINED_COLUMN),
19777 errmsg(
"column \"%s\" named in partition key does not exist",
19782 if (attform->attnum <= 0)
19784 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19785 errmsg(
"cannot use system column \"%s\" in partition key",
19796 if (attform->attgenerated)
19798 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19799 errmsg(
"cannot use generated column in partition key"),
19800 errdetail(
"Column \"%s\" is a generated column.",
19804 partattrs[attn] = attform->attnum;
19805 atttype = attform->atttypid;
19806 attcollation = attform->attcollation;
19813 char partattname[16];
19825 snprintf(partattname,
sizeof(partattname),
"%d", attn + 1);
19827 atttype, attcollation,
19838 ((
Var *) expr)->varattno > 0)
19844 partattrs[attn] = ((
Var *) expr)->varattno;
19851 partattrs[attn] = 0;
19852 *partexprs =
lappend(*partexprs, expr);
19871 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19872 errmsg(
"partition key expressions cannot contain system column references")));
19891 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19892 errmsg(
"cannot use generated column in partition key"),
19893 errdetail(
"Column \"%s\" is a generated column.",
19921 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19922 errmsg(
"functions in partition key expression must be marked IMMUTABLE")));
19930 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19931 errmsg(
"cannot use constant expression as partition key")));
19951 (
errcode(ERRCODE_INDETERMINATE_COLLATION),
19952 errmsg(
"could not determine which collation to use for partition expression"),
19953 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
19959 (
errcode(ERRCODE_DATATYPE_MISMATCH),
19960 errmsg(
"collations are not supported by type %s",
19964 partcollation[attn] = attcollation;
19972 am_oid = HASH_AM_OID;
19974 am_oid = BTREE_AM_OID;
19984 (
errcode(ERRCODE_UNDEFINED_OBJECT),
19985 errmsg(
"data type %s has no default operator class for access method \"%s\"",
19987 errhint(
"You must specify a hash operator class or define a default hash operator class for the data type.")));
19990 (
errcode(ERRCODE_UNDEFINED_OBJECT),
19991 errmsg(
"data type %s has no default operator class for access method \"%s\"",
19993 errhint(
"You must specify a btree operator class or define a default btree operator class for the data type.")));
19999 am_oid == HASH_AM_OID ?
"hash" :
"btree",
20016 List *partConstraint)
20026 for (
i = 1;
i <= natts;
i++)
20038 wholeatt->atttypid,
20039 wholeatt->atttypmod,
20040 wholeatt->attcollation,
20049 ntest->argisrow =
false;
20051 existConstraint =
lappend(existConstraint, ntest);
20077 num_check = (constr != NULL) ? constr->
num_check : 0;
20078 for (
i = 0;
i < num_check;
i++)
20134 List *partConstraint,
20135 bool validate_default)
20143 if (!validate_default)
20145 (
errmsg_internal(
"partition constraint for table \"%s\" is implied by existing constraints",
20149 (
errmsg_internal(
"updated partition constraint for default partition \"%s\" is implied by existing constraints",
20159 if (scanrel->
rd_rel->relkind == RELKIND_RELATION)
20169 else if (scanrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20177 List *thisPartConstraint;
20188 thisPartConstraint =
20190 part_rel, scanrel);
20193 thisPartConstraint,
20211 List *attachrel_children;
20212 List *partConstraint;
20219 const char *trigger_name;
20220 Oid defaultPartOid;
20221 List *partBoundConstraint;
20250 if (attachrel->
rd_rel->relispartition)
20252 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20253 errmsg(
"\"%s\" is already a partition",
20258 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20259 errmsg(
"cannot attach a typed table as partition")));
20267 Anum_pg_inherits_inhrelid,
20274 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20275 errmsg(
"cannot attach inheritance child as partition")));
20280 Anum_pg_inherits_inhparent,
20286 attachrel->
rd_rel->relkind == RELKIND_RELATION)
20288 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20289 errmsg(
"cannot attach inheritance parent as partition")));
20312 (
errcode(ERRCODE_DUPLICATE_TABLE),
20313 errmsg(
"circular inheritance not allowed"),
20314 errdetail(
"\"%s\" is already a child of \"%s\".",
20319 if (rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
20320 attachrel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
20322 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20323 errmsg(
"cannot attach a temporary relation as partition of permanent relation \"%s\"",
20327 if (rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20328 attachrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
20330 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20331 errmsg(
"cannot attach a permanent relation as partition of temporary relation \"%s\"",
20337 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20338 errmsg(
"cannot attach as partition of temporary relation of another session")));
20343 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20344 errmsg(
"cannot attach temporary relation of another session as partition")));
20351 natts = tupleDesc->
natts;
20352 for (attno = 1; attno <= natts; attno++)
20355 char *attributeName =
NameStr(attribute->attname);
20358 if (attribute->attisdropped)
20361 if (attribute->attidentity)
20363 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20364 errmsg(
"table \"%s\" being attached contains an identity column \"%s\"",
20366 errdetail(
"The new partition may not contain an identity column."));
20373 (
errcode(ERRCODE_DATATYPE_MISMATCH),
20374 errmsg(
"table \"%s\" contains column \"%s\" not found in parent \"%s\"",
20377 errdetail(
"The new partition may contain only the columns present in parent.")));
20386 if (trigger_name != NULL)
20388 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
20389 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming a partition",
20391 errdetail(
"ROW triggers with transition tables are not supported on partitions.")));
20399 cmd->
bound, pstate);
20435 if (partConstraint)
20444 (
Node *) partConstraint);
20471 List *defPartConstraint;
20477 defPartConstraint =
20484 defPartConstraint =
20486 1, defaultrel, rel);
20488 defPartConstraint,
true);
20502 if (attachrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20506 foreach(l, attachrel_children)
20530 List *attachRelIdxs;
20538 "AttachPartitionEnsureIndexes",
20562 if (attachrel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
20564 foreach(cell, idxes)
20569 if (idxRel->
rd_index->indisunique ||
20572 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20573 errmsg(
"cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"",
20576 errdetail(
"Partitioned table \"%s\" contains unique indexes.",
20588 foreach(cell, idxes)
20594 bool found =
false;
20601 if (idxRel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
20625 if (attachrelIdxRels[
i]->rd_rel->relispartition)
20629 if (!attachrelIdxRels[
i]->rd_index->indisvalid)
20633 attachrelIdxRels[
i]->rd_indcollation,
20689 true,
false,
false,
false,
false);
20721 true, NULL, 1, &
key);
20740 if (!TRIGGER_FOR_ROW(trigForm->tgtype))
20747 if (trigForm->tgisinternal)
20753 if (!TRIGGER_FOR_BEFORE(trigForm->tgtype) &&
20754 !TRIGGER_FOR_AFTER(trigForm->tgtype))
20755 elog(
ERROR,
"unexpected trigger \"%s\" found",
20771 partition, parent);
20773 partition, parent);
20780 if (trigForm->tgattr.dim1 > 0)
20784 for (
i = 0;
i < trigForm->tgattr.dim1;
i++)
20789 trigForm->tgattr.values[
i] - 1);
20796 if (trigForm->tgnargs > 0)
20803 elog(
ERROR,
"tgargs is null for trigger \"%s\" in partition \"%s\"",
20808 for (
int i = 0;
i < trigForm->tgnargs;
i++)
20811 p += strlen(p) + 1;
20821 trigStmt->
args = trigargs;
20822 trigStmt->
row =
true;
20823 trigStmt->
timing = trigForm->tgtype & TRIGGER_TYPE_TIMING_MASK;
20824 trigStmt->
events = trigForm->tgtype & TRIGGER_TYPE_EVENT_MASK;
20828 trigStmt->
deferrable = trigForm->tgdeferrable;
20834 trigForm->tgfoid, trigForm->oid, qual,
20835 false,
true, trigForm->tgenabled);
20871 Oid defaultPartOid;
20898 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20899 errmsg(
"cannot detach partitions concurrently when a default partition exists")));
20941 char *parentrelname;
21003 if (partRel != NULL)
21004 elog(
WARNING,
"dangling partition \"%s\" remains, can't fix",
21007 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21008 errmsg(
"partitioned table \"%s\" was removed concurrently",
21011 if (partRel == NULL)
21013 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21014 errmsg(
"partition \"%s\" was removed concurrently", partrelname)));
21046 Oid defaultPartOid)
21052 Datum new_val[Natts_pg_class];
21053 bool new_null[Natts_pg_class],
21054 new_repl[Natts_pg_class];
21111 if (conform->contype != CONSTRAINT_FOREIGN ||
21133 Oid insertTriggerOid,
21138 &insertTriggerOid, &updateTriggerOid);
21165 int numfkdelsetcols;
21181 fkconstraint->
contype = CONSTRAINT_FOREIGN;
21183 fkconstraint->
deferrable = conform->condeferrable;
21185 fkconstraint->
is_enforced = conform->conenforced;
21189 fkconstraint->
pktable = NULL;
21201 for (
int i = 0;
i < numfks;
i++)
21228 conform->conperiod);
21251 ConstraintRelationId,
21261 foreach(cell, indexes)
21267 Oid parentConstrOid;
21299 elog(
ERROR,
"cache lookup failed for relation %u",
21304 memset(new_val, 0,
sizeof(new_val));
21305 memset(new_null,
false,
sizeof(new_null));
21306 memset(new_repl,
false,
sizeof(new_repl));
21307 new_val[Anum_pg_class_relpartbound - 1] = (
Datum) 0;
21308 new_null[Anum_pg_class_relpartbound - 1] =
true;
21309 new_repl[Anum_pg_class_relpartbound - 1] =
true;
21311 new_val, new_null, new_repl);
21325 if (!attr->attisdropped && attr->attidentity)
21359 if (partRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
21365 foreach(cell, children)
21416 List *constraintExpr;
21473 true, NULL, 1, &skey);
21499 RelationRelationId,
21538 if (!
state->lockedParentTbl)
21541 state->lockedParentTbl =
true;
21564 if (classform->relkind != RELKIND_PARTITIONED_INDEX &&
21565 classform->relkind != RELKIND_INDEX)
21567 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21602 state.lockedParentTbl =
false;
21610 (
errcode(ERRCODE_UNDEFINED_OBJECT),
21611 errmsg(
"index \"%s\" does not exist",
name->relname)));
21623 currParent = partIdx->
rd_rel->relispartition ?
21644 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21645 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21648 errdetail(
"Index \"%s\" is already attached to another index.",
21656 if (partDesc->
oids[
i] ==
state.partitionOid)
21664 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21665 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21668 errdetail(
"Index \"%s\" is not an index on any partition of table \"%s\".",
21685 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21686 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21689 errdetail(
"The index definitions do not match.")));
21704 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21705 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21708 errdetail(
"The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\".",
21718 if (parentIdx->
rd_index->indisprimary)
21753 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21754 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21757 errdetail(
"Another index \"%s\" is already attached for partition \"%s\".",
21776 bool updated =
false;
21778 Assert(partedIdx->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX);
21800 elog(
ERROR,
"cache lookup failed for index %u", inhForm->inhrelid);
21802 if (indexForm->indisvalid)
21825 elog(
ERROR,
"cache lookup failed for index %u",
21829 indexForm->indisvalid =
true;
21842 if (updated && partedIdx->
rd_rel->relispartition)
21878 if (!att->attnotnull)
21880 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
21881 errmsg(
"invalid primary key definition"),
21882 errdetail(
"Column \"%s\" of relation \"%s\" is not marked NOT NULL.",
21931 constraints =
lappend_oid(constraints, constrForm->oid);
21937 return constraints;
21953 foreach(cell, constraints)
21963 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
21999 if (compression == NULL || strcmp(compression,
"default") == 0)
22016 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
22017 errmsg(
"column data type %s does not support compression",
22023 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
22024 errmsg(
"invalid compression method \"%s\"", compression)));
22038 cstorage = TYPSTORAGE_PLAIN;
22040 cstorage = TYPSTORAGE_EXTERNAL;
22042 cstorage = TYPSTORAGE_EXTENDED;
22044 cstorage = TYPSTORAGE_MAIN;
22049 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
22050 errmsg(
"invalid storage type \"%s\"",
22059 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
22060 errmsg(
"column data type %s can only have storage PLAIN",
Datum idx(PG_FUNCTION_ARGS)
Acl * aclnewowner(const Acl *old_acl, Oid oldOwnerId, Oid newOwnerId)
void check_can_set_role(Oid member, Oid role)
Oid get_rolespec_oid(const RoleSpec *role, bool missing_ok)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult pg_attribute_aclcheck(Oid table_oid, AttrNumber attnum, Oid roleid, AclMode mode)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
void aclcheck_error_type(AclResult aclerr, Oid typeOid)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
StrategyNumber IndexAmTranslateCompareType(CompareType cmptype, Oid amoid, Oid opfamily, bool missing_ok)
Oid get_table_am_oid(const char *amname, bool missing_ok)
char * get_am_name(Oid amOid)
#define DatumGetArrayTypeP(X)
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
Datum array_get_element(Datum arraydatum, int nSubscripts, int *indx, int arraytyplen, int elmlen, bool elmbyval, char elmalign, bool *isNull)
void free_attrmap(AttrMap *map)
AttrMap * make_attrmap(int maplen)
AttrMap * build_attrmap_by_name(TupleDesc indesc, TupleDesc outdesc, bool missing_ok)
AttrMap * build_attrmap_by_name_if_req(TupleDesc indesc, TupleDesc outdesc, bool missing_ok)
#define InvalidAttrNumber
char * get_tablespace_name(Oid spc_oid)
Oid get_tablespace_oid(const char *tablespacename, bool missing_ok)
Oid GetDefaultTablespace(char relpersistence, bool partitioned)
List * raw_parser(const char *str, RawParseMode mode)
bool TimestampTimestampTzRequiresRewrite(void)
Bitmapset * bms_make_singleton(int x)
int bms_next_member(const Bitmapset *a, int prevbit)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
void FlushRelationBuffers(Relation rel)
#define TextDatumGetCString(d)
#define PG_USED_FOR_ASSERTS_ONLY
#define InvalidSubTransactionId
#define MemSet(start, val, len)
#define OidIsValid(objectId)
bool IsToastNamespace(Oid namespaceId)
bool IsSystemRelation(Relation relation)
RelFileNumber GetNewRelFileNumber(Oid reltablespace, Relation pg_class, char relpersistence)
bool IsCatalogNamespace(Oid namespaceId)
bool IsSystemClass(Oid relid, Form_pg_class reltuple)
bool contain_mutable_functions(Node *clause)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
bool contain_volatile_functions(Node *clause)
void check_index_is_clusterable(Relation OldHeap, Oid indexOid, LOCKMODE lockmode)
void finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, bool is_system_catalog, bool swap_toast_by_content, bool check_constraints, bool is_internal, TransactionId frozenXid, MultiXactId cutoffMulti, char newrelpersistence)
Oid make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod, char relpersistence, LOCKMODE lockmode)
void mark_index_clustered(Relation rel, Oid indexOid, bool is_internal)
void ResetSequence(Oid seq_relid)
void SequenceChangePersistence(Oid relid, char newrelpersistence)
int32 defGetInt32(DefElem *def)
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
void free_object_addresses(ObjectAddresses *addrs)
#define PERFORM_DELETION_CONCURRENTLY
@ DEPENDENCY_PARTITION_PRI
@ DEPENDENCY_PARTITION_SEC
#define PERFORM_DELETION_QUIETLY
#define PERFORM_DELETION_INTERNAL
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
void hash_destroy(HTAB *hashp)
void * hash_seq_search(HASH_SEQ_STATUS *status)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errmsg_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool equal(const void *a, const void *b)
void EventTriggerAlterTableStart(Node *parsetree)
void EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason)
void EventTriggerAlterTableRelid(Oid objectId)
void EventTriggerAlterTableEnd(void)
void EventTriggerCollectAlterTableSubcmd(Node *subcmd, ObjectAddress address)
#define AT_REWRITE_ALTER_PERSISTENCE
#define AT_REWRITE_DEFAULT_VAL
#define AT_REWRITE_ACCESS_METHOD
#define AT_REWRITE_COLUMN_REWRITE
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
ExprState * ExecPrepareExpr(Expr *node, EState *estate)
bool ExecCheck(ExprState *state, ExprContext *econtext)
void InitResultRelInfo(ResultRelInfo *resultRelInfo, Relation resultRelationDesc, Index resultRelationIndex, ResultRelInfo *partition_root_rri, int instrument_options)
AttrNumber ExecRelGenVirtualNotNull(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, List *notnull_virtual_attrs)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
HeapTuple ExecFetchSlotHeapTuple(TupleTableSlot *slot, bool materialize, bool *shouldFree)
TupleTableSlot * ExecStoreAllNullTuple(TupleTableSlot *slot)
void FreeExecutorState(EState *estate)
EState * CreateExecutorState(void)
struct ResultRelInfo ResultRelInfo
#define GetPerTupleExprContext(estate)
#define ResetExprContext(econtext)
#define GetPerTupleMemoryContext(estate)
static Datum ExecEvalExpr(ExprState *state, ExprContext *econtext, bool *isNull)
#define palloc0_object(type)
#define DirectFunctionCall2(func, arg1, arg2)
#define DatumGetByteaPP(X)
#define SizeForFunctionCallInfo(nargs)
#define LOCAL_FCINFO(name, nargs)
ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid)
FdwRoutine * GetFdwRoutineByServerId(Oid serverid)
ForeignServer * GetForeignServer(Oid serverid)
Oid GetForeignServerIdByRelId(Oid relid)
Datum transformGenericOptions(Oid catalogId, Datum oldOptions, List *options, Oid fdwvalidator)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
bool allowSystemTableMods
Assert(PointerIsAligned(start, uint64))
void RelationClearMissing(Relation rel)
List * heap_truncate_find_FKs(List *relationIds)
void StorePartitionKey(Relation rel, char strategy, int16 partnatts, AttrNumber *partattrs, List *partexprs, Oid *partopclass, Oid *partcollation)
void RemoveStatistics(Oid relid, AttrNumber attnum)
Oid heap_create_with_catalog(const char *relname, Oid relnamespace, Oid reltablespace, Oid relid, Oid reltypeid, Oid reloftypeid, Oid ownerid, Oid accessmtd, TupleDesc tupdesc, List *cooked_constraints, char relkind, char relpersistence, bool shared_relation, bool mapped_relation, OnCommitAction oncommit, Datum reloptions, bool use_user_acl, bool allow_system_table_mods, bool is_internal, Oid relrewrite, ObjectAddress *typaddress)
void heap_truncate(List *relids)
void CheckAttributeType(const char *attname, Oid atttypid, Oid attcollation, List *containing_rowtypes, int flags)
void heap_truncate_check_FKs(List *relations, bool tempTables)
void StorePartitionBound(Relation rel, Relation parent, PartitionBoundSpec *bound)
List * AddRelationNotNullConstraints(Relation rel, List *constraints, List *old_notnulls)
List * AddRelationNewConstraints(Relation rel, List *newColDefaults, List *newConstraints, bool allow_merge, bool is_local, bool is_internal, const char *queryString)
void InsertPgAttributeTuples(Relation pg_attribute_rel, TupleDesc tupdesc, Oid new_rel_oid, const FormExtraData_pg_attribute tupdesc_extra[], CatalogIndexState indstate)
void heap_truncate_one_rel(Relation rel)
void StoreAttrMissingVal(Relation rel, AttrNumber attnum, Datum missingval)
#define CHKATYPE_IS_VIRTUAL
#define CHKATYPE_IS_PARTKEY
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
BulkInsertState GetBulkInsertState(void)
void FreeBulkInsertState(BulkInsertState bistate)
#define XLOG_HEAP_TRUNCATE
#define XLH_TRUNCATE_RESTART_SEQS
#define SizeOfHeapTruncate
#define XLH_TRUNCATE_CASCADE
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_copytuple(HeapTuple tuple)
bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static void * GETSTRUCT(const HeapTupleData *tuple)
#define MaxHeapAttributeNumber
Oid IndexGetRelation(Oid indexId, bool missing_ok)
bool CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2, const Oid *collations1, const Oid *collations2, const Oid *opfamilies1, const Oid *opfamilies2, const AttrMap *attmap)
bool reindex_relation(const ReindexStmt *stmt, Oid relid, int flags, const ReindexParams *params)
IndexInfo * BuildIndexInfo(Relation index)
void index_check_primary_key(Relation heapRel, const IndexInfo *indexInfo, bool is_alter_table, const IndexStmt *stmt)
ObjectAddress index_constraint_create(Relation heapRelation, Oid indexRelationId, Oid parentConstraintId, const IndexInfo *indexInfo, const char *constraintName, char constraintType, bits16 constr_flags, bool allow_system_table_mods, bool is_internal)
#define REINDEX_REL_PROCESS_TOAST
#define INDEX_CONSTR_CREATE_UPDATE_INDEX
#define INDEX_CONSTR_CREATE_REMOVE_OLD_DEPS
#define INDEX_CONSTR_CREATE_DEFERRABLE
#define INDEX_CONSTR_CREATE_MARK_AS_PRIMARY
#define INDEX_CONSTR_CREATE_INIT_DEFERRED
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
ObjectAddress DefineIndex(Oid tableId, IndexStmt *stmt, Oid indexRelationId, Oid parentIndexId, Oid parentConstraintId, int total_parts, bool is_alter_table, bool check_rights, bool check_not_in_use, bool skip_build, bool quiet)
void IndexSetParentIndex(Relation partitionIdx, Oid parentOid)
Oid GetDefaultOpClass(Oid type_id, Oid am_id)
bool CheckIndexCompatible(Oid oldId, const char *accessMethodName, const List *attributeList, const List *exclusionOpNames, bool isWithoutOverlaps)
void WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
Oid ResolveOpClass(const List *opclass, Oid attrType, const char *accessMethodName, Oid accessMethodId)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
static bool pg_add_s16_overflow(int16 a, int16 b, int16 *result)
void AcceptInvalidationMessages(void)
void CacheInvalidateRelcache(Relation relation)
void CacheInvalidateRelcacheByRelid(Oid relid)
void CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
if(TABLE==NULL||TABLE_index==NULL)
Datum is_valid(PG_FUNCTION_ARGS)
List * lcons_oid(Oid datum, List *list)
List * lappend(List *list, void *datum)
List * list_difference_ptr(const List *list1, const List *list2)
List * list_delete_nth_cell(List *list, int n)
List * list_concat(List *list1, const List *list2)
List * list_concat_copy(const List *list1, const List *list2)
List * list_copy(const List *oldlist)
List * lappend_int(List *list, int datum)
List * lappend_oid(List *list, Oid datum)
List * lcons(void *datum, List *list)
List * list_append_unique_oid(List *list, Oid datum)
void list_free(List *list)
bool list_member_oid(const List *list, Oid datum)
void list_free_deep(List *list)
bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode)
void UnlockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
bool CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode, bool orstronger)
bool CheckRelationOidLockedByMe(Oid relid, LOCKMODE lockmode, bool orstronger)
#define SET_LOCKTAG_RELATION(locktag, dboid, reloid)
#define AccessExclusiveLock
#define ShareRowExclusiveLock
#define InplaceUpdateTupleLock
#define ShareUpdateExclusiveLock
char * get_rel_name(Oid relid)
AttrNumber get_attnum(Oid relid, const char *attname)
Oid get_constraint_index(Oid conoid)
char get_typstorage(Oid typid)
bool get_index_isreplident(Oid index_oid)
char get_rel_relkind(Oid relid)
Oid get_typcollation(Oid typid)
char * get_collation_name(Oid colloid)
bool get_index_isclustered(Oid index_oid)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
char * get_constraint_name(Oid conoid)
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
bool get_collation_isdeterministic(Oid colloid)
char * get_opfamily_name(Oid opfid, bool missing_ok)
Oid get_rel_relam(Oid relid)
bool type_is_collatable(Oid typid)
Oid get_rel_tablespace(Oid relid)
Oid get_typ_typrelid(Oid typid)
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
Oid getBaseType(Oid typid)
char * get_namespace_name(Oid nspid)
char get_constraint_type(Oid conoid)
Oid get_relname_relid(const char *relname, Oid relnamespace)
#define TypeIsToastable(typid)
Expr * make_ands_explicit(List *andclauses)
TypeName * makeTypeNameFromNameList(List *names)
Var * makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup)
ColumnDef * makeColumnDef(const char *colname, Oid typeOid, int32 typmod, Oid collOid)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
Constraint * makeNotNullConstraint(String *colname)
List * make_ands_implicit(Expr *clause)
char * MemoryContextStrdup(MemoryContext context, const char *string)
void MemoryContextReset(MemoryContext context)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
MemoryContext CacheMemoryContext
void MemoryContextDelete(MemoryContext context)
MemoryContext PortalContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define ALLOCSET_SMALL_SIZES
#define CHECK_FOR_INTERRUPTS()
bool InSecurityRestrictedOperation(void)
MultiXactId ReadNextMultiXactId(void)
void namestrcpy(Name name, const char *str)
Oid RangeVarGetAndCheckCreationNamespace(RangeVar *relation, LOCKMODE lockmode, Oid *existing_relation_id)
bool isAnyTempNamespace(Oid namespaceId)
Oid get_collation_oid(List *collname, bool missing_ok)
void CheckSetNamespace(Oid oldNspOid, Oid nspOid)
RangeVar * makeRangeVarFromNameList(const List *names)
Oid LookupNamespaceNoError(const char *nspname)
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
#define RangeVarGetRelid(relation, lockmode, missing_ok)
Oid exprType(const Node *expr)
Oid exprCollation(const Node *expr)
Node * strip_implicit_coercions(Node *node)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define InvokeObjectTruncateHook(objectId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
#define InvokeObjectPostAlterHookArg(classId, objectId, subId, auxiliaryId, is_internal)
ObjectType get_relkind_objtype(char relkind)
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
const ObjectAddress InvalidObjectAddress
#define ObjectAddressSet(addr, class_id, object_id)
#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id)
char * nodeToString(const void *obj)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
CoercionPathType find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId, CoercionContext ccontext, Oid *funcid)
bool can_coerce_type(int nargs, const Oid *input_typeids, const Oid *target_typeids, CoercionContext ccontext)
Node * coerce_to_target_type(ParseState *pstate, Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat, int location)
@ COERCION_PATH_RELABELTYPE
void assign_expr_collations(ParseState *pstate, Node *expr)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
int parser_errposition(ParseState *pstate, int location)
ParseState * make_parsestate(ParseState *parentParseState)
@ EXPR_KIND_PARTITION_EXPRESSION
ParseNamespaceItem * addRangeTableEntryForRelation(ParseState *pstate, Relation rel, int lockmode, Alias *alias, bool inh, bool inFromCl)
Oid attnumCollationId(Relation rd, int attid)
void addNSItemToQuery(ParseState *pstate, ParseNamespaceItem *nsitem, bool addToJoinList, bool addToRelNameSpace, bool addToVarNameSpace)
Oid attnumTypeId(Relation rd, int attid)
const NameData * attnumAttName(Relation rd, int attid)
void typenameTypeIdAndMod(ParseState *pstate, const TypeName *typeName, Oid *typeid_p, int32 *typmod_p)
Type typenameType(ParseState *pstate, const TypeName *typeName, int32 *typmod_p)
Oid GetColumnDefCollation(ParseState *pstate, const ColumnDef *coldef, Oid typeOid)
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
IndexStmt * transformIndexStmt(Oid relid, IndexStmt *stmt, const char *queryString)
AlterTableStmt * transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, const char *queryString, List **beforeStmts, List **afterStmts)
CreateStatsStmt * transformStatsStmt(Oid relid, CreateStatsStmt *stmt, const char *queryString)
PartitionBoundSpec * transformPartitionBound(ParseState *pstate, Relation parent, PartitionBoundSpec *spec)
IndexStmt * generateClonedIndexStmt(RangeVar *heapRel, Relation source_idx, const AttrMap *attmap, Oid *constraintOid)
#define FKCONSTR_ACTION_RESTRICT
#define FKCONSTR_ACTION_SETDEFAULT
@ PARTITION_STRATEGY_HASH
@ PARTITION_STRATEGY_LIST
@ AT_DetachPartitionFinalize
@ AT_ReAddDomainConstraint
@ AT_AlterColumnGenericOptions
#define FKCONSTR_ACTION_CASCADE
#define FKCONSTR_ACTION_SETNULL
#define FKCONSTR_ACTION_NOACTION
List * SystemFuncName(char *name)
void check_new_partition_bound(char *relname, Relation parent, PartitionBoundSpec *spec, ParseState *pstate)
List * get_qual_from_partbound(Relation parent, PartitionBoundSpec *spec)
void check_default_partition_contents(Relation parent, Relation default_rel, PartitionBoundSpec *new_spec)
List * RelationGetPartitionQual(Relation rel)
PartitionDesc RelationGetPartitionDesc(Relation rel, bool omit_detached)
Oid get_default_oid_from_partdesc(PartitionDesc partdesc)
List * map_partition_varattnos(List *expr, int fromrel_varno, Relation to_rel, Relation from_rel)
bool has_partition_attrs(Relation rel, Bitmapset *attnums, bool *used_in_expr)
List * get_proposed_default_constraint(List *new_part_constraints)
void update_default_partition_oid(Oid parentId, Oid defaultPartId)
Oid index_get_partition(Relation partition, Oid indexId)
Oid get_partition_parent(Oid relid, bool even_if_detached)
Oid StoreAttrDefault(Relation rel, AttrNumber attnum, Node *expr, bool is_internal)
Oid GetAttrDefaultOid(Oid relid, AttrNumber attnum)
ObjectAddress GetAttrDefaultColumnAddress(Oid attrdefoid)
void RemoveAttrDefault(Oid relid, AttrNumber attnum, DropBehavior behavior, bool complain, bool internal)
FormData_pg_attribute * Form_pg_attribute
int errdetail_relkind_not_supported(char relkind)
FormData_pg_class * Form_pg_class
#define PARTITION_MAX_KEYS
Oid CreateConstraintEntry(const char *constraintName, Oid constraintNamespace, char constraintType, bool isDeferrable, bool isDeferred, bool isEnforced, bool isValidated, Oid parentConstrId, Oid relId, const int16 *constraintKey, int constraintNKeys, int constraintNTotalKeys, Oid domainId, Oid indexRelId, Oid foreignRelId, const int16 *foreignKey, const Oid *pfEqOp, const Oid *ppEqOp, const Oid *ffEqOp, int foreignNKeys, char foreignUpdateType, char foreignDeleteType, const int16 *fkDeleteSetCols, int numFkDeleteSetCols, char foreignMatchType, const Oid *exclOp, Node *conExpr, const char *conBin, bool conIsLocal, int16 conInhCount, bool conNoInherit, bool conPeriod, bool is_internal)
HeapTuple findNotNullConstraint(Oid relid, const char *colname)
bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId, const char *conname)
void FindFKPeriodOpers(Oid opclass, Oid *containedbyoperoid, Oid *aggedcontainedbyoperoid, Oid *intersectoperoid)
void RenameConstraintById(Oid conId, const char *newname)
Oid get_relation_idx_constraint_oid(Oid relationId, Oid indexId)
void ConstraintSetParentConstraint(Oid childConstrId, Oid parentConstrId, Oid childTableId)
void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, AttrNumber *conkey, AttrNumber *confkey, Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs, int *num_fk_del_set_cols, AttrNumber *fk_del_set_cols)
HeapTuple findNotNullConstraintAttnum(Oid relid, AttrNumber attnum)
void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, Oid newNspId, bool isType, ObjectAddresses *objsMoved)
List * RelationGetNotNullConstraints(Oid relid, bool cooked, bool include_noinh)
char * ChooseConstraintName(const char *name1, const char *name2, const char *label, Oid namespaceid, List *others)
Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok)
AttrNumber extractNotNullColumn(HeapTuple constrTup)
Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok)
FormData_pg_constraint * Form_pg_constraint
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long changeDependencyFor(Oid classId, Oid objectId, Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
List * getOwnedSequences(Oid relid)
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId, char deptype, Oid refclassId, Oid refobjectId)
Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok)
Oid get_index_constraint(Oid indexId)
bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId)
FormData_pg_depend * Form_pg_depend
FormData_pg_foreign_table * Form_pg_foreign_table
FormData_pg_index * Form_pg_index
List * find_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)
bool DeleteInheritsTuple(Oid inhrelid, Oid inhparent, bool expect_detach_pending, const char *childname)
List * find_inheritance_children(Oid parentrelId, LOCKMODE lockmode)
void StoreSingleInheritance(Oid relationId, Oid parentOid, int32 seqNumber)
bool has_superclass(Oid relationId)
bool PartitionHasPendingDetach(Oid partoid)
FormData_pg_inherits * Form_pg_inherits
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
#define foreach_current_index(var_or_cell)
#define foreach_delete_current(lst, var_or_cell)
#define list_make1_oid(x1)
#define foreach_ptr(type, var, lst)
#define for_each_from(cell, lst, N)
static void * list_nth(const List *list, int n)
#define list_make3(x1, x2, x3)
#define foreach_node(type, var, lst)
static ListCell * list_head(const List *l)
#define foreach_oid(var, lst)
#define list_nth_node(type, list, n)
static ListCell * lnext(const List *l, const ListCell *c)
#define list_make2(x1, x2)
#define foreach_int(var, lst)
FormData_pg_opclass * Form_pg_opclass
List * GetRelationPublications(Oid relid)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
void changeDependencyOnTablespace(Oid classId, Oid objectId, Oid newTablespaceId)
FormData_pg_trigger * Form_pg_trigger
void RenameTypeInternal(Oid typeOid, const char *newTypeName, Oid typeNamespace)
FormData_pg_type * Form_pg_type
#define ERRCODE_UNDEFINED_TABLE
void pgstat_count_truncate(Relation rel)
Expr * expression_planner(Expr *expr)
int pg_strcasecmp(const char *s1, const char *s2)
size_t strlcpy(char *dst, const char *src, size_t siz)
static Datum PointerGetDatum(const void *X)
static Datum Int16GetDatum(int16 X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
void CheckTableForSerializableConflictIn(Relation relation)
void TransferPredicateLocksToHeapRelation(Relation relation)
bool predicate_implied_by(List *predicate_list, List *clause_list, bool weak)
Expr * canonicalize_qual(Expr *qual, bool is_check)
void * stringToNode(const char *str)
#define RelationGetForm(relation)
#define RelationGetRelid(relation)
#define RelationIsLogicallyLogged(relation)
#define RelationIsUsedAsCatalogTable(relation)
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationGetDescr(relation)
#define RelationIsMapped(relation)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
#define RelationGetNamespace(relation)
#define IndexRelationGetNumberOfKeyAttributes(relation)
#define RelationIsPermanent(relation)
List * RelationGetIndexList(Relation relation)
Oid RelationGetPrimaryKeyIndex(Relation relation, bool deferrable_ok)
int errtableconstraint(Relation rel, const char *conname)
int errtablecol(Relation rel, int attnum)
List * RelationGetIndexPredicate(Relation relation)
Bitmapset * RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind)
void RelationSetNewRelfilenumber(Relation relation, char persistence)
List * RelationGetFKeyList(Relation relation)
List * RelationGetIndexExpressions(Relation relation)
void RelationAssumeNewRelfilelocator(Relation relation)
int errtable(Relation rel)
struct RelationData * Relation
@ INDEX_ATTR_BITMAP_PRIMARY_KEY
@ INDEX_ATTR_BITMAP_IDENTITY_KEY
List * untransformRelOptions(Datum options)
bytea * view_reloptions(Datum reloptions, bool validate)
bytea * index_reloptions(amoptions_function amoptions, Datum reloptions, bool validate)
bytea * partitioned_table_reloptions(Datum reloptions, bool validate)
Datum transformRelOptions(Datum oldOptions, List *defList, const char *nameSpace, const char *const validnsps[], bool acceptOidsOff, bool isReset)
LOCKMODE AlterTableGetRelOptionsLockLevel(List *defList)
bytea * attribute_reloptions(Datum reloptions, bool validate)
bytea * heap_reloptions(char relkind, Datum reloptions, bool validate)
#define HEAP_RELOPT_NAMESPACES
#define RelFileNumberIsValid(relnumber)
void EnableDisableRule(Relation rel, const char *rulename, char fires_when)
#define RULE_FIRES_ON_ORIGIN
#define RULE_FIRES_ON_REPLICA
#define RULE_FIRES_ALWAYS
Query * get_view_query(Relation view)
const char * view_query_is_auto_updatable(Query *viewquery, bool check_cols)
Node * build_column_default(Relation rel, int attrno)
Node * expand_generated_columns_in_expr(Node *node, Relation rel, int rt_index)
Node * map_variable_attnos(Node *node, int target_varno, int sublevels_up, const AttrMap *attno_map, Oid to_rowtype, bool *found_whole_row)
Datum RI_FKey_check_ins(PG_FUNCTION_ARGS)
bool RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
void RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
int RI_FKey_trigger_type(Oid tgfoid)
char * pg_get_statisticsobjdef_string(Oid statextid)
char * pg_get_indexdef_string(Oid indexrelid)
const char * quote_identifier(const char *ident)
Datum pg_get_expr(PG_FUNCTION_ARGS)
char * pg_get_constraintdef_command(Oid constraintId)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
void smgrclose(SMgrRelation reln)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
Snapshot GetTransactionSnapshot(void)
Snapshot GetLatestSnapshot(void)
void UnregisterSnapshot(Snapshot snapshot)
void PushActiveSnapshot(Snapshot snapshot)
Snapshot RegisterSnapshot(Snapshot snapshot)
void PopActiveSnapshot(void)
Snapshot GetActiveSnapshot(void)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
void check_stack_depth(void)
ObjectAddress CreateStatistics(CreateStatsStmt *stmt)
Oid StatisticsGetRelation(Oid statId, bool missing_ok)
void RelationPreserveStorage(RelFileLocator rlocator, bool atCommit)
void RelationCopyStorage(SMgrRelation src, SMgrRelation dst, ForkNumber forkNum, char relpersistence)
SMgrRelation RelationCreateStorage(RelFileLocator rlocator, char relpersistence, bool register_delete)
void log_smgrcreate(const RelFileLocator *rlocator, ForkNumber forkNum)
void RelationDropStorage(Relation rel)
#define BTEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
List * changedConstraintDefs
Expr * partition_constraint
List * changedStatisticsDefs
char * replicaIdentityIndex
List * changedStatisticsOids
List * changedConstraintOids
List * subcmds[AT_NUM_PASSES]
RangeVar * identitySequence
bool reset_default_tblspc
char actual_relpersistence
MemoryContext es_query_cxt
List * es_opened_result_relations
TupleTableSlot * ecxt_scantuple
ExecForeignTruncate_function ExecForeignTruncate
amoptions_function amoptions
AttrNumber ii_IndexAttrNumbers[INDEX_MAX_KEYS]
bool reset_default_tblspc
NullTestType nulltesttype
SubTransactionId creating_subid
SubTransactionId deleting_subid
const char * p_sourcetext
PartitionBoundSpec * bound
PartitionStrategy strategy
struct IndexAmRoutine * rd_indam
SubTransactionId rd_firstRelfilelocatorSubid
SubTransactionId rd_newRelfilelocatorSubid
SubTransactionId rd_createSubid
RelFileLocator rd_locator
TupleTableSlot * tg_trigslot
bool has_generated_virtual
const char * skipping_msg
const char * nonexistent_msg
const char * drophint_msg
Oid values[FLEXIBLE_ARRAY_MEMBER]
#define FirstLowInvalidHeapAttributeNumber
HeapTuple SearchSysCacheCopyAttName(Oid relid, const char *attname)
HeapTuple SearchSysCacheCopyAttNum(Oid relid, int16 attnum)
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCacheLocked1(int cacheId, Datum key1)
HeapTuple SearchSysCacheLockedCopy1(int cacheId, Datum key1)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
HeapTuple SearchSysCacheAttNum(Oid relid, int16 attnum)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
bool SearchSysCacheExistsAttName(Oid relid, const char *attname)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
HeapTuple SearchSysCacheAttName(Oid relid, const char *attname)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
#define SearchSysCacheCopy1(cacheId, key1)
#define SearchSysCacheExists2(cacheId, key1, key2)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
Relation table_openrv(const RangeVar *relation, LOCKMODE lockmode)
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
char * default_table_access_method
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, ScanKeyData *key)
const TupleTableSlotOps * table_slot_callbacks(Relation relation)
static void table_endscan(TableScanDesc scan)
#define TABLE_INSERT_SKIP_FSM
static void table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid, int options, BulkInsertStateData *bistate)
static void table_finish_bulk_insert(Relation rel, int options)
static void table_relation_copy_data(Relation rel, const RelFileLocator *newrlocator)
static bool table_scan_getnextslot(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot)
static TableScanDesc table_beginscan(Relation rel, Snapshot snapshot, int nkeys, ScanKeyData *key)
static void QueueFKConstraintValidation(List **wqueue, Relation conrel, Relation fkrel, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode)
static AttrNumber renameatt_internal(Oid myrelid, const char *oldattname, const char *newattname, bool recurse, bool recursing, int expected_parents, DropBehavior behavior)
void ResetRelRewrite(Oid myrelid)
static int validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, int numfksetcols, int16 *fksetcolsattnums, List *fksetcols)
static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel, bool ispartition)
static void MarkInheritDetached(Relation child_rel, Relation parent_rel)
static ObjectAddress ATExecAlterColumnGenericOptions(Relation rel, const char *colName, List *options, LOCKMODE lockmode)
static void ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void AlterConstrEnforceabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Oid fkrelid, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
static ObjectAddress ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode)
ObjectAddress RenameRelation(RenameStmt *stmt)
static AlteredTableInfo * ATGetQueueEntry(List **wqueue, Relation rel)
static void verifyNotNullPKCompatible(HeapTuple tuple, const char *colname)
static void ATExecDropOf(Relation rel, LOCKMODE lockmode)
static ObjectAddress ATExecAlterConstraint(List **wqueue, Relation rel, ATAlterConstraint *cmdcon, bool recurse, LOCKMODE lockmode)
static ColumnDef * MergeInheritedAttribute(List *inh_columns, int exist_attno, const ColumnDef *newdef)
static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool old_check_ok, LOCKMODE lockmode, Oid parentInsTrigger, Oid parentUpdTrigger, bool with_period)
static bool ConstraintImpliedByRelConstraint(Relation scanrel, List *testConstraint, List *provenConstraint)
static const char * storage_name(char c)
static ObjectAddress ATExecDropExpression(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode)
void AtEOSubXact_on_commit_actions(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid)
static void add_column_datatype_dependency(Oid relid, int32 attnum, Oid typid)
static ObjectAddress ATExecColumnDefault(Relation rel, const char *colName, Node *newDefault, LOCKMODE lockmode)
static void ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, List **wqueue, LOCKMODE lockmode, bool rewrite)
static void ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode)
static void drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid, DependencyType deptype)
static void DropForeignKeyConstraintTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid)
static void RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached)
void PreCommit_on_commit_actions(void)
static ObjectAddress dropconstraint_internal(Relation rel, HeapTuple constraintTup, DropBehavior behavior, bool recurse, bool recursing, bool missing_ok, LOCKMODE lockmode)
static void RemoveInheritedConstraint(Relation conrel, Relation trigrel, Oid conoid, Oid conrelid)
static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode, bool recurse, bool recursing)
static char GetAttributeCompression(Oid atttypid, const char *compression)
static int findAttrByName(const char *attributeName, const List *columns)
static void RememberIndexForRebuilding(Oid indoid, AlteredTableInfo *tab)
static bool ATColumnChangeRequiresRewrite(Node *expr, AttrNumber varattno)
static char * ChooseForeignKeyConstraintNameAddition(List *colnames)
static ObjectAddress ATExecValidateConstraint(List **wqueue, Relation rel, char *constrName, bool recurse, bool recursing, LOCKMODE lockmode)
void AlterTable(AlterTableStmt *stmt, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void RememberStatisticsForRebuilding(Oid stxoid, AlteredTableInfo *tab)
static CoercionPathType findFkeyCast(Oid targetTypeId, Oid sourceTypeId, Oid *funcid)
static void add_column_collation_dependency(Oid relid, int32 attnum, Oid collid)
static ObjectAddress ATExecDropNotNull(Relation rel, const char *colName, bool recurse, LOCKMODE lockmode)
static Oid transformFkeyCheckAttrs(Relation pkrel, int numattrs, int16 *attnums, bool with_period, Oid *opclasses, bool *pk_has_without_overlaps)
void RemoveRelations(DropStmt *drop)
static void ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel, const char *tablespacename, LOCKMODE lockmode)
static void ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void RememberReplicaIdentityForRebuilding(Oid indoid, AlteredTableInfo *tab)
static List * GetParentedForeignKeyRefs(Relation partition)
void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, bool hasDependEntry, ObjectAddresses *objsMoved)
static ObjectAddress ATExecAddConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *newConstraint, bool recurse, bool is_readd, LOCKMODE lockmode)
ObjectAddress renameatt(RenameStmt *stmt)
void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lockmode)
static void RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid, void *arg)
static void CheckAlterTableIsSafe(Relation rel)
static void DropErrorMsgWrongType(const char *relname, char wrongkind, char rightkind)
LOCKMODE AlterTableGetLockLevel(List *cmds)
struct ForeignTruncateInfo ForeignTruncateInfo
static ObjectAddress ATExecDetachPartition(List **wqueue, AlteredTableInfo *tab, Relation rel, RangeVar *name, bool concurrent)
static void AlterSeqNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved, LOCKMODE lockmode)
static void RangeVarCallbackForRenameAttribute(const RangeVar *rv, Oid relid, Oid oldrelid, void *arg)
TupleDesc BuildDescForRelation(const List *columns)
static void ATExecForceNoForceRowSecurity(Relation rel, bool force_rls)
void AtEOXact_on_commit_actions(bool isCommit)
static void checkFkeyPermissions(Relation rel, int16 *attnums, int natts)
struct OnCommitItem OnCommitItem
void CheckTableNotInUse(Relation rel, const char *stmt)
static bool ATExecAlterConstrInheritability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation rel, HeapTuple contuple, LOCKMODE lockmode)
static void createForeignKeyActionTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentDelTrigger, Oid parentUpdTrigger, Oid *deleteTrigOid, Oid *updateTrigOid)
static void ATExecEnableDisableTrigger(Relation rel, const char *trigname, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode)
static void AttachPartitionForeignKey(List **wqueue, Relation partition, Oid partConstrOid, Oid parentConstrOid, Oid parentInsTrigger, Oid parentUpdTrigger, Relation trigrel)
static List * MergeCheckConstraint(List *constraints, const char *name, Node *expr, bool is_enforced)
static void renameatt_check(Oid myrelid, Form_pg_class classform, bool recursing)
static void RangeVarCallbackForAttachIndex(const RangeVar *rv, Oid relOid, Oid oldRelOid, void *arg)
static void ATCheckPartitionsNotInUse(Relation rel, LOCKMODE lockmode)
static void truncate_check_activity(Relation rel)
static void validatePartitionedIndex(Relation partedIdx, Relation partedTbl)
static void AlterConstrUpdateConstraintEntry(ATAlterConstraint *cmdcon, Relation conrel, HeapTuple contuple)
static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *fkconstraint, bool recurse, bool recursing, LOCKMODE lockmode)
static void TryReuseIndex(Oid oldId, IndexStmt *stmt)
static void GetForeignKeyCheckTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid, Oid *insertTriggerOid, Oid *updateTriggerOid)
static ObjectAddress addFkConstraint(addFkConstraintSides fkside, char *constraintname, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool is_internal, bool with_period)
static void RememberClusterOnForRebuilding(Oid indoid, AlteredTableInfo *tab)
static ObjectAddress ATExecSetOptions(Relation rel, const char *colName, Node *options, bool isReset, LOCKMODE lockmode)
static bool ATExecAlterConstrEnforceability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Oid fkrelid, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
static void QueueNNConstraintValidation(List **wqueue, Relation conrel, Relation rel, HeapTuple contuple, bool recurse, bool recursing, LOCKMODE lockmode)
static ObjectAddress ATExecDropColumn(List **wqueue, Relation rel, const char *colName, DropBehavior behavior, bool recurse, bool recursing, bool missing_ok, LOCKMODE lockmode, ObjectAddresses *addrs)
static void CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
static void SetIndexStorageProperties(Relation rel, Relation attrelation, AttrNumber attnum, bool setstorage, char newstorage, bool setcompression, char newcompression, LOCKMODE lockmode)
static void ATController(AlterTableStmt *parsetree, Relation rel, List *cmds, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
bool CheckRelationTableSpaceMove(Relation rel, Oid newTableSpaceId)
static void ATExecSetRowSecurity(Relation rel, bool rls)
void find_composite_type_dependencies(Oid typeOid, Relation origRelation, const char *origTypeName)
static void truncate_check_perms(Oid relid, Form_pg_class reltuple)
static void truncate_check_rel(Oid relid, Form_pg_class reltuple)
static void change_owner_recurse_to_sequences(Oid relationOid, Oid newOwnerId, LOCKMODE lockmode)
static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, int32 seqNumber, Relation inhRelation, bool child_is_partition)
static void RememberAllDependentForRebuilding(AlteredTableInfo *tab, AlterTableType subtype, Relation rel, AttrNumber attnum, const char *colName)
static void ATPrepDropExpression(Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode)
static bool ATExecAlterConstraintInternal(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, LOCKMODE lockmode)
static void verifyPartitionIndexNotNull(IndexInfo *iinfo, Relation partition)
static ObjectAddress ATExecCookedColumnDefault(Relation rel, AttrNumber attnum, Node *newDefault)
static ObjectAddress rename_constraint_internal(Oid myrelid, Oid mytypid, const char *oldconname, const char *newconname, bool recurse, bool recursing, int expected_parents)
static void DropErrorMsgNonExistent(RangeVar *rel, char rightkind, bool missing_ok)
static void ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode)
static AlterTableCmd * ATParseTransformCmd(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
void AlterTableNamespaceInternal(Relation rel, Oid oldNspOid, Oid nspOid, ObjectAddresses *objsMoved)
static ObjectAddress ATAddCheckNNConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *constr, bool recurse, bool recursing, bool is_readd, LOCKMODE lockmode)
static void CloneFkReferenced(Relation parentRel, Relation partitionRel)
static void MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel)
static void ATPrepDropColumn(List **wqueue, Relation rel, bool recurse, bool recursing, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
void SetRelationHasSubclass(Oid relationId, bool relhassubclass)
static void MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const ColumnDef *newdef)
static void ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets)
static const char * alter_table_type_to_string(AlterTableType cmdtype)
static void ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, LOCKMODE lockmode)
static ObjectAddress ATExecSetIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmode, bool recurse, bool recursing)
ObjectAddress AlterTableNamespace(AlterObjectSchemaStmt *stmt, Oid *oldschema)
static void RememberConstraintForRebuilding(Oid conoid, AlteredTableInfo *tab)
void ExecuteTruncate(TruncateStmt *stmt)
static void relation_mark_replica_identity(Relation rel, char ri_type, Oid indexOid, bool is_internal)
#define ATT_FOREIGN_TABLE
static void ATPrepAddColumn(List **wqueue, Relation rel, bool recurse, bool recursing, bool is_view, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNumber *partattrs, List **partexprs, Oid *partopclass, Oid *partcollation, PartitionStrategy strategy)
static void CloneRowTriggersToPartition(Relation parent, Relation partition)
static void AttachPartitionEnsureIndexes(List **wqueue, Relation rel, Relation attachrel)
static void StoreCatalogInheritance(Oid relationId, List *supers, bool child_is_partition)
static void ATExecGenericOptions(Relation rel, List *options)
static void TryReuseForeignKey(Oid oldId, Constraint *con)
struct AlteredTableInfo AlteredTableInfo
Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode)
static void AlterConstrDeferrabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, List **otherrelids, LOCKMODE lockmode)
struct NewConstraint NewConstraint
static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
static void ATSimpleRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, Oid defaultPartOid)
static void RebuildConstraintComment(AlteredTableInfo *tab, AlterTablePass pass, Oid objid, Relation rel, List *domname, const char *conname)
static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel, Relation partitionRel)
static void addFkRecurseReferenced(Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool old_check_ok, Oid parentDelTrigger, Oid parentUpdTrigger, bool with_period)
static bool check_for_column_name_collision(Relation rel, const char *colname, bool if_not_exists)
static ObjectAddress ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd **cmd, bool recurse, bool recursing, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
@ AT_PASS_ADD_OTHERCONSTR
@ AT_PASS_ADD_INDEXCONSTR
static ObjectAddress ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, LOCKMODE lockmode)
static void validateForeignKeyConstraint(char *conname, Relation rel, Relation pkrel, Oid pkindOid, Oid constraintOid, bool hasperiod)
static char * decompile_conbin(HeapTuple contup, TupleDesc tupdesc)
static void QueueCheckConstraintValidation(List **wqueue, Relation conrel, Relation rel, char *constrName, HeapTuple contuple, bool recurse, bool recursing, LOCKMODE lockmode)
void SetRelationTableSpace(Relation rel, Oid newTableSpaceId, RelFileNumber newRelFilenumber)
void remove_on_commit_action(Oid relid)
static void DetachAddConstraintIfNeeded(List **wqueue, Relation partRel)
static void ATExecDropCluster(Relation rel, LOCKMODE lockmode)
#define ATT_PARTITIONED_INDEX
static void CreateInheritance(Relation child_rel, Relation parent_rel, bool ispartition)
static const struct dropmsgstrings dropmsgstringarray[]
static void ATPrepChangePersistence(AlteredTableInfo *tab, Relation rel, bool toLogged)
static ObjectAddress ATExecSetExpression(AlteredTableInfo *tab, Relation rel, const char *colName, Node *newExpr, LOCKMODE lockmode)
ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, ObjectAddress *typaddress, const char *queryString)
static Oid CreateFKCheckTrigger(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentTrigOid, bool on_insert)
static void AlterConstrTriggerDeferrability(Oid conoid, Relation tgrel, Relation rel, bool deferrable, bool initdeferred, List **otherrelids)
static void ATPrepAddPrimaryKey(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void DropClonedTriggersFromPartition(Oid partitionId)
static void QueuePartitionConstraintValidation(List **wqueue, Relation scanrel, List *partConstraint, bool validate_default)
static ObjectAddress ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode)
static void RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, void *arg)
void AlterTableInternal(Oid relid, List *cmds, bool recurse)
static void GetForeignKeyActionTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid, Oid *deleteTriggerOid, Oid *updateTriggerOid)
void check_of_type(HeapTuple typetuple)
static ObjectAddress ATExecDropInherit(Relation rel, RangeVar *parent, LOCKMODE lockmode)
static void ATDetachCheckNoForeignKeyRefs(Relation partition)
static ObjectAddress ATExecAddIndexConstraint(AlteredTableInfo *tab, Relation rel, IndexStmt *stmt, LOCKMODE lockmode)
static void AlterIndexNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved)
#define ATT_PARTITIONED_TABLE
static void ATExecCmd(List **wqueue, AlteredTableInfo *tab, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
static bool ATExecAlterConstrDeferrability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, List **otherrelids, LOCKMODE lockmode)
static void ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode)
static void createForeignKeyCheckTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentInsTrigger, Oid parentUpdTrigger, Oid *insertTrigOid, Oid *updateTrigOid)
static void ATPrepAddInherit(Relation child_rel)
static ObjectAddress ATExecDetachPartitionFinalize(Relation rel, RangeVar *name)
static ObjectAddress ATExecSetStorage(Relation rel, const char *colName, Node *newValue, LOCKMODE lockmode)
static ObjectAddress ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, AlterTableUtilityContext *context)
static List * find_typed_table_dependencies(Oid typeOid, const char *typeName, DropBehavior behavior)
Oid AlterTableMoveAll(AlterTableMoveAllStmt *stmt)
static int transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid, List **attnamelist, int16 *attnums, Oid *atttypids, Oid *attcollids, Oid *opclasses, bool *pk_has_without_overlaps)
static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmode, bool recurse, bool recursing)
static void ATExecSetAccessMethodNoStorage(Relation rel, Oid newAccessMethodId)
static void ATExecDropConstraint(Relation rel, const char *constrName, DropBehavior behavior, bool recurse, bool missing_ok, LOCKMODE lockmode)
static ObjectAddress ATExecAddIndex(AlteredTableInfo *tab, Relation rel, IndexStmt *stmt, bool is_rebuild, LOCKMODE lockmode)
static ObjectAddress ATExecSetCompression(Relation rel, const char *column, Node *newValue, LOCKMODE lockmode)
static PartitionSpec * transformPartitionSpec(Relation rel, PartitionSpec *partspec)
static void ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void index_copy_data(Relation rel, RelFileLocator newrlocator)
static ObjectAddress ATExecSetNotNull(List **wqueue, Relation rel, char *conName, char *colName, bool recurse, bool recursing, LOCKMODE lockmode)
void RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bool is_index)
static void set_attnotnull(List **wqueue, Relation rel, AttrNumber attnum, bool is_valid, bool queue_validation)
static bool tryAttachPartitionForeignKey(List **wqueue, ForeignKeyCacheInfo *fk, Relation partition, Oid parentConstrOid, int numfks, AttrNumber *mapped_conkey, AttrNumber *confkey, Oid *conpfeqop, Oid parentInsTrigger, Oid parentUpdTrigger, Relation trigrel)
static void ATExecSetTableSpaceNoStorage(Relation rel, Oid newTableSpace)
static void ATPrepAlterColumnType(List **wqueue, AlteredTableInfo *tab, Relation rel, bool recurse, bool recursing, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static int transformColumnNameList(Oid relId, List *colList, int16 *attnums, Oid *atttypids, Oid *attcollids)
static void change_owner_fix_column_acls(Oid relationOid, Oid oldOwnerId, Oid newOwnerId)
#define ATT_COMPOSITE_TYPE
static ObjectAddress ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name)
bool PartConstraintImpliedByRelConstraint(Relation scanrel, List *partConstraint)
void RangeVarCallbackMaintainsTable(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
static bool constraints_equivalent(HeapTuple a, HeapTuple b, TupleDesc tupleDesc)
static ObjectAddress ATExecAddStatistics(AlteredTableInfo *tab, Relation rel, CreateStatsStmt *stmt, bool is_rebuild, LOCKMODE lockmode)
ObjectAddress RenameConstraint(RenameStmt *stmt)
static void ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context)
void register_on_commit_action(Oid relid, OnCommitAction action)
static void RangeVarCallbackForTruncate(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
static ObjectAddress ATExecClusterOn(Relation rel, const char *indexName, LOCKMODE lockmode)
static char GetAttributeStorage(Oid atttypid, const char *storagemode)
void RangeVarCallbackOwnsRelation(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
#define child_dependency_type(child_is_partition)
static void refuseDupeIndexAttach(Relation parentIdx, Relation partIdx, Relation partitionTbl)
void ExecuteTruncateGuts(List *explicit_rels, List *relids, List *relids_logged, DropBehavior behavior, bool restart_seqs, bool run_as_table_owner)
static void ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
static List * MergeAttributes(List *columns, const List *supers, char relpersistence, bool is_partition, List **supconstr, List **supnotnulls)
static void ATExecEnableDisableRule(Relation rel, const char *rulename, char fires_when, LOCKMODE lockmode)
struct NewColumnValue NewColumnValue
static void ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname)
static bool NotNullImpliedByRelConstraints(Relation rel, Form_pg_attribute attr)
const char * GetCompressionMethodName(char method)
char CompressionNameToMethod(const char *compression)
#define CompressionMethodIsValid(cm)
#define InvalidCompressionMethod
void AlterTableCreateToastTable(Oid relOid, Datum reloptions, LOCKMODE lockmode)
void ExecBSTruncateTriggers(EState *estate, ResultRelInfo *relinfo)
void EnableDisableTrigger(Relation rel, const char *tgname, Oid tgparent, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode)
const char * FindTriggerIncompatibleWithInheritance(TriggerDesc *trigdesc)
void ExecASTruncateTriggers(EState *estate, ResultRelInfo *relinfo)
ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, Oid funcoid, Oid parentTriggerOid, Node *whenClause, bool isInternal, bool in_partition)
void TriggerSetParentTrigger(Relation trigRel, Oid childTrigId, Oid parentTrigId, Oid childTableId)
ObjectAddress CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, Oid funcoid, Oid parentTriggerOid, Node *whenClause, bool isInternal, bool in_partition, char trigger_fires_when)
bool AfterTriggerPendingOnRel(Oid relid)
void AfterTriggerEndQuery(EState *estate)
void AfterTriggerBeginQuery(void)
#define TRIGGER_FIRES_ON_ORIGIN
#define TRIGGER_FIRES_ON_REPLICA
#define TRIGGER_EVENT_ROW
#define TRIGGER_FIRES_ALWAYS
#define TRIGGER_EVENT_INSERT
TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc)
Node * TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum)
TupleDesc CreateTemplateTupleDesc(int natts)
void populate_compact_attribute(TupleDesc tupdesc, int attnum)
void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
#define ReleaseTupleDesc(tupdesc)
#define ATTNULLABLE_VALID
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
static void slot_getallattrs(TupleTableSlot *slot)
static bool slot_attisnull(TupleTableSlot *slot, int attnum)
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
bool DomainHasConstraints(Oid type_id)
void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId)
ObjectAddress AlterDomainAddConstraint(List *names, Node *newConstraint, ObjectAddress *constrAddr)
void checkDomainOwner(HeapTuple tup)
Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, bool ignoreDependent, bool errorOnTableType, ObjectAddresses *objsMoved)
List * roleSpecsToIds(List *memberNames)
void SwitchToUntrustedUser(Oid userid, UserContext *context)
void RestoreUserContext(UserContext *context)
void ProcessUtilityForAlterTable(Node *stmt, AlterTableUtilityContext *context)
#define MAX_STATISTICS_TARGET
String * makeString(char *str)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
static char * VARDATA_ANY(const void *PTR)
SubTransactionId GetCurrentSubTransactionId(void)
void CommandCounterIncrement(void)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)
CommandId GetCurrentCommandId(bool used)
#define XACT_FLAGS_ACCESSEDTEMPNAMESPACE
#define XLogLogicalInfoActive()
#define XLOG_INCLUDE_ORIGIN
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterData(const void *data, uint32 len)
void XLogSetRecordFlags(uint8 flags)
void XLogBeginInsert(void)