99#include "utils/fmgroids.h"
166#define AT_NUM_PASSES (AT_PASS_MISC + 1)
265 gettext_noop(
"sequence \"%s\" does not exist, skipping"),
267 gettext_noop(
"Use DROP SEQUENCE to remove a sequence.")},
276 gettext_noop(
"materialized view \"%s\" does not exist"),
277 gettext_noop(
"materialized view \"%s\" does not exist, skipping"),
279 gettext_noop(
"Use DROP MATERIALIZED VIEW to remove a materialized view.")},
281 ERRCODE_UNDEFINED_OBJECT,
286 {RELKIND_COMPOSITE_TYPE,
287 ERRCODE_UNDEFINED_OBJECT,
292 {RELKIND_FOREIGN_TABLE,
293 ERRCODE_UNDEFINED_OBJECT,
295 gettext_noop(
"foreign table \"%s\" does not exist, skipping"),
297 gettext_noop(
"Use DROP FOREIGN TABLE to remove a foreign table.")},
298 {RELKIND_PARTITIONED_TABLE,
304 {RELKIND_PARTITIONED_INDEX,
305 ERRCODE_UNDEFINED_OBJECT,
310 {
'\0', 0, NULL, NULL, NULL, NULL}
328#define ATT_TABLE 0x0001
329#define ATT_VIEW 0x0002
330#define ATT_MATVIEW 0x0004
331#define ATT_INDEX 0x0008
332#define ATT_COMPOSITE_TYPE 0x0010
333#define ATT_FOREIGN_TABLE 0x0020
334#define ATT_PARTITIONED_INDEX 0x0040
335#define ATT_SEQUENCE 0x0080
336#define ATT_PARTITIONED_TABLE 0x0100
365#define child_dependency_type(child_is_partition) \
366 ((child_is_partition) ? DEPENDENCY_AUTO : DEPENDENCY_NORMAL)
374 bool is_partition,
List **supconstr,
382 bool child_is_partition);
385 bool child_is_partition);
400 const Oid fkrelid,
const Oid pkrelid,
402 Oid ReferencedParentDelTrigger,
403 Oid ReferencedParentUpdTrigger,
404 Oid ReferencingParentInsTrigger,
405 Oid ReferencingParentUpdTrigger);
414 bool deferrable,
bool initdeferred,
418 const Oid fkrelid,
const Oid pkrelid,
420 Oid ReferencedParentDelTrigger,
421 Oid ReferencedParentUpdTrigger,
422 Oid ReferencingParentInsTrigger,
423 Oid ReferencingParentUpdTrigger);
432 bool recurse,
bool recursing,
LOCKMODE lockmode);
437 bool recurse,
bool recursing,
LOCKMODE lockmode);
439 HeapTuple contuple,
bool recurse,
bool recursing,
446 Oid *opclasses,
bool *pk_has_without_overlaps);
448 int numattrs,
int16 *attnums,
449 bool with_period,
Oid *opclasses,
450 bool *pk_has_without_overlaps);
456 Oid pkindOid,
Oid constraintOid,
bool hasperiod);
462 bool recurse,
bool recursing,
LOCKMODE lockmode,
494 bool recurse,
bool recursing,
504 bool is_valid,
bool queue_validation);
506 char *constrname,
char *colName,
507 bool recurse,
bool recursing,
511 List *testConstraint,
List *provenConstraint);
517 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing);
519 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing);
521 bool recurse,
bool recursing);
537 bool recurse,
bool recursing,
549 Constraint *newConstraint,
bool recurse,
bool is_readd,
557 bool recurse,
bool recursing,
bool is_readd,
561 bool recurse,
bool recursing,
564 int numfksetcols,
int16 *fksetcolsattnums,
567 char *constraintname,
572 Oid *pfeqoperators,
Oid *ppeqoperators,
573 Oid *ffeqoperators,
int numfkdelsetcols,
574 int16 *fkdelsetcols,
bool is_internal,
579 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
580 int numfkdelsetcols,
int16 *fkdelsetcols,
582 Oid parentDelTrigger,
Oid parentUpdTrigger,
587 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
588 int numfkdelsetcols,
int16 *fkdelsetcols,
589 bool old_check_ok,
LOCKMODE lockmode,
590 Oid parentInsTrigger,
Oid parentUpdTrigger,
600 Oid parentInsTrigger,
Oid parentUpdTrigger,
601 Oid *insertTrigOid,
Oid *updateTrigOid);
605 Oid parentDelTrigger,
Oid parentUpdTrigger,
606 Oid *deleteTrigOid,
Oid *updateTrigOid);
610 Oid parentConstrOid,
int numfks,
613 Oid parentInsTrigger,
614 Oid parentUpdTrigger,
617 Oid partConstrOid,
Oid parentConstrOid,
618 Oid parentInsTrigger,
Oid parentUpdTrigger,
621 Oid conoid,
Oid conrelid);
623 Oid confrelid,
Oid conrelid);
626 Oid *deleteTriggerOid,
627 Oid *updateTriggerOid);
630 Oid *insertTriggerOid,
631 Oid *updateTriggerOid);
634 bool missing_ok,
LOCKMODE lockmode);
637 bool recurse,
bool recursing,
638 bool missing_ok,
LOCKMODE lockmode);
641 bool recurse,
bool recursing,
659 const char *conname);
665 Oid oldOwnerId,
Oid newOwnerId);
676 const char *tablespacename,
LOCKMODE lockmode);
683 char fires_when,
bool skip_system,
bool recurse,
686 char fires_when,
LOCKMODE lockmode);
705 Oid oldRelOid,
void *
arg);
710 List **partexprs,
Oid *partopclass,
Oid *partcollation,
714 bool expect_detached);
720 List *partConstraint,
721 bool validate_default);
729 bool concurrent,
Oid defaultPartOid);
773 List *old_constraints;
776 List *cookedDefaults;
798 &&
stmt->relation->relpersistence != RELPERSISTENCE_TEMP)
800 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
801 errmsg(
"ON COMMIT can only be used on temporary tables")));
803 if (
stmt->partspec != NULL)
805 if (relkind != RELKIND_RELATION)
806 elog(
ERROR,
"unexpected relkind: %d", (
int) relkind);
808 relkind = RELKIND_PARTITIONED_TABLE;
814 if (relkind == RELKIND_PARTITIONED_TABLE &&
815 stmt->relation->relpersistence == RELPERSISTENCE_UNLOGGED)
817 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
818 errmsg(
"partitioned tables cannot be unlogged")));
834 if (
stmt->relation->relpersistence == RELPERSISTENCE_TEMP
837 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
838 errmsg(
"cannot create temporary table within security-restricted operation")));
861 foreach(listptr,
stmt->inhRelations)
873 (
errcode(ERRCODE_DUPLICATE_TABLE),
874 errmsg(
"relation \"%s\" would be inherited from more than once",
884 if (
stmt->tablespacename)
890 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
891 errmsg(
"cannot specify default tablespace for partitioned relations")));
893 else if (
stmt->partbound)
919 if (tablespaceId == GLOBALTABLESPACE_OID)
921 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
922 errmsg(
"only shared relations can be placed in pg_global tablespace")));
939 case RELKIND_PARTITIONED_TABLE:
946 if (
stmt->ofTypename)
966 stmt->relation->relpersistence,
967 stmt->partbound != NULL,
968 &old_constraints, &old_notnulls);
987 cookedDefaults =
NIL;
990 foreach(listptr,
stmt->tableElts)
1005 rawDefaults =
lappend(rawDefaults, rawEnt);
1014 cooked->
name = NULL;
1022 cookedDefaults =
lappend(cookedDefaults, cooked);
1031 if (
stmt->accessMethod != NULL)
1033 Assert(RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE);
1036 else if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE)
1038 if (
stmt->partbound)
1044 if (RELKIND_HAS_TABLE_AM(relkind) && !
OidIsValid(accessMethodId))
1065 stmt->relation->relpersistence,
1104 true,
true,
false, queryString);
1112 if (
stmt->partbound)
1129 if (parent->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
1131 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1132 errmsg(
"\"%s\" is not partitioned",
1170 NULL,
false,
false);
1225 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
1226 errmsg(
"cannot partition using more than %d columns",
1238 partattrs, &partexprs, partopclass,
1239 partcollation,
stmt->partspec->strategy);
1243 partopclass, partcollation);
1256 if (
stmt->partbound)
1270 foreach(cell, idxlist)
1277 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
1281 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1282 errmsg(
"cannot create foreign partition of partitioned table \"%s\"",
1284 errdetail(
"Table \"%s\" contains indexes that are unique.",
1298 attmap, &constraintOid);
1305 false,
false,
false,
false,
false);
1333 if (
stmt->constraints)
1335 true,
true,
false, queryString);
1413 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1414 errmsg(
"too many array dimensions"));
1418 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
1419 errmsg(
"column \"%s\" cannot be declared SETOF",
1423 atttypid, atttypmod, attdim);
1432 att->attinhcount = entry->
inhcount;
1433 att->attidentity = entry->
identity;
1437 att->attstorage = entry->
storage;
1462 (
errcode(ERRCODE_UNDEFINED_SCHEMA),
1468 (
errmsg(
"schema \"%s\" does not exist, skipping",
1476 if (rentry->
kind == rightkind)
1506 if (rentry->
kind == rightkind)
1511 if (wentry->
kind == wrongkind)
1516 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1547 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1548 errmsg(
"DROP INDEX CONCURRENTLY does not support dropping multiple objects")));
1551 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1552 errmsg(
"DROP INDEX CONCURRENTLY does not support CASCADE")));
1565 relkind = RELKIND_RELATION;
1569 relkind = RELKIND_INDEX;
1573 relkind = RELKIND_SEQUENCE;
1577 relkind = RELKIND_VIEW;
1581 relkind = RELKIND_MATVIEW;
1585 relkind = RELKIND_FOREIGN_TABLE;
1589 elog(
ERROR,
"unrecognized drop object type: %d",
1618 state.expected_relkind = relkind;
1641 state.actual_relpersistence != RELPERSISTENCE_TEMP)
1653 state.actual_relkind == RELKIND_PARTITIONED_INDEX)
1655 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1656 errmsg(
"cannot drop partitioned index \"%s\" concurrently",
1666 if (
state.actual_relkind == RELKIND_PARTITIONED_INDEX)
1668 state.heap_lockmode,
1672 obj.
classId = RelationRelationId;
1700 bool invalid_system_index =
false;
1735 is_partition = classform->relispartition;
1738 state->actual_relkind = classform->relkind;
1739 state->actual_relpersistence = classform->relpersistence;
1749 if (classform->relkind == RELKIND_PARTITIONED_TABLE)
1751 else if (classform->relkind == RELKIND_PARTITIONED_INDEX)
1758 state->expected_relkind);
1773 if (
IsSystemClass(relOid, classform) && classform->relkind == RELKIND_INDEX)
1787 indisvalid = indexform->indisvalid;
1792 invalid_system_index =
true;
1798 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1799 errmsg(
"permission denied: \"%s\" is a system catalog",
1813 relOid != oldRelOid)
1826 if (is_partition && relOid != oldRelOid)
1860 foreach(cell,
stmt->relations)
1864 bool recurse = rv->
inh;
1890 relids_logged =
lappend_oid(relids_logged, myrelid);
1899 foreach(child, children)
1938 relids_logged =
lappend_oid(relids_logged, childrelid);
1941 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
1943 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1944 errmsg(
"cannot truncate only a partitioned table"),
1945 errhint(
"Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly.")));
1949 stmt->behavior,
stmt->restart_seqs,
false);
1976 List *relids_logged,
1978 bool run_as_table_owner)
1982 HTAB *ft_htab = NULL;
2008 if (newrelids ==
NIL)
2011 foreach(cell, newrelids)
2018 (
errmsg(
"truncate cascades to table \"%s\"",
2028 relids_logged =
lappend_oid(relids_logged, relid);
2038#ifdef USE_ASSERT_CHECKING
2059 foreach(seqcell, seqlist)
2093 resultRelInfo = resultRelInfos;
2114 resultRelInfo = resultRelInfos;
2119 if (run_as_table_owner)
2123 if (run_as_table_owner)
2138 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
2148 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
2159 memset(&hctl, 0,
sizeof(
HASHCTL));
2164 ft_htab =
hash_create(
"TRUNCATE for Foreign Tables",
2224 toast_relid = rel->
rd_rel->reltoastrelid;
2231 toastrel->
rd_rel->relpersistence);
2277 foreach(cell, seq_relids)
2291 if (relids_logged !=
NIL)
2300 foreach(cell, relids_logged)
2323 resultRelInfo = resultRelInfos;
2328 if (run_as_table_owner)
2332 if (run_as_table_owner)
2371 if (reltuple->relkind == RELKIND_FOREIGN_TABLE)
2378 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2379 errmsg(
"cannot truncate foreign table \"%s\"",
2382 else if (reltuple->relkind != RELKIND_RELATION &&
2383 reltuple->relkind != RELKIND_PARTITIONED_TABLE)
2385 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2398 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2399 errmsg(
"permission denied: \"%s\" is a system catalog",
2435 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2436 errmsg(
"cannot truncate temporary tables of other sessions")));
2454 case TYPSTORAGE_PLAIN:
2456 case TYPSTORAGE_EXTERNAL:
2458 case TYPSTORAGE_EXTENDED:
2460 case TYPSTORAGE_MAIN:
2536 bool is_partition,
List **supconstr,
List **supnotnulls)
2541 bool have_bogus_defaults =
false;
2543 static Node bogus_marker = {0};
2560 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
2561 errmsg(
"tables can have at most %d columns",
2578 for (
int coldefpos = 0; coldefpos <
list_length(columns); coldefpos++)
2582 if (!is_partition && coldef->
typeName == NULL)
2591 (
errcode(ERRCODE_UNDEFINED_COLUMN),
2592 errmsg(
"column \"%s\" does not exist",
2597 for (
int restpos = coldefpos + 1; restpos <
list_length(columns);)
2617 (
errcode(ERRCODE_DUPLICATE_COLUMN),
2618 errmsg(
"column \"%s\" specified more than once",
2633 saved_columns = columns;
2649 List *inherited_defaults;
2650 List *cols_with_defaults;
2671 if (relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !is_partition)
2673 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2674 errmsg(
"cannot inherit from partitioned table \"%s\"",
2676 if (relation->
rd_rel->relispartition && !is_partition)
2678 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2679 errmsg(
"cannot inherit from partition \"%s\"",
2682 if (relation->
rd_rel->relkind != RELKIND_RELATION &&
2683 relation->
rd_rel->relkind != RELKIND_FOREIGN_TABLE &&
2684 relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
2686 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2687 errmsg(
"inherited relation \"%s\" is not a table or foreign table",
2695 relation->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
2696 relpersistence == RELPERSISTENCE_TEMP)
2698 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2699 errmsg(
"cannot create a temporary relation as partition of permanent relation \"%s\"",
2703 if (relpersistence != RELPERSISTENCE_TEMP &&
2704 relation->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
2706 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2708 ?
"cannot inherit from temporary relation \"%s\""
2709 :
"cannot create a permanent relation as partition of temporary relation \"%s\"",
2713 if (relation->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
2716 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2718 ?
"cannot inherit from temporary relation of another session"
2719 :
"cannot create as partition of temporary relation of another session")));
2730 constr = tupleDesc->
constr;
2740 inherited_defaults = cols_with_defaults =
NIL;
2756 char *attributeName =
NameStr(attribute->attname);
2764 if (attribute->attisdropped)
2771 attribute->atttypmod, attribute->attcollation);
2772 newdef->
storage = attribute->attstorage;
2773 newdef->
generated = attribute->attgenerated;
2784 newdef->
identity = attribute->attidentity;
2791 if (exist_attno > 0)
2798 newattmap->
attnums[parent_attno - 1] = exist_attno;
2813 inh_columns =
lappend(inh_columns, newdef);
2815 newattmap->
attnums[parent_attno - 1] = ++child_attno;
2828 if (attribute->atthasdef)
2833 if (this_default == NULL)
2834 elog(
ERROR,
"default expression not found for attribute %d of relation \"%s\"",
2843 inherited_defaults =
lappend(inherited_defaults, this_default);
2844 cols_with_defaults =
lappend(cols_with_defaults, mergeddef);
2852 forboth(lc1, inherited_defaults, lc2, cols_with_defaults)
2856 bool found_whole_row;
2870 if (found_whole_row)
2872 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2873 errmsg(
"cannot convert whole-row table reference"),
2874 errdetail(
"Generation expression for column \"%s\" contains a whole-row reference to table \"%s\".",
2890 have_bogus_defaults =
true;
2907 bool found_whole_row;
2910 if (check[
i].ccnoinherit)
2924 if (found_whole_row)
2926 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2927 errmsg(
"cannot convert whole-row table reference"),
2928 errdetail(
"Constraint \"%s\" contains a whole-row reference to table \"%s\".",
2933 check[
i].ccenforced);
2945 nn->attnum = newattmap->
attnums[nn->attnum - 1];
2947 nnconstraints =
lappend(nnconstraints, nn);
2966 if (inh_columns !=
NIL)
2968 int newcol_attno = 0;
2970 foreach(lc, columns)
2973 char *attributeName = newdef->
colname;
2988 if (exist_attno > 0)
3000 inh_columns =
lappend(inh_columns, newdef);
3004 columns = inh_columns;
3012 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
3013 errmsg(
"tables can have at most %d columns",
3024 foreach(lc, saved_columns)
3049 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3050 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3054 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3055 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3062 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3063 errmsg(
"child column \"%s\" specifies generation expression",
3065 errhint(
"A child table column cannot be generated unless its parent column is.")));
3070 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3071 errmsg(
"column \"%s\" inherits from generated column of different kind",
3073 errdetail(
"Parent column is %s, child column is %s.",
3074 coldef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3075 restdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3099 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3100 errmsg(
"column \"%s\" does not exist",
3109 if (have_bogus_defaults)
3111 foreach(lc, columns)
3119 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3120 errmsg(
"column \"%s\" inherits conflicting generation expressions",
3122 errhint(
"To resolve the conflict, specify a generation expression explicitly.")));
3125 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3126 errmsg(
"column \"%s\" inherits conflicting default values",
3128 errhint(
"To resolve the conflict, specify a default explicitly.")));
3133 *supconstr = constraints;
3134 *supnotnulls = nnconstraints;
3161 foreach(lc, constraints)
3177 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3178 errmsg(
"too many inheritance parents"));
3195 errmsg(
"check constraint name \"%s\" appears multiple times but with different expressions",
3206 newcon->
expr = expr;
3210 return lappend(constraints, newcon);
3237 char *attributeName = newdef->
colname;
3246 if (exist_attno == newcol_attno)
3248 (
errmsg(
"merging column \"%s\" with inherited definition",
3252 (
errmsg(
"moving and merging column \"%s\" with inherited definition", attributeName),
3253 errdetail(
"User-specified column moved to the position of the inherited column.")));
3262 if (inhtypeid != newtypeid || inhtypmod != newtypmod)
3264 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3265 errmsg(
"column \"%s\" has a type conflict",
3276 if (inhcollid != newcollid)
3278 (
errcode(ERRCODE_COLLATION_MISMATCH),
3279 errmsg(
"column \"%s\" has a collation conflict",
3298 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3299 errmsg(
"column \"%s\" has a storage parameter conflict",
3314 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3315 errmsg(
"column \"%s\" has a compression method conflict",
3343 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3344 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3348 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3349 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3356 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3357 errmsg(
"child column \"%s\" specifies generation expression",
3359 errhint(
"A child table column cannot be generated unless its parent column is.")));
3364 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3365 errmsg(
"column \"%s\" inherits from generated column of different kind",
3367 errdetail(
"Parent column is %s, child column is %s.",
3368 inhdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3369 newdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3409 char *attributeName = newdef->
colname;
3419 (
errmsg(
"merging multiple inherited definitions of column \"%s\"",
3428 if (prevtypeid != newtypeid || prevtypmod != newtypmod)
3430 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3431 errmsg(
"inherited column \"%s\" has a type conflict",
3442 if (prevcollid != newcollid)
3444 (
errcode(ERRCODE_COLLATION_MISMATCH),
3445 errmsg(
"inherited column \"%s\" has a collation conflict",
3458 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3459 errmsg(
"inherited column \"%s\" has a storage parameter conflict",
3474 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3475 errmsg(
"column \"%s\" has a compression method conflict",
3486 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3487 errmsg(
"inherited column \"%s\" has a generation conflict",
3497 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3498 errmsg(
"too many inheritance parents"));
3511 bool child_is_partition)
3537 foreach(entry, supers)
3542 child_is_partition);
3556 bool child_is_partition)
3567 parentobject.
classId = RelationRelationId;
3570 childobject.
classId = RelationRelationId;
3604 foreach(lc, columns)
3653 elog(
ERROR,
"cache lookup failed for relation %u", relationId);
3656 if (classtuple->relhassubclass != relhassubclass)
3658 classtuple->relhassubclass = relhassubclass;
3684 Oid oldTableSpaceId;
3690 oldTableSpaceId = rel->
rd_rel->reltablespace;
3691 if (newTableSpaceId == oldTableSpaceId ||
3701 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3702 errmsg(
"cannot move system relation \"%s\"",
3706 if (newTableSpaceId == GLOBALTABLESPACE_OID)
3708 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3709 errmsg(
"only shared relations can be placed in pg_global tablespace")));
3717 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3718 errmsg(
"cannot move temporary tables of other sessions")));
3740 Oid newTableSpaceId,
3756 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
3764 rd_rel->relfilenode = newRelFilenumber;
3772 if (!RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
3774 rd_rel->reltablespace);
3786 char relkind = classform->relkind;
3788 if (classform->reloftype && !recursing)
3790 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3791 errmsg(
"cannot rename column of typed table")));
3800 if (relkind != RELKIND_RELATION &&
3801 relkind != RELKIND_VIEW &&
3802 relkind != RELKIND_MATVIEW &&
3803 relkind != RELKIND_COMPOSITE_TYPE &&
3804 relkind != RELKIND_INDEX &&
3805 relkind != RELKIND_PARTITIONED_INDEX &&
3806 relkind != RELKIND_FOREIGN_TABLE &&
3807 relkind != RELKIND_PARTITIONED_TABLE)
3809 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3810 errmsg(
"cannot rename columns of relation \"%s\"",
3822 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
3823 errmsg(
"permission denied: \"%s\" is a system catalog",
3824 NameStr(classform->relname))));
3834 const char *oldattname,
3835 const char *newattname,
3838 int expected_parents,
3882 forboth(lo, child_oids, li, child_numparents)
3887 if (childrelid == myrelid)
3890 renameatt_internal(childrelid, oldattname, newattname,
false,
true, numparents, behavior);
3901 if (expected_parents == 0 &&
3904 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3905 errmsg(
"inherited column \"%s\" must be renamed in child tables too",
3910 if (targetrelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
3919 foreach(lo, child_oids)
3928 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3929 errmsg(
"column \"%s\" does not exist",
3933 attnum = attform->attnum;
3936 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3937 errmsg(
"cannot rename system column \"%s\"",
3949 if (attform->attinhcount > expected_parents)
3951 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3952 errmsg(
"cannot rename inherited column \"%s\"",
4013 (
errmsg(
"relation \"%s\" does not exist, skipping",
4014 stmt->relation->relname)));
4022 stmt->relation->inh,
4038 const char *oldconname,
4039 const char *newconname,
4042 int expected_parents)
4050 Assert(!myrelid || !mytypid);
4071 elog(
ERROR,
"cache lookup failed for constraint %u",
4076 (con->contype == CONSTRAINT_CHECK ||
4077 con->contype == CONSTRAINT_NOTNULL) &&
4090 forboth(lo, child_oids, li, child_numparents)
4095 if (childrelid == myrelid)
4103 if (expected_parents == 0 &&
4106 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4107 errmsg(
"inherited constraint \"%s\" must be renamed in child tables too",
4111 if (con->coninhcount > expected_parents)
4113 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4114 errmsg(
"cannot rename inherited constraint \"%s\"",
4119 && (con->contype == CONSTRAINT_PRIMARY
4120 || con->contype == CONSTRAINT_UNIQUE
4121 || con->contype == CONSTRAINT_EXCLUSION))
4159 elog(
ERROR,
"cache lookup failed for type %u", typid);
4174 (
errmsg(
"relation \"%s\" does not exist, skipping",
4175 stmt->relation->relname)));
4185 stmt->relation->inh),
4226 (
errmsg(
"relation \"%s\" does not exist, skipping",
4227 stmt->relation->relname)));
4238 obj_is_index = (relkind == RELKIND_INDEX ||
4239 relkind == RELKIND_PARTITIONED_INDEX);
4240 if (obj_is_index || is_index_stmt == obj_is_index)
4244 is_index_stmt = obj_is_index;
4288 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4294 (
errcode(ERRCODE_DUPLICATE_TABLE),
4295 errmsg(
"relation \"%s\" already exists",
4305 is_index == (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4306 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX));
4328 newrelname, namespaceId);
4333 if (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4334 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
4365 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4407 int expected_refcnt;
4412 (
errcode(ERRCODE_OBJECT_IN_USE),
4414 errmsg(
"cannot %s \"%s\" because it is being used by active queries in this session",
4417 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
4418 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
4421 (
errcode(ERRCODE_OBJECT_IN_USE),
4423 errmsg(
"cannot %s \"%s\" because it has pending trigger events",
4448 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4449 errmsg(
"cannot alter temporary tables of other sessions")));
4561 ATController(NULL, rel, cmds, recurse, lockmode, NULL);
4837 elog(
ERROR,
"unrecognized alter table type: %d",
4845 if (cmd_lockmode > lockmode)
4846 lockmode = cmd_lockmode;
4871 ATPrepCmd(&wqueue, rel, cmd, recurse,
false, lockmode, context);
4895 bool recurse,
bool recursing,
LOCKMODE lockmode,
4908 if (rel->
rd_rel->relispartition &&
4912 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
4913 errmsg(
"cannot alter partition \"%s\" with an incomplete detach",
4915 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
5141 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5142 errmsg(
"cannot change persistence setting twice")));
5158 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5159 errmsg(
"cannot have multiple SET ACCESS METHOD subcommands")));
5272 elog(
ERROR,
"unrecognized alter table type: %d",
5306 foreach(ltab, *wqueue)
5322 foreach(lcmd, subcmds)
5325 lockmode, pass, context);
5344 foreach(ltab, *wqueue)
5353 if (((tab->
relkind == RELKIND_RELATION ||
5354 tab->
relkind == RELKIND_PARTITIONED_TABLE) &&
5356 tab->
relkind == RELKIND_MATVIEW)
5378 lockmode, cur_pass, context);
5406 cmd->
recurse,
false, lockmode);
5459 cmd->
recurse,
false, lockmode);
5464 true,
true, lockmode);
5526 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
5537 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
5538 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
5647 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
5659 Assert(rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
5668 elog(
ERROR,
"unrecognized alter table type: %d",
5728 foreach(lc, beforeStmts)
5737 foreach(lc, atstmt->
cmds)
5789 if (pass < cur_pass)
5792 elog(
ERROR,
"ALTER TABLE scheduling failure: too late for pass %d",
5795 else if (pass > cur_pass)
5812 elog(
ERROR,
"ALTER TABLE scheduling failure: bogus item for pass %d",
5833 foreach(ltab, *wqueue)
5838 if (!RELKIND_HAS_STORAGE(tab->
relkind))
5879 Oid NewAccessMethod;
5892 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5893 errmsg(
"cannot rewrite system relation \"%s\"",
5898 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5899 errmsg(
"cannot rewrite table \"%s\" used as a catalog table",
5910 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5911 errmsg(
"cannot rewrite temporary tables of other sessions")));
5920 NewTableSpace = OldHeap->
rd_rel->reltablespace;
5929 NewAccessMethod = OldHeap->
rd_rel->relam;
5972 persistence, lockmode);
6031 foreach(lc, seqlist)
6047 foreach(ltab, *wqueue)
6054 if (!RELKIND_HAS_STORAGE(tab->
relkind))
6093 foreach(ltab, *wqueue)
6121 bool needscan =
false;
6122 List *notnull_attrs;
6123 List *notnull_virtual_attrs;
6188 elog(
ERROR,
"unrecognized constraint type: %d",
6208 notnull_attrs = notnull_virtual_attrs =
NIL;
6221 for (
i = 0;
i < newTupDesc->
natts;
i++)
6230 if (wholeatt->attgenerated != ATTRIBUTE_GENERATED_VIRTUAL)
6231 notnull_attrs =
lappend_int(notnull_attrs, wholeatt->attnum);
6233 notnull_virtual_attrs =
lappend_int(notnull_virtual_attrs,
6237 if (notnull_attrs || notnull_virtual_attrs)
6241 if (newrel || needscan)
6259 if (notnull_virtual_attrs !=
NIL)
6334 for (
i = 0;
i < newTupDesc->
natts;
i++)
6370 foreach(lc, dropped_attrs)
6424 insertslot = newslot;
6433 insertslot = oldslot;
6446 (
errcode(ERRCODE_NOT_NULL_VIOLATION),
6447 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6454 if (notnull_virtual_attrs !=
NIL)
6460 notnull_virtual_attrs);
6466 errcode(ERRCODE_NOT_NULL_VIOLATION),
6467 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6483 (
errcode(ERRCODE_CHECK_VIOLATION),
6484 errmsg(
"check constraint \"%s\" of relation \"%s\" is violated by some row",
6494 elog(
ERROR,
"unrecognized constraint type: %d",
6499 if (partqualstate && !
ExecCheck(partqualstate, econtext))
6503 (
errcode(ERRCODE_CHECK_VIOLATION),
6504 errmsg(
"updated partition constraint for default partition \"%s\" would be violated by some row",
6509 (
errcode(ERRCODE_CHECK_VIOLATION),
6510 errmsg(
"partition constraint of relation \"%s\" is violated by some row",
6518 ti_options, bistate);
6557 foreach(ltab, *wqueue)
6560 if (tab->
relid == relid)
6579 *wqueue =
lappend(*wqueue, tab);
6591 return "ADD COLUMN";
6594 return "ALTER COLUMN ... SET DEFAULT";
6596 return "ALTER COLUMN ... DROP NOT NULL";
6598 return "ALTER COLUMN ... SET NOT NULL";
6600 return "ALTER COLUMN ... SET EXPRESSION";
6602 return "ALTER COLUMN ... DROP EXPRESSION";
6604 return "ALTER COLUMN ... SET STATISTICS";
6606 return "ALTER COLUMN ... SET";
6608 return "ALTER COLUMN ... RESET";
6610 return "ALTER COLUMN ... SET STORAGE";
6612 return "ALTER COLUMN ... SET COMPRESSION";
6614 return "DROP COLUMN";
6622 return "ADD CONSTRAINT";
6624 return "ALTER CONSTRAINT";
6626 return "VALIDATE CONSTRAINT";
6628 return "DROP CONSTRAINT";
6632 return "ALTER COLUMN ... SET DATA TYPE";
6634 return "ALTER COLUMN ... OPTIONS";
6638 return "CLUSTER ON";
6640 return "SET WITHOUT CLUSTER";
6642 return "SET ACCESS METHOD";
6644 return "SET LOGGED";
6646 return "SET UNLOGGED";
6648 return "SET WITHOUT OIDS";
6650 return "SET TABLESPACE";
6658 return "ENABLE TRIGGER";
6660 return "ENABLE ALWAYS TRIGGER";
6662 return "ENABLE REPLICA TRIGGER";
6664 return "DISABLE TRIGGER";
6666 return "ENABLE TRIGGER ALL";
6668 return "DISABLE TRIGGER ALL";
6670 return "ENABLE TRIGGER USER";
6672 return "DISABLE TRIGGER USER";
6674 return "ENABLE RULE";
6676 return "ENABLE ALWAYS RULE";
6678 return "ENABLE REPLICA RULE";
6680 return "DISABLE RULE";
6684 return "NO INHERIT";
6690 return "REPLICA IDENTITY";
6692 return "ENABLE ROW SECURITY";
6694 return "DISABLE ROW SECURITY";
6696 return "FORCE ROW SECURITY";
6698 return "NO FORCE ROW SECURITY";
6702 return "ATTACH PARTITION";
6704 return "DETACH PARTITION";
6706 return "DETACH PARTITION ... FINALIZE";
6708 return "ALTER COLUMN ... ADD IDENTITY";
6710 return "ALTER COLUMN ... SET";
6712 return "ALTER COLUMN ... DROP IDENTITY";
6732 switch (rel->
rd_rel->relkind)
6734 case RELKIND_RELATION:
6737 case RELKIND_PARTITIONED_TABLE:
6743 case RELKIND_MATVIEW:
6749 case RELKIND_PARTITIONED_INDEX:
6752 case RELKIND_COMPOSITE_TYPE:
6755 case RELKIND_FOREIGN_TABLE:
6758 case RELKIND_SEQUENCE:
6767 if ((actual_target & allowed_targets) == 0)
6773 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
6775 errmsg(
"ALTER action %s cannot be performed on relation \"%s\"",
6780 elog(
ERROR,
"invalid ALTER action attempted on relation \"%s\"",
6791 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
6792 errmsg(
"permission denied: \"%s\" is a system catalog",
6813 if (recurse && rel->
rd_rel->relhassubclass)
6826 foreach(child, children)
6831 if (childrelid == relid)
6836 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
6852 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
6886 Assert(rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
6892 foreach(child, children)
6899 ATPrepCmd(wqueue, childrel, cmd,
true,
true, lockmode, context);
6926 const char *origTypeName)
6943 Anum_pg_depend_refclassid,
6947 Anum_pg_depend_refobjid,
6962 if (pg_depend->classid == TypeRelationId)
6971 origRelation, origTypeName);
6976 if (pg_depend->classid != RelationRelationId)
6995 if (pg_depend->objsubid > 0 && pg_depend->objsubid <= tupleDesc->
natts)
7000 for (
int attno = 1; attno <= tupleDesc->
natts; attno++)
7003 if (att->atttypid == typeOid && !att->attisdropped)
7024 if (RELKIND_HAS_STORAGE(rel->
rd_rel->relkind) ||
7025 RELKIND_HAS_PARTITIONS(rel->
rd_rel->relkind))
7029 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7030 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7034 else if (origRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7036 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7037 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7041 else if (origRelation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
7043 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7044 errmsg(
"cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type",
7050 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7051 errmsg(
"cannot alter table \"%s\" because column \"%s.%s\" uses its row type",
7063 origRelation, origTypeName);
7094 Anum_pg_class_reloftype,
7106 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
7107 errmsg(
"cannot alter type \"%s\" because it is the type of a typed table",
7109 errhint(
"Use ALTER ... CASCADE to alter the typed tables too.")));
7135 bool typeOk =
false;
7137 if (typ->typtype == TYPTYPE_COMPOSITE)
7143 typeOk = (typeRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
7154 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7155 errmsg(
"type %s is the row type of another table",
7157 errdetail(
"A typed table must use a stand-alone composite type created with CREATE TYPE.")));
7161 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7162 errmsg(
"type %s is not a composite type",
7186 if (rel->
rd_rel->reloftype && !recursing)
7188 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7189 errmsg(
"cannot add column to typed table")));
7191 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7194 if (recurse && !is_view)
7213 bool if_not_exists = (*cmd)->missing_ok;
7236 if (rel->
rd_rel->relispartition && !recursing)
7238 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7239 errmsg(
"cannot add column to a partition")));
7264 if (ctypeId != childatt->atttypid ||
7265 ctypmod != childatt->atttypmod)
7267 (
errcode(ERRCODE_DATATYPE_MISMATCH),
7268 errmsg(
"child table \"%s\" has different type for column \"%s\"",
7271 if (ccollid != childatt->attcollation)
7273 (
errcode(ERRCODE_COLLATION_MISMATCH),
7274 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
7282 &childatt->attinhcount))
7284 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7285 errmsg(
"too many inheritance parents"));
7292 (
errmsg(
"merging definition of column \"%s\" for child \"%s\"",
7322 if (context != NULL && !recursing)
7341 rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE &&
7344 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7345 errmsg(
"cannot recursively add identity column to table that has child tables")));
7351 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
7353 relkind = relform->relkind;
7356 newattnum = relform->relnatts + 1;
7359 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
7360 errmsg(
"tables can have at most %d columns",
7371 attribute->attnum = newattnum;
7385 relform->relnatts = newattnum;
7407 rawEnt->
attnum = attribute->attnum;
7416 false,
true,
false, NULL);
7454 if (RELKIND_HAS_STORAGE(relkind))
7456 bool has_domain_constraints;
7457 bool has_missing =
false;
7468 nve->
typeId = attribute->atttypid;
7470 defval = (
Expr *) nve;
7477 if (!defval && has_domain_constraints)
7483 baseTypeMod = attribute->atttypmod;
7490 attribute->atttypid,
7491 attribute->atttypmod,
7496 elog(
ERROR,
"failed to coerce base type to domain");
7508 newval->attnum = attribute->attnum;
7523 if (rel->
rd_rel->relkind == RELKIND_RELATION &&
7525 !has_domain_constraints &&
7556 if (colDef->
generated != ATTRIBUTE_GENERATED_VIRTUAL)
7589 if (children && !recurse)
7591 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7592 errmsg(
"column must be added to child tables too")));
7605 foreach(child, children)
7620 &childcmd, recurse,
true,
7621 lockmode, cur_pass, context);
7661 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7662 errmsg(
"column name \"%s\" conflicts with a system column name",
7669 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7670 errmsg(
"column \"%s\" of relation \"%s\" already exists, skipping",
7676 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7677 errmsg(
"column \"%s\" of relation \"%s\" already exists",
7693 myself.
classId = RelationRelationId;
7696 referenced.
classId = TypeRelationId;
7714 myself.
classId = RelationRelationId;
7717 referenced.
classId = CollationRelationId;
7749 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7750 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7758 if (!attTup->attnotnull)
7767 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7768 errmsg(
"cannot alter system column \"%s\"",
7771 if (attTup->attidentity)
7773 (
errcode(ERRCODE_SYNTAX_ERROR),
7774 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
7780 if (rel->
rd_rel->relispartition)
7787 parent_attnum =
get_attnum(parentId, colName);
7790 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7791 errmsg(
"column \"%s\" is marked NOT NULL in parent table",
7802 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
7830 bool is_valid,
bool queue_validation)
7835 Assert(!queue_validation || wqueue);
7844 if (attr->attisdropped)
7847 if (!attr->attnotnull)
7856 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
7864 attr->attnotnull =
true;
7871 if (queue_validation && wqueue &&
7903 bool recurse,
bool recursing,
LOCKMODE lockmode)
7911 bool is_no_inherit =
false;
7927 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7928 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7934 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7935 errmsg(
"cannot alter system column \"%s\"",
7943 bool changed =
false;
7948 if (conForm->connoinherit && recurse)
7950 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7951 errmsg(
"cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"",
7963 &conForm->coninhcount))
7965 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7966 errmsg(
"too many inheritance parents"));
7969 else if (!conForm->conislocal)
7971 conForm->conislocal =
true;
7974 else if (!conForm->convalidated)
7981 recurse, recursing, lockmode);
8010 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
8012 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8013 errmsg(
"constraint must be added to child tables too"),
8014 errhint(
"Do not specify the ONLY keyword."));
8016 is_no_inherit =
true;
8027 colName,
"not_null",
8034 constraint->
conname = conName;
8038 false, !recursing,
false, NULL);
8065 recurse,
true, lockmode);
8095 nnulltest->argisrow =
false;
8101 (
errmsg_internal(
"existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls",
8128 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8129 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8135 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8136 errmsg(
"cannot alter system column \"%s\"",
8141 (
errcode(ERRCODE_SYNTAX_ERROR),
8142 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
8145 newDefault ? 0 :
errhint(
"Use %s instead.",
8146 "ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY")));
8150 (
errcode(ERRCODE_SYNTAX_ERROR),
8151 errmsg(
"column \"%s\" of relation \"%s\" is a generated column",
8155 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION") :
8157 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION") : 0)));
8169 newDefault != NULL);
8186 false,
true,
false, NULL);
8230 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing)
8240 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8241 if (ispartitioned && !recurse)
8243 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8244 errmsg(
"cannot add identity to a column of only the partitioned table"),
8245 errhint(
"Do not specify the ONLY keyword.")));
8247 if (rel->
rd_rel->relispartition && !recursing)
8249 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8250 errmsg(
"cannot add identity to a column of a partition"));
8257 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8258 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8266 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8267 errmsg(
"cannot alter system column \"%s\"",
8275 if (!attTup->attnotnull)
8277 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8278 errmsg(
"column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added",
8281 if (attTup->attidentity)
8283 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8284 errmsg(
"column \"%s\" of relation \"%s\" is already an identity column",
8287 if (attTup->atthasdef)
8289 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8290 errmsg(
"column \"%s\" of relation \"%s\" already has a default value",
8293 attTup->attidentity = cdef->
identity;
8309 if (recurse && ispartitioned)
8316 foreach(lc, children)
8336 LOCKMODE lockmode,
bool recurse,
bool recursing)
8347 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8348 if (ispartitioned && !recurse)
8350 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8351 errmsg(
"cannot change identity column of only the partitioned table"),
8352 errhint(
"Do not specify the ONLY keyword.")));
8354 if (rel->
rd_rel->relispartition && !recursing)
8356 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8357 errmsg(
"cannot change identity column of a partition"));
8363 if (strcmp(defel->
defname,
"generated") == 0)
8367 (
errcode(ERRCODE_SYNTAX_ERROR),
8368 errmsg(
"conflicting or redundant options")));
8369 generatedEl = defel;
8372 elog(
ERROR,
"option \"%s\" not recognized",
8386 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8387 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8395 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8396 errmsg(
"cannot alter system column \"%s\"",
8399 if (!attTup->attidentity)
8401 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8402 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8426 if (generatedEl && recurse && ispartitioned)
8433 foreach(lc, children)
8453 bool recurse,
bool recursing)
8464 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8465 if (ispartitioned && !recurse)
8467 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8468 errmsg(
"cannot drop identity from a column of only the partitioned table"),
8469 errhint(
"Do not specify the ONLY keyword.")));
8471 if (rel->
rd_rel->relispartition && !recursing)
8473 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8474 errmsg(
"cannot drop identity from a column of a partition"));
8480 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8481 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8489 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8490 errmsg(
"cannot alter system column \"%s\"",
8493 if (!attTup->attidentity)
8497 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8498 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8503 (
errmsg(
"column \"%s\" of relation \"%s\" is not an identity column, skipping",
8511 attTup->attidentity =
'\0';
8527 if (recurse && ispartitioned)
8534 foreach(lc, children)
8551 seqaddress.
classId = RelationRelationId;
8583 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8584 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8592 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8593 errmsg(
"cannot alter system column \"%s\"",
8596 attgenerated = attTup->attgenerated;
8599 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8600 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8607 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8610 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8611 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns on tables with check constraints"),
8612 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8615 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL && attTup->attnotnull)
8625 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8628 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8629 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns on tables that are part of a publication"),
8630 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8633 rewrite = (attgenerated == ATTRIBUTE_GENERATED_STORED);
8663 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8686 false,
true,
false, NULL);
8699 newval->is_generated =
true;
8735 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8736 errmsg(
"ALTER TABLE / DROP EXPRESSION must be applied to child tables too")));
8749 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8750 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8755 if (attTup->attinhcount > 0)
8757 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8758 errmsg(
"cannot drop generation expression from inherited column")));
8779 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8780 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8788 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8789 errmsg(
"cannot alter system column \"%s\"",
8798 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8800 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8801 errmsg(
"ALTER TABLE / DROP EXPRESSION is not supported for virtual generated columns"),
8802 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8805 if (!attTup->attgenerated)
8809 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8810 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8815 (
errmsg(
"column \"%s\" of relation \"%s\" is not a generated column, skipping",
8827 attTup->attgenerated =
'\0';
8844 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8873 bool newtarget_default;
8880 Datum repl_val[Natts_pg_attribute];
8881 bool repl_null[Natts_pg_attribute];
8882 bool repl_repl[Natts_pg_attribute];
8888 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
8889 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
8892 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8893 errmsg(
"cannot refer to non-index column by number")));
8896 if (newValue &&
intVal(newValue) != -1)
8898 newtarget =
intVal(newValue);
8899 newtarget_default =
false;
8902 newtarget_default =
true;
8904 if (!newtarget_default)
8912 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8913 errmsg(
"statistics target %d is too low",
8920 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8921 errmsg(
"lowering statistics target to %d",
8934 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8935 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8944 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8945 errmsg(
"column number %d of relation \"%s\" does not exist",
8951 attnum = attrtuple->attnum;
8954 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8955 errmsg(
"cannot alter system column \"%s\"",
8962 if (attrtuple->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8964 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8965 errmsg(
"cannot alter statistics on virtual generated column \"%s\"",
8968 if (rel->
rd_rel->relkind == RELKIND_INDEX ||
8969 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
8973 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8974 errmsg(
"cannot alter statistics on included column \"%s\" of index \"%s\"",
8978 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8979 errmsg(
"cannot alter statistics on non-expression column \"%s\" of index \"%s\"",
8981 errhint(
"Alter statistics on table column instead.")));
8985 memset(repl_null,
false,
sizeof(repl_null));
8986 memset(repl_repl,
false,
sizeof(repl_repl));
8987 if (!newtarget_default)
8988 repl_val[Anum_pg_attribute_attstattarget - 1] = newtarget;
8990 repl_null[Anum_pg_attribute_attstattarget - 1] =
true;
8991 repl_repl[Anum_pg_attribute_attstattarget - 1] =
true;
8993 repl_val, repl_null, repl_repl);
9027 Datum repl_val[Natts_pg_attribute];
9028 bool repl_null[Natts_pg_attribute];
9029 bool repl_repl[Natts_pg_attribute];
9037 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9038 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9042 attnum = attrtuple->attnum;
9045 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9046 errmsg(
"cannot alter system column \"%s\"",
9059 memset(repl_null,
false,
sizeof(repl_null));
9060 memset(repl_repl,
false,
sizeof(repl_repl));
9061 if (newOptions != (
Datum) 0)
9062 repl_val[Anum_pg_attribute_attoptions - 1] = newOptions;
9064 repl_null[Anum_pg_attribute_attoptions - 1] =
true;
9065 repl_repl[Anum_pg_attribute_attoptions - 1] =
true;
9067 repl_val, repl_null, repl_repl);
9096 bool setstorage,
char newstorage,
9097 bool setcompression,
char newcompression,
9111 for (
int i = 0;
i < indrel->
rd_index->indnatts;
i++)
9133 attrtuple->attstorage = newstorage;
9136 attrtuple->attcompression = newcompression;
9171 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9172 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9176 attnum = attrtuple->attnum;
9179 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9180 errmsg(
"cannot alter system column \"%s\"",
9196 true, attrtuple->attstorage,
9224 if (rel->
rd_rel->reloftype && !recursing)
9226 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
9227 errmsg(
"cannot drop column from typed table")));
9229 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
9250 bool recurse,
bool recursing,
9251 bool missing_ok,
LOCKMODE lockmode,
9267 Assert(!recursing || addrs != NULL);
9284 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9285 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9291 (
errmsg(
"column \"%s\" of relation \"%s\" does not exist, skipping",
9298 attnum = targetatt->attnum;
9303 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9304 errmsg(
"cannot drop system column \"%s\"",
9311 if (targetatt->attinhcount > 0 && !recursing)
9313 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9314 errmsg(
"cannot drop inherited column \"%s\"",
9326 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9327 errmsg(
"cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"",
9349 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
9351 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9352 errmsg(
"cannot drop column from only the partitioned table when partitions exist"),
9353 errhint(
"Do not specify the ONLY keyword.")));
9356 foreach(child, children)
9368 elog(
ERROR,
"cache lookup failed for attribute \"%s\" of relation %u",
9369 colName, childrelid);
9372 if (childatt->attinhcount <= 0)
9373 elog(
ERROR,
"relation %u has non-inherited attribute \"%s\"",
9374 childrelid, colName);
9383 if (childatt->attinhcount == 1 && !childatt->attislocal)
9387 behavior,
true,
true,
9388 false, lockmode, addrs);
9393 childatt->attinhcount--;
9408 childatt->attinhcount--;
9409 childatt->attislocal =
true;
9425 object.classId = RelationRelationId;
9427 object.objectSubId =
attnum;
9474 elog(
ERROR,
"cache lookup failed for attribute %s of relation %u",
9477 if (!attrForm->attnotnull)
9479 errmsg(
"column \"%s\" of table \"%s\" is not marked NOT NULL",
9504 if (conForm->connoinherit)
9506 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9507 errmsg(
"cannot create primary key on column \"%s\"",
9510 errdetail(
"The constraint \"%s\" on column \"%s\", marked %s, is incompatible with a primary key.",
9512 errhint(
"You will need to make it inheritable using %s.",
9513 "ALTER TABLE ... ALTER CONSTRAINT ... INHERIT"));
9516 if (!conForm->convalidated)
9518 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9519 errmsg(
"cannot create primary key on column \"%s\"",
9522 errdetail(
"The constraint \"%s\" on column \"%s\", marked %s, is incompatible with a primary key.",
9524 errhint(
"You will need to validate it using %s.",
9525 "ALTER TABLE ... VALIDATE CONSTRAINT"));
9538 newcmd->
def = (
Node *) nnconstr;
9540 ATPrepCmd(wqueue, rel, newcmd,
true,
false, lockmode, context);
9569 check_rights = !is_rebuild;
9641 Oid index_oid =
stmt->indexOid;
9645 char *constraintName;
9646 char constraintType;
9658 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
9660 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9661 errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables")));
9671 elog(
ERROR,
"index \"%s\" is not unique", indexName);
9680 constraintName =
stmt->idxname;
9681 if (constraintName == NULL)
9682 constraintName = indexName;
9683 else if (strcmp(constraintName, indexName) != 0)
9686 (
errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"",
9687 indexName, constraintName)));
9697 constraintType = CONSTRAINT_PRIMARY;
9699 constraintType = CONSTRAINT_UNIQUE;
9731 Constraint *newConstraint,
bool recurse,
bool is_readd,
9743 switch (newConstraint->
contype)
9749 newConstraint, recurse,
false, is_readd,
9765 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
9784 elog(
ERROR,
"unrecognized constraint type: %d",
9785 (
int) newConstraint->
contype);
9811 foreach(lc, colnames)
9816 buf[buflen++] =
'_';
9823 buflen += strlen(
buf + buflen);
9847 Constraint *constr,
bool recurse,
bool recursing,
9876 recursing || is_readd,
9886 foreach(lcon, newcons)
9954 if (!recurse && children !=
NIL)
9956 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9957 errmsg(
"constraint must be added to child tables too")));
9962 foreach(child, children)
9977 constr, recurse,
true, is_readd, lockmode);
10003 bool recurse,
bool recursing,
LOCKMODE lockmode)
10018 bool pk_has_without_overlaps;
10041 if (!recurse && rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10043 errcode(ERRCODE_WRONG_OBJECT_TYPE),
10044 errmsg(
"cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"",
10048 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10049 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10051 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10052 errmsg(
"referenced relation \"%s\" is not a table",
10057 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
10058 errmsg(
"permission denied: \"%s\" is a system catalog",
10069 switch (rel->
rd_rel->relpersistence)
10071 case RELPERSISTENCE_PERMANENT:
10074 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10075 errmsg(
"constraints on permanent tables may reference only permanent tables")));
10077 case RELPERSISTENCE_UNLOGGED:
10079 && pkrel->
rd_rel->relpersistence != RELPERSISTENCE_UNLOGGED)
10081 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10082 errmsg(
"constraints on unlogged tables may reference only permanent or unlogged tables")));
10084 case RELPERSISTENCE_TEMP:
10085 if (pkrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
10087 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10088 errmsg(
"constraints on temporary tables may reference only temporary tables")));
10091 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10092 errmsg(
"constraints on temporary tables must involve temporary tables of this session")));
10102 fkattnum, fktypoid, fkcolloid);
10106 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10107 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10111 fkdelsetcols, NULL, NULL);
10128 pkattnum, pktypoid, pkcolloid,
10129 opclasses, &pk_has_without_overlaps);
10134 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10135 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10141 pkattnum, pktypoid, pkcolloid);
10146 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10147 errmsg(
"foreign key uses PERIOD on the referencing table but not the referenced table"));
10151 with_period, opclasses, &pk_has_without_overlaps);
10158 if (pk_has_without_overlaps && !with_period)
10160 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10161 errmsg(
"foreign key must use PERIOD when referencing a primary using WITHOUT OVERLAPS"));
10171 for (
i = 0;
i < numfks;
i++)
10184 (
errcode(ERRCODE_SYNTAX_ERROR),
10185 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10190 (
errcode(ERRCODE_SYNTAX_ERROR),
10191 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10203 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
10205 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10206 errmsg(
"foreign key constraints on virtual generated columns are not supported")));
10219 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10220 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10228 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10229 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10241 if (numfks != numpks)
10243 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
10244 errmsg(
"number of referencing and referenced columns for foreign key disagree")));
10253 for (
i = 0;
i < numpks;
i++)
10255 Oid pktype = pktypoid[
i];
10256 Oid fktype = fktypoid[
i];
10258 Oid pkcoll = pkcolloid[
i];
10259 Oid fkcoll = fkcolloid[
i];
10276 elog(
ERROR,
"cache lookup failed for opclass %u", opclasses[
i]);
10278 amid = cla_tup->opcmethod;
10279 opfamily = cla_tup->opcfamily;
10280 opcintype = cla_tup->opcintype;
10293 for_overlaps = with_period &&
i == numpks - 1;
10298 errcode(ERRCODE_UNDEFINED_OBJECT),
10300 ?
errmsg(
"could not identify an overlaps operator for foreign key")
10301 :
errmsg(
"could not identify an equality operator for foreign key"),
10302 errdetail(
"Could not translate compare type %d for operator family \"%s\", input type %s, access method \"%s\".",
10313 elog(
ERROR,
"missing operator %d(%u,%u) in opfamily %u",
10314 eqstrategy, opcintype, opcintype, opfamily);
10326 pfeqop_right = fktyped;
10348 Oid input_typeids[2];
10349 Oid target_typeids[2];
10351 input_typeids[0] = pktype;
10352 input_typeids[1] = fktype;
10353 target_typeids[0] = opcintype;
10354 target_typeids[1] = opcintype;
10358 pfeqop = ffeqop = ppeqop;
10359 pfeqop_right = opcintype;
10365 (
errcode(ERRCODE_DATATYPE_MISMATCH),
10366 errmsg(
"foreign key constraint \"%s\" cannot be implemented",
10368 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10369 "are of incompatible types: %s and %s.",
10380 elog(
ERROR,
"key columns are not both collatable");
10397 if ((!pkcolldet || !fkcolldet) && pkcoll != fkcoll)
10399 (
errcode(ERRCODE_COLLATION_MISMATCH),
10400 errmsg(
"foreign key constraint \"%s\" cannot be implemented", fkconstraint->
conname),
10401 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10402 "have incompatible collations: \"%s\" and \"%s\". "
10403 "If either collation is nondeterministic, then both collations have to be the same.",
10418 old_check_ok = (pfeqop ==
lfirst_oid(old_pfeqop_item));
10440 old_fktype = attr->atttypid;
10441 new_fktype = fktype;
10447 old_fkcoll = attr->attcollation;
10448 new_fkcoll = fkcoll;
10483 old_check_ok = (new_pathtype == old_pathtype &&
10484 new_castfunc == old_castfunc &&
10485 (!IsPolymorphicType(pfeqop_right) ||
10486 new_fktype == old_fktype) &&
10487 (new_fkcoll == old_fkcoll ||
10491 pfeqoperators[
i] = pfeqop;
10492 ppeqoperators[
i] = ppeqop;
10493 ffeqoperators[
i] = ffeqop;
10507 Oid aggedperiodoperoid;
10508 Oid intersectoperoid;
10511 &intersectoperoid);
10516 fkconstraint->
conname, fkconstraint, rel, pkrel,
10581 int numfksetcols,
int16 *fksetcolsattnums,
10584 int numcolsout = 0;
10586 for (
int i = 0;
i < numfksetcols;
i++)
10588 int16 setcol_attnum = fksetcolsattnums[
i];
10592 for (
int j = 0;
j < numfks;
j++)
10594 if (fkattnums[
j] == setcol_attnum)
10606 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
10607 errmsg(
"column \"%s\" referenced in ON DELETE SET action must be part of foreign key", col)));
10612 for (
int j = 0;
j < numcolsout;
j++)
10614 if (fksetcolsattnums[
j] == setcol_attnum)
10621 fksetcolsattnums[numcolsout++] = setcol_attnum;
10657 char *constraintname,
Constraint *fkconstraint,
10659 int numfks,
int16 *pkattnum,
10660 int16 *fkattnum,
Oid *pfeqoperators,
Oid *ppeqoperators,
10661 Oid *ffeqoperators,
int numfkdelsetcols,
int16 *fkdelsetcols,
10662 bool is_internal,
bool with_period)
10675 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10676 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10678 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10679 errmsg(
"referenced relation \"%s\" is not a table",
10694 conname = constraintname;
10696 if (fkconstraint->
conname == NULL)
10701 conislocal =
false;
10703 connoinherit =
false;
10713 connoinherit = rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE;
10721 CONSTRAINT_FOREIGN,
10836 Oid *ppeqoperators,
Oid *ffeqoperators,
10837 int numfkdelsetcols,
int16 *fkdelsetcols,
10839 Oid parentDelTrigger,
Oid parentUpdTrigger,
10856 parentConstr, indexOid,
10857 parentDelTrigger, parentUpdTrigger,
10858 &deleteTriggerOid, &updateTriggerOid);
10865 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10890 for (
int j = 0;
j < numfks;
j++)
10891 mapped_pkattnum[
j] = map->
attnums[pkattnum[
j] - 1];
10894 mapped_pkattnum = pkattnum;
10899 elog(
ERROR,
"index for %u not found in partition %s",
10904 fkconstraint->
conname, fkconstraint, rel,
10905 partRel, partIndexId, parentConstr,
10906 numfks, mapped_pkattnum,
10907 fkattnum, pfeqoperators, ppeqoperators,
10908 ffeqoperators, numfkdelsetcols,
10909 fkdelsetcols,
true, with_period);
10912 partIndexId, address.
objectId, numfks,
10913 mapped_pkattnum, fkattnum,
10914 pfeqoperators, ppeqoperators, ffeqoperators,
10915 numfkdelsetcols, fkdelsetcols,
10917 deleteTriggerOid, updateTriggerOid,
10924 pfree(mapped_pkattnum);
10972 int numfks,
int16 *pkattnum,
int16 *fkattnum,
10973 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
10974 int numfkdelsetcols,
int16 *fkdelsetcols,
10975 bool old_check_ok,
LOCKMODE lockmode,
10976 Oid parentInsTrigger,
Oid parentUpdTrigger,
10986 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
10988 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10989 errmsg(
"foreign key constraints are not supported on foreign tables")));
11003 parentInsTrigger, parentUpdTrigger,
11004 &insertTriggerOid, &updateTriggerOid);
11006 if (rel->
rd_rel->relkind == RELKIND_RELATION)
11029 newcon->
conid = parentConstr;
11031 newcon->
qual = (
Node *) fkconstraint;
11036 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11068 for (
int j = 0;
j < numfks;
j++)
11069 mapped_fkattnum[
j] = attmap->
attnums[fkattnum[
j] - 1];
11102 fkconstraint->
conname, fkconstraint,
11103 partition, pkrel, indexOid, parentConstr,
11105 mapped_fkattnum, pfeqoperators,
11106 ppeqoperators, ffeqoperators,
11107 numfkdelsetcols, fkdelsetcols,
true,
11153 Assert(parentRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
11230 foreach(cell, clone)
11244 int numfkdelsetcols;
11253 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
11280 indexOid = constrForm->conindid;
11291 for (
int i = 0;
i < numfks;
i++)
11292 mapped_confkey[
i] = attmap->
attnums[confkey[
i] - 1];
11295 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11297 fkconstraint->
deferrable = constrForm->condeferrable;
11300 fkconstraint->
pktable = NULL;
11303 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11309 fkconstraint->
is_enforced = constrForm->conenforced;
11314 for (
int i = 0;
i < numfks;
i++)
11331 elog(
ERROR,
"index for %u not found in partition %s",
11339 if (constrForm->conenforced)
11341 constrForm->confrelid, constrForm->conrelid,
11342 &deleteTriggerOid, &updateTriggerOid);
11346 fkconstraint->
conname, fkconstraint, fkRel,
11347 partitionRel, partIndexId, constrOid,
11348 numfks, mapped_confkey,
11349 conkey, conpfeqop, conppeqop, conffeqop,
11350 numfkdelsetcols, confdelsetcols,
false,
11351 constrForm->conperiod);
11369 constrForm->conperiod);
11417 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
11418 errmsg(
"cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"",
11432 if (partRel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
11434 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
11435 errmsg(
"foreign key constraints are not supported on foreign tables")));
11455 foreach(cell, clone)
11468 int numfkdelsetcols;
11481 elog(
ERROR,
"cache lookup failed for constraint %u",
11497 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11502 conpfeqop, conppeqop, conffeqop,
11503 &numfkdelsetcols, confdelsetcols);
11504 for (
int i = 0;
i < numfks;
i++)
11505 mapped_conkey[
i] = attmap->
attnums[conkey[
i] - 1];
11516 if (constrForm->conenforced)
11518 constrForm->confrelid, constrForm->conrelid,
11519 &insertTriggerOid, &updateTriggerOid);
11529 foreach(lc, partFKs)
11558 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11560 fkconstraint->
deferrable = constrForm->condeferrable;
11563 fkconstraint->
pktable = NULL;
11566 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11572 fkconstraint->
is_enforced = constrForm->conenforced;
11575 for (
int i = 0;
i < numfks;
i++)
11580 mapped_conkey[
i] - 1);
11585 indexOid = constrForm->conindid;
11586 with_period = constrForm->conperiod;
11590 NameStr(constrForm->conname), fkconstraint,
11591 partRel, pkrel, indexOid, parentConstrOid,
11593 mapped_conkey, conpfeqop,
11594 conppeqop, conffeqop,
11595 numfkdelsetcols, confdelsetcols,
11596 false, with_period);
11642 Oid parentConstrOid,
11647 Oid parentInsTrigger,
11648 Oid parentUpdTrigger,
11659 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11666 if (fk->
confrelid != parentConstr->confrelid || fk->
nkeys != numfks)
11671 for (
int i = 0;
i < numfks;
i++)
11673 if (fk->conkey[
i] != mapped_conkey[
i] ||
11674 fk->confkey[
i] != confkey[
i] ||
11675 fk->conpfeqop[
i] != conpfeqop[
i])
11696 if (partConstr->conenforced != parentConstr->conenforced)
11698 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
11699 errmsg(
"constraint \"%s\" enforceability conflicts with constraint \"%s\" on relation \"%s\"",
11700 NameStr(parentConstr->conname),
11701 NameStr(partConstr->conname),
11705 partConstr->condeferrable != parentConstr->condeferrable ||
11706 partConstr->condeferred != parentConstr->condeferred ||
11707 partConstr->confupdtype != parentConstr->confupdtype ||
11708 partConstr->confdeltype != parentConstr->confdeltype ||
11709 partConstr->confmatchtype != parentConstr->confmatchtype)
11721 parentConstrOid, parentInsTrigger,
11722 parentUpdTrigger, trigrel);
11738 Oid parentConstrOid,
11739 Oid parentInsTrigger,
11740 Oid parentUpdTrigger,
11747 bool queueValidation;
11748 Oid partConstrFrelid;
11749 Oid partConstrRelid;
11750 bool parentConstrIsEnforced;
11756 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11758 parentConstrIsEnforced = parentConstr->conenforced;
11764 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11766 partConstrFrelid = partConstr->confrelid;
11767 partConstrRelid = partConstr->conrelid;
11789 queueValidation = parentConstr->convalidated && !partConstr->convalidated;
11811 if (parentConstrIsEnforced)
11813 Oid insertTriggerOid,
11817 partConstrOid, partConstrFrelid, partConstrRelid,
11818 &insertTriggerOid, &updateTriggerOid);
11838 if (queueValidation)
11846 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11873 Anum_pg_constraint_conrelid,
11878 ConstraintRelidTypidNameIndexId,
11879 true, NULL, 1, &
key);
11885 if (conform->conparentid != conoid)
11904 ConstraintRelationId,
11913 Anum_pg_trigger_tgconstraint,
11917 true, NULL, 1, &key2);
11953 Anum_pg_trigger_tgconstraint,
11966 if (
OidIsValid(conrelid) && trgform->tgconstrrelid != conrelid)
11968 if (
OidIsValid(confrelid) && trgform->tgrelid != confrelid)
11972 Assert(trgform->tgfoid == F_RI_FKEY_CHECK_INS ||
11973 trgform->tgfoid == F_RI_FKEY_CHECK_UPD ||
11974 trgform->tgfoid == F_RI_FKEY_CASCADE_DEL ||
11975 trgform->tgfoid == F_RI_FKEY_CASCADE_UPD ||
11976 trgform->tgfoid == F_RI_FKEY_RESTRICT_DEL ||
11977 trgform->tgfoid == F_RI_FKEY_RESTRICT_UPD ||
11978 trgform->tgfoid == F_RI_FKEY_SETNULL_DEL ||
11979 trgform->tgfoid == F_RI_FKEY_SETNULL_UPD ||
11980 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_DEL ||
11981 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_UPD ||
11982 trgform->tgfoid == F_RI_FKEY_NOACTION_DEL ||
11983 trgform->tgfoid == F_RI_FKEY_NOACTION_UPD);
12014 Oid conoid,
Oid confrelid,
Oid conrelid,
12015 Oid *deleteTriggerOid,
12016 Oid *updateTriggerOid)
12022 *deleteTriggerOid = *updateTriggerOid =
InvalidOid;
12024 Anum_pg_trigger_tgconstraint,
12034 if (trgform->tgconstrrelid != conrelid)
12036 if (trgform->tgrelid != confrelid)
12041 if (TRIGGER_FOR_DELETE(trgform->tgtype))
12044 *deleteTriggerOid = trgform->oid;
12046 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12049 *updateTriggerOid = trgform->oid;
12051#ifndef USE_ASSERT_CHECKING
12059 elog(
ERROR,
"could not find ON DELETE action trigger of foreign key constraint %u",
12062 elog(
ERROR,
"could not find ON UPDATE action trigger of foreign key constraint %u",
12075 Oid conoid,
Oid confrelid,
Oid conrelid,
12076 Oid *insertTriggerOid,
12077 Oid *updateTriggerOid)
12083 *insertTriggerOid = *updateTriggerOid =
InvalidOid;
12085 Anum_pg_trigger_tgconstraint,
12095 if (trgform->tgconstrrelid != confrelid)
12097 if (trgform->tgrelid != conrelid)
12102 if (TRIGGER_FOR_INSERT(trgform->tgtype))
12105 *insertTriggerOid = trgform->oid;
12107 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12110 *updateTriggerOid = trgform->oid;
12112#ifndef USE_ASSERT_CHECKING
12120 elog(
ERROR,
"could not find ON INSERT check triggers of foreign key constraint %u",
12123 elog(
ERROR,
"could not find ON UPDATE check triggers of foreign key constraint %u",
12155 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
12157 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
12158 errmsg(
"constraint must be altered in child tables too"),
12159 errhint(
"Do not specify the ONLY keyword."));
12169 Anum_pg_constraint_conrelid,
12173 Anum_pg_constraint_contypid,
12177 Anum_pg_constraint_conname,
12181 true, NULL, 3, skey);
12186 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12187 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12193 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12194 errmsg(
"constraint \"%s\" of relation \"%s\" is not a foreign key constraint",
12198 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12199 errmsg(
"cannot alter enforceability of constraint \"%s\" of relation \"%s\"",
12202 currcon->contype != CONSTRAINT_NOTNULL)
12204 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12205 errmsg(
"constraint \"%s\" of relation \"%s\" is not a not-null constraint",
12210 cmdcon->
noinherit && currcon->coninhcount > 0)
12212 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12213 errmsg(
"cannot alter inherited constraint \"%s\" on relation \"%s\"",
12229 Oid parent = currcon->conparentid;
12230 char *ancestorname = NULL;
12231 char *ancestortable = NULL;
12247 parent = contup->conparentid;
12252 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12253 errmsg(
"cannot alter constraint \"%s\" on relation \"%s\"",
12255 ancestorname && ancestortable ?
12256 errdetail(
"Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\".",
12257 cmdcon->
conname, ancestorname, ancestortable) : 0,
12258 errhint(
"You may alter the constraint it derives from instead.")));
12267 contuple, recurse, lockmode))
12289 bool changed =
false;
12308 currcon->conrelid, currcon->confrelid,
12315 contuple, recurse, &otherrelids,
12356 const Oid fkrelid,
const Oid pkrelid,
12358 Oid ReferencedParentDelTrigger,
12359 Oid ReferencedParentUpdTrigger,
12360 Oid ReferencingParentInsTrigger,
12361 Oid ReferencingParentUpdTrigger)
12366 bool changed =
false;
12374 conoid = currcon->oid;
12377 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12379 rel =
table_open(currcon->conrelid, lockmode);
12395 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12398 fkrelid, pkrelid, contuple,
12421 if (currcon->conrelid == fkrelid)
12423 currcon->confrelid,
12427 ReferencedParentDelTrigger,
12428 ReferencedParentUpdTrigger,
12429 &ReferencedDelTriggerOid,
12430 &ReferencedUpdTriggerOid);
12433 if (currcon->confrelid == pkrelid)
12439 ReferencingParentInsTrigger,
12440 ReferencingParentUpdTrigger,
12441 &ReferencingInsTriggerOid,
12442 &ReferencingUpdTriggerOid);
12448 if (rel->
rd_rel->relkind == RELKIND_RELATION)
12456 newcon->
refrelid = currcon->confrelid;
12457 newcon->
refindid = currcon->conindid;
12458 newcon->
conid = currcon->oid;
12459 newcon->
qual = (
Node *) fkconstraint;
12471 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12474 fkrelid, pkrelid, contuple,
12475 lockmode, ReferencedDelTriggerOid,
12476 ReferencedUpdTriggerOid,
12477 ReferencingInsTriggerOid,
12478 ReferencingUpdTriggerOid);
12504 bool changed =
false;
12512 refrelid = currcon->confrelid;
12515 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12521 if (currcon->condeferrable != cmdcon->
deferrable ||
12540 if (recurse && changed &&
12541 (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12544 contuple, recurse, otherrelids,
12568 Assert(currcon->contype == CONSTRAINT_NOTNULL);
12574 if (cmdcon->
noinherit == currcon->connoinherit)
12582 colName =
get_attname(currcon->conrelid, colNum,
false);
12601 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
12602 colName, childoid);
12604 Assert(childcon->coninhcount > 0);
12605 childcon->coninhcount--;
12606 childcon->conislocal =
true;
12615 colName,
true,
true, lockmode);
12634 bool deferrable,
bool initdeferred,
12635 List **otherrelids)
12642 Anum_pg_trigger_tgconstraint,
12669 if (tgform->tgfoid != F_RI_FKEY_NOACTION_DEL &&
12670 tgform->tgfoid != F_RI_FKEY_NOACTION_UPD &&
12671 tgform->tgfoid != F_RI_FKEY_CHECK_INS &&
12672 tgform->tgfoid != F_RI_FKEY_CHECK_UPD)
12678 copy_tg->tgdeferrable = deferrable;
12679 copy_tg->tginitdeferred = initdeferred;
12704 const Oid fkrelid,
const Oid pkrelid,
12706 Oid ReferencedParentDelTrigger,
12707 Oid ReferencedParentUpdTrigger,
12708 Oid ReferencingParentInsTrigger,
12709 Oid ReferencingParentUpdTrigger)
12718 conoid = currcon->oid;
12721 Anum_pg_constraint_conparentid,
12726 true, NULL, 1, &pkey);
12730 pkrelid, childtup, lockmode,
12731 ReferencedParentDelTrigger,
12732 ReferencedParentUpdTrigger,
12733 ReferencingParentInsTrigger,
12734 ReferencingParentUpdTrigger);
12763 conoid = currcon->oid;
12766 Anum_pg_constraint_conparentid,
12771 true, NULL, 1, &pkey);
12778 childrel =
table_open(childcon->conrelid, lockmode);
12781 childtup, recurse, otherrelids, lockmode);
12820 copy_con->condeferrable = cmdcon->
deferrable;
12824 copy_con->connoinherit = cmdcon->
noinherit;
12848 bool recurse,
bool recursing,
LOCKMODE lockmode)
12863 Anum_pg_constraint_conrelid,
12867 Anum_pg_constraint_contypid,
12871 Anum_pg_constraint_conname,
12875 true, NULL, 3, skey);
12880 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12881 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12885 if (con->contype != CONSTRAINT_FOREIGN &&
12886 con->contype != CONSTRAINT_CHECK &&
12887 con->contype != CONSTRAINT_NOTNULL)
12889 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12890 errmsg(
"constraint \"%s\" of relation \"%s\" is not a foreign key, check, or not-null constraint",
12893 if (!con->conenforced)
12895 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12896 errmsg(
"cannot validate NOT ENFORCED constraint")));
12898 if (!con->convalidated)
12900 if (con->contype == CONSTRAINT_FOREIGN)
12904 else if (con->contype == CONSTRAINT_CHECK)
12907 tuple, recurse, recursing, lockmode);
12909 else if (con->contype == CONSTRAINT_NOTNULL)
12912 tuple, recurse, recursing, lockmode);
12944 Assert(con->contype == CONSTRAINT_FOREIGN);
12945 Assert(!con->convalidated);
12947 if (rel->
rd_rel->relkind == RELKIND_RELATION)
12960 newcon->
refrelid = con->confrelid;
12962 newcon->
conid = con->oid;
12963 newcon->
qual = (
Node *) fkconstraint;
12974 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12982 Anum_pg_constraint_conparentid,
12987 true, NULL, 1, &pkey);
13001 if (childcon->convalidated)
13004 childrel =
table_open(childcon->conrelid, lockmode);
13019 copy_con->convalidated =
true;
13037 bool recurse,
bool recursing,
LOCKMODE lockmode)
13051 Assert(con->contype == CONSTRAINT_CHECK);
13058 if (!recursing && !con->connoinherit)
13069 foreach(child, children)
13084 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13085 errmsg(
"constraint must be validated on child tables too")));
13097 newcon->
name = constrName;
13101 newcon->
conid = con->oid;
13104 Anum_pg_constraint_conbin);
13122 copy_con->convalidated =
true;
13139 HeapTuple contuple,
bool recurse,
bool recursing,
13151 Assert(con->contype == CONSTRAINT_NOTNULL);
13163 if (!recursing && !con->connoinherit)
13184 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13185 errmsg(
"constraint must be validated on child tables too"));
13193 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
13196 if (childcon->convalidated)
13205 false,
true, lockmode);
13225 copy_con->convalidated =
true;
13252 foreach(l, colList)
13261 (
errcode(ERRCODE_UNDEFINED_COLUMN),
13262 errmsg(
"column \"%s\" referenced in foreign key constraint does not exist",
13265 if (attform->attnum < 0)
13267 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
13268 errmsg(
"system columns cannot be used in foreign keys")));
13271 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
13272 errmsg(
"cannot have more than %d keys in a foreign key",
13274 attnums[
attnum] = attform->attnum;
13275 if (atttypids != NULL)
13276 atttypids[
attnum] = attform->atttypid;
13277 if (attcollids != NULL)
13278 attcollids[
attnum] = attform->attcollation;
13301 List **attnamelist,
13303 Oid *opclasses,
bool *pk_has_without_overlaps)
13305 List *indexoidlist;
13309 Datum indclassDatum;
13322 foreach(indexoidscan, indexoidlist)
13328 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13330 if (indexStruct->indisprimary && indexStruct->indisvalid)
13337 if (!indexStruct->indimmediate)
13339 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13340 errmsg(
"cannot use a deferrable primary key for referenced table \"%s\"",
13343 *indexOid = indexoid;
13356 (
errcode(ERRCODE_UNDEFINED_OBJECT),
13357 errmsg(
"there is no primary key for referenced table \"%s\"",
13362 Anum_pg_index_indclass);
13369 *attnamelist =
NIL;
13370 for (
i = 0;
i < indexStruct->indnkeyatts;
i++)
13372 int pkattno = indexStruct->indkey.values[
i];
13374 attnums[
i] = pkattno;
13377 opclasses[
i] = indclass->
values[
i];
13378 *attnamelist =
lappend(*attnamelist,
13382 *pk_has_without_overlaps = indexStruct->indisexclusion;
13404 int numattrs,
int16 *attnums,
13405 bool with_period,
Oid *opclasses,
13406 bool *pk_has_without_overlaps)
13409 bool found =
false;
13410 bool found_deferrable =
false;
13411 List *indexoidlist;
13423 for (
i = 0;
i < numattrs;
i++)
13425 for (
j =
i + 1;
j < numattrs;
j++)
13427 if (attnums[
i] == attnums[
j])
13429 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13430 errmsg(
"foreign key referenced-columns list must not contain duplicates")));
13441 foreach(indexoidscan, indexoidlist)
13449 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13457 if (indexStruct->indnkeyatts == numattrs &&
13458 (with_period ? indexStruct->indisexclusion : indexStruct->indisunique) &&
13459 indexStruct->indisvalid &&
13463 Datum indclassDatum;
13468 Anum_pg_index_indclass);
13481 for (
i = 0;
i < numattrs;
i++)
13484 for (
j = 0;
j < numattrs;
j++)
13486 if (attnums[
i] == indexStruct->indkey.values[
j])
13488 opclasses[
i] = indclass->
values[
j];
13497 if (found && with_period)
13499 int16 periodattnum = attnums[numattrs - 1];
13501 found = (periodattnum == indexStruct->indkey.values[numattrs - 1]);
13509 if (found && !indexStruct->indimmediate)
13515 found_deferrable =
true;
13521 *pk_has_without_overlaps = indexStruct->indisexclusion;
13530 if (found_deferrable)
13532 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13533 errmsg(
"cannot use a deferrable unique constraint for referenced table \"%s\"",
13537 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13538 errmsg(
"there is no unique constraint matching given keys for referenced table \"%s\"",
13558 if (targetTypeId == sourceTypeId)
13569 elog(
ERROR,
"could not find cast from %u to %u",
13570 sourceTypeId, targetTypeId);
13595 for (
i = 0;
i < natts;
i++)
13627 (
errmsg_internal(
"validating foreign key constraint \"%s\"", conname)));
13662 "validateForeignKeyConstraint",
13683 trigdata.
type = T_TriggerData;
13690 fcinfo->context = (
Node *) &trigdata;
13713 Oid constraintOid,
Oid indexOid,
Oid parentTrigOid,
13731 fk_trigger->
trigname =
"RI_ConstraintTrigger_c";
13738 fk_trigger->
events = TRIGGER_TYPE_INSERT;
13743 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13747 fk_trigger->
row =
true;
13748 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13756 trigAddress =
CreateTrigger(fk_trigger, NULL, myRelOid, refRelOid,
13758 parentTrigOid, NULL,
true,
false);
13776 Oid constraintOid,
Oid indexOid,
13777 Oid parentDelTrigger,
Oid parentUpdTrigger,
13778 Oid *deleteTrigOid,
Oid *updateTrigOid)
13790 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13793 fk_trigger->
row =
true;
13794 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13795 fk_trigger->
events = TRIGGER_TYPE_DELETE;
13829 elog(
ERROR,
"unrecognized FK action type: %d",
13834 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13836 parentDelTrigger, NULL,
true,
false);
13838 *deleteTrigOid = trigAddress.
objectId;
13850 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13853 fk_trigger->
row =
true;
13854 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13855 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13889 elog(
ERROR,
"unrecognized FK action type: %d",
13894 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13896 parentUpdTrigger, NULL,
true,
false);
13898 *updateTrigOid = trigAddress.
objectId;
13913 Oid parentInsTrigger,
Oid parentUpdTrigger,
13914 Oid *insertTrigOid,
Oid *updateTrigOid)
13917 constraintOid, indexOid,
13918 parentInsTrigger,
true);
13920 constraintOid, indexOid,
13921 parentUpdTrigger,
false);
13932 bool missing_ok,
LOCKMODE lockmode)
13938 bool found =
false;
13946 Anum_pg_constraint_conrelid,
13950 Anum_pg_constraint_contypid,
13954 Anum_pg_constraint_conname,
13958 true, NULL, 3, skey);
13964 missing_ok, lockmode);
13974 errcode(ERRCODE_UNDEFINED_OBJECT),
13975 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
13979 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist, skipping",
13996 bool recurse,
bool recursing,
bool missing_ok,
14003 bool is_no_inherit_constraint =
false;
14005 char *colname = NULL;
14018 constrName =
NameStr(con->conname);
14021 if (con->coninhcount > 0 && !recursing)
14023 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14024 errmsg(
"cannot drop inherited constraint \"%s\" of relation \"%s\"",
14034 if (con->contype == CONSTRAINT_NOTNULL)
14055 if (pkattrs == NULL &&
14056 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14065 for (
int i = 0;
i < pk->
rd_index->indnkeyatts;
i++)
14075 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14076 errmsg(
"column \"%s\" is in a primary key",
14083 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14084 errmsg(
"column \"%s\" is in index used as replica identity",
14090 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
14093 if (attForm->attidentity !=
'\0')
14095 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
14096 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
14102 if (attForm->attnotnull)
14104 attForm->attnotnull =
false;
14111 is_no_inherit_constraint = con->connoinherit;
14120 if (con->contype == CONSTRAINT_FOREIGN &&
14141 if (con->contype != CONSTRAINT_CHECK &&
14142 con->contype != CONSTRAINT_NOTNULL &&
14143 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14154 if (!is_no_inherit_constraint)
14173 if (con->contype == CONSTRAINT_NOTNULL)
14177 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
14186 Anum_pg_constraint_conrelid,
14190 Anum_pg_constraint_contypid,
14194 Anum_pg_constraint_conname,
14198 true, NULL, 3, skey);
14203 (
errcode(ERRCODE_UNDEFINED_OBJECT),
14204 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
14214 if (childcon->contype != CONSTRAINT_CHECK &&
14215 childcon->contype != CONSTRAINT_NOTNULL)
14216 elog(
ERROR,
"inherited constraint is not a CHECK or not-null constraint");
14218 if (childcon->coninhcount <= 0)
14219 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
14220 childrelid,
NameStr(childcon->conname));
14228 if (childcon->coninhcount == 1 && !childcon->conislocal)
14232 recurse,
true, missing_ok,
14238 childcon->coninhcount--;
14253 childcon->coninhcount--;
14254 if (childcon->coninhcount == 0)
14255 childcon->conislocal =
true;
14293 bool recurse,
bool recursing,
14297 char *colName = cmd->
name;
14305 int32 targettypmod;
14314 if (rel->
rd_rel->reloftype && !recursing)
14316 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14317 errmsg(
"cannot alter column type of typed table"),
14324 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14325 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14329 attnum = attTup->attnum;
14334 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14335 errmsg(
"cannot alter system column \"%s\"", colName),
14344 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
14345 errmsg(
"cannot specify USING when altering type of generated column"),
14346 errdetail(
"Column \"%s\" is a generated column.", colName),
14354 if (attTup->attinhcount > 0 && !recursing)
14356 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14357 errmsg(
"cannot alter inherited column \"%s\"", colName),
14365 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14366 errmsg(
"cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"",
14385 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14389 else if (tab->
relkind == RELKIND_RELATION ||
14390 tab->
relkind == RELKIND_PARTITIONED_TABLE)
14404 attTup->atttypid, attTup->atttypmod,
14405 attTup->attcollation,
14411 targettype, targettypmod,
14415 if (transform == NULL)
14420 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14421 errmsg(
"result of USING clause for column \"%s\""
14422 " cannot be cast automatically to type %s",
14424 errhint(
"You might need to add an explicit cast.")));
14427 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14428 errmsg(
"column \"%s\" cannot be cast automatically to type %s",
14430 !attTup->attgenerated ?
14432 errhint(
"You might need to specify \"USING %s::%s\".",
14435 targettypmod)) : 0));
14451 newval->is_generated =
false;
14457 else if (transform)
14459 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14460 errmsg(
"\"%s\" is not a table",
14463 if (!RELKIND_HAS_STORAGE(tab->
relkind) || attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14492 &child_numparents);
14499 forboth(lo, child_oids, li, child_numparents)
14507 if (childrelid == relid)
14524 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14525 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14529 if (childattTup->attinhcount > numparents)
14531 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14532 errmsg(
"cannot alter inherited column \"%s\" of relation \"%s\"",
14544 bool found_whole_row;
14557 if (found_whole_row)
14559 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14560 errmsg(
"cannot convert whole-row table reference"),
14561 errdetail(
"USING expression contains a whole-row table reference.")));
14564 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
14568 else if (!recursing &&
14571 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14572 errmsg(
"type of inherited column \"%s\" must be changed in child tables too",
14575 if (tab->
relkind == RELKIND_COMPOSITE_TYPE)
14601 if (
IsA(expr,
Var) && ((
Var *) expr)->varattno == varattno)
14619 case F_TIMESTAMPTZ_TIMESTAMP:
14620 case F_TIMESTAMP_TIMESTAMPTZ:
14644 char *colName = cmd->
name;
14654 int32 targettypmod;
14685 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14686 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14689 attnum = attTup->attnum;
14693 if (attTup->atttypid != attOldTup->atttypid ||
14694 attTup->atttypmod != attOldTup->atttypmod)
14696 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14697 errmsg(
"cannot alter type of column \"%s\" twice",
14701 typeTuple =
typenameType(NULL, typeName, &targettypmod);
14703 targettype = tform->oid;
14719 if (attTup->atthasdef)
14725 defaultexpr,
exprType(defaultexpr),
14726 targettype, targettypmod,
14730 if (defaultexpr == NULL)
14732 if (attTup->attgenerated)
14734 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14735 errmsg(
"generation expression for column \"%s\" cannot be cast automatically to type %s",
14739 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14740 errmsg(
"default for column \"%s\" cannot be cast automatically to type %s",
14745 defaultexpr = NULL;
14766 Anum_pg_depend_classid,
14770 Anum_pg_depend_objid,
14774 Anum_pg_depend_objsubid,
14786 foundObject.
classId = foundDep->refclassid;
14787 foundObject.
objectId = foundDep->refobjid;
14791 elog(
ERROR,
"found unexpected dependency type '%c'",
14792 foundDep->deptype);
14793 if (!(foundDep->refclassid == TypeRelationId &&
14794 foundDep->refobjid == attTup->atttypid) &&
14795 !(foundDep->refclassid == CollationRelationId &&
14796 foundDep->refobjid == attTup->attcollation))
14797 elog(
ERROR,
"found unexpected dependency for column: %s",
14812 if (attTup->atthasmissing)
14822 Anum_pg_attribute_attmissingval,
14823 attrelation->rd_att,
14839 Datum valuesAtt[Natts_pg_attribute] = {0};
14840 bool nullsAtt[Natts_pg_attribute] = {0};
14841 bool replacesAtt[Natts_pg_attribute] = {0};
14859 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
14860 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
14861 nullsAtt[Anum_pg_attribute_attmissingval - 1] =
false;
14864 valuesAtt, nullsAtt, replacesAtt);
14871 attTup->atttypid = targettype;
14872 attTup->atttypmod = targettypmod;
14873 attTup->attcollation = targetcollid;
14876 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
14877 errmsg(
"too many array dimensions"));
14878 attTup->attndims =
list_length(typeName->arrayBounds);
14879 attTup->attlen = tform->typlen;
14880 attTup->attbyval = tform->typbyval;
14881 attTup->attalign = tform->typalign;
14882 attTup->attstorage = tform->typstorage;
14917 if (attTup->attgenerated)
14922 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
14971 Anum_pg_depend_refclassid,
14975 Anum_pg_depend_refobjid,
14979 Anum_pg_depend_refobjsubid,
14991 foundObject.
classId = foundDep->classid;
14992 foundObject.
objectId = foundDep->objid;
14997 case RelationRelationId:
15001 if (relKind == RELKIND_INDEX ||
15002 relKind == RELKIND_PARTITIONED_INDEX)
15007 else if (relKind == RELKIND_SEQUENCE)
15018 elog(
ERROR,
"unexpected object depending on column: %s",
15024 case ConstraintRelationId:
15029 case ProcedureRelationId:
15043 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15044 errmsg(
"cannot alter type of a column used by a function or procedure"),
15045 errdetail(
"%s depends on column \"%s\"",
15050 case RewriteRelationId:
15058 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15059 errmsg(
"cannot alter type of a column used by a view or rule"),
15060 errdetail(
"%s depends on column \"%s\"",
15065 case TriggerRelationId:
15078 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15079 errmsg(
"cannot alter type of a column used in a trigger definition"),
15080 errdetail(
"%s depends on column \"%s\"",
15085 case PolicyRelationId:
15097 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15098 errmsg(
"cannot alter type of a column used in a policy definition"),
15099 errdetail(
"%s depends on column \"%s\"",
15104 case AttrDefaultRelationId:
15128 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15129 errmsg(
"cannot alter type of a column used by a generated column"),
15130 errdetail(
"Column \"%s\" is used by generated column \"%s\".",
15139 case StatisticExtRelationId:
15148 case PublicationRelRelationId:
15156 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15157 errmsg(
"cannot alter type of a column used by a publication WHERE clause"),
15158 errdetail(
"%s depends on column \"%s\"",
15169 elog(
ERROR,
"unexpected object depending on column: %s",
15190 elog(
ERROR,
"relation %u has multiple indexes marked as replica identity", tab->
relid);
15205 elog(
ERROR,
"relation %u has multiple clustered indexes", tab->
relid);
15391 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15394 relid = con->conrelid;
15400 elog(
ERROR,
"could not identify relation associated with constraint %u", oldId);
15402 confrelid = con->confrelid;
15403 contype = con->contype;
15404 conislocal = con->conislocal;
15426 if (relid != tab->
relid && contype == CONSTRAINT_FOREIGN)
15430 (
char *)
lfirst(def_item),
15431 wqueue, lockmode, tab->
rewrite);
15433 forboth(oid_item, tab->changedIndexOids,
15434 def_item, tab->changedIndexDefs)
15441 (
char *)
lfirst(def_item),
15442 wqueue, lockmode, tab->rewrite);
15449 forboth(oid_item, tab->changedStatisticsOids,
15450 def_item, tab->changedStatisticsDefs)
15457 (
char *)
lfirst(def_item),
15458 wqueue, lockmode, tab->rewrite);
15467 if (tab->replicaIdentityIndex)
15473 subcmd->
name = tab->replicaIdentityIndex;
15485 if (tab->clusterOnIndex)
15490 cmd->
name = tab->clusterOnIndex;
15523 List *raw_parsetree_list;
15524 List *querytree_list;
15535 querytree_list =
NIL;
15536 foreach(list_item, raw_parsetree_list)
15542 querytree_list =
lappend(querytree_list,
15556 querytree_list =
list_concat(querytree_list, beforeStmts);
15558 querytree_list =
list_concat(querytree_list, afterStmts);
15561 querytree_list =
lappend(querytree_list,
15580 foreach(list_item, querytree_list)
15594 stmt->reset_default_tblspc =
true;
15609 foreach(lcmd,
stmt->cmds)
15625 RelationRelationId, 0);
15647 !rewrite && tab->
rewrite == 0)
15671 elog(
ERROR,
"unexpected statement subtype: %d",
15679 if (
stmt->subtype ==
'C')
15698 elog(
ERROR,
"unexpected statement subtype: %d",
15699 (
int)
stmt->subtype);
15707 stmt->stxcomment =
GetComment(oldId, StatisticExtRelationId, 0);
15716 elog(
ERROR,
"unexpected statement type: %d",
15736 const char *conname)
15743 comment_str =
GetComment(objid, ConstraintRelationId, 0);
15744 if (comment_str == NULL)
15781 stmt->accessMethod,
15783 stmt->excludeOpNames,
15784 stmt->iswithoutoverlaps))
15789 if (irel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
15821 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15824 Anum_pg_constraint_conpfeqop);
15831 elog(
ERROR,
"conpfeqop is not a 1-D Oid array");
15835 for (
i = 0;
i < numkeys;
i++)
15848 const char *colName,
15859 Datum repl_val[Natts_pg_attribute];
15860 bool repl_null[Natts_pg_attribute];
15861 bool repl_repl[Natts_pg_attribute];
15876 (
errcode(ERRCODE_UNDEFINED_OBJECT),
15877 errmsg(
"foreign table \"%s\" does not exist",
15890 (
errcode(ERRCODE_UNDEFINED_COLUMN),
15891 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
15896 attnum = atttableform->attnum;
15899 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15900 errmsg(
"cannot alter system column \"%s\"", colName)));
15904 memset(repl_val, 0,
sizeof(repl_val));
15905 memset(repl_null,
false,
sizeof(repl_null));
15906 memset(repl_repl,
false,
sizeof(repl_repl));
15911 Anum_pg_attribute_attfdwoptions,
15923 repl_val[Anum_pg_attribute_attfdwoptions - 1] = datum;
15925 repl_null[Anum_pg_attribute_attfdwoptions - 1] =
true;
15927 repl_repl[Anum_pg_attribute_attfdwoptions - 1] =
true;
15932 repl_val, repl_null, repl_repl);
15938 atttableform->attnum);
15982 elog(
ERROR,
"cache lookup failed for relation %u", relationOid);
15986 switch (tuple_class->relkind)
15988 case RELKIND_RELATION:
15990 case RELKIND_MATVIEW:
15991 case RELKIND_FOREIGN_TABLE:
15992 case RELKIND_PARTITIONED_TABLE:
15995 case RELKIND_INDEX:
16005 if (tuple_class->relowner != newOwnerId)
16007 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16008 errmsg(
"cannot change owner of index \"%s\"",
16009 NameStr(tuple_class->relname)),
16010 errhint(
"Change the ownership of the index's table instead.")));
16012 newOwnerId = tuple_class->relowner;
16015 case RELKIND_PARTITIONED_INDEX:
16019 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16020 errmsg(
"cannot change owner of index \"%s\"",
16021 NameStr(tuple_class->relname)),
16022 errhint(
"Change the ownership of the index's table instead.")));
16024 case RELKIND_SEQUENCE:
16026 tuple_class->relowner != newOwnerId)
16035 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16036 errmsg(
"cannot change owner of sequence \"%s\"",
16037 NameStr(tuple_class->relname)),
16038 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
16039 NameStr(tuple_class->relname),
16043 case RELKIND_COMPOSITE_TYPE:
16047 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16048 errmsg(
"\"%s\" is a composite type",
16049 NameStr(tuple_class->relname)),
16054 case RELKIND_TOASTVALUE:
16060 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16061 errmsg(
"cannot change owner of relation \"%s\"",
16062 NameStr(tuple_class->relname)),
16070 if (tuple_class->relowner != newOwnerId)
16072 Datum repl_val[Natts_pg_class];
16073 bool repl_null[Natts_pg_class];
16074 bool repl_repl[Natts_pg_class];
16086 Oid namespaceOid = tuple_class->relnamespace;
16098 aclresult =
object_aclcheck(NamespaceRelationId, namespaceOid, newOwnerId,
16106 memset(repl_null,
false,
sizeof(repl_null));
16107 memset(repl_repl,
false,
sizeof(repl_repl));
16109 repl_repl[Anum_pg_class_relowner - 1] =
true;
16117 Anum_pg_class_relacl,
16122 tuple_class->relowner, newOwnerId);
16123 repl_repl[Anum_pg_class_relacl - 1] =
true;
16138 tuple_class->relowner,
16146 if (tuple_class->relkind != RELKIND_COMPOSITE_TYPE &&
16147 tuple_class->relkind != RELKIND_INDEX &&
16148 tuple_class->relkind != RELKIND_PARTITIONED_INDEX &&
16149 tuple_class->relkind != RELKIND_TOASTVALUE)
16164 if (tuple_class->relkind == RELKIND_RELATION ||
16165 tuple_class->relkind == RELKIND_PARTITIONED_TABLE ||
16166 tuple_class->relkind == RELKIND_MATVIEW ||
16167 tuple_class->relkind == RELKIND_TOASTVALUE)
16169 List *index_oid_list;
16176 foreach(
i, index_oid_list)
16183 if (tuple_class->reltoastrelid !=
InvalidOid)
16214 Anum_pg_attribute_attrelid,
16218 true, NULL, 1,
key);
16222 Datum repl_val[Natts_pg_attribute];
16223 bool repl_null[Natts_pg_attribute];
16224 bool repl_repl[Natts_pg_attribute];
16231 if (att->attisdropped)
16235 Anum_pg_attribute_attacl,
16242 memset(repl_null,
false,
sizeof(repl_null));
16243 memset(repl_repl,
false,
sizeof(repl_repl));
16246 oldOwnerId, newOwnerId);
16247 repl_repl[Anum_pg_attribute_attacl - 1] =
true;
16252 repl_val, repl_null, repl_repl);
16284 Anum_pg_depend_refclassid,
16288 Anum_pg_depend_refobjid,
16302 if (depForm->refobjsubid == 0 ||
16303 depForm->classid != RelationRelationId ||
16304 depForm->objsubid != 0 ||
16348 (
errcode(ERRCODE_UNDEFINED_OBJECT),
16349 errmsg(
"index \"%s\" for table \"%s\" does not exist",
16359 RelationRelationId, indexOid);
16392 if (amname != NULL)
16394 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
16400 if (rel->
rd_rel->relam == amoid)
16420 Oid oldAccessMethodId;
16436 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
16440 oldAccessMethodId = rd_rel->relam;
16441 rd_rel->relam = newAccessMethodId;
16444 if (rd_rel->relam == oldAccessMethodId)
16480 AccessMethodRelationId,
16490 AccessMethodRelationId,
16491 oldAccessMethodId, rd_rel->relam);
16527 (
errcode(ERRCODE_SYNTAX_ERROR),
16528 errmsg(
"cannot have multiple SET TABLESPACE subcommands")));
16546 Datum repl_val[Natts_pg_class];
16547 bool repl_null[Natts_pg_class];
16548 bool repl_repl[Natts_pg_class];
16560 elog(
ERROR,
"cache lookup failed for relation %u", relid);
16586 switch (rel->
rd_rel->relkind)
16588 case RELKIND_RELATION:
16589 case RELKIND_MATVIEW:
16592 case RELKIND_PARTITIONED_TABLE:
16598 case RELKIND_INDEX:
16599 case RELKIND_PARTITIONED_INDEX:
16602 case RELKIND_TOASTVALUE:
16606 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16607 errmsg(
"cannot set options for relation \"%s\"",
16614 if (rel->
rd_rel->relkind == RELKIND_VIEW)
16619 bool check_option =
false;
16621 foreach(cell, view_options)
16625 if (strcmp(defel->
defname,
"check_option") == 0)
16626 check_option =
true;
16635 const char *view_updatable_error =
16638 if (view_updatable_error)
16640 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16641 errmsg(
"WITH CHECK OPTION is supported only on automatically updatable views"),
16642 errhint(
"%s",
_(view_updatable_error))));
16650 memset(repl_val, 0,
sizeof(repl_val));
16651 memset(repl_null,
false,
sizeof(repl_null));
16652 memset(repl_repl,
false,
sizeof(repl_repl));
16654 if (newOptions != (
Datum) 0)
16655 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16657 repl_null[Anum_pg_class_reloptions - 1] =
true;
16659 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16662 repl_val, repl_null, repl_repl);
16677 Oid toastid = rel->
rd_rel->reltoastrelid;
16684 elog(
ERROR,
"cache lookup failed for relation %u", toastid);
16710 memset(repl_val, 0,
sizeof(repl_val));
16711 memset(repl_null,
false,
sizeof(repl_null));
16712 memset(repl_repl,
false,
sizeof(repl_repl));
16714 if (newOptions != (
Datum) 0)
16715 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16717 repl_null[Anum_pg_class_reloptions - 1] =
true;
16719 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16722 repl_val, repl_null, repl_repl);
16768 reltoastrelid = rel->
rd_rel->reltoastrelid;
16783 rel->
rd_rel->relpersistence);
16787 newrlocator.
relNumber = newrelfilenumber;
16788 newrlocator.
spcOid = newTableSpace;
16791 if (rel->
rd_rel->relkind == RELKIND_INDEX)
16823 foreach(lc, reltoastidxids)
16885 Oid orig_tablespaceoid;
16886 Oid new_tablespaceoid;
16893 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16894 errmsg(
"only tables, indexes, and materialized views exist in tablespaces")));
16902 if (orig_tablespaceoid == GLOBALTABLESPACE_OID ||
16903 new_tablespaceoid == GLOBALTABLESPACE_OID)
16905 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16906 errmsg(
"cannot move relations in to or out of pg_global tablespace")));
16935 if (orig_tablespaceoid == new_tablespaceoid)
16936 return new_tablespaceoid;
16943 Anum_pg_class_reltablespace,
16952 Oid relOid = relForm->oid;
16963 relForm->relisshared ||
16970 relForm->relkind != RELKIND_RELATION &&
16971 relForm->relkind != RELKIND_PARTITIONED_TABLE) ||
16973 relForm->relkind != RELKIND_INDEX &&
16974 relForm->relkind != RELKIND_PARTITIONED_INDEX) ||
16976 relForm->relkind != RELKIND_MATVIEW))
16994 if (
stmt->nowait &&
16997 (
errcode(ERRCODE_OBJECT_IN_USE),
16998 errmsg(
"aborting because lock on relation \"%s.%s\" is not available",
17000 NameStr(relForm->relname))));
17011 if (relations ==
NIL)
17013 (
errcode(ERRCODE_NO_DATA_FOUND),
17014 errmsg(
"no matching relations in tablespace \"%s\" found",
17015 orig_tablespaceoid ==
InvalidOid ?
"(database default)" :
17019 foreach(l, relations)
17025 cmd->
name =
stmt->new_tablespacename;
17035 return new_tablespaceoid;
17062 rel->
rd_rel->relpersistence);
17077 (rel->
rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED &&
17081 rel->
rd_rel->relpersistence);
17097 char fires_when,
bool skip_system,
bool recurse,
17101 fires_when, skip_system, recurse,
17115 char fires_when,
LOCKMODE lockmode)
17133 if (child_rel->
rd_rel->reloftype)
17135 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17136 errmsg(
"cannot change inheritance of typed table")));
17138 if (child_rel->
rd_rel->relispartition)
17140 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17141 errmsg(
"cannot change inheritance of a partition")));
17143 if (child_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17145 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17146 errmsg(
"cannot change inheritance of partitioned table")));
17158 const char *trigger_name;
17174 if (parent_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17175 child_rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
17177 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17178 errmsg(
"cannot inherit from temporary relation \"%s\"",
17182 if (parent_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17185 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17186 errmsg(
"cannot inherit from temporary relation of another session")));
17189 if (child_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17192 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17193 errmsg(
"cannot inherit to temporary relation of another session")));
17196 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17198 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17199 errmsg(
"cannot inherit from partitioned table \"%s\"",
17203 if (parent_rel->
rd_rel->relispartition)
17205 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17206 errmsg(
"cannot inherit from a partition")));
17227 (
errcode(ERRCODE_DUPLICATE_TABLE),
17228 errmsg(
"circular inheritance not allowed"),
17229 errdetail(
"\"%s\" is already a child of \"%s\".",
17239 if (trigger_name != NULL)
17241 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
17242 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming an inheritance child",
17244 errdetail(
"ROW triggers with transition tables are not supported in inheritance hierarchies.")));
17287 Anum_pg_inherits_inhrelid,
17291 true, NULL, 1, &
key);
17301 (
errcode(ERRCODE_DUPLICATE_TABLE),
17302 errmsg(
"relation \"%s\" would be inherited from more than once",
17305 if (inh->inhseqno > inhseqno)
17306 inhseqno = inh->inhseqno;
17323 parent_rel->
rd_rel->relkind ==
17324 RELKIND_PARTITIONED_TABLE);
17343 attr =
heap_getattr(contup, Anum_pg_constraint_conbin, tupdesc, &isnull);
17345 elog(
ERROR,
"null conbin for constraint %u", con->oid);
17368 if (acon->condeferrable != bcon->condeferrable ||
17369 acon->condeferred != bcon->condeferred ||
17400 for (
AttrNumber parent_attno = 1; parent_attno <= parent_desc->
natts; parent_attno++)
17403 char *parent_attname =
NameStr(parent_att->attname);
17407 if (parent_att->attisdropped)
17416 if (parent_att->atttypid != child_att->atttypid ||
17417 parent_att->atttypmod != child_att->atttypmod)
17419 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17420 errmsg(
"child table \"%s\" has different type for column \"%s\"",
17423 if (parent_att->attcollation != child_att->attcollation)
17425 (
errcode(ERRCODE_COLLATION_MISMATCH),
17426 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
17435 if (parent_att->attnotnull && !child_att->attnotnull)
17440 parent_att->attnum);
17444 errcode(ERRCODE_DATATYPE_MISMATCH),
17445 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17452 if (parent_att->attgenerated && !child_att->attgenerated)
17454 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17455 errmsg(
"column \"%s\" in child table must be a generated column", parent_attname)));
17456 if (child_att->attgenerated && !parent_att->attgenerated)
17458 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17459 errmsg(
"column \"%s\" in child table must not be a generated column", parent_attname)));
17461 if (parent_att->attgenerated && child_att->attgenerated && child_att->attgenerated != parent_att->attgenerated)
17463 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17464 errmsg(
"column \"%s\" inherits from generated column of different kind", parent_attname),
17465 errdetail(
"Parent column is %s, child column is %s.",
17466 parent_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
17467 child_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
17475 child_att->attidentity = parent_att->attidentity;
17482 &child_att->attinhcount))
17484 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17485 errmsg(
"too many inheritance parents"));
17492 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17494 Assert(child_att->attinhcount == 1);
17495 child_att->attislocal =
false;
17504 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17505 errmsg(
"child table is missing column \"%s\"", parent_attname)));
17543 Anum_pg_constraint_conrelid,
17547 true, NULL, 1, &parent_key);
17560 bool found =
false;
17562 if (parent_con->contype != CONSTRAINT_CHECK &&
17563 parent_con->contype != CONSTRAINT_NOTNULL)
17567 if (parent_con->connoinherit)
17570 if (parent_con->contype == CONSTRAINT_NOTNULL)
17577 Anum_pg_constraint_conrelid,
17581 true, NULL, 1, &child_key);
17588 if (child_con->contype != parent_con->contype)
17595 if (child_con->contype == CONSTRAINT_CHECK)
17597 if (strcmp(
NameStr(parent_con->conname),
17598 NameStr(child_con->conname)) != 0)
17601 else if (child_con->contype == CONSTRAINT_NOTNULL)
17609 if (parent_attno != attmap->
attnums[child_attno - 1])
17614 if (parent_attr->attisdropped || child_attr->attisdropped)
17615 elog(
ERROR,
"found not-null constraint on dropped columns");
17618 if (child_con->contype == CONSTRAINT_CHECK &&
17621 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17622 errmsg(
"child table \"%s\" has different definition for check constraint \"%s\"",
17628 if (child_con->connoinherit)
17630 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17631 errmsg(
"constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"",
17638 if (parent_con->convalidated && child_con->conenforced &&
17639 !child_con->convalidated)
17641 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17642 errmsg(
"constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"",
17650 if (parent_con->conenforced && !child_con->conenforced)
17652 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17653 errmsg(
"constraint \"%s\" conflicts with NOT ENFORCED constraint on child table \"%s\"",
17664 &child_con->coninhcount))
17666 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17667 errmsg(
"too many inheritance parents"));
17674 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17676 Assert(child_con->coninhcount == 1);
17677 child_con->conislocal =
false;
17691 if (parent_con->contype == CONSTRAINT_NOTNULL)
17693 errcode(ERRCODE_DATATYPE_MISMATCH),
17694 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17701 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17702 errmsg(
"child table is missing constraint \"%s\"",
17703 NameStr(parent_con->conname))));
17722 if (rel->
rd_rel->relispartition)
17724 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17725 errmsg(
"cannot change inheritance of a partition")));
17765 bool found =
false;
17767 Assert(parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17775 Anum_pg_inherits_inhparent,
17779 true, NULL, 1, &
key);
17786 if (inhForm->inhdetachpending)
17788 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
17789 errmsg(
"partition \"%s\" already pending detach in partitioned table \"%s.%s\"",
17793 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
17818 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17853 bool is_partitioning;
17855 is_partitioning = (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17863 if (is_partitioning)
17866 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17872 errmsg(
"relation \"%s\" is not a parent of relation \"%s\"",
17882 Anum_pg_attribute_attrelid,
17886 true, NULL, 1,
key);
17892 if (att->attisdropped)
17894 if (att->attinhcount <= 0)
17904 copy_att->attinhcount--;
17905 if (copy_att->attinhcount == 0)
17906 copy_att->attislocal =
true;
17930 Anum_pg_constraint_conrelid,
17934 true, NULL, 1,
key);
17943 if (con->connoinherit)
17946 if (con->contype == CONSTRAINT_CHECK)
17948 if (con->contype == CONSTRAINT_NOTNULL)
17960 Anum_pg_constraint_conrelid,
17964 true, NULL, 1,
key);
17969 bool match =
false;
17975 if (con->contype == CONSTRAINT_CHECK)
17979 if (con->contype == CONSTRAINT_CHECK &&
17980 strcmp(
NameStr(con->conname), chkname) == 0)
17988 else if (con->contype == CONSTRAINT_NOTNULL)
17994 if (prevattno == child_attno)
18011 if (copy_con->coninhcount <= 0)
18012 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
18015 copy_con->coninhcount--;
18016 if (copy_con->coninhcount == 0)
18017 copy_con->conislocal =
true;
18025 if (connames !=
NIL || nncolumns !=
NIL)
18026 elog(
ERROR,
"%d unmatched constraints while removing inheritance from \"%s\" to \"%s\"",
18034 RelationRelationId,
18067 Anum_pg_depend_classid,
18071 Anum_pg_depend_objid,
18075 Anum_pg_depend_objsubid,
18086 if (dep->refclassid == refclassid &&
18087 dep->refobjid == refobjid &&
18088 dep->refobjsubid == 0 &&
18089 dep->deptype == deptype)
18130 typeid = typeform->oid;
18135 Anum_pg_inherits_inhrelid,
18139 true, NULL, 1, &
key);
18142 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18143 errmsg(
"typed tables cannot inherit")));
18154 for (type_attno = 1; type_attno <= typeTupleDesc->
natts; type_attno++)
18158 const char *type_attname,
18163 if (type_attr->attisdropped)
18165 type_attname =
NameStr(type_attr->attname);
18170 if (table_attno > tableTupleDesc->
natts)
18172 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18173 errmsg(
"table is missing column \"%s\"",
18175 table_attr =
TupleDescAttr(tableTupleDesc, table_attno - 1);
18177 }
while (table_attr->attisdropped);
18178 table_attname =
NameStr(table_attr->attname);
18181 if (strncmp(table_attname, type_attname,
NAMEDATALEN) != 0)
18183 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18184 errmsg(
"table has column \"%s\" where type requires \"%s\"",
18185 table_attname, type_attname)));
18188 if (table_attr->atttypid != type_attr->atttypid ||
18189 table_attr->atttypmod != type_attr->atttypmod ||
18190 table_attr->attcollation != type_attr->attcollation)
18192 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18193 errmsg(
"table \"%s\" has different type for column \"%s\"",
18199 for (; table_attno <= tableTupleDesc->
natts; table_attno++)
18204 if (!table_attr->attisdropped)
18206 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18207 errmsg(
"table has extra column \"%s\"",
18208 NameStr(table_attr->attname))));
18212 if (rel->
rd_rel->reloftype)
18217 tableobj.
classId = RelationRelationId;
18220 typeobj.
classId = TypeRelationId;
18229 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18258 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18259 errmsg(
"\"%s\" is not a typed table",
18274 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18312 elog(
ERROR,
"cache lookup failed for relation \"%s\"",
18315 if (pg_class_form->relreplident != ri_type)
18317 pg_class_form->relreplident = ri_type;
18330 bool dirty =
false;
18335 elog(
ERROR,
"cache lookup failed for index %u", thisIndexOid);
18338 if (thisIndexOid == indexOid)
18341 if (!pg_index_form->indisreplident)
18344 pg_index_form->indisreplident =
true;
18350 if (pg_index_form->indisreplident)
18353 pg_index_form->indisreplident =
false;
18388 if (
stmt->identity_type == REPLICA_IDENTITY_DEFAULT)
18393 else if (
stmt->identity_type == REPLICA_IDENTITY_FULL)
18398 else if (
stmt->identity_type == REPLICA_IDENTITY_NOTHING)
18403 else if (
stmt->identity_type == REPLICA_IDENTITY_INDEX)
18408 elog(
ERROR,
"unexpected identity type %u",
stmt->identity_type);
18414 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18415 errmsg(
"index \"%s\" for table \"%s\" does not exist",
18424 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18425 errmsg(
"\"%s\" is not an index for table \"%s\"",
18435 !indexRel->
rd_index->indisunique) &&
18438 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18439 errmsg(
"cannot use non-unique index \"%s\" as replica identity",
18442 if (!indexRel->
rd_index->indimmediate)
18444 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18445 errmsg(
"cannot use non-immediate index \"%s\" as replica identity",
18450 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18451 errmsg(
"cannot use expression index \"%s\" as replica identity",
18456 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18457 errmsg(
"cannot use partial index \"%s\" as replica identity",
18473 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
18474 errmsg(
"index \"%s\" cannot be used as replica identity because column %d is a system column",
18478 if (!attr->attnotnull)
18480 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18481 errmsg(
"index \"%s\" cannot be used as replica identity because column \"%s\" is nullable",
18510 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18539 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18562 Datum repl_val[Natts_pg_foreign_table];
18563 bool repl_null[Natts_pg_foreign_table];
18564 bool repl_repl[Natts_pg_foreign_table];
18577 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18578 errmsg(
"foreign table \"%s\" does not exist",
18584 memset(repl_val, 0,
sizeof(repl_val));
18585 memset(repl_null,
false,
sizeof(repl_null));
18586 memset(repl_repl,
false,
sizeof(repl_repl));
18591 Anum_pg_foreign_table_ftoptions,
18603 repl_val[Anum_pg_foreign_table_ftoptions - 1] = datum;
18605 repl_null[Anum_pg_foreign_table_ftoptions - 1] =
true;
18607 repl_repl[Anum_pg_foreign_table_ftoptions - 1] =
true;
18612 repl_val, repl_null, repl_repl);
18637 const char *column,
18649 compression =
strVal(newValue);
18657 (
errcode(ERRCODE_UNDEFINED_COLUMN),
18658 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
18663 attnum = atttableform->attnum;
18666 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18667 errmsg(
"cannot alter system column \"%s\"", column)));
18676 atttableform->attcompression = cmethod;
18725 switch (rel->
rd_rel->relpersistence)
18727 case RELPERSISTENCE_TEMP:
18729 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18730 errmsg(
"cannot change logged status of table \"%s\" because it is temporary",
18734 case RELPERSISTENCE_PERMANENT:
18739 case RELPERSISTENCE_UNLOGGED:
18753 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
18754 errmsg(
"cannot change table \"%s\" to unlogged because it is part of a publication",
18756 errdetail(
"Unlogged relations cannot be replicated.")));
18770 toLogged ? Anum_pg_constraint_conrelid :
18771 Anum_pg_constraint_confrelid,
18775 toLogged ? ConstraintRelidTypidNameIndexId :
InvalidOid,
18776 true, NULL, 1, skey);
18782 if (con->contype == CONSTRAINT_FOREIGN)
18788 foreignrelid = toLogged ? con->confrelid : con->conrelid;
18800 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18801 errmsg(
"could not change table \"%s\" to logged because it references unlogged table \"%s\"",
18810 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18811 errmsg(
"could not change table \"%s\" to unlogged because it references logged table \"%s\"",
18856 (
errmsg(
"relation \"%s\" does not exist, skipping",
18857 stmt->relation->relname)));
18866 if (rel->
rd_rel->relkind == RELKIND_SEQUENCE)
18874 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18875 errmsg(
"cannot move an owned sequence into another schema"),
18876 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
18895 *oldschema = oldNspOid;
18914 Assert(objsMoved != NULL);
18920 nspOid,
true, objsMoved);
18947 Oid oldNspOid,
Oid newNspOid,
18948 bool hasDependEntry,
18954 bool already_done =
false;
18959 elog(
ERROR,
"cache lookup failed for relation %u", relOid);
18962 Assert(classForm->relnamespace == oldNspOid);
18964 thisobj.
classId = RelationRelationId;
18974 if (!already_done && oldNspOid != newNspOid)
18982 (
errcode(ERRCODE_DUPLICATE_TABLE),
18983 errmsg(
"relation \"%s\" already exists in schema \"%s\"",
18988 classForm->relnamespace = newNspOid;
18995 if (hasDependEntry &&
18998 NamespaceRelationId,
19001 elog(
ERROR,
"could not change schema dependency for relation \"%s\"",
19002 NameStr(classForm->relname));
19031 foreach(l, indexList)
19036 thisobj.
classId = RelationRelationId;
19051 oldNspOid, newNspOid,
19084 Anum_pg_depend_refclassid,
19088 Anum_pg_depend_refobjid,
19102 if (depForm->refobjsubid == 0 ||
19103 depForm->classid != RelationRelationId ||
19104 depForm->objsubid != 0 ||
19121 oldNspOid, newNspOid,
19197 if (oc->
relid == relid)
19215 List *oids_to_truncate =
NIL;
19256 if (oids_to_truncate !=
NIL)
19259 if (oids_to_drop !=
NIL)
19263 foreach(l, oids_to_drop)
19267 object.
classId = RelationRelationId;
19269 object.objectSubId = 0;
19291#ifdef USE_ASSERT_CHECKING
19404 if (relkind != RELKIND_RELATION && relkind != RELKIND_TOASTVALUE &&
19405 relkind != RELKIND_MATVIEW && relkind != RELKIND_PARTITIONED_TABLE)
19407 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19408 errmsg(
"\"%s\" is not a table or materialized view", relation->
relname)));
19433 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19457 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19466 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19467 errmsg(
"permission denied: \"%s\" is a system catalog",
19492 relkind = classform->relkind;
19501 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19502 errmsg(
"permission denied: \"%s\" is a system catalog",
19513 aclresult =
object_aclcheck(NamespaceRelationId, classform->relnamespace,
19540 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19543 if (reltype ==
OBJECT_VIEW && relkind != RELKIND_VIEW)
19545 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19550 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19551 errmsg(
"\"%s\" is not a materialized view", rv->
relname)));
19555 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19558 if (reltype ==
OBJECT_TYPE && relkind != RELKIND_COMPOSITE_TYPE)
19560 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19563 if (reltype ==
OBJECT_INDEX && relkind != RELKIND_INDEX &&
19564 relkind != RELKIND_PARTITIONED_INDEX
19567 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19574 if (reltype !=
OBJECT_TYPE && relkind == RELKIND_COMPOSITE_TYPE)
19576 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19588 if (relkind == RELKIND_INDEX || relkind == RELKIND_PARTITIONED_INDEX)
19590 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19591 errmsg(
"cannot change schema of index \"%s\"",
19593 errhint(
"Change the schema of the table instead.")));
19594 else if (relkind == RELKIND_COMPOSITE_TYPE)
19596 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19597 errmsg(
"cannot change schema of composite type \"%s\"",
19602 else if (relkind == RELKIND_TOASTVALUE)
19604 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19605 errmsg(
"cannot change schema of TOAST table \"%s\"",
19607 errhint(
"Change the schema of the table instead.")));
19636 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19637 errmsg(
"cannot use \"list\" partition strategy with more than one column")));
19645 NULL,
false,
true);
19678 List **partexprs,
Oid *partopclass,
Oid *partcollation,
19686 foreach(lc, partParams)
19692 if (pelem->
name != NULL)
19702 (
errcode(ERRCODE_UNDEFINED_COLUMN),
19703 errmsg(
"column \"%s\" named in partition key does not exist",
19708 if (attform->attnum <= 0)
19710 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19711 errmsg(
"cannot use system column \"%s\" in partition key",
19722 if (attform->attgenerated)
19724 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19725 errmsg(
"cannot use generated column in partition key"),
19726 errdetail(
"Column \"%s\" is a generated column.",
19730 partattrs[attn] = attform->attnum;
19731 atttype = attform->atttypid;
19732 attcollation = attform->attcollation;
19739 char partattname[16];
19751 snprintf(partattname,
sizeof(partattname),
"%d", attn + 1);
19753 atttype, attcollation,
19764 ((
Var *) expr)->varattno > 0)
19770 partattrs[attn] = ((
Var *) expr)->varattno;
19777 partattrs[attn] = 0;
19778 *partexprs =
lappend(*partexprs, expr);
19797 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19798 errmsg(
"partition key expressions cannot contain system column references")));
19817 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19818 errmsg(
"cannot use generated column in partition key"),
19819 errdetail(
"Column \"%s\" is a generated column.",
19847 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19848 errmsg(
"functions in partition key expression must be marked IMMUTABLE")));
19856 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19857 errmsg(
"cannot use constant expression as partition key")));
19877 (
errcode(ERRCODE_INDETERMINATE_COLLATION),
19878 errmsg(
"could not determine which collation to use for partition expression"),
19879 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
19885 (
errcode(ERRCODE_DATATYPE_MISMATCH),
19886 errmsg(
"collations are not supported by type %s",
19890 partcollation[attn] = attcollation;
19898 am_oid = HASH_AM_OID;
19900 am_oid = BTREE_AM_OID;
19910 (
errcode(ERRCODE_UNDEFINED_OBJECT),
19911 errmsg(
"data type %s has no default operator class for access method \"%s\"",
19913 errhint(
"You must specify a hash operator class or define a default hash operator class for the data type.")));
19916 (
errcode(ERRCODE_UNDEFINED_OBJECT),
19917 errmsg(
"data type %s has no default operator class for access method \"%s\"",
19919 errhint(
"You must specify a btree operator class or define a default btree operator class for the data type.")));
19925 am_oid == HASH_AM_OID ?
"hash" :
"btree",
19942 List *partConstraint)
19952 for (
i = 1;
i <= natts;
i++)
19964 wholeatt->atttypid,
19965 wholeatt->atttypmod,
19966 wholeatt->attcollation,
19975 ntest->argisrow =
false;
19977 existConstraint =
lappend(existConstraint, ntest);
20003 num_check = (constr != NULL) ? constr->
num_check : 0;
20004 for (
i = 0;
i < num_check;
i++)
20060 List *partConstraint,
20061 bool validate_default)
20069 if (!validate_default)
20071 (
errmsg_internal(
"partition constraint for table \"%s\" is implied by existing constraints",
20075 (
errmsg_internal(
"updated partition constraint for default partition \"%s\" is implied by existing constraints",
20085 if (scanrel->
rd_rel->relkind == RELKIND_RELATION)
20095 else if (scanrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20103 List *thisPartConstraint;
20114 thisPartConstraint =
20116 part_rel, scanrel);
20119 thisPartConstraint,
20137 List *attachrel_children;
20138 List *partConstraint;
20145 const char *trigger_name;
20146 Oid defaultPartOid;
20147 List *partBoundConstraint;
20176 if (attachrel->
rd_rel->relispartition)
20178 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20179 errmsg(
"\"%s\" is already a partition",
20184 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20185 errmsg(
"cannot attach a typed table as partition")));
20193 Anum_pg_inherits_inhrelid,
20200 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20201 errmsg(
"cannot attach inheritance child as partition")));
20206 Anum_pg_inherits_inhparent,
20212 attachrel->
rd_rel->relkind == RELKIND_RELATION)
20214 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20215 errmsg(
"cannot attach inheritance parent as partition")));
20238 (
errcode(ERRCODE_DUPLICATE_TABLE),
20239 errmsg(
"circular inheritance not allowed"),
20240 errdetail(
"\"%s\" is already a child of \"%s\".",
20245 if (rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
20246 attachrel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
20248 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20249 errmsg(
"cannot attach a temporary relation as partition of permanent relation \"%s\"",
20253 if (rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20254 attachrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
20256 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20257 errmsg(
"cannot attach a permanent relation as partition of temporary relation \"%s\"",
20261 if (rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20264 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20265 errmsg(
"cannot attach as partition of temporary relation of another session")));
20268 if (attachrel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20271 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20272 errmsg(
"cannot attach temporary relation of another session as partition")));
20279 natts = tupleDesc->
natts;
20280 for (attno = 1; attno <= natts; attno++)
20283 char *attributeName =
NameStr(attribute->attname);
20286 if (attribute->attisdropped)
20289 if (attribute->attidentity)
20291 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20292 errmsg(
"table \"%s\" being attached contains an identity column \"%s\"",
20294 errdetail(
"The new partition may not contain an identity column."));
20301 (
errcode(ERRCODE_DATATYPE_MISMATCH),
20302 errmsg(
"table \"%s\" contains column \"%s\" not found in parent \"%s\"",
20305 errdetail(
"The new partition may contain only the columns present in parent.")));
20314 if (trigger_name != NULL)
20316 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
20317 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming a partition",
20319 errdetail(
"ROW triggers with transition tables are not supported on partitions.")));
20327 cmd->
bound, pstate);
20363 if (partConstraint)
20372 (
Node *) partConstraint);
20399 List *defPartConstraint;
20405 defPartConstraint =
20412 defPartConstraint =
20414 1, defaultrel, rel);
20416 defPartConstraint,
true);
20430 if (attachrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20434 foreach(l, attachrel_children)
20458 List *attachRelIdxs;
20466 "AttachPartitionEnsureIndexes",
20490 if (attachrel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
20492 foreach(cell, idxes)
20497 if (idxRel->
rd_index->indisunique ||
20500 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20501 errmsg(
"cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"",
20504 errdetail(
"Partitioned table \"%s\" contains unique indexes.",
20516 foreach(cell, idxes)
20522 bool found =
false;
20529 if (idxRel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
20553 if (attachrelIdxRels[
i]->rd_rel->relispartition)
20557 if (!attachrelIdxRels[
i]->rd_index->indisvalid)
20561 attachrelIdxRels[
i]->rd_indcollation,
20617 true,
false,
false,
false,
false);
20649 true, NULL, 1, &
key);
20668 if (!TRIGGER_FOR_ROW(trigForm->tgtype))
20675 if (trigForm->tgisinternal)
20681 if (!TRIGGER_FOR_BEFORE(trigForm->tgtype) &&
20682 !TRIGGER_FOR_AFTER(trigForm->tgtype))
20683 elog(
ERROR,
"unexpected trigger \"%s\" found",
20699 partition, parent);
20701 partition, parent);
20708 if (trigForm->tgattr.dim1 > 0)
20712 for (
i = 0;
i < trigForm->tgattr.dim1;
i++)
20717 trigForm->tgattr.values[
i] - 1);
20724 if (trigForm->tgnargs > 0)
20731 elog(
ERROR,
"tgargs is null for trigger \"%s\" in partition \"%s\"",
20736 for (
int i = 0;
i < trigForm->tgnargs;
i++)
20739 p += strlen(p) + 1;
20749 trigStmt->
args = trigargs;
20750 trigStmt->
row =
true;
20751 trigStmt->
timing = trigForm->tgtype & TRIGGER_TYPE_TIMING_MASK;
20752 trigStmt->
events = trigForm->tgtype & TRIGGER_TYPE_EVENT_MASK;
20756 trigStmt->
deferrable = trigForm->tgdeferrable;
20762 trigForm->tgfoid, trigForm->oid, qual,
20763 false,
true, trigForm->tgenabled);
20799 Oid defaultPartOid;
20826 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20827 errmsg(
"cannot detach partitions concurrently when a default partition exists")));
20869 char *parentrelname;
20931 if (partRel != NULL)
20932 elog(
WARNING,
"dangling partition \"%s\" remains, can't fix",
20935 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20936 errmsg(
"partitioned table \"%s\" was removed concurrently",
20939 if (partRel == NULL)
20941 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20942 errmsg(
"partition \"%s\" was removed concurrently", partrelname)));
20966 Oid defaultPartOid)
20972 Datum new_val[Natts_pg_class];
20973 bool new_null[Natts_pg_class],
20974 new_repl[Natts_pg_class];
21031 if (conform->contype != CONSTRAINT_FOREIGN ||
21053 Oid insertTriggerOid,
21058 &insertTriggerOid, &updateTriggerOid);
21085 int numfkdelsetcols;
21101 fkconstraint->
contype = CONSTRAINT_FOREIGN;
21103 fkconstraint->
deferrable = conform->condeferrable;
21105 fkconstraint->
is_enforced = conform->conenforced;
21109 fkconstraint->
pktable = NULL;
21121 for (
int i = 0;
i < numfks;
i++)
21148 conform->conperiod);
21171 ConstraintRelationId,
21181 foreach(cell, indexes)
21187 Oid parentConstrOid;
21219 elog(
ERROR,
"cache lookup failed for relation %u",
21224 memset(new_val, 0,
sizeof(new_val));
21225 memset(new_null,
false,
sizeof(new_null));
21226 memset(new_repl,
false,
sizeof(new_repl));
21227 new_val[Anum_pg_class_relpartbound - 1] = (
Datum) 0;
21228 new_null[Anum_pg_class_relpartbound - 1] =
true;
21229 new_repl[Anum_pg_class_relpartbound - 1] =
true;
21231 new_val, new_null, new_repl);
21245 if (!attr->attisdropped && attr->attidentity)
21279 if (partRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
21285 foreach(cell, children)
21336 List *constraintExpr;
21393 true, NULL, 1, &skey);
21419 RelationRelationId,
21458 if (!
state->lockedParentTbl)
21461 state->lockedParentTbl =
true;
21484 if (classform->relkind != RELKIND_PARTITIONED_INDEX &&
21485 classform->relkind != RELKIND_INDEX)
21487 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21522 state.lockedParentTbl =
false;
21530 (
errcode(ERRCODE_UNDEFINED_OBJECT),
21531 errmsg(
"index \"%s\" does not exist",
name->relname)));
21543 currParent = partIdx->
rd_rel->relispartition ?
21564 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21565 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21568 errdetail(
"Index \"%s\" is already attached to another index.",
21576 if (partDesc->
oids[
i] ==
state.partitionOid)
21584 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21585 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21588 errdetail(
"Index \"%s\" is not an index on any partition of table \"%s\".",
21605 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21606 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21609 errdetail(
"The index definitions do not match.")));
21624 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21625 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21628 errdetail(
"The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\".",
21638 if (parentIdx->
rd_index->indisprimary)
21673 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21674 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21677 errdetail(
"Another index is already attached for partition \"%s\".",
21695 bool updated =
false;
21697 Assert(partedIdx->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX);
21719 elog(
ERROR,
"cache lookup failed for index %u", inhForm->inhrelid);
21721 if (indexForm->indisvalid)
21744 elog(
ERROR,
"cache lookup failed for index %u",
21748 indexForm->indisvalid =
true;
21761 if (updated && partedIdx->
rd_rel->relispartition)
21797 if (!att->attnotnull)
21799 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
21800 errmsg(
"invalid primary key definition"),
21801 errdetail(
"Column \"%s\" of relation \"%s\" is not marked NOT NULL.",
21850 constraints =
lappend_oid(constraints, constrForm->oid);
21856 return constraints;
21872 foreach(cell, constraints)
21882 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
21918 if (compression == NULL || strcmp(compression,
"default") == 0)
21935 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
21936 errmsg(
"column data type %s does not support compression",
21942 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
21943 errmsg(
"invalid compression method \"%s\"", compression)));
21957 cstorage = TYPSTORAGE_PLAIN;
21959 cstorage = TYPSTORAGE_EXTERNAL;
21961 cstorage = TYPSTORAGE_EXTENDED;
21963 cstorage = TYPSTORAGE_MAIN;
21968 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
21969 errmsg(
"invalid storage type \"%s\"",
21978 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
21979 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 PointerIsValid(pointer)
#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)
void hash_destroy(HTAB *hashp)
void * hash_seq_search(HASH_SEQ_STATUS *status)
HTAB * hash_create(const char *tabname, long nelem, const HASHCTL *info, int flags)
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_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 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)
void UnlockTuple(Relation relation, ItemPointer tid, LOCKMODE lockmode)
#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 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
Datum transformRelOptions(Datum oldOptions, List *defList, const char *namspace, const char *const validnsps[], bool acceptOidsOff, bool isReset)
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)
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)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, struct ScanKeyData *key)
char * default_table_access_method
const TupleTableSlotOps * table_slot_callbacks(Relation relation)
static TableScanDesc table_beginscan(Relation rel, Snapshot snapshot, int nkeys, struct ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
#define TABLE_INSERT_SKIP_FSM
static void table_finish_bulk_insert(Relation rel, int options)
static void table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid, int options, struct BulkInsertStateData *bistate)
static void table_relation_copy_data(Relation rel, const RelFileLocator *newrlocator)
static bool table_scan_getnextslot(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot)
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 ObjectAddress ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode)
ObjectAddress RenameRelation(RenameStmt *stmt)
static AlteredTableInfo * ATGetQueueEntry(List **wqueue, Relation rel)
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)
static void verifyPartitionIndexNotNull(IndexInfo *iinfo, Relation partIdx)
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 void QueueNNConstraintValidation(List **wqueue, Relation conrel, Relation rel, HeapTuple contuple, bool recurse, bool recursing, LOCKMODE lockmode)
static ObjectAddress ATExecSetNotNull(List **wqueue, Relation rel, char *constrname, char *colName, 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 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 QueueFKConstraintValidation(List **wqueue, Relation conrel, Relation rel, HeapTuple contuple, LOCKMODE lockmode)
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 bool ATExecAlterConstrEnforceability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, const Oid fkrelid, const Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
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)
static void AlterConstrEnforceabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, const Oid fkrelid, const Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
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)
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)
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)