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);
402 Oid ReferencedParentDelTrigger,
403 Oid ReferencedParentUpdTrigger,
404 Oid ReferencingParentInsTrigger,
405 Oid ReferencingParentUpdTrigger);
414 bool deferrable,
bool initdeferred,
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 *conName,
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,
550 Constraint *newConstraint,
bool recurse,
bool is_readd,
558 bool recurse,
bool recursing,
bool is_readd,
562 bool recurse,
bool recursing,
565 int numfksetcols,
int16 *fksetcolsattnums,
568 char *constraintname,
573 Oid *pfeqoperators,
Oid *ppeqoperators,
574 Oid *ffeqoperators,
int numfkdelsetcols,
575 int16 *fkdelsetcols,
bool is_internal,
580 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
581 int numfkdelsetcols,
int16 *fkdelsetcols,
583 Oid parentDelTrigger,
Oid parentUpdTrigger,
588 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
589 int numfkdelsetcols,
int16 *fkdelsetcols,
590 bool old_check_ok,
LOCKMODE lockmode,
591 Oid parentInsTrigger,
Oid parentUpdTrigger,
601 Oid parentInsTrigger,
Oid parentUpdTrigger,
602 Oid *insertTrigOid,
Oid *updateTrigOid);
606 Oid parentDelTrigger,
Oid parentUpdTrigger,
607 Oid *deleteTrigOid,
Oid *updateTrigOid);
611 Oid parentConstrOid,
int numfks,
614 Oid parentInsTrigger,
615 Oid parentUpdTrigger,
618 Oid partConstrOid,
Oid parentConstrOid,
619 Oid parentInsTrigger,
Oid parentUpdTrigger,
622 Oid conoid,
Oid conrelid);
624 Oid confrelid,
Oid conrelid);
627 Oid *deleteTriggerOid,
628 Oid *updateTriggerOid);
631 Oid *insertTriggerOid,
632 Oid *updateTriggerOid);
635 bool missing_ok,
LOCKMODE lockmode);
638 bool recurse,
bool recursing,
639 bool missing_ok,
LOCKMODE lockmode);
642 bool recurse,
bool recursing,
660 const char *conname);
666 Oid oldOwnerId,
Oid newOwnerId);
677 const char *tablespacename,
LOCKMODE lockmode);
684 char fires_when,
bool skip_system,
bool recurse,
687 char fires_when,
LOCKMODE lockmode);
706 Oid oldRelOid,
void *
arg);
711 List **partexprs,
Oid *partopclass,
Oid *partcollation,
715 bool expect_detached);
721 List *partConstraint,
722 bool validate_default);
730 bool concurrent,
Oid defaultPartOid);
774 List *old_constraints;
777 List *cookedDefaults;
799 &&
stmt->relation->relpersistence != RELPERSISTENCE_TEMP)
801 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
802 errmsg(
"ON COMMIT can only be used on temporary tables")));
804 if (
stmt->partspec != NULL)
806 if (relkind != RELKIND_RELATION)
807 elog(
ERROR,
"unexpected relkind: %d", (
int) relkind);
809 relkind = RELKIND_PARTITIONED_TABLE;
815 if (relkind == RELKIND_PARTITIONED_TABLE &&
816 stmt->relation->relpersistence == RELPERSISTENCE_UNLOGGED)
818 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
819 errmsg(
"partitioned tables cannot be unlogged")));
835 if (
stmt->relation->relpersistence == RELPERSISTENCE_TEMP
838 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
839 errmsg(
"cannot create temporary table within security-restricted operation")));
862 foreach(listptr,
stmt->inhRelations)
874 (
errcode(ERRCODE_DUPLICATE_TABLE),
875 errmsg(
"relation \"%s\" would be inherited from more than once",
885 if (
stmt->tablespacename)
891 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
892 errmsg(
"cannot specify default tablespace for partitioned relations")));
894 else if (
stmt->partbound)
920 if (tablespaceId == GLOBALTABLESPACE_OID)
922 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
923 errmsg(
"only shared relations can be placed in pg_global tablespace")));
940 case RELKIND_PARTITIONED_TABLE:
947 if (
stmt->ofTypename)
967 stmt->relation->relpersistence,
968 stmt->partbound != NULL,
969 &old_constraints, &old_notnulls);
988 cookedDefaults =
NIL;
991 foreach(listptr,
stmt->tableElts)
1006 rawDefaults =
lappend(rawDefaults, rawEnt);
1015 cooked->
name = NULL;
1023 cookedDefaults =
lappend(cookedDefaults, cooked);
1032 if (
stmt->accessMethod != NULL)
1034 Assert(RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE);
1037 else if (RELKIND_HAS_TABLE_AM(relkind) || relkind == RELKIND_PARTITIONED_TABLE)
1039 if (
stmt->partbound)
1045 if (RELKIND_HAS_TABLE_AM(relkind) && !
OidIsValid(accessMethodId))
1066 stmt->relation->relpersistence,
1105 true,
true,
false, queryString);
1113 if (
stmt->partbound)
1130 if (parent->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
1132 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1133 errmsg(
"\"%s\" is not partitioned",
1171 NULL,
false,
false);
1226 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
1227 errmsg(
"cannot partition using more than %d columns",
1239 partattrs, &partexprs, partopclass,
1240 partcollation,
stmt->partspec->strategy);
1244 partopclass, partcollation);
1257 if (
stmt->partbound)
1271 foreach(cell, idxlist)
1278 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
1282 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1283 errmsg(
"cannot create foreign partition of partitioned table \"%s\"",
1285 errdetail(
"Table \"%s\" contains indexes that are unique.",
1299 attmap, &constraintOid);
1306 false,
false,
false,
false,
false);
1334 if (
stmt->constraints)
1336 true,
true,
false, queryString);
1414 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
1415 errmsg(
"too many array dimensions"));
1419 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
1420 errmsg(
"column \"%s\" cannot be declared SETOF",
1424 atttypid, atttypmod, attdim);
1433 att->attinhcount = entry->
inhcount;
1434 att->attidentity = entry->
identity;
1438 att->attstorage = entry->
storage;
1463 (
errcode(ERRCODE_UNDEFINED_SCHEMA),
1469 (
errmsg(
"schema \"%s\" does not exist, skipping",
1477 if (rentry->
kind == rightkind)
1507 if (rentry->
kind == rightkind)
1512 if (wentry->
kind == wrongkind)
1517 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1548 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1549 errmsg(
"DROP INDEX CONCURRENTLY does not support dropping multiple objects")));
1552 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1553 errmsg(
"DROP INDEX CONCURRENTLY does not support CASCADE")));
1566 relkind = RELKIND_RELATION;
1570 relkind = RELKIND_INDEX;
1574 relkind = RELKIND_SEQUENCE;
1578 relkind = RELKIND_VIEW;
1582 relkind = RELKIND_MATVIEW;
1586 relkind = RELKIND_FOREIGN_TABLE;
1590 elog(
ERROR,
"unrecognized drop object type: %d",
1619 state.expected_relkind = relkind;
1642 state.actual_relpersistence != RELPERSISTENCE_TEMP)
1654 state.actual_relkind == RELKIND_PARTITIONED_INDEX)
1656 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1657 errmsg(
"cannot drop partitioned index \"%s\" concurrently",
1667 if (
state.actual_relkind == RELKIND_PARTITIONED_INDEX)
1669 state.heap_lockmode,
1673 obj.
classId = RelationRelationId;
1701 bool invalid_system_index =
false;
1736 is_partition = classform->relispartition;
1739 state->actual_relkind = classform->relkind;
1740 state->actual_relpersistence = classform->relpersistence;
1750 if (classform->relkind == RELKIND_PARTITIONED_TABLE)
1752 else if (classform->relkind == RELKIND_PARTITIONED_INDEX)
1759 state->expected_relkind);
1774 if (
IsSystemClass(relOid, classform) && classform->relkind == RELKIND_INDEX)
1788 indisvalid = indexform->indisvalid;
1793 invalid_system_index =
true;
1799 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
1800 errmsg(
"permission denied: \"%s\" is a system catalog",
1814 relOid != oldRelOid)
1827 if (is_partition && relOid != oldRelOid)
1861 foreach(cell,
stmt->relations)
1865 bool recurse = rv->
inh;
1891 relids_logged =
lappend_oid(relids_logged, myrelid);
1900 foreach(child, children)
1939 relids_logged =
lappend_oid(relids_logged, childrelid);
1942 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
1944 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1945 errmsg(
"cannot truncate only a partitioned table"),
1946 errhint(
"Do not specify the ONLY keyword, or use TRUNCATE ONLY on the partitions directly.")));
1950 stmt->behavior,
stmt->restart_seqs,
false);
1977 List *relids_logged,
1979 bool run_as_table_owner)
1983 HTAB *ft_htab = NULL;
2009 if (newrelids ==
NIL)
2012 foreach(cell, newrelids)
2019 (
errmsg(
"truncate cascades to table \"%s\"",
2029 relids_logged =
lappend_oid(relids_logged, relid);
2039#ifdef USE_ASSERT_CHECKING
2060 foreach(seqcell, seqlist)
2094 resultRelInfo = resultRelInfos;
2115 resultRelInfo = resultRelInfos;
2120 if (run_as_table_owner)
2124 if (run_as_table_owner)
2139 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
2149 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
2160 memset(&hctl, 0,
sizeof(
HASHCTL));
2165 ft_htab =
hash_create(
"TRUNCATE for Foreign Tables",
2225 toast_relid = rel->
rd_rel->reltoastrelid;
2232 toastrel->
rd_rel->relpersistence);
2278 foreach(cell, seq_relids)
2292 if (relids_logged !=
NIL)
2301 foreach(cell, relids_logged)
2324 resultRelInfo = resultRelInfos;
2329 if (run_as_table_owner)
2333 if (run_as_table_owner)
2372 if (reltuple->relkind == RELKIND_FOREIGN_TABLE)
2379 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2380 errmsg(
"cannot truncate foreign table \"%s\"",
2383 else if (reltuple->relkind != RELKIND_RELATION &&
2384 reltuple->relkind != RELKIND_PARTITIONED_TABLE)
2386 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2399 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2400 errmsg(
"permission denied: \"%s\" is a system catalog",
2436 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2437 errmsg(
"cannot truncate temporary tables of other sessions")));
2455 case TYPSTORAGE_PLAIN:
2457 case TYPSTORAGE_EXTERNAL:
2459 case TYPSTORAGE_EXTENDED:
2461 case TYPSTORAGE_MAIN:
2537 bool is_partition,
List **supconstr,
List **supnotnulls)
2542 bool have_bogus_defaults =
false;
2544 static Node bogus_marker = {0};
2561 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
2562 errmsg(
"tables can have at most %d columns",
2579 for (
int coldefpos = 0; coldefpos <
list_length(columns); coldefpos++)
2583 if (!is_partition && coldef->
typeName == NULL)
2592 (
errcode(ERRCODE_UNDEFINED_COLUMN),
2593 errmsg(
"column \"%s\" does not exist",
2598 for (
int restpos = coldefpos + 1; restpos <
list_length(columns);)
2618 (
errcode(ERRCODE_DUPLICATE_COLUMN),
2619 errmsg(
"column \"%s\" specified more than once",
2634 saved_columns = columns;
2650 List *inherited_defaults;
2651 List *cols_with_defaults;
2672 if (relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !is_partition)
2674 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2675 errmsg(
"cannot inherit from partitioned table \"%s\"",
2677 if (relation->
rd_rel->relispartition && !is_partition)
2679 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2680 errmsg(
"cannot inherit from partition \"%s\"",
2683 if (relation->
rd_rel->relkind != RELKIND_RELATION &&
2684 relation->
rd_rel->relkind != RELKIND_FOREIGN_TABLE &&
2685 relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
2687 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2688 errmsg(
"inherited relation \"%s\" is not a table or foreign table",
2696 relation->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
2697 relpersistence == RELPERSISTENCE_TEMP)
2699 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2700 errmsg(
"cannot create a temporary relation as partition of permanent relation \"%s\"",
2704 if (relpersistence != RELPERSISTENCE_TEMP &&
2705 relation->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
2707 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2709 ?
"cannot inherit from temporary relation \"%s\""
2710 :
"cannot create a permanent relation as partition of temporary relation \"%s\"",
2714 if (relation->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
2717 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2719 ?
"cannot inherit from temporary relation of another session"
2720 :
"cannot create as partition of temporary relation of another session")));
2731 constr = tupleDesc->
constr;
2741 inherited_defaults = cols_with_defaults =
NIL;
2757 char *attributeName =
NameStr(attribute->attname);
2765 if (attribute->attisdropped)
2772 attribute->atttypmod, attribute->attcollation);
2773 newdef->
storage = attribute->attstorage;
2774 newdef->
generated = attribute->attgenerated;
2785 newdef->
identity = attribute->attidentity;
2792 if (exist_attno > 0)
2799 newattmap->
attnums[parent_attno - 1] = exist_attno;
2814 inh_columns =
lappend(inh_columns, newdef);
2816 newattmap->
attnums[parent_attno - 1] = ++child_attno;
2829 if (attribute->atthasdef)
2834 if (this_default == NULL)
2835 elog(
ERROR,
"default expression not found for attribute %d of relation \"%s\"",
2844 inherited_defaults =
lappend(inherited_defaults, this_default);
2845 cols_with_defaults =
lappend(cols_with_defaults, mergeddef);
2853 forboth(lc1, inherited_defaults, lc2, cols_with_defaults)
2857 bool found_whole_row;
2871 if (found_whole_row)
2873 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2874 errmsg(
"cannot convert whole-row table reference"),
2875 errdetail(
"Generation expression for column \"%s\" contains a whole-row reference to table \"%s\".",
2891 have_bogus_defaults =
true;
2908 bool found_whole_row;
2911 if (check[
i].ccnoinherit)
2925 if (found_whole_row)
2927 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2928 errmsg(
"cannot convert whole-row table reference"),
2929 errdetail(
"Constraint \"%s\" contains a whole-row reference to table \"%s\".",
2934 check[
i].ccenforced);
2946 nn->attnum = newattmap->
attnums[nn->attnum - 1];
2948 nnconstraints =
lappend(nnconstraints, nn);
2967 if (inh_columns !=
NIL)
2969 int newcol_attno = 0;
2971 foreach(lc, columns)
2974 char *attributeName = newdef->
colname;
2989 if (exist_attno > 0)
3001 inh_columns =
lappend(inh_columns, newdef);
3005 columns = inh_columns;
3013 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
3014 errmsg(
"tables can have at most %d columns",
3025 foreach(lc, saved_columns)
3050 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3051 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3055 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3056 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3063 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3064 errmsg(
"child column \"%s\" specifies generation expression",
3066 errhint(
"A child table column cannot be generated unless its parent column is.")));
3071 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3072 errmsg(
"column \"%s\" inherits from generated column of different kind",
3074 errdetail(
"Parent column is %s, child column is %s.",
3075 coldef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3076 restdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3100 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3101 errmsg(
"column \"%s\" does not exist",
3110 if (have_bogus_defaults)
3112 foreach(lc, columns)
3120 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3121 errmsg(
"column \"%s\" inherits conflicting generation expressions",
3123 errhint(
"To resolve the conflict, specify a generation expression explicitly.")));
3126 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3127 errmsg(
"column \"%s\" inherits conflicting default values",
3129 errhint(
"To resolve the conflict, specify a default explicitly.")));
3134 *supconstr = constraints;
3135 *supnotnulls = nnconstraints;
3162 foreach(lc, constraints)
3178 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3179 errmsg(
"too many inheritance parents"));
3196 errmsg(
"check constraint name \"%s\" appears multiple times but with different expressions",
3207 newcon->
expr = expr;
3211 return lappend(constraints, newcon);
3238 char *attributeName = newdef->
colname;
3247 if (exist_attno == newcol_attno)
3249 (
errmsg(
"merging column \"%s\" with inherited definition",
3253 (
errmsg(
"moving and merging column \"%s\" with inherited definition", attributeName),
3254 errdetail(
"User-specified column moved to the position of the inherited column.")));
3263 if (inhtypeid != newtypeid || inhtypmod != newtypmod)
3265 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3266 errmsg(
"column \"%s\" has a type conflict",
3277 if (inhcollid != newcollid)
3279 (
errcode(ERRCODE_COLLATION_MISMATCH),
3280 errmsg(
"column \"%s\" has a collation conflict",
3299 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3300 errmsg(
"column \"%s\" has a storage parameter conflict",
3315 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3316 errmsg(
"column \"%s\" has a compression method conflict",
3344 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3345 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3349 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3350 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3357 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3358 errmsg(
"child column \"%s\" specifies generation expression",
3360 errhint(
"A child table column cannot be generated unless its parent column is.")));
3365 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3366 errmsg(
"column \"%s\" inherits from generated column of different kind",
3368 errdetail(
"Parent column is %s, child column is %s.",
3369 inhdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3370 newdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3410 char *attributeName = newdef->
colname;
3420 (
errmsg(
"merging multiple inherited definitions of column \"%s\"",
3429 if (prevtypeid != newtypeid || prevtypmod != newtypmod)
3431 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3432 errmsg(
"inherited column \"%s\" has a type conflict",
3443 if (prevcollid != newcollid)
3445 (
errcode(ERRCODE_COLLATION_MISMATCH),
3446 errmsg(
"inherited column \"%s\" has a collation conflict",
3459 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3460 errmsg(
"inherited column \"%s\" has a storage parameter conflict",
3475 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3476 errmsg(
"column \"%s\" has a compression method conflict",
3487 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3488 errmsg(
"inherited column \"%s\" has a generation conflict",
3498 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3499 errmsg(
"too many inheritance parents"));
3512 bool child_is_partition)
3538 foreach(entry, supers)
3543 child_is_partition);
3557 bool child_is_partition)
3568 parentobject.
classId = RelationRelationId;
3571 childobject.
classId = RelationRelationId;
3605 foreach(lc, columns)
3654 elog(
ERROR,
"cache lookup failed for relation %u", relationId);
3657 if (classtuple->relhassubclass != relhassubclass)
3659 classtuple->relhassubclass = relhassubclass;
3685 Oid oldTableSpaceId;
3691 oldTableSpaceId = rel->
rd_rel->reltablespace;
3692 if (newTableSpaceId == oldTableSpaceId ||
3702 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3703 errmsg(
"cannot move system relation \"%s\"",
3707 if (newTableSpaceId == GLOBALTABLESPACE_OID)
3709 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3710 errmsg(
"only shared relations can be placed in pg_global tablespace")));
3718 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3719 errmsg(
"cannot move temporary tables of other sessions")));
3741 Oid newTableSpaceId,
3757 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
3765 rd_rel->relfilenode = newRelFilenumber;
3773 if (!RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
3775 rd_rel->reltablespace);
3787 char relkind = classform->relkind;
3789 if (classform->reloftype && !recursing)
3791 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3792 errmsg(
"cannot rename column of typed table")));
3801 if (relkind != RELKIND_RELATION &&
3802 relkind != RELKIND_VIEW &&
3803 relkind != RELKIND_MATVIEW &&
3804 relkind != RELKIND_COMPOSITE_TYPE &&
3805 relkind != RELKIND_INDEX &&
3806 relkind != RELKIND_PARTITIONED_INDEX &&
3807 relkind != RELKIND_FOREIGN_TABLE &&
3808 relkind != RELKIND_PARTITIONED_TABLE)
3810 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3811 errmsg(
"cannot rename columns of relation \"%s\"",
3823 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
3824 errmsg(
"permission denied: \"%s\" is a system catalog",
3825 NameStr(classform->relname))));
3835 const char *oldattname,
3836 const char *newattname,
3839 int expected_parents,
3883 forboth(lo, child_oids, li, child_numparents)
3888 if (childrelid == myrelid)
3891 renameatt_internal(childrelid, oldattname, newattname,
false,
true, numparents, behavior);
3902 if (expected_parents == 0 &&
3905 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3906 errmsg(
"inherited column \"%s\" must be renamed in child tables too",
3911 if (targetrelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
3920 foreach(lo, child_oids)
3929 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3930 errmsg(
"column \"%s\" does not exist",
3934 attnum = attform->attnum;
3937 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3938 errmsg(
"cannot rename system column \"%s\"",
3950 if (attform->attinhcount > expected_parents)
3952 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3953 errmsg(
"cannot rename inherited column \"%s\"",
4014 (
errmsg(
"relation \"%s\" does not exist, skipping",
4015 stmt->relation->relname)));
4023 stmt->relation->inh,
4039 const char *oldconname,
4040 const char *newconname,
4043 int expected_parents)
4051 Assert(!myrelid || !mytypid);
4072 elog(
ERROR,
"cache lookup failed for constraint %u",
4077 (con->contype == CONSTRAINT_CHECK ||
4078 con->contype == CONSTRAINT_NOTNULL) &&
4091 forboth(lo, child_oids, li, child_numparents)
4096 if (childrelid == myrelid)
4104 if (expected_parents == 0 &&
4107 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4108 errmsg(
"inherited constraint \"%s\" must be renamed in child tables too",
4112 if (con->coninhcount > expected_parents)
4114 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4115 errmsg(
"cannot rename inherited constraint \"%s\"",
4120 && (con->contype == CONSTRAINT_PRIMARY
4121 || con->contype == CONSTRAINT_UNIQUE
4122 || con->contype == CONSTRAINT_EXCLUSION))
4160 elog(
ERROR,
"cache lookup failed for type %u", typid);
4175 (
errmsg(
"relation \"%s\" does not exist, skipping",
4176 stmt->relation->relname)));
4186 stmt->relation->inh),
4227 (
errmsg(
"relation \"%s\" does not exist, skipping",
4228 stmt->relation->relname)));
4239 obj_is_index = (relkind == RELKIND_INDEX ||
4240 relkind == RELKIND_PARTITIONED_INDEX);
4241 if (obj_is_index || is_index_stmt == obj_is_index)
4245 is_index_stmt = obj_is_index;
4289 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4295 (
errcode(ERRCODE_DUPLICATE_TABLE),
4296 errmsg(
"relation \"%s\" already exists",
4306 is_index == (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4307 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX));
4329 newrelname, namespaceId);
4334 if (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4335 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
4366 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4408 int expected_refcnt;
4413 (
errcode(ERRCODE_OBJECT_IN_USE),
4415 errmsg(
"cannot %s \"%s\" because it is being used by active queries in this session",
4418 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
4419 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
4422 (
errcode(ERRCODE_OBJECT_IN_USE),
4424 errmsg(
"cannot %s \"%s\" because it has pending trigger events",
4449 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4450 errmsg(
"cannot alter temporary tables of other sessions")));
4562 ATController(NULL, rel, cmds, recurse, lockmode, NULL);
4838 elog(
ERROR,
"unrecognized alter table type: %d",
4846 if (cmd_lockmode > lockmode)
4847 lockmode = cmd_lockmode;
4872 ATPrepCmd(&wqueue, rel, cmd, recurse,
false, lockmode, context);
4896 bool recurse,
bool recursing,
LOCKMODE lockmode,
4909 if (rel->
rd_rel->relispartition &&
4913 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
4914 errmsg(
"cannot alter partition \"%s\" with an incomplete detach",
4916 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
5142 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5143 errmsg(
"cannot change persistence setting twice")));
5159 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5160 errmsg(
"cannot have multiple SET ACCESS METHOD subcommands")));
5273 elog(
ERROR,
"unrecognized alter table type: %d",
5307 foreach(ltab, *wqueue)
5323 foreach(lcmd, subcmds)
5326 lockmode, pass, context);
5345 foreach(ltab, *wqueue)
5354 if (((tab->
relkind == RELKIND_RELATION ||
5355 tab->
relkind == RELKIND_PARTITIONED_TABLE) &&
5357 tab->
relkind == RELKIND_MATVIEW)
5379 lockmode, cur_pass, context);
5407 cmd->
recurse,
false, lockmode);
5460 cmd->
recurse,
false, lockmode);
5465 true,
true, lockmode);
5527 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
5538 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
5539 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
5648 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
5660 Assert(rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
5669 elog(
ERROR,
"unrecognized alter table type: %d",
5729 foreach(lc, beforeStmts)
5738 foreach(lc, atstmt->
cmds)
5790 if (pass < cur_pass)
5793 elog(
ERROR,
"ALTER TABLE scheduling failure: too late for pass %d",
5796 else if (pass > cur_pass)
5813 elog(
ERROR,
"ALTER TABLE scheduling failure: bogus item for pass %d",
5834 foreach(ltab, *wqueue)
5839 if (!RELKIND_HAS_STORAGE(tab->
relkind))
5880 Oid NewAccessMethod;
5893 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5894 errmsg(
"cannot rewrite system relation \"%s\"",
5899 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5900 errmsg(
"cannot rewrite table \"%s\" used as a catalog table",
5911 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5912 errmsg(
"cannot rewrite temporary tables of other sessions")));
5921 NewTableSpace = OldHeap->
rd_rel->reltablespace;
5930 NewAccessMethod = OldHeap->
rd_rel->relam;
5973 persistence, lockmode);
6032 foreach(lc, seqlist)
6048 foreach(ltab, *wqueue)
6055 if (!RELKIND_HAS_STORAGE(tab->
relkind))
6094 foreach(ltab, *wqueue)
6122 bool needscan =
false;
6123 List *notnull_attrs;
6124 List *notnull_virtual_attrs;
6189 elog(
ERROR,
"unrecognized constraint type: %d",
6209 notnull_attrs = notnull_virtual_attrs =
NIL;
6222 for (
i = 0;
i < newTupDesc->
natts;
i++)
6231 if (wholeatt->attgenerated != ATTRIBUTE_GENERATED_VIRTUAL)
6232 notnull_attrs =
lappend_int(notnull_attrs, wholeatt->attnum);
6234 notnull_virtual_attrs =
lappend_int(notnull_virtual_attrs,
6238 if (notnull_attrs || notnull_virtual_attrs)
6242 if (newrel || needscan)
6260 if (notnull_virtual_attrs !=
NIL)
6335 for (
i = 0;
i < newTupDesc->
natts;
i++)
6371 foreach(lc, dropped_attrs)
6425 insertslot = newslot;
6434 insertslot = oldslot;
6447 (
errcode(ERRCODE_NOT_NULL_VIOLATION),
6448 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6455 if (notnull_virtual_attrs !=
NIL)
6461 notnull_virtual_attrs);
6467 errcode(ERRCODE_NOT_NULL_VIOLATION),
6468 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6484 (
errcode(ERRCODE_CHECK_VIOLATION),
6485 errmsg(
"check constraint \"%s\" of relation \"%s\" is violated by some row",
6495 elog(
ERROR,
"unrecognized constraint type: %d",
6500 if (partqualstate && !
ExecCheck(partqualstate, econtext))
6504 (
errcode(ERRCODE_CHECK_VIOLATION),
6505 errmsg(
"updated partition constraint for default partition \"%s\" would be violated by some row",
6510 (
errcode(ERRCODE_CHECK_VIOLATION),
6511 errmsg(
"partition constraint of relation \"%s\" is violated by some row",
6519 ti_options, bistate);
6558 foreach(ltab, *wqueue)
6561 if (tab->
relid == relid)
6580 *wqueue =
lappend(*wqueue, tab);
6592 return "ADD COLUMN";
6595 return "ALTER COLUMN ... SET DEFAULT";
6597 return "ALTER COLUMN ... DROP NOT NULL";
6599 return "ALTER COLUMN ... SET NOT NULL";
6601 return "ALTER COLUMN ... SET EXPRESSION";
6603 return "ALTER COLUMN ... DROP EXPRESSION";
6605 return "ALTER COLUMN ... SET STATISTICS";
6607 return "ALTER COLUMN ... SET";
6609 return "ALTER COLUMN ... RESET";
6611 return "ALTER COLUMN ... SET STORAGE";
6613 return "ALTER COLUMN ... SET COMPRESSION";
6615 return "DROP COLUMN";
6623 return "ADD CONSTRAINT";
6625 return "ALTER CONSTRAINT";
6627 return "VALIDATE CONSTRAINT";
6629 return "DROP CONSTRAINT";
6633 return "ALTER COLUMN ... SET DATA TYPE";
6635 return "ALTER COLUMN ... OPTIONS";
6639 return "CLUSTER ON";
6641 return "SET WITHOUT CLUSTER";
6643 return "SET ACCESS METHOD";
6645 return "SET LOGGED";
6647 return "SET UNLOGGED";
6649 return "SET WITHOUT OIDS";
6651 return "SET TABLESPACE";
6659 return "ENABLE TRIGGER";
6661 return "ENABLE ALWAYS TRIGGER";
6663 return "ENABLE REPLICA TRIGGER";
6665 return "DISABLE TRIGGER";
6667 return "ENABLE TRIGGER ALL";
6669 return "DISABLE TRIGGER ALL";
6671 return "ENABLE TRIGGER USER";
6673 return "DISABLE TRIGGER USER";
6675 return "ENABLE RULE";
6677 return "ENABLE ALWAYS RULE";
6679 return "ENABLE REPLICA RULE";
6681 return "DISABLE RULE";
6685 return "NO INHERIT";
6691 return "REPLICA IDENTITY";
6693 return "ENABLE ROW SECURITY";
6695 return "DISABLE ROW SECURITY";
6697 return "FORCE ROW SECURITY";
6699 return "NO FORCE ROW SECURITY";
6703 return "ATTACH PARTITION";
6705 return "DETACH PARTITION";
6707 return "DETACH PARTITION ... FINALIZE";
6709 return "ALTER COLUMN ... ADD IDENTITY";
6711 return "ALTER COLUMN ... SET";
6713 return "ALTER COLUMN ... DROP IDENTITY";
6733 switch (rel->
rd_rel->relkind)
6735 case RELKIND_RELATION:
6738 case RELKIND_PARTITIONED_TABLE:
6744 case RELKIND_MATVIEW:
6750 case RELKIND_PARTITIONED_INDEX:
6753 case RELKIND_COMPOSITE_TYPE:
6756 case RELKIND_FOREIGN_TABLE:
6759 case RELKIND_SEQUENCE:
6768 if ((actual_target & allowed_targets) == 0)
6774 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
6776 errmsg(
"ALTER action %s cannot be performed on relation \"%s\"",
6781 elog(
ERROR,
"invalid ALTER action attempted on relation \"%s\"",
6792 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
6793 errmsg(
"permission denied: \"%s\" is a system catalog",
6814 if (recurse && rel->
rd_rel->relhassubclass)
6827 foreach(child, children)
6832 if (childrelid == relid)
6837 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
6853 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
6887 Assert(rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
6893 foreach(child, children)
6900 ATPrepCmd(wqueue, childrel, cmd,
true,
true, lockmode, context);
6927 const char *origTypeName)
6944 Anum_pg_depend_refclassid,
6948 Anum_pg_depend_refobjid,
6963 if (pg_depend->classid == TypeRelationId)
6972 origRelation, origTypeName);
6977 if (pg_depend->classid != RelationRelationId)
6996 if (pg_depend->objsubid > 0 && pg_depend->objsubid <= tupleDesc->
natts)
7001 for (
int attno = 1; attno <= tupleDesc->
natts; attno++)
7004 if (att->atttypid == typeOid && !att->attisdropped)
7025 if (RELKIND_HAS_STORAGE(rel->
rd_rel->relkind) ||
7026 RELKIND_HAS_PARTITIONS(rel->
rd_rel->relkind))
7030 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7031 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7035 else if (origRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7037 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7038 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7042 else if (origRelation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
7044 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7045 errmsg(
"cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type",
7051 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7052 errmsg(
"cannot alter table \"%s\" because column \"%s.%s\" uses its row type",
7064 origRelation, origTypeName);
7095 Anum_pg_class_reloftype,
7107 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
7108 errmsg(
"cannot alter type \"%s\" because it is the type of a typed table",
7110 errhint(
"Use ALTER ... CASCADE to alter the typed tables too.")));
7136 bool typeOk =
false;
7138 if (typ->typtype == TYPTYPE_COMPOSITE)
7144 typeOk = (typeRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
7155 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7156 errmsg(
"type %s is the row type of another table",
7158 errdetail(
"A typed table must use a stand-alone composite type created with CREATE TYPE.")));
7162 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7163 errmsg(
"type %s is not a composite type",
7187 if (rel->
rd_rel->reloftype && !recursing)
7189 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7190 errmsg(
"cannot add column to typed table")));
7192 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7195 if (recurse && !is_view)
7214 bool if_not_exists = (*cmd)->missing_ok;
7237 if (rel->
rd_rel->relispartition && !recursing)
7239 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7240 errmsg(
"cannot add column to a partition")));
7265 if (ctypeId != childatt->atttypid ||
7266 ctypmod != childatt->atttypmod)
7268 (
errcode(ERRCODE_DATATYPE_MISMATCH),
7269 errmsg(
"child table \"%s\" has different type for column \"%s\"",
7272 if (ccollid != childatt->attcollation)
7274 (
errcode(ERRCODE_COLLATION_MISMATCH),
7275 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
7283 &childatt->attinhcount))
7285 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7286 errmsg(
"too many inheritance parents"));
7293 (
errmsg(
"merging definition of column \"%s\" for child \"%s\"",
7323 if (context != NULL && !recursing)
7342 rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE &&
7345 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7346 errmsg(
"cannot recursively add identity column to table that has child tables")));
7352 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
7354 relkind = relform->relkind;
7357 newattnum = relform->relnatts + 1;
7360 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
7361 errmsg(
"tables can have at most %d columns",
7372 attribute->attnum = newattnum;
7386 relform->relnatts = newattnum;
7408 rawEnt->
attnum = attribute->attnum;
7417 false,
true,
false, NULL);
7455 if (RELKIND_HAS_STORAGE(relkind))
7457 bool has_domain_constraints;
7458 bool has_missing =
false;
7469 nve->
typeId = attribute->atttypid;
7471 defval = (
Expr *) nve;
7478 if (!defval && has_domain_constraints)
7484 baseTypeMod = attribute->atttypmod;
7491 attribute->atttypid,
7492 attribute->atttypmod,
7497 elog(
ERROR,
"failed to coerce base type to domain");
7509 newval->attnum = attribute->attnum;
7524 if (rel->
rd_rel->relkind == RELKIND_RELATION &&
7526 !has_domain_constraints &&
7557 if (colDef->
generated != ATTRIBUTE_GENERATED_VIRTUAL)
7590 if (children && !recurse)
7592 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7593 errmsg(
"column must be added to child tables too")));
7606 foreach(child, children)
7621 &childcmd, recurse,
true,
7622 lockmode, cur_pass, context);
7662 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7663 errmsg(
"column name \"%s\" conflicts with a system column name",
7670 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7671 errmsg(
"column \"%s\" of relation \"%s\" already exists, skipping",
7677 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7678 errmsg(
"column \"%s\" of relation \"%s\" already exists",
7694 myself.
classId = RelationRelationId;
7697 referenced.
classId = TypeRelationId;
7715 myself.
classId = RelationRelationId;
7718 referenced.
classId = CollationRelationId;
7750 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7751 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7759 if (!attTup->attnotnull)
7768 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7769 errmsg(
"cannot alter system column \"%s\"",
7772 if (attTup->attidentity)
7774 (
errcode(ERRCODE_SYNTAX_ERROR),
7775 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
7781 if (rel->
rd_rel->relispartition)
7788 parent_attnum =
get_attnum(parentId, colName);
7791 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7792 errmsg(
"column \"%s\" is marked NOT NULL in parent table",
7803 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
7831 bool is_valid,
bool queue_validation)
7836 Assert(!queue_validation || wqueue);
7845 if (attr->attisdropped)
7848 if (!attr->attnotnull)
7857 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
7865 attr->attnotnull =
true;
7872 if (queue_validation && wqueue &&
7904 bool recurse,
bool recursing,
LOCKMODE lockmode)
7912 bool is_no_inherit =
false;
7928 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7929 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7935 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7936 errmsg(
"cannot alter system column \"%s\"",
7944 bool changed =
false;
7949 if (conForm->connoinherit && recurse)
7951 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7952 errmsg(
"cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"",
7964 &conForm->coninhcount))
7966 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7967 errmsg(
"too many inheritance parents"));
7970 else if (!conForm->conislocal)
7972 conForm->conislocal =
true;
7975 else if (!conForm->convalidated)
7982 recurse, recursing, lockmode);
8011 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
8013 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8014 errmsg(
"constraint must be added to child tables too"),
8015 errhint(
"Do not specify the ONLY keyword."));
8017 is_no_inherit =
true;
8028 colName,
"not_null",
8035 constraint->
conname = conName;
8039 false, !recursing,
false, NULL);
8066 recurse,
true, lockmode);
8096 nnulltest->argisrow =
false;
8102 (
errmsg_internal(
"existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls",
8129 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8130 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8136 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8137 errmsg(
"cannot alter system column \"%s\"",
8142 (
errcode(ERRCODE_SYNTAX_ERROR),
8143 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
8146 newDefault ? 0 :
errhint(
"Use %s instead.",
8147 "ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY")));
8151 (
errcode(ERRCODE_SYNTAX_ERROR),
8152 errmsg(
"column \"%s\" of relation \"%s\" is a generated column",
8156 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION") :
8158 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION") : 0)));
8170 newDefault != NULL);
8187 false,
true,
false, NULL);
8231 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing)
8241 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8242 if (ispartitioned && !recurse)
8244 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8245 errmsg(
"cannot add identity to a column of only the partitioned table"),
8246 errhint(
"Do not specify the ONLY keyword.")));
8248 if (rel->
rd_rel->relispartition && !recursing)
8250 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8251 errmsg(
"cannot add identity to a column of a partition"));
8258 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8259 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8267 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8268 errmsg(
"cannot alter system column \"%s\"",
8276 if (!attTup->attnotnull)
8278 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8279 errmsg(
"column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added",
8282 if (attTup->attidentity)
8284 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8285 errmsg(
"column \"%s\" of relation \"%s\" is already an identity column",
8288 if (attTup->atthasdef)
8290 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8291 errmsg(
"column \"%s\" of relation \"%s\" already has a default value",
8294 attTup->attidentity = cdef->
identity;
8310 if (recurse && ispartitioned)
8317 foreach(lc, children)
8337 LOCKMODE lockmode,
bool recurse,
bool recursing)
8348 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8349 if (ispartitioned && !recurse)
8351 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8352 errmsg(
"cannot change identity column of only the partitioned table"),
8353 errhint(
"Do not specify the ONLY keyword.")));
8355 if (rel->
rd_rel->relispartition && !recursing)
8357 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8358 errmsg(
"cannot change identity column of a partition"));
8364 if (strcmp(defel->
defname,
"generated") == 0)
8368 (
errcode(ERRCODE_SYNTAX_ERROR),
8369 errmsg(
"conflicting or redundant options")));
8370 generatedEl = defel;
8373 elog(
ERROR,
"option \"%s\" not recognized",
8387 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8388 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8396 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8397 errmsg(
"cannot alter system column \"%s\"",
8400 if (!attTup->attidentity)
8402 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8403 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8427 if (generatedEl && recurse && ispartitioned)
8434 foreach(lc, children)
8454 bool recurse,
bool recursing)
8465 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8466 if (ispartitioned && !recurse)
8468 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8469 errmsg(
"cannot drop identity from a column of only the partitioned table"),
8470 errhint(
"Do not specify the ONLY keyword.")));
8472 if (rel->
rd_rel->relispartition && !recursing)
8474 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8475 errmsg(
"cannot drop identity from a column of a partition"));
8481 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8482 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8490 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8491 errmsg(
"cannot alter system column \"%s\"",
8494 if (!attTup->attidentity)
8498 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8499 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8504 (
errmsg(
"column \"%s\" of relation \"%s\" is not an identity column, skipping",
8512 attTup->attidentity =
'\0';
8528 if (recurse && ispartitioned)
8535 foreach(lc, children)
8552 seqaddress.
classId = RelationRelationId;
8584 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8585 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8593 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8594 errmsg(
"cannot alter system column \"%s\"",
8597 attgenerated = attTup->attgenerated;
8600 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8601 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8608 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8611 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8612 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns on tables with check constraints"),
8613 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8616 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL && attTup->attnotnull)
8626 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8629 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8630 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns on tables that are part of a publication"),
8631 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8634 rewrite = (attgenerated == ATTRIBUTE_GENERATED_STORED);
8664 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8687 false,
true,
false, NULL);
8700 newval->is_generated =
true;
8736 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8737 errmsg(
"ALTER TABLE / DROP EXPRESSION must be applied to child tables too")));
8750 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8751 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8756 if (attTup->attinhcount > 0)
8758 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8759 errmsg(
"cannot drop generation expression from inherited column")));
8780 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8781 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8789 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8790 errmsg(
"cannot alter system column \"%s\"",
8799 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8801 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8802 errmsg(
"ALTER TABLE / DROP EXPRESSION is not supported for virtual generated columns"),
8803 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8806 if (!attTup->attgenerated)
8810 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8811 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8816 (
errmsg(
"column \"%s\" of relation \"%s\" is not a generated column, skipping",
8828 attTup->attgenerated =
'\0';
8845 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8874 bool newtarget_default;
8881 Datum repl_val[Natts_pg_attribute];
8882 bool repl_null[Natts_pg_attribute];
8883 bool repl_repl[Natts_pg_attribute];
8889 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
8890 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
8893 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8894 errmsg(
"cannot refer to non-index column by number")));
8897 if (newValue &&
intVal(newValue) != -1)
8899 newtarget =
intVal(newValue);
8900 newtarget_default =
false;
8903 newtarget_default =
true;
8905 if (!newtarget_default)
8913 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8914 errmsg(
"statistics target %d is too low",
8921 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8922 errmsg(
"lowering statistics target to %d",
8935 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8936 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8945 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8946 errmsg(
"column number %d of relation \"%s\" does not exist",
8952 attnum = attrtuple->attnum;
8955 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8956 errmsg(
"cannot alter system column \"%s\"",
8963 if (attrtuple->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8965 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8966 errmsg(
"cannot alter statistics on virtual generated column \"%s\"",
8969 if (rel->
rd_rel->relkind == RELKIND_INDEX ||
8970 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
8974 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8975 errmsg(
"cannot alter statistics on included column \"%s\" of index \"%s\"",
8979 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8980 errmsg(
"cannot alter statistics on non-expression column \"%s\" of index \"%s\"",
8982 errhint(
"Alter statistics on table column instead.")));
8986 memset(repl_null,
false,
sizeof(repl_null));
8987 memset(repl_repl,
false,
sizeof(repl_repl));
8988 if (!newtarget_default)
8989 repl_val[Anum_pg_attribute_attstattarget - 1] = newtarget;
8991 repl_null[Anum_pg_attribute_attstattarget - 1] =
true;
8992 repl_repl[Anum_pg_attribute_attstattarget - 1] =
true;
8994 repl_val, repl_null, repl_repl);
9028 Datum repl_val[Natts_pg_attribute];
9029 bool repl_null[Natts_pg_attribute];
9030 bool repl_repl[Natts_pg_attribute];
9038 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9039 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9043 attnum = attrtuple->attnum;
9046 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9047 errmsg(
"cannot alter system column \"%s\"",
9060 memset(repl_null,
false,
sizeof(repl_null));
9061 memset(repl_repl,
false,
sizeof(repl_repl));
9062 if (newOptions != (
Datum) 0)
9063 repl_val[Anum_pg_attribute_attoptions - 1] = newOptions;
9065 repl_null[Anum_pg_attribute_attoptions - 1] =
true;
9066 repl_repl[Anum_pg_attribute_attoptions - 1] =
true;
9068 repl_val, repl_null, repl_repl);
9097 bool setstorage,
char newstorage,
9098 bool setcompression,
char newcompression,
9112 for (
int i = 0;
i < indrel->
rd_index->indnatts;
i++)
9134 attrtuple->attstorage = newstorage;
9137 attrtuple->attcompression = newcompression;
9172 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9173 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9177 attnum = attrtuple->attnum;
9180 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9181 errmsg(
"cannot alter system column \"%s\"",
9197 true, attrtuple->attstorage,
9225 if (rel->
rd_rel->reloftype && !recursing)
9227 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
9228 errmsg(
"cannot drop column from typed table")));
9230 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
9251 bool recurse,
bool recursing,
9252 bool missing_ok,
LOCKMODE lockmode,
9268 Assert(!recursing || addrs != NULL);
9285 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9286 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9292 (
errmsg(
"column \"%s\" of relation \"%s\" does not exist, skipping",
9299 attnum = targetatt->attnum;
9304 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9305 errmsg(
"cannot drop system column \"%s\"",
9312 if (targetatt->attinhcount > 0 && !recursing)
9314 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9315 errmsg(
"cannot drop inherited column \"%s\"",
9327 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9328 errmsg(
"cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"",
9350 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
9352 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9353 errmsg(
"cannot drop column from only the partitioned table when partitions exist"),
9354 errhint(
"Do not specify the ONLY keyword.")));
9357 foreach(child, children)
9369 elog(
ERROR,
"cache lookup failed for attribute \"%s\" of relation %u",
9370 colName, childrelid);
9373 if (childatt->attinhcount <= 0)
9374 elog(
ERROR,
"relation %u has non-inherited attribute \"%s\"",
9375 childrelid, colName);
9384 if (childatt->attinhcount == 1 && !childatt->attislocal)
9388 behavior,
true,
true,
9389 false, lockmode, addrs);
9394 childatt->attinhcount--;
9409 childatt->attinhcount--;
9410 childatt->attislocal =
true;
9426 object.classId = RelationRelationId;
9428 object.objectSubId =
attnum;
9470 bool got_children =
false;
9508 got_children =
true;
9518 errmsg(
"column \"%s\" of table \"%s\" is not marked NOT NULL",
9532 newcmd->
def = (
Node *) nnconstr;
9534 ATPrepCmd(wqueue, rel, newcmd,
true,
false, lockmode, context);
9547 if (conForm->contype != CONSTRAINT_NOTNULL)
9548 elog(
ERROR,
"constraint %u is not a not-null constraint", conForm->oid);
9551 if (conForm->connoinherit)
9553 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9554 errmsg(
"cannot create primary key on column \"%s\"", colname),
9556 errdetail(
"The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key.",
9557 NameStr(conForm->conname), colname,
9559 errhint(
"You might need to make the existing constraint inheritable using %s.",
9560 "ALTER TABLE ... ALTER CONSTRAINT ... INHERIT"));
9563 if (!conForm->convalidated)
9565 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9566 errmsg(
"cannot create primary key on column \"%s\"", colname),
9568 errdetail(
"The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key.",
9569 NameStr(conForm->conname), colname,
9571 errhint(
"You might need to validate it using %s.",
9572 "ALTER TABLE ... VALIDATE CONSTRAINT"));
9600 check_rights = !is_rebuild;
9672 Oid index_oid =
stmt->indexOid;
9676 char *constraintName;
9677 char constraintType;
9689 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
9691 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9692 errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables")));
9702 elog(
ERROR,
"index \"%s\" is not unique", indexName);
9711 constraintName =
stmt->idxname;
9712 if (constraintName == NULL)
9713 constraintName = indexName;
9714 else if (strcmp(constraintName, indexName) != 0)
9717 (
errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"",
9718 indexName, constraintName)));
9728 constraintType = CONSTRAINT_PRIMARY;
9730 constraintType = CONSTRAINT_UNIQUE;
9762 Constraint *newConstraint,
bool recurse,
bool is_readd,
9774 switch (newConstraint->
contype)
9780 newConstraint, recurse,
false, is_readd,
9796 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
9815 elog(
ERROR,
"unrecognized constraint type: %d",
9816 (
int) newConstraint->
contype);
9842 foreach(lc, colnames)
9847 buf[buflen++] =
'_';
9854 buflen += strlen(
buf + buflen);
9878 Constraint *constr,
bool recurse,
bool recursing,
9907 recursing || is_readd,
9917 foreach(lcon, newcons)
9985 if (!recurse && children !=
NIL)
9987 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9988 errmsg(
"constraint must be added to child tables too")));
9993 foreach(child, children)
10008 constr, recurse,
true, is_readd, lockmode);
10034 bool recurse,
bool recursing,
LOCKMODE lockmode)
10049 bool pk_has_without_overlaps;
10072 if (!recurse && rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10074 errcode(ERRCODE_WRONG_OBJECT_TYPE),
10075 errmsg(
"cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"",
10079 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10080 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10082 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10083 errmsg(
"referenced relation \"%s\" is not a table",
10088 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
10089 errmsg(
"permission denied: \"%s\" is a system catalog",
10100 switch (rel->
rd_rel->relpersistence)
10102 case RELPERSISTENCE_PERMANENT:
10105 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10106 errmsg(
"constraints on permanent tables may reference only permanent tables")));
10108 case RELPERSISTENCE_UNLOGGED:
10110 && pkrel->
rd_rel->relpersistence != RELPERSISTENCE_UNLOGGED)
10112 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10113 errmsg(
"constraints on unlogged tables may reference only permanent or unlogged tables")));
10115 case RELPERSISTENCE_TEMP:
10116 if (pkrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
10118 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10119 errmsg(
"constraints on temporary tables may reference only temporary tables")));
10122 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10123 errmsg(
"constraints on temporary tables must involve temporary tables of this session")));
10133 fkattnum, fktypoid, fkcolloid);
10137 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10138 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10142 fkdelsetcols, NULL, NULL);
10159 pkattnum, pktypoid, pkcolloid,
10160 opclasses, &pk_has_without_overlaps);
10165 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10166 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10172 pkattnum, pktypoid, pkcolloid);
10177 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10178 errmsg(
"foreign key uses PERIOD on the referencing table but not the referenced table"));
10182 with_period, opclasses, &pk_has_without_overlaps);
10189 if (pk_has_without_overlaps && !with_period)
10191 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10192 errmsg(
"foreign key must use PERIOD when referencing a primary using WITHOUT OVERLAPS"));
10202 for (
i = 0;
i < numfks;
i++)
10215 (
errcode(ERRCODE_SYNTAX_ERROR),
10216 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10221 (
errcode(ERRCODE_SYNTAX_ERROR),
10222 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10234 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
10236 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10237 errmsg(
"foreign key constraints on virtual generated columns are not supported")));
10250 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10251 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10259 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10260 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10272 if (numfks != numpks)
10274 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
10275 errmsg(
"number of referencing and referenced columns for foreign key disagree")));
10284 for (
i = 0;
i < numpks;
i++)
10286 Oid pktype = pktypoid[
i];
10287 Oid fktype = fktypoid[
i];
10289 Oid pkcoll = pkcolloid[
i];
10290 Oid fkcoll = fkcolloid[
i];
10307 elog(
ERROR,
"cache lookup failed for opclass %u", opclasses[
i]);
10309 amid = cla_tup->opcmethod;
10310 opfamily = cla_tup->opcfamily;
10311 opcintype = cla_tup->opcintype;
10324 for_overlaps = with_period &&
i == numpks - 1;
10329 errcode(ERRCODE_UNDEFINED_OBJECT),
10331 ?
errmsg(
"could not identify an overlaps operator for foreign key")
10332 :
errmsg(
"could not identify an equality operator for foreign key"),
10333 errdetail(
"Could not translate compare type %d for operator family \"%s\", input type %s, access method \"%s\".",
10344 elog(
ERROR,
"missing operator %d(%u,%u) in opfamily %u",
10345 eqstrategy, opcintype, opcintype, opfamily);
10357 pfeqop_right = fktyped;
10379 Oid input_typeids[2];
10380 Oid target_typeids[2];
10382 input_typeids[0] = pktype;
10383 input_typeids[1] = fktype;
10384 target_typeids[0] = opcintype;
10385 target_typeids[1] = opcintype;
10389 pfeqop = ffeqop = ppeqop;
10390 pfeqop_right = opcintype;
10396 (
errcode(ERRCODE_DATATYPE_MISMATCH),
10397 errmsg(
"foreign key constraint \"%s\" cannot be implemented",
10399 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10400 "are of incompatible types: %s and %s.",
10411 elog(
ERROR,
"key columns are not both collatable");
10428 if ((!pkcolldet || !fkcolldet) && pkcoll != fkcoll)
10430 (
errcode(ERRCODE_COLLATION_MISMATCH),
10431 errmsg(
"foreign key constraint \"%s\" cannot be implemented", fkconstraint->
conname),
10432 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10433 "have incompatible collations: \"%s\" and \"%s\". "
10434 "If either collation is nondeterministic, then both collations have to be the same.",
10449 old_check_ok = (pfeqop ==
lfirst_oid(old_pfeqop_item));
10471 old_fktype = attr->atttypid;
10472 new_fktype = fktype;
10478 old_fkcoll = attr->attcollation;
10479 new_fkcoll = fkcoll;
10514 old_check_ok = (new_pathtype == old_pathtype &&
10515 new_castfunc == old_castfunc &&
10516 (!IsPolymorphicType(pfeqop_right) ||
10517 new_fktype == old_fktype) &&
10518 (new_fkcoll == old_fkcoll ||
10522 pfeqoperators[
i] = pfeqop;
10523 ppeqoperators[
i] = ppeqop;
10524 ffeqoperators[
i] = ffeqop;
10538 Oid aggedperiodoperoid;
10539 Oid intersectoperoid;
10542 &intersectoperoid);
10547 fkconstraint->
conname, fkconstraint, rel, pkrel,
10612 int numfksetcols,
int16 *fksetcolsattnums,
10615 int numcolsout = 0;
10617 for (
int i = 0;
i < numfksetcols;
i++)
10619 int16 setcol_attnum = fksetcolsattnums[
i];
10623 for (
int j = 0;
j < numfks;
j++)
10625 if (fkattnums[
j] == setcol_attnum)
10637 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
10638 errmsg(
"column \"%s\" referenced in ON DELETE SET action must be part of foreign key", col)));
10643 for (
int j = 0;
j < numcolsout;
j++)
10645 if (fksetcolsattnums[
j] == setcol_attnum)
10652 fksetcolsattnums[numcolsout++] = setcol_attnum;
10688 char *constraintname,
Constraint *fkconstraint,
10690 int numfks,
int16 *pkattnum,
10691 int16 *fkattnum,
Oid *pfeqoperators,
Oid *ppeqoperators,
10692 Oid *ffeqoperators,
int numfkdelsetcols,
int16 *fkdelsetcols,
10693 bool is_internal,
bool with_period)
10706 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10707 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10709 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10710 errmsg(
"referenced relation \"%s\" is not a table",
10727 conname = constraintname;
10729 if (fkconstraint->
conname == NULL)
10734 conislocal =
false;
10736 connoinherit =
false;
10746 connoinherit = rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE;
10754 CONSTRAINT_FOREIGN,
10869 Oid *ppeqoperators,
Oid *ffeqoperators,
10870 int numfkdelsetcols,
int16 *fkdelsetcols,
10872 Oid parentDelTrigger,
Oid parentUpdTrigger,
10889 parentConstr, indexOid,
10890 parentDelTrigger, parentUpdTrigger,
10891 &deleteTriggerOid, &updateTriggerOid);
10898 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10923 for (
int j = 0;
j < numfks;
j++)
10924 mapped_pkattnum[
j] = map->
attnums[pkattnum[
j] - 1];
10927 mapped_pkattnum = pkattnum;
10932 elog(
ERROR,
"index for %u not found in partition %s",
10937 fkconstraint->
conname, fkconstraint, rel,
10938 partRel, partIndexId, parentConstr,
10939 numfks, mapped_pkattnum,
10940 fkattnum, pfeqoperators, ppeqoperators,
10941 ffeqoperators, numfkdelsetcols,
10942 fkdelsetcols,
true, with_period);
10945 partIndexId, address.
objectId, numfks,
10946 mapped_pkattnum, fkattnum,
10947 pfeqoperators, ppeqoperators, ffeqoperators,
10948 numfkdelsetcols, fkdelsetcols,
10950 deleteTriggerOid, updateTriggerOid,
10957 pfree(mapped_pkattnum);
11005 int numfks,
int16 *pkattnum,
int16 *fkattnum,
11006 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
11007 int numfkdelsetcols,
int16 *fkdelsetcols,
11008 bool old_check_ok,
LOCKMODE lockmode,
11009 Oid parentInsTrigger,
Oid parentUpdTrigger,
11019 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
11021 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
11022 errmsg(
"foreign key constraints are not supported on foreign tables")));
11036 parentInsTrigger, parentUpdTrigger,
11037 &insertTriggerOid, &updateTriggerOid);
11039 if (rel->
rd_rel->relkind == RELKIND_RELATION)
11062 newcon->
conid = parentConstr;
11064 newcon->
qual = (
Node *) fkconstraint;
11069 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11101 for (
int j = 0;
j < numfks;
j++)
11102 mapped_fkattnum[
j] = attmap->
attnums[fkattnum[
j] - 1];
11135 fkconstraint->
conname, fkconstraint,
11136 partition, pkrel, indexOid, parentConstr,
11138 mapped_fkattnum, pfeqoperators,
11139 ppeqoperators, ffeqoperators,
11140 numfkdelsetcols, fkdelsetcols,
true,
11186 Assert(parentRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
11261 foreach(cell, clone)
11275 int numfkdelsetcols;
11284 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
11300 indexOid = constrForm->conindid;
11311 for (
int i = 0;
i < numfks;
i++)
11312 mapped_confkey[
i] = attmap->
attnums[confkey[
i] - 1];
11315 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11317 fkconstraint->
deferrable = constrForm->condeferrable;
11320 fkconstraint->
pktable = NULL;
11323 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11329 fkconstraint->
is_enforced = constrForm->conenforced;
11334 for (
int i = 0;
i < numfks;
i++)
11351 elog(
ERROR,
"index for %u not found in partition %s",
11359 if (constrForm->conenforced)
11361 constrForm->confrelid, constrForm->conrelid,
11362 &deleteTriggerOid, &updateTriggerOid);
11366 fkconstraint->
conname, fkconstraint, fkRel,
11367 partitionRel, partIndexId, constrOid,
11368 numfks, mapped_confkey,
11369 conkey, conpfeqop, conppeqop, conffeqop,
11370 numfkdelsetcols, confdelsetcols,
false,
11371 constrForm->conperiod);
11389 constrForm->conperiod);
11437 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
11438 errmsg(
"cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"",
11452 if (partRel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
11454 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
11455 errmsg(
"foreign key constraints are not supported on foreign tables")));
11475 foreach(cell, clone)
11488 int numfkdelsetcols;
11501 elog(
ERROR,
"cache lookup failed for constraint %u",
11517 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11522 conpfeqop, conppeqop, conffeqop,
11523 &numfkdelsetcols, confdelsetcols);
11524 for (
int i = 0;
i < numfks;
i++)
11525 mapped_conkey[
i] = attmap->
attnums[conkey[
i] - 1];
11536 if (constrForm->conenforced)
11538 constrForm->confrelid, constrForm->conrelid,
11539 &insertTriggerOid, &updateTriggerOid);
11549 foreach(lc, partFKs)
11578 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11580 fkconstraint->
deferrable = constrForm->condeferrable;
11583 fkconstraint->
pktable = NULL;
11586 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11592 fkconstraint->
is_enforced = constrForm->conenforced;
11595 for (
int i = 0;
i < numfks;
i++)
11600 mapped_conkey[
i] - 1);
11605 indexOid = constrForm->conindid;
11606 with_period = constrForm->conperiod;
11610 NameStr(constrForm->conname), fkconstraint,
11611 partRel, pkrel, indexOid, parentConstrOid,
11613 mapped_conkey, conpfeqop,
11614 conppeqop, conffeqop,
11615 numfkdelsetcols, confdelsetcols,
11616 false, with_period);
11662 Oid parentConstrOid,
11667 Oid parentInsTrigger,
11668 Oid parentUpdTrigger,
11679 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11686 if (fk->
confrelid != parentConstr->confrelid || fk->
nkeys != numfks)
11691 for (
int i = 0;
i < numfks;
i++)
11693 if (fk->conkey[
i] != mapped_conkey[
i] ||
11694 fk->confkey[
i] != confkey[
i] ||
11695 fk->conpfeqop[
i] != conpfeqop[
i])
11716 if (partConstr->conenforced != parentConstr->conenforced)
11718 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
11719 errmsg(
"constraint \"%s\" enforceability conflicts with constraint \"%s\" on relation \"%s\"",
11720 NameStr(parentConstr->conname),
11721 NameStr(partConstr->conname),
11725 partConstr->condeferrable != parentConstr->condeferrable ||
11726 partConstr->condeferred != parentConstr->condeferred ||
11727 partConstr->confupdtype != parentConstr->confupdtype ||
11728 partConstr->confdeltype != parentConstr->confdeltype ||
11729 partConstr->confmatchtype != parentConstr->confmatchtype)
11741 parentConstrOid, parentInsTrigger,
11742 parentUpdTrigger, trigrel);
11758 Oid parentConstrOid,
11759 Oid parentInsTrigger,
11760 Oid parentUpdTrigger,
11767 bool queueValidation;
11768 Oid partConstrFrelid;
11769 Oid partConstrRelid;
11770 bool parentConstrIsEnforced;
11776 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11778 parentConstrIsEnforced = parentConstr->conenforced;
11784 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11786 partConstrFrelid = partConstr->confrelid;
11787 partConstrRelid = partConstr->conrelid;
11809 queueValidation = parentConstr->convalidated && !partConstr->convalidated;
11831 if (parentConstrIsEnforced)
11833 Oid insertTriggerOid,
11837 partConstrOid, partConstrFrelid, partConstrRelid,
11838 &insertTriggerOid, &updateTriggerOid);
11858 if (queueValidation)
11866 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11893 Anum_pg_constraint_conrelid,
11898 ConstraintRelidTypidNameIndexId,
11899 true, NULL, 1, &
key);
11905 if (conform->conparentid != conoid)
11924 ConstraintRelationId,
11933 Anum_pg_trigger_tgconstraint,
11937 true, NULL, 1, &key2);
11973 Anum_pg_trigger_tgconstraint,
11986 if (
OidIsValid(conrelid) && trgform->tgconstrrelid != conrelid)
11988 if (
OidIsValid(confrelid) && trgform->tgrelid != confrelid)
11992 Assert(trgform->tgfoid == F_RI_FKEY_CHECK_INS ||
11993 trgform->tgfoid == F_RI_FKEY_CHECK_UPD ||
11994 trgform->tgfoid == F_RI_FKEY_CASCADE_DEL ||
11995 trgform->tgfoid == F_RI_FKEY_CASCADE_UPD ||
11996 trgform->tgfoid == F_RI_FKEY_RESTRICT_DEL ||
11997 trgform->tgfoid == F_RI_FKEY_RESTRICT_UPD ||
11998 trgform->tgfoid == F_RI_FKEY_SETNULL_DEL ||
11999 trgform->tgfoid == F_RI_FKEY_SETNULL_UPD ||
12000 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_DEL ||
12001 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_UPD ||
12002 trgform->tgfoid == F_RI_FKEY_NOACTION_DEL ||
12003 trgform->tgfoid == F_RI_FKEY_NOACTION_UPD);
12034 Oid conoid,
Oid confrelid,
Oid conrelid,
12035 Oid *deleteTriggerOid,
12036 Oid *updateTriggerOid)
12042 *deleteTriggerOid = *updateTriggerOid =
InvalidOid;
12044 Anum_pg_trigger_tgconstraint,
12054 if (trgform->tgconstrrelid != conrelid)
12056 if (trgform->tgrelid != confrelid)
12061 if (TRIGGER_FOR_DELETE(trgform->tgtype))
12064 *deleteTriggerOid = trgform->oid;
12066 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12069 *updateTriggerOid = trgform->oid;
12071#ifndef USE_ASSERT_CHECKING
12079 elog(
ERROR,
"could not find ON DELETE action trigger of foreign key constraint %u",
12082 elog(
ERROR,
"could not find ON UPDATE action trigger of foreign key constraint %u",
12095 Oid conoid,
Oid confrelid,
Oid conrelid,
12096 Oid *insertTriggerOid,
12097 Oid *updateTriggerOid)
12103 *insertTriggerOid = *updateTriggerOid =
InvalidOid;
12105 Anum_pg_trigger_tgconstraint,
12115 if (trgform->tgconstrrelid != confrelid)
12117 if (trgform->tgrelid != conrelid)
12122 if (TRIGGER_FOR_INSERT(trgform->tgtype))
12125 *insertTriggerOid = trgform->oid;
12127 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12130 *updateTriggerOid = trgform->oid;
12132#ifndef USE_ASSERT_CHECKING
12140 elog(
ERROR,
"could not find ON INSERT check triggers of foreign key constraint %u",
12143 elog(
ERROR,
"could not find ON UPDATE check triggers of foreign key constraint %u",
12175 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
12177 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
12178 errmsg(
"constraint must be altered in child tables too"),
12179 errhint(
"Do not specify the ONLY keyword."));
12189 Anum_pg_constraint_conrelid,
12193 Anum_pg_constraint_contypid,
12197 Anum_pg_constraint_conname,
12201 true, NULL, 3, skey);
12206 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12207 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12213 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12214 errmsg(
"constraint \"%s\" of relation \"%s\" is not a foreign key constraint",
12218 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12219 errmsg(
"cannot alter enforceability of constraint \"%s\" of relation \"%s\"",
12222 currcon->contype != CONSTRAINT_NOTNULL)
12224 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12225 errmsg(
"constraint \"%s\" of relation \"%s\" is not a not-null constraint",
12230 cmdcon->
noinherit && currcon->coninhcount > 0)
12232 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12233 errmsg(
"cannot alter inherited constraint \"%s\" on relation \"%s\"",
12249 Oid parent = currcon->conparentid;
12250 char *ancestorname = NULL;
12251 char *ancestortable = NULL;
12267 parent = contup->conparentid;
12272 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12273 errmsg(
"cannot alter constraint \"%s\" on relation \"%s\"",
12275 ancestorname && ancestortable ?
12276 errdetail(
"Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\".",
12277 cmdcon->
conname, ancestorname, ancestortable) : 0,
12278 errhint(
"You may alter the constraint it derives from instead.")));
12287 contuple, recurse, lockmode))
12309 bool changed =
false;
12328 currcon->conrelid, currcon->confrelid,
12335 contuple, recurse, &otherrelids,
12376 Oid fkrelid,
Oid pkrelid,
12378 Oid ReferencedParentDelTrigger,
12379 Oid ReferencedParentUpdTrigger,
12380 Oid ReferencingParentInsTrigger,
12381 Oid ReferencingParentUpdTrigger)
12386 bool changed =
false;
12394 conoid = currcon->oid;
12397 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12399 rel =
table_open(currcon->conrelid, lockmode);
12415 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12418 fkrelid, pkrelid, contuple,
12441 if (currcon->conrelid == fkrelid)
12443 currcon->confrelid,
12447 ReferencedParentDelTrigger,
12448 ReferencedParentUpdTrigger,
12449 &ReferencedDelTriggerOid,
12450 &ReferencedUpdTriggerOid);
12453 if (currcon->confrelid == pkrelid)
12459 ReferencingParentInsTrigger,
12460 ReferencingParentUpdTrigger,
12461 &ReferencingInsTriggerOid,
12462 &ReferencingUpdTriggerOid);
12468 if (rel->
rd_rel->relkind == RELKIND_RELATION)
12476 newcon->
refrelid = currcon->confrelid;
12477 newcon->
refindid = currcon->conindid;
12478 newcon->
conid = currcon->oid;
12479 newcon->
qual = (
Node *) fkconstraint;
12491 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12494 fkrelid, pkrelid, contuple,
12495 lockmode, ReferencedDelTriggerOid,
12496 ReferencedUpdTriggerOid,
12497 ReferencingInsTriggerOid,
12498 ReferencingUpdTriggerOid);
12524 bool changed =
false;
12532 refrelid = currcon->confrelid;
12535 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12541 if (currcon->condeferrable != cmdcon->
deferrable ||
12560 if (recurse && changed &&
12561 (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12564 contuple, recurse, otherrelids,
12588 Assert(currcon->contype == CONSTRAINT_NOTNULL);
12594 if (cmdcon->
noinherit == currcon->connoinherit)
12602 colName =
get_attname(currcon->conrelid, colNum,
false);
12621 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
12622 colName, childoid);
12624 Assert(childcon->coninhcount > 0);
12625 childcon->coninhcount--;
12626 childcon->conislocal =
true;
12635 colName,
true,
true, lockmode);
12654 bool deferrable,
bool initdeferred,
12655 List **otherrelids)
12662 Anum_pg_trigger_tgconstraint,
12689 if (tgform->tgfoid != F_RI_FKEY_NOACTION_DEL &&
12690 tgform->tgfoid != F_RI_FKEY_NOACTION_UPD &&
12691 tgform->tgfoid != F_RI_FKEY_CHECK_INS &&
12692 tgform->tgfoid != F_RI_FKEY_CHECK_UPD)
12698 copy_tg->tgdeferrable = deferrable;
12699 copy_tg->tginitdeferred = initdeferred;
12724 Oid fkrelid,
Oid pkrelid,
12726 Oid ReferencedParentDelTrigger,
12727 Oid ReferencedParentUpdTrigger,
12728 Oid ReferencingParentInsTrigger,
12729 Oid ReferencingParentUpdTrigger)
12738 conoid = currcon->oid;
12741 Anum_pg_constraint_conparentid,
12746 true, NULL, 1, &pkey);
12750 pkrelid, childtup, lockmode,
12751 ReferencedParentDelTrigger,
12752 ReferencedParentUpdTrigger,
12753 ReferencingParentInsTrigger,
12754 ReferencingParentUpdTrigger);
12783 conoid = currcon->oid;
12786 Anum_pg_constraint_conparentid,
12791 true, NULL, 1, &pkey);
12798 childrel =
table_open(childcon->conrelid, lockmode);
12801 childtup, recurse, otherrelids, lockmode);
12840 copy_con->condeferrable = cmdcon->
deferrable;
12844 copy_con->connoinherit = cmdcon->
noinherit;
12868 bool recurse,
bool recursing,
LOCKMODE lockmode)
12883 Anum_pg_constraint_conrelid,
12887 Anum_pg_constraint_contypid,
12891 Anum_pg_constraint_conname,
12895 true, NULL, 3, skey);
12900 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12901 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12905 if (con->contype != CONSTRAINT_FOREIGN &&
12906 con->contype != CONSTRAINT_CHECK &&
12907 con->contype != CONSTRAINT_NOTNULL)
12909 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12910 errmsg(
"constraint \"%s\" of relation \"%s\" is not a foreign key, check, or not-null constraint",
12913 if (!con->conenforced)
12915 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12916 errmsg(
"cannot validate NOT ENFORCED constraint")));
12918 if (!con->convalidated)
12920 if (con->contype == CONSTRAINT_FOREIGN)
12924 else if (con->contype == CONSTRAINT_CHECK)
12927 tuple, recurse, recursing, lockmode);
12929 else if (con->contype == CONSTRAINT_NOTNULL)
12932 tuple, recurse, recursing, lockmode);
12964 Assert(con->contype == CONSTRAINT_FOREIGN);
12965 Assert(!con->convalidated);
12967 if (rel->
rd_rel->relkind == RELKIND_RELATION)
12980 newcon->
refrelid = con->confrelid;
12982 newcon->
conid = con->oid;
12983 newcon->
qual = (
Node *) fkconstraint;
12994 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
13002 Anum_pg_constraint_conparentid,
13007 true, NULL, 1, &pkey);
13021 if (childcon->convalidated)
13024 childrel =
table_open(childcon->conrelid, lockmode);
13039 copy_con->convalidated =
true;
13057 bool recurse,
bool recursing,
LOCKMODE lockmode)
13071 Assert(con->contype == CONSTRAINT_CHECK);
13078 if (!recursing && !con->connoinherit)
13089 foreach(child, children)
13104 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13105 errmsg(
"constraint must be validated on child tables too")));
13117 newcon->
name = constrName;
13121 newcon->
conid = con->oid;
13124 Anum_pg_constraint_conbin);
13142 copy_con->convalidated =
true;
13159 HeapTuple contuple,
bool recurse,
bool recursing,
13171 Assert(con->contype == CONSTRAINT_NOTNULL);
13183 if (!recursing && !con->connoinherit)
13204 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13205 errmsg(
"constraint must be validated on child tables too"));
13213 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
13216 if (childcon->convalidated)
13225 false,
true, lockmode);
13245 copy_con->convalidated =
true;
13272 foreach(l, colList)
13281 (
errcode(ERRCODE_UNDEFINED_COLUMN),
13282 errmsg(
"column \"%s\" referenced in foreign key constraint does not exist",
13285 if (attform->attnum < 0)
13287 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
13288 errmsg(
"system columns cannot be used in foreign keys")));
13291 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
13292 errmsg(
"cannot have more than %d keys in a foreign key",
13294 attnums[
attnum] = attform->attnum;
13295 if (atttypids != NULL)
13296 atttypids[
attnum] = attform->atttypid;
13297 if (attcollids != NULL)
13298 attcollids[
attnum] = attform->attcollation;
13321 List **attnamelist,
13323 Oid *opclasses,
bool *pk_has_without_overlaps)
13325 List *indexoidlist;
13329 Datum indclassDatum;
13342 foreach(indexoidscan, indexoidlist)
13348 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13350 if (indexStruct->indisprimary && indexStruct->indisvalid)
13357 if (!indexStruct->indimmediate)
13359 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13360 errmsg(
"cannot use a deferrable primary key for referenced table \"%s\"",
13363 *indexOid = indexoid;
13376 (
errcode(ERRCODE_UNDEFINED_OBJECT),
13377 errmsg(
"there is no primary key for referenced table \"%s\"",
13382 Anum_pg_index_indclass);
13389 *attnamelist =
NIL;
13390 for (
i = 0;
i < indexStruct->indnkeyatts;
i++)
13392 int pkattno = indexStruct->indkey.values[
i];
13394 attnums[
i] = pkattno;
13397 opclasses[
i] = indclass->
values[
i];
13398 *attnamelist =
lappend(*attnamelist,
13402 *pk_has_without_overlaps = indexStruct->indisexclusion;
13424 int numattrs,
int16 *attnums,
13425 bool with_period,
Oid *opclasses,
13426 bool *pk_has_without_overlaps)
13429 bool found =
false;
13430 bool found_deferrable =
false;
13431 List *indexoidlist;
13443 for (
i = 0;
i < numattrs;
i++)
13445 for (
j =
i + 1;
j < numattrs;
j++)
13447 if (attnums[
i] == attnums[
j])
13449 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13450 errmsg(
"foreign key referenced-columns list must not contain duplicates")));
13461 foreach(indexoidscan, indexoidlist)
13469 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13477 if (indexStruct->indnkeyatts == numattrs &&
13478 (with_period ? indexStruct->indisexclusion : indexStruct->indisunique) &&
13479 indexStruct->indisvalid &&
13483 Datum indclassDatum;
13488 Anum_pg_index_indclass);
13501 for (
i = 0;
i < numattrs;
i++)
13504 for (
j = 0;
j < numattrs;
j++)
13506 if (attnums[
i] == indexStruct->indkey.values[
j])
13508 opclasses[
i] = indclass->
values[
j];
13517 if (found && with_period)
13519 int16 periodattnum = attnums[numattrs - 1];
13521 found = (periodattnum == indexStruct->indkey.values[numattrs - 1]);
13529 if (found && !indexStruct->indimmediate)
13535 found_deferrable =
true;
13541 *pk_has_without_overlaps = indexStruct->indisexclusion;
13550 if (found_deferrable)
13552 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13553 errmsg(
"cannot use a deferrable unique constraint for referenced table \"%s\"",
13557 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13558 errmsg(
"there is no unique constraint matching given keys for referenced table \"%s\"",
13578 if (targetTypeId == sourceTypeId)
13589 elog(
ERROR,
"could not find cast from %u to %u",
13590 sourceTypeId, targetTypeId);
13615 for (
i = 0;
i < natts;
i++)
13647 (
errmsg_internal(
"validating foreign key constraint \"%s\"", conname)));
13682 "validateForeignKeyConstraint",
13703 trigdata.
type = T_TriggerData;
13710 fcinfo->context = (
Node *) &trigdata;
13733 Oid constraintOid,
Oid indexOid,
Oid parentTrigOid,
13751 fk_trigger->
trigname =
"RI_ConstraintTrigger_c";
13758 fk_trigger->
events = TRIGGER_TYPE_INSERT;
13763 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13767 fk_trigger->
row =
true;
13768 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13776 trigAddress =
CreateTrigger(fk_trigger, NULL, myRelOid, refRelOid,
13778 parentTrigOid, NULL,
true,
false);
13796 Oid constraintOid,
Oid indexOid,
13797 Oid parentDelTrigger,
Oid parentUpdTrigger,
13798 Oid *deleteTrigOid,
Oid *updateTrigOid)
13810 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13813 fk_trigger->
row =
true;
13814 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13815 fk_trigger->
events = TRIGGER_TYPE_DELETE;
13849 elog(
ERROR,
"unrecognized FK action type: %d",
13854 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13856 parentDelTrigger, NULL,
true,
false);
13858 *deleteTrigOid = trigAddress.
objectId;
13870 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13873 fk_trigger->
row =
true;
13874 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13875 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13909 elog(
ERROR,
"unrecognized FK action type: %d",
13914 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13916 parentUpdTrigger, NULL,
true,
false);
13918 *updateTrigOid = trigAddress.
objectId;
13933 Oid parentInsTrigger,
Oid parentUpdTrigger,
13934 Oid *insertTrigOid,
Oid *updateTrigOid)
13937 constraintOid, indexOid,
13938 parentInsTrigger,
true);
13940 constraintOid, indexOid,
13941 parentUpdTrigger,
false);
13952 bool missing_ok,
LOCKMODE lockmode)
13958 bool found =
false;
13966 Anum_pg_constraint_conrelid,
13970 Anum_pg_constraint_contypid,
13974 Anum_pg_constraint_conname,
13978 true, NULL, 3, skey);
13984 missing_ok, lockmode);
13994 errcode(ERRCODE_UNDEFINED_OBJECT),
13995 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
13999 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist, skipping",
14016 bool recurse,
bool recursing,
bool missing_ok,
14023 bool is_no_inherit_constraint =
false;
14025 char *colname = NULL;
14038 constrName =
NameStr(con->conname);
14041 if (con->coninhcount > 0 && !recursing)
14043 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14044 errmsg(
"cannot drop inherited constraint \"%s\" of relation \"%s\"",
14054 if (con->contype == CONSTRAINT_NOTNULL)
14075 if (pkattrs == NULL &&
14076 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14085 for (
int i = 0;
i < pk->
rd_index->indnkeyatts;
i++)
14095 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14096 errmsg(
"column \"%s\" is in a primary key",
14103 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14104 errmsg(
"column \"%s\" is in index used as replica identity",
14110 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
14113 if (attForm->attidentity !=
'\0')
14115 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
14116 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
14122 if (attForm->attnotnull)
14124 attForm->attnotnull =
false;
14131 is_no_inherit_constraint = con->connoinherit;
14140 if (con->contype == CONSTRAINT_FOREIGN &&
14161 if (con->contype != CONSTRAINT_CHECK &&
14162 con->contype != CONSTRAINT_NOTNULL &&
14163 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14174 if (!is_no_inherit_constraint)
14193 if (con->contype == CONSTRAINT_NOTNULL)
14197 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
14206 Anum_pg_constraint_conrelid,
14210 Anum_pg_constraint_contypid,
14214 Anum_pg_constraint_conname,
14218 true, NULL, 3, skey);
14223 (
errcode(ERRCODE_UNDEFINED_OBJECT),
14224 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
14234 if (childcon->contype != CONSTRAINT_CHECK &&
14235 childcon->contype != CONSTRAINT_NOTNULL)
14236 elog(
ERROR,
"inherited constraint is not a CHECK or not-null constraint");
14238 if (childcon->coninhcount <= 0)
14239 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
14240 childrelid,
NameStr(childcon->conname));
14248 if (childcon->coninhcount == 1 && !childcon->conislocal)
14252 recurse,
true, missing_ok,
14258 childcon->coninhcount--;
14273 childcon->coninhcount--;
14274 if (childcon->coninhcount == 0)
14275 childcon->conislocal =
true;
14313 bool recurse,
bool recursing,
14317 char *colName = cmd->
name;
14325 int32 targettypmod;
14334 if (rel->
rd_rel->reloftype && !recursing)
14336 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14337 errmsg(
"cannot alter column type of typed table"),
14344 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14345 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14349 attnum = attTup->attnum;
14354 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14355 errmsg(
"cannot alter system column \"%s\"", colName),
14364 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
14365 errmsg(
"cannot specify USING when altering type of generated column"),
14366 errdetail(
"Column \"%s\" is a generated column.", colName),
14374 if (attTup->attinhcount > 0 && !recursing)
14376 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14377 errmsg(
"cannot alter inherited column \"%s\"", colName),
14385 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14386 errmsg(
"cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"",
14405 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14409 else if (tab->
relkind == RELKIND_RELATION ||
14410 tab->
relkind == RELKIND_PARTITIONED_TABLE)
14424 attTup->atttypid, attTup->atttypmod,
14425 attTup->attcollation,
14431 targettype, targettypmod,
14435 if (transform == NULL)
14440 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14441 errmsg(
"result of USING clause for column \"%s\""
14442 " cannot be cast automatically to type %s",
14444 errhint(
"You might need to add an explicit cast.")));
14447 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14448 errmsg(
"column \"%s\" cannot be cast automatically to type %s",
14450 !attTup->attgenerated ?
14452 errhint(
"You might need to specify \"USING %s::%s\".",
14455 targettypmod)) : 0));
14471 newval->is_generated =
false;
14477 else if (transform)
14479 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14480 errmsg(
"\"%s\" is not a table",
14483 if (!RELKIND_HAS_STORAGE(tab->
relkind) || attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14512 &child_numparents);
14519 forboth(lo, child_oids, li, child_numparents)
14527 if (childrelid == relid)
14544 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14545 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14549 if (childattTup->attinhcount > numparents)
14551 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14552 errmsg(
"cannot alter inherited column \"%s\" of relation \"%s\"",
14564 bool found_whole_row;
14577 if (found_whole_row)
14579 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14580 errmsg(
"cannot convert whole-row table reference"),
14581 errdetail(
"USING expression contains a whole-row table reference.")));
14584 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
14588 else if (!recursing &&
14591 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14592 errmsg(
"type of inherited column \"%s\" must be changed in child tables too",
14595 if (tab->
relkind == RELKIND_COMPOSITE_TYPE)
14621 if (
IsA(expr,
Var) && ((
Var *) expr)->varattno == varattno)
14639 case F_TIMESTAMPTZ_TIMESTAMP:
14640 case F_TIMESTAMP_TIMESTAMPTZ:
14664 char *colName = cmd->
name;
14674 int32 targettypmod;
14705 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14706 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14709 attnum = attTup->attnum;
14713 if (attTup->atttypid != attOldTup->atttypid ||
14714 attTup->atttypmod != attOldTup->atttypmod)
14716 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14717 errmsg(
"cannot alter type of column \"%s\" twice",
14721 typeTuple =
typenameType(NULL, typeName, &targettypmod);
14723 targettype = tform->oid;
14739 if (attTup->atthasdef)
14745 defaultexpr,
exprType(defaultexpr),
14746 targettype, targettypmod,
14750 if (defaultexpr == NULL)
14752 if (attTup->attgenerated)
14754 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14755 errmsg(
"generation expression for column \"%s\" cannot be cast automatically to type %s",
14759 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14760 errmsg(
"default for column \"%s\" cannot be cast automatically to type %s",
14765 defaultexpr = NULL;
14786 Anum_pg_depend_classid,
14790 Anum_pg_depend_objid,
14794 Anum_pg_depend_objsubid,
14806 foundObject.
classId = foundDep->refclassid;
14807 foundObject.
objectId = foundDep->refobjid;
14811 elog(
ERROR,
"found unexpected dependency type '%c'",
14812 foundDep->deptype);
14813 if (!(foundDep->refclassid == TypeRelationId &&
14814 foundDep->refobjid == attTup->atttypid) &&
14815 !(foundDep->refclassid == CollationRelationId &&
14816 foundDep->refobjid == attTup->attcollation))
14817 elog(
ERROR,
"found unexpected dependency for column: %s",
14832 if (attTup->atthasmissing)
14842 Anum_pg_attribute_attmissingval,
14843 attrelation->rd_att,
14859 Datum valuesAtt[Natts_pg_attribute] = {0};
14860 bool nullsAtt[Natts_pg_attribute] = {0};
14861 bool replacesAtt[Natts_pg_attribute] = {0};
14879 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
14880 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
14881 nullsAtt[Anum_pg_attribute_attmissingval - 1] =
false;
14884 valuesAtt, nullsAtt, replacesAtt);
14891 attTup->atttypid = targettype;
14892 attTup->atttypmod = targettypmod;
14893 attTup->attcollation = targetcollid;
14896 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
14897 errmsg(
"too many array dimensions"));
14898 attTup->attndims =
list_length(typeName->arrayBounds);
14899 attTup->attlen = tform->typlen;
14900 attTup->attbyval = tform->typbyval;
14901 attTup->attalign = tform->typalign;
14902 attTup->attstorage = tform->typstorage;
14937 if (attTup->attgenerated)
14942 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
14991 Anum_pg_depend_refclassid,
14995 Anum_pg_depend_refobjid,
14999 Anum_pg_depend_refobjsubid,
15011 foundObject.
classId = foundDep->classid;
15012 foundObject.
objectId = foundDep->objid;
15017 case RelationRelationId:
15021 if (relKind == RELKIND_INDEX ||
15022 relKind == RELKIND_PARTITIONED_INDEX)
15027 else if (relKind == RELKIND_SEQUENCE)
15038 elog(
ERROR,
"unexpected object depending on column: %s",
15044 case ConstraintRelationId:
15049 case ProcedureRelationId:
15063 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15064 errmsg(
"cannot alter type of a column used by a function or procedure"),
15065 errdetail(
"%s depends on column \"%s\"",
15070 case RewriteRelationId:
15078 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15079 errmsg(
"cannot alter type of a column used by a view or rule"),
15080 errdetail(
"%s depends on column \"%s\"",
15085 case TriggerRelationId:
15098 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15099 errmsg(
"cannot alter type of a column used in a trigger definition"),
15100 errdetail(
"%s depends on column \"%s\"",
15105 case PolicyRelationId:
15117 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15118 errmsg(
"cannot alter type of a column used in a policy definition"),
15119 errdetail(
"%s depends on column \"%s\"",
15124 case AttrDefaultRelationId:
15148 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15149 errmsg(
"cannot alter type of a column used by a generated column"),
15150 errdetail(
"Column \"%s\" is used by generated column \"%s\".",
15159 case StatisticExtRelationId:
15168 case PublicationRelRelationId:
15176 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15177 errmsg(
"cannot alter type of a column used by a publication WHERE clause"),
15178 errdetail(
"%s depends on column \"%s\"",
15189 elog(
ERROR,
"unexpected object depending on column: %s",
15210 elog(
ERROR,
"relation %u has multiple indexes marked as replica identity", tab->
relid);
15225 elog(
ERROR,
"relation %u has multiple clustered indexes", tab->
relid);
15411 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15414 relid = con->conrelid;
15420 elog(
ERROR,
"could not identify relation associated with constraint %u", oldId);
15422 confrelid = con->confrelid;
15423 contype = con->contype;
15424 conislocal = con->conislocal;
15446 if (relid != tab->
relid && contype == CONSTRAINT_FOREIGN)
15450 (
char *)
lfirst(def_item),
15451 wqueue, lockmode, tab->
rewrite);
15453 forboth(oid_item, tab->changedIndexOids,
15454 def_item, tab->changedIndexDefs)
15461 (
char *)
lfirst(def_item),
15462 wqueue, lockmode, tab->rewrite);
15469 forboth(oid_item, tab->changedStatisticsOids,
15470 def_item, tab->changedStatisticsDefs)
15477 (
char *)
lfirst(def_item),
15478 wqueue, lockmode, tab->rewrite);
15487 if (tab->replicaIdentityIndex)
15493 subcmd->
name = tab->replicaIdentityIndex;
15505 if (tab->clusterOnIndex)
15510 cmd->
name = tab->clusterOnIndex;
15543 List *raw_parsetree_list;
15544 List *querytree_list;
15555 querytree_list =
NIL;
15556 foreach(list_item, raw_parsetree_list)
15562 querytree_list =
lappend(querytree_list,
15576 querytree_list =
list_concat(querytree_list, beforeStmts);
15578 querytree_list =
list_concat(querytree_list, afterStmts);
15581 querytree_list =
lappend(querytree_list,
15600 foreach(list_item, querytree_list)
15614 stmt->reset_default_tblspc =
true;
15629 foreach(lcmd,
stmt->cmds)
15645 RelationRelationId, 0);
15667 !rewrite && tab->
rewrite == 0)
15691 elog(
ERROR,
"unexpected statement subtype: %d",
15699 if (
stmt->subtype ==
'C')
15718 elog(
ERROR,
"unexpected statement subtype: %d",
15719 (
int)
stmt->subtype);
15727 stmt->stxcomment =
GetComment(oldId, StatisticExtRelationId, 0);
15736 elog(
ERROR,
"unexpected statement type: %d",
15756 const char *conname)
15763 comment_str =
GetComment(objid, ConstraintRelationId, 0);
15764 if (comment_str == NULL)
15801 stmt->accessMethod,
15803 stmt->excludeOpNames,
15804 stmt->iswithoutoverlaps))
15809 if (irel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
15841 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15844 Anum_pg_constraint_conpfeqop);
15851 elog(
ERROR,
"conpfeqop is not a 1-D Oid array");
15855 for (
i = 0;
i < numkeys;
i++)
15868 const char *colName,
15879 Datum repl_val[Natts_pg_attribute];
15880 bool repl_null[Natts_pg_attribute];
15881 bool repl_repl[Natts_pg_attribute];
15896 (
errcode(ERRCODE_UNDEFINED_OBJECT),
15897 errmsg(
"foreign table \"%s\" does not exist",
15910 (
errcode(ERRCODE_UNDEFINED_COLUMN),
15911 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
15916 attnum = atttableform->attnum;
15919 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15920 errmsg(
"cannot alter system column \"%s\"", colName)));
15924 memset(repl_val, 0,
sizeof(repl_val));
15925 memset(repl_null,
false,
sizeof(repl_null));
15926 memset(repl_repl,
false,
sizeof(repl_repl));
15931 Anum_pg_attribute_attfdwoptions,
15943 repl_val[Anum_pg_attribute_attfdwoptions - 1] = datum;
15945 repl_null[Anum_pg_attribute_attfdwoptions - 1] =
true;
15947 repl_repl[Anum_pg_attribute_attfdwoptions - 1] =
true;
15952 repl_val, repl_null, repl_repl);
15958 atttableform->attnum);
16002 elog(
ERROR,
"cache lookup failed for relation %u", relationOid);
16006 switch (tuple_class->relkind)
16008 case RELKIND_RELATION:
16010 case RELKIND_MATVIEW:
16011 case RELKIND_FOREIGN_TABLE:
16012 case RELKIND_PARTITIONED_TABLE:
16015 case RELKIND_INDEX:
16025 if (tuple_class->relowner != newOwnerId)
16027 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16028 errmsg(
"cannot change owner of index \"%s\"",
16029 NameStr(tuple_class->relname)),
16030 errhint(
"Change the ownership of the index's table instead.")));
16032 newOwnerId = tuple_class->relowner;
16035 case RELKIND_PARTITIONED_INDEX:
16039 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16040 errmsg(
"cannot change owner of index \"%s\"",
16041 NameStr(tuple_class->relname)),
16042 errhint(
"Change the ownership of the index's table instead.")));
16044 case RELKIND_SEQUENCE:
16046 tuple_class->relowner != newOwnerId)
16055 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16056 errmsg(
"cannot change owner of sequence \"%s\"",
16057 NameStr(tuple_class->relname)),
16058 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
16059 NameStr(tuple_class->relname),
16063 case RELKIND_COMPOSITE_TYPE:
16067 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16068 errmsg(
"\"%s\" is a composite type",
16069 NameStr(tuple_class->relname)),
16074 case RELKIND_TOASTVALUE:
16080 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16081 errmsg(
"cannot change owner of relation \"%s\"",
16082 NameStr(tuple_class->relname)),
16090 if (tuple_class->relowner != newOwnerId)
16092 Datum repl_val[Natts_pg_class];
16093 bool repl_null[Natts_pg_class];
16094 bool repl_repl[Natts_pg_class];
16106 Oid namespaceOid = tuple_class->relnamespace;
16118 aclresult =
object_aclcheck(NamespaceRelationId, namespaceOid, newOwnerId,
16126 memset(repl_null,
false,
sizeof(repl_null));
16127 memset(repl_repl,
false,
sizeof(repl_repl));
16129 repl_repl[Anum_pg_class_relowner - 1] =
true;
16137 Anum_pg_class_relacl,
16142 tuple_class->relowner, newOwnerId);
16143 repl_repl[Anum_pg_class_relacl - 1] =
true;
16158 tuple_class->relowner,
16166 if (tuple_class->relkind != RELKIND_COMPOSITE_TYPE &&
16167 tuple_class->relkind != RELKIND_INDEX &&
16168 tuple_class->relkind != RELKIND_PARTITIONED_INDEX &&
16169 tuple_class->relkind != RELKIND_TOASTVALUE)
16184 if (tuple_class->relkind == RELKIND_RELATION ||
16185 tuple_class->relkind == RELKIND_PARTITIONED_TABLE ||
16186 tuple_class->relkind == RELKIND_MATVIEW ||
16187 tuple_class->relkind == RELKIND_TOASTVALUE)
16189 List *index_oid_list;
16196 foreach(
i, index_oid_list)
16203 if (tuple_class->reltoastrelid !=
InvalidOid)
16234 Anum_pg_attribute_attrelid,
16238 true, NULL, 1,
key);
16242 Datum repl_val[Natts_pg_attribute];
16243 bool repl_null[Natts_pg_attribute];
16244 bool repl_repl[Natts_pg_attribute];
16251 if (att->attisdropped)
16255 Anum_pg_attribute_attacl,
16262 memset(repl_null,
false,
sizeof(repl_null));
16263 memset(repl_repl,
false,
sizeof(repl_repl));
16266 oldOwnerId, newOwnerId);
16267 repl_repl[Anum_pg_attribute_attacl - 1] =
true;
16272 repl_val, repl_null, repl_repl);
16304 Anum_pg_depend_refclassid,
16308 Anum_pg_depend_refobjid,
16322 if (depForm->refobjsubid == 0 ||
16323 depForm->classid != RelationRelationId ||
16324 depForm->objsubid != 0 ||
16368 (
errcode(ERRCODE_UNDEFINED_OBJECT),
16369 errmsg(
"index \"%s\" for table \"%s\" does not exist",
16379 RelationRelationId, indexOid);
16412 if (amname != NULL)
16414 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
16420 if (rel->
rd_rel->relam == amoid)
16440 Oid oldAccessMethodId;
16456 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
16460 oldAccessMethodId = rd_rel->relam;
16461 rd_rel->relam = newAccessMethodId;
16464 if (rd_rel->relam == oldAccessMethodId)
16500 AccessMethodRelationId,
16510 AccessMethodRelationId,
16511 oldAccessMethodId, rd_rel->relam);
16547 (
errcode(ERRCODE_SYNTAX_ERROR),
16548 errmsg(
"cannot have multiple SET TABLESPACE subcommands")));
16566 Datum repl_val[Natts_pg_class];
16567 bool repl_null[Natts_pg_class];
16568 bool repl_repl[Natts_pg_class];
16580 elog(
ERROR,
"cache lookup failed for relation %u", relid);
16606 switch (rel->
rd_rel->relkind)
16608 case RELKIND_RELATION:
16609 case RELKIND_MATVIEW:
16612 case RELKIND_PARTITIONED_TABLE:
16618 case RELKIND_INDEX:
16619 case RELKIND_PARTITIONED_INDEX:
16622 case RELKIND_TOASTVALUE:
16626 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16627 errmsg(
"cannot set options for relation \"%s\"",
16634 if (rel->
rd_rel->relkind == RELKIND_VIEW)
16639 bool check_option =
false;
16641 foreach(cell, view_options)
16645 if (strcmp(defel->
defname,
"check_option") == 0)
16646 check_option =
true;
16655 const char *view_updatable_error =
16658 if (view_updatable_error)
16660 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16661 errmsg(
"WITH CHECK OPTION is supported only on automatically updatable views"),
16662 errhint(
"%s",
_(view_updatable_error))));
16670 memset(repl_val, 0,
sizeof(repl_val));
16671 memset(repl_null,
false,
sizeof(repl_null));
16672 memset(repl_repl,
false,
sizeof(repl_repl));
16674 if (newOptions != (
Datum) 0)
16675 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16677 repl_null[Anum_pg_class_reloptions - 1] =
true;
16679 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16682 repl_val, repl_null, repl_repl);
16697 Oid toastid = rel->
rd_rel->reltoastrelid;
16704 elog(
ERROR,
"cache lookup failed for relation %u", toastid);
16730 memset(repl_val, 0,
sizeof(repl_val));
16731 memset(repl_null,
false,
sizeof(repl_null));
16732 memset(repl_repl,
false,
sizeof(repl_repl));
16734 if (newOptions != (
Datum) 0)
16735 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16737 repl_null[Anum_pg_class_reloptions - 1] =
true;
16739 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16742 repl_val, repl_null, repl_repl);
16788 reltoastrelid = rel->
rd_rel->reltoastrelid;
16803 rel->
rd_rel->relpersistence);
16807 newrlocator.
relNumber = newrelfilenumber;
16808 newrlocator.
spcOid = newTableSpace;
16811 if (rel->
rd_rel->relkind == RELKIND_INDEX)
16843 foreach(lc, reltoastidxids)
16905 Oid orig_tablespaceoid;
16906 Oid new_tablespaceoid;
16913 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16914 errmsg(
"only tables, indexes, and materialized views exist in tablespaces")));
16922 if (orig_tablespaceoid == GLOBALTABLESPACE_OID ||
16923 new_tablespaceoid == GLOBALTABLESPACE_OID)
16925 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16926 errmsg(
"cannot move relations in to or out of pg_global tablespace")));
16955 if (orig_tablespaceoid == new_tablespaceoid)
16956 return new_tablespaceoid;
16963 Anum_pg_class_reltablespace,
16972 Oid relOid = relForm->oid;
16983 relForm->relisshared ||
16990 relForm->relkind != RELKIND_RELATION &&
16991 relForm->relkind != RELKIND_PARTITIONED_TABLE) ||
16993 relForm->relkind != RELKIND_INDEX &&
16994 relForm->relkind != RELKIND_PARTITIONED_INDEX) ||
16996 relForm->relkind != RELKIND_MATVIEW))
17014 if (
stmt->nowait &&
17017 (
errcode(ERRCODE_OBJECT_IN_USE),
17018 errmsg(
"aborting because lock on relation \"%s.%s\" is not available",
17020 NameStr(relForm->relname))));
17031 if (relations ==
NIL)
17033 (
errcode(ERRCODE_NO_DATA_FOUND),
17034 errmsg(
"no matching relations in tablespace \"%s\" found",
17035 orig_tablespaceoid ==
InvalidOid ?
"(database default)" :
17039 foreach(l, relations)
17045 cmd->
name =
stmt->new_tablespacename;
17055 return new_tablespaceoid;
17082 rel->
rd_rel->relpersistence);
17097 (rel->
rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED &&
17101 rel->
rd_rel->relpersistence);
17117 char fires_when,
bool skip_system,
bool recurse,
17121 fires_when, skip_system, recurse,
17135 char fires_when,
LOCKMODE lockmode)
17153 if (child_rel->
rd_rel->reloftype)
17155 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17156 errmsg(
"cannot change inheritance of typed table")));
17158 if (child_rel->
rd_rel->relispartition)
17160 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17161 errmsg(
"cannot change inheritance of a partition")));
17163 if (child_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17165 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17166 errmsg(
"cannot change inheritance of partitioned table")));
17178 const char *trigger_name;
17194 if (parent_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17195 child_rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
17197 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17198 errmsg(
"cannot inherit from temporary relation \"%s\"",
17202 if (parent_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17205 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17206 errmsg(
"cannot inherit from temporary relation of another session")));
17209 if (child_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17212 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17213 errmsg(
"cannot inherit to temporary relation of another session")));
17216 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17218 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17219 errmsg(
"cannot inherit from partitioned table \"%s\"",
17223 if (parent_rel->
rd_rel->relispartition)
17225 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17226 errmsg(
"cannot inherit from a partition")));
17247 (
errcode(ERRCODE_DUPLICATE_TABLE),
17248 errmsg(
"circular inheritance not allowed"),
17249 errdetail(
"\"%s\" is already a child of \"%s\".",
17259 if (trigger_name != NULL)
17261 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
17262 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming an inheritance child",
17264 errdetail(
"ROW triggers with transition tables are not supported in inheritance hierarchies.")));
17307 Anum_pg_inherits_inhrelid,
17311 true, NULL, 1, &
key);
17321 (
errcode(ERRCODE_DUPLICATE_TABLE),
17322 errmsg(
"relation \"%s\" would be inherited from more than once",
17325 if (inh->inhseqno > inhseqno)
17326 inhseqno = inh->inhseqno;
17343 parent_rel->
rd_rel->relkind ==
17344 RELKIND_PARTITIONED_TABLE);
17363 attr =
heap_getattr(contup, Anum_pg_constraint_conbin, tupdesc, &isnull);
17365 elog(
ERROR,
"null conbin for constraint %u", con->oid);
17388 if (acon->condeferrable != bcon->condeferrable ||
17389 acon->condeferred != bcon->condeferred ||
17420 for (
AttrNumber parent_attno = 1; parent_attno <= parent_desc->
natts; parent_attno++)
17423 char *parent_attname =
NameStr(parent_att->attname);
17427 if (parent_att->attisdropped)
17436 if (parent_att->atttypid != child_att->atttypid ||
17437 parent_att->atttypmod != child_att->atttypmod)
17439 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17440 errmsg(
"child table \"%s\" has different type for column \"%s\"",
17443 if (parent_att->attcollation != child_att->attcollation)
17445 (
errcode(ERRCODE_COLLATION_MISMATCH),
17446 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
17455 if (parent_att->attnotnull && !child_att->attnotnull)
17460 parent_att->attnum);
17464 errcode(ERRCODE_DATATYPE_MISMATCH),
17465 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17472 if (parent_att->attgenerated && !child_att->attgenerated)
17474 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17475 errmsg(
"column \"%s\" in child table must be a generated column", parent_attname)));
17476 if (child_att->attgenerated && !parent_att->attgenerated)
17478 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17479 errmsg(
"column \"%s\" in child table must not be a generated column", parent_attname)));
17481 if (parent_att->attgenerated && child_att->attgenerated && child_att->attgenerated != parent_att->attgenerated)
17483 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17484 errmsg(
"column \"%s\" inherits from generated column of different kind", parent_attname),
17485 errdetail(
"Parent column is %s, child column is %s.",
17486 parent_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
17487 child_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
17495 child_att->attidentity = parent_att->attidentity;
17502 &child_att->attinhcount))
17504 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17505 errmsg(
"too many inheritance parents"));
17512 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17514 Assert(child_att->attinhcount == 1);
17515 child_att->attislocal =
false;
17524 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17525 errmsg(
"child table is missing column \"%s\"", parent_attname)));
17563 Anum_pg_constraint_conrelid,
17567 true, NULL, 1, &parent_key);
17580 bool found =
false;
17582 if (parent_con->contype != CONSTRAINT_CHECK &&
17583 parent_con->contype != CONSTRAINT_NOTNULL)
17587 if (parent_con->connoinherit)
17590 if (parent_con->contype == CONSTRAINT_NOTNULL)
17597 Anum_pg_constraint_conrelid,
17601 true, NULL, 1, &child_key);
17608 if (child_con->contype != parent_con->contype)
17615 if (child_con->contype == CONSTRAINT_CHECK)
17617 if (strcmp(
NameStr(parent_con->conname),
17618 NameStr(child_con->conname)) != 0)
17621 else if (child_con->contype == CONSTRAINT_NOTNULL)
17629 if (parent_attno != attmap->
attnums[child_attno - 1])
17634 if (parent_attr->attisdropped || child_attr->attisdropped)
17635 elog(
ERROR,
"found not-null constraint on dropped columns");
17638 if (child_con->contype == CONSTRAINT_CHECK &&
17641 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17642 errmsg(
"child table \"%s\" has different definition for check constraint \"%s\"",
17648 if (child_con->connoinherit)
17650 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17651 errmsg(
"constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"",
17658 if (parent_con->convalidated && child_con->conenforced &&
17659 !child_con->convalidated)
17661 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17662 errmsg(
"constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"",
17670 if (parent_con->conenforced && !child_con->conenforced)
17672 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17673 errmsg(
"constraint \"%s\" conflicts with NOT ENFORCED constraint on child table \"%s\"",
17684 &child_con->coninhcount))
17686 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17687 errmsg(
"too many inheritance parents"));
17694 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17696 Assert(child_con->coninhcount == 1);
17697 child_con->conislocal =
false;
17711 if (parent_con->contype == CONSTRAINT_NOTNULL)
17713 errcode(ERRCODE_DATATYPE_MISMATCH),
17714 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17721 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17722 errmsg(
"child table is missing constraint \"%s\"",
17723 NameStr(parent_con->conname))));
17742 if (rel->
rd_rel->relispartition)
17744 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17745 errmsg(
"cannot change inheritance of a partition")));
17785 bool found =
false;
17787 Assert(parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17795 Anum_pg_inherits_inhparent,
17799 true, NULL, 1, &
key);
17806 if (inhForm->inhdetachpending)
17808 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
17809 errmsg(
"partition \"%s\" already pending detach in partitioned table \"%s.%s\"",
17813 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
17838 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17873 bool is_partitioning;
17875 is_partitioning = (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17883 if (is_partitioning)
17886 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17892 errmsg(
"relation \"%s\" is not a parent of relation \"%s\"",
17902 Anum_pg_attribute_attrelid,
17906 true, NULL, 1,
key);
17912 if (att->attisdropped)
17914 if (att->attinhcount <= 0)
17924 copy_att->attinhcount--;
17925 if (copy_att->attinhcount == 0)
17926 copy_att->attislocal =
true;
17950 Anum_pg_constraint_conrelid,
17954 true, NULL, 1,
key);
17963 if (con->connoinherit)
17966 if (con->contype == CONSTRAINT_CHECK)
17968 if (con->contype == CONSTRAINT_NOTNULL)
17980 Anum_pg_constraint_conrelid,
17984 true, NULL, 1,
key);
17989 bool match =
false;
17995 if (con->contype == CONSTRAINT_CHECK)
17999 if (con->contype == CONSTRAINT_CHECK &&
18000 strcmp(
NameStr(con->conname), chkname) == 0)
18008 else if (con->contype == CONSTRAINT_NOTNULL)
18014 if (prevattno == child_attno)
18031 if (copy_con->coninhcount <= 0)
18032 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
18035 copy_con->coninhcount--;
18036 if (copy_con->coninhcount == 0)
18037 copy_con->conislocal =
true;
18045 if (connames !=
NIL || nncolumns !=
NIL)
18046 elog(
ERROR,
"%d unmatched constraints while removing inheritance from \"%s\" to \"%s\"",
18054 RelationRelationId,
18087 Anum_pg_depend_classid,
18091 Anum_pg_depend_objid,
18095 Anum_pg_depend_objsubid,
18106 if (dep->refclassid == refclassid &&
18107 dep->refobjid == refobjid &&
18108 dep->refobjsubid == 0 &&
18109 dep->deptype == deptype)
18150 typeid = typeform->oid;
18155 Anum_pg_inherits_inhrelid,
18159 true, NULL, 1, &
key);
18162 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18163 errmsg(
"typed tables cannot inherit")));
18174 for (type_attno = 1; type_attno <= typeTupleDesc->
natts; type_attno++)
18178 const char *type_attname,
18183 if (type_attr->attisdropped)
18185 type_attname =
NameStr(type_attr->attname);
18190 if (table_attno > tableTupleDesc->
natts)
18192 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18193 errmsg(
"table is missing column \"%s\"",
18195 table_attr =
TupleDescAttr(tableTupleDesc, table_attno - 1);
18197 }
while (table_attr->attisdropped);
18198 table_attname =
NameStr(table_attr->attname);
18201 if (strncmp(table_attname, type_attname,
NAMEDATALEN) != 0)
18203 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18204 errmsg(
"table has column \"%s\" where type requires \"%s\"",
18205 table_attname, type_attname)));
18208 if (table_attr->atttypid != type_attr->atttypid ||
18209 table_attr->atttypmod != type_attr->atttypmod ||
18210 table_attr->attcollation != type_attr->attcollation)
18212 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18213 errmsg(
"table \"%s\" has different type for column \"%s\"",
18219 for (; table_attno <= tableTupleDesc->
natts; table_attno++)
18224 if (!table_attr->attisdropped)
18226 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18227 errmsg(
"table has extra column \"%s\"",
18228 NameStr(table_attr->attname))));
18232 if (rel->
rd_rel->reloftype)
18237 tableobj.
classId = RelationRelationId;
18240 typeobj.
classId = TypeRelationId;
18249 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18278 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18279 errmsg(
"\"%s\" is not a typed table",
18294 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18332 elog(
ERROR,
"cache lookup failed for relation \"%s\"",
18335 if (pg_class_form->relreplident != ri_type)
18337 pg_class_form->relreplident = ri_type;
18350 bool dirty =
false;
18355 elog(
ERROR,
"cache lookup failed for index %u", thisIndexOid);
18358 if (thisIndexOid == indexOid)
18361 if (!pg_index_form->indisreplident)
18364 pg_index_form->indisreplident =
true;
18370 if (pg_index_form->indisreplident)
18373 pg_index_form->indisreplident =
false;
18408 if (
stmt->identity_type == REPLICA_IDENTITY_DEFAULT)
18413 else if (
stmt->identity_type == REPLICA_IDENTITY_FULL)
18418 else if (
stmt->identity_type == REPLICA_IDENTITY_NOTHING)
18423 else if (
stmt->identity_type == REPLICA_IDENTITY_INDEX)
18428 elog(
ERROR,
"unexpected identity type %u",
stmt->identity_type);
18434 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18435 errmsg(
"index \"%s\" for table \"%s\" does not exist",
18444 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18445 errmsg(
"\"%s\" is not an index for table \"%s\"",
18455 !indexRel->
rd_index->indisunique) &&
18458 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18459 errmsg(
"cannot use non-unique index \"%s\" as replica identity",
18462 if (!indexRel->
rd_index->indimmediate)
18464 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18465 errmsg(
"cannot use non-immediate index \"%s\" as replica identity",
18470 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18471 errmsg(
"cannot use expression index \"%s\" as replica identity",
18476 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18477 errmsg(
"cannot use partial index \"%s\" as replica identity",
18493 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
18494 errmsg(
"index \"%s\" cannot be used as replica identity because column %d is a system column",
18498 if (!attr->attnotnull)
18500 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18501 errmsg(
"index \"%s\" cannot be used as replica identity because column \"%s\" is nullable",
18530 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18559 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18582 Datum repl_val[Natts_pg_foreign_table];
18583 bool repl_null[Natts_pg_foreign_table];
18584 bool repl_repl[Natts_pg_foreign_table];
18597 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18598 errmsg(
"foreign table \"%s\" does not exist",
18604 memset(repl_val, 0,
sizeof(repl_val));
18605 memset(repl_null,
false,
sizeof(repl_null));
18606 memset(repl_repl,
false,
sizeof(repl_repl));
18611 Anum_pg_foreign_table_ftoptions,
18623 repl_val[Anum_pg_foreign_table_ftoptions - 1] = datum;
18625 repl_null[Anum_pg_foreign_table_ftoptions - 1] =
true;
18627 repl_repl[Anum_pg_foreign_table_ftoptions - 1] =
true;
18632 repl_val, repl_null, repl_repl);
18657 const char *column,
18669 compression =
strVal(newValue);
18677 (
errcode(ERRCODE_UNDEFINED_COLUMN),
18678 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
18683 attnum = atttableform->attnum;
18686 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18687 errmsg(
"cannot alter system column \"%s\"", column)));
18696 atttableform->attcompression = cmethod;
18745 switch (rel->
rd_rel->relpersistence)
18747 case RELPERSISTENCE_TEMP:
18749 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18750 errmsg(
"cannot change logged status of table \"%s\" because it is temporary",
18754 case RELPERSISTENCE_PERMANENT:
18759 case RELPERSISTENCE_UNLOGGED:
18773 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
18774 errmsg(
"cannot change table \"%s\" to unlogged because it is part of a publication",
18776 errdetail(
"Unlogged relations cannot be replicated.")));
18790 toLogged ? Anum_pg_constraint_conrelid :
18791 Anum_pg_constraint_confrelid,
18795 toLogged ? ConstraintRelidTypidNameIndexId :
InvalidOid,
18796 true, NULL, 1, skey);
18802 if (con->contype == CONSTRAINT_FOREIGN)
18808 foreignrelid = toLogged ? con->confrelid : con->conrelid;
18820 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18821 errmsg(
"could not change table \"%s\" to logged because it references unlogged table \"%s\"",
18830 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18831 errmsg(
"could not change table \"%s\" to unlogged because it references logged table \"%s\"",
18876 (
errmsg(
"relation \"%s\" does not exist, skipping",
18877 stmt->relation->relname)));
18886 if (rel->
rd_rel->relkind == RELKIND_SEQUENCE)
18894 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18895 errmsg(
"cannot move an owned sequence into another schema"),
18896 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
18915 *oldschema = oldNspOid;
18934 Assert(objsMoved != NULL);
18940 nspOid,
true, objsMoved);
18967 Oid oldNspOid,
Oid newNspOid,
18968 bool hasDependEntry,
18974 bool already_done =
false;
18979 elog(
ERROR,
"cache lookup failed for relation %u", relOid);
18982 Assert(classForm->relnamespace == oldNspOid);
18984 thisobj.
classId = RelationRelationId;
18994 if (!already_done && oldNspOid != newNspOid)
19002 (
errcode(ERRCODE_DUPLICATE_TABLE),
19003 errmsg(
"relation \"%s\" already exists in schema \"%s\"",
19008 classForm->relnamespace = newNspOid;
19015 if (hasDependEntry &&
19018 NamespaceRelationId,
19021 elog(
ERROR,
"could not change schema dependency for relation \"%s\"",
19022 NameStr(classForm->relname));
19051 foreach(l, indexList)
19056 thisobj.
classId = RelationRelationId;
19071 oldNspOid, newNspOid,
19104 Anum_pg_depend_refclassid,
19108 Anum_pg_depend_refobjid,
19122 if (depForm->refobjsubid == 0 ||
19123 depForm->classid != RelationRelationId ||
19124 depForm->objsubid != 0 ||
19141 oldNspOid, newNspOid,
19217 if (oc->
relid == relid)
19235 List *oids_to_truncate =
NIL;
19276 if (oids_to_truncate !=
NIL)
19279 if (oids_to_drop !=
NIL)
19283 foreach(l, oids_to_drop)
19287 object.
classId = RelationRelationId;
19289 object.objectSubId = 0;
19311#ifdef USE_ASSERT_CHECKING
19424 if (relkind != RELKIND_RELATION && relkind != RELKIND_TOASTVALUE &&
19425 relkind != RELKIND_MATVIEW && relkind != RELKIND_PARTITIONED_TABLE)
19427 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19428 errmsg(
"\"%s\" is not a table or materialized view", relation->
relname)));
19453 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19477 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19486 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19487 errmsg(
"permission denied: \"%s\" is a system catalog",
19512 relkind = classform->relkind;
19521 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19522 errmsg(
"permission denied: \"%s\" is a system catalog",
19533 aclresult =
object_aclcheck(NamespaceRelationId, classform->relnamespace,
19560 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19563 if (reltype ==
OBJECT_VIEW && relkind != RELKIND_VIEW)
19565 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19570 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19571 errmsg(
"\"%s\" is not a materialized view", rv->
relname)));
19575 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19578 if (reltype ==
OBJECT_TYPE && relkind != RELKIND_COMPOSITE_TYPE)
19580 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19583 if (reltype ==
OBJECT_INDEX && relkind != RELKIND_INDEX &&
19584 relkind != RELKIND_PARTITIONED_INDEX
19587 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19594 if (reltype !=
OBJECT_TYPE && relkind == RELKIND_COMPOSITE_TYPE)
19596 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19608 if (relkind == RELKIND_INDEX || relkind == RELKIND_PARTITIONED_INDEX)
19610 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19611 errmsg(
"cannot change schema of index \"%s\"",
19613 errhint(
"Change the schema of the table instead.")));
19614 else if (relkind == RELKIND_COMPOSITE_TYPE)
19616 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19617 errmsg(
"cannot change schema of composite type \"%s\"",
19622 else if (relkind == RELKIND_TOASTVALUE)
19624 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19625 errmsg(
"cannot change schema of TOAST table \"%s\"",
19627 errhint(
"Change the schema of the table instead.")));
19656 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19657 errmsg(
"cannot use \"list\" partition strategy with more than one column")));
19665 NULL,
false,
true);
19698 List **partexprs,
Oid *partopclass,
Oid *partcollation,
19706 foreach(lc, partParams)
19712 if (pelem->
name != NULL)
19722 (
errcode(ERRCODE_UNDEFINED_COLUMN),
19723 errmsg(
"column \"%s\" named in partition key does not exist",
19728 if (attform->attnum <= 0)
19730 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19731 errmsg(
"cannot use system column \"%s\" in partition key",
19742 if (attform->attgenerated)
19744 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19745 errmsg(
"cannot use generated column in partition key"),
19746 errdetail(
"Column \"%s\" is a generated column.",
19750 partattrs[attn] = attform->attnum;
19751 atttype = attform->atttypid;
19752 attcollation = attform->attcollation;
19759 char partattname[16];
19771 snprintf(partattname,
sizeof(partattname),
"%d", attn + 1);
19773 atttype, attcollation,
19784 ((
Var *) expr)->varattno > 0)
19790 partattrs[attn] = ((
Var *) expr)->varattno;
19797 partattrs[attn] = 0;
19798 *partexprs =
lappend(*partexprs, expr);
19817 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19818 errmsg(
"partition key expressions cannot contain system column references")));
19837 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19838 errmsg(
"cannot use generated column in partition key"),
19839 errdetail(
"Column \"%s\" is a generated column.",
19867 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19868 errmsg(
"functions in partition key expression must be marked IMMUTABLE")));
19876 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19877 errmsg(
"cannot use constant expression as partition key")));
19897 (
errcode(ERRCODE_INDETERMINATE_COLLATION),
19898 errmsg(
"could not determine which collation to use for partition expression"),
19899 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
19905 (
errcode(ERRCODE_DATATYPE_MISMATCH),
19906 errmsg(
"collations are not supported by type %s",
19910 partcollation[attn] = attcollation;
19918 am_oid = HASH_AM_OID;
19920 am_oid = BTREE_AM_OID;
19930 (
errcode(ERRCODE_UNDEFINED_OBJECT),
19931 errmsg(
"data type %s has no default operator class for access method \"%s\"",
19933 errhint(
"You must specify a hash operator class or define a default hash operator class for the data type.")));
19936 (
errcode(ERRCODE_UNDEFINED_OBJECT),
19937 errmsg(
"data type %s has no default operator class for access method \"%s\"",
19939 errhint(
"You must specify a btree operator class or define a default btree operator class for the data type.")));
19945 am_oid == HASH_AM_OID ?
"hash" :
"btree",
19962 List *partConstraint)
19972 for (
i = 1;
i <= natts;
i++)
19984 wholeatt->atttypid,
19985 wholeatt->atttypmod,
19986 wholeatt->attcollation,
19995 ntest->argisrow =
false;
19997 existConstraint =
lappend(existConstraint, ntest);
20023 num_check = (constr != NULL) ? constr->
num_check : 0;
20024 for (
i = 0;
i < num_check;
i++)
20080 List *partConstraint,
20081 bool validate_default)
20089 if (!validate_default)
20091 (
errmsg_internal(
"partition constraint for table \"%s\" is implied by existing constraints",
20095 (
errmsg_internal(
"updated partition constraint for default partition \"%s\" is implied by existing constraints",
20105 if (scanrel->
rd_rel->relkind == RELKIND_RELATION)
20115 else if (scanrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20123 List *thisPartConstraint;
20134 thisPartConstraint =
20136 part_rel, scanrel);
20139 thisPartConstraint,
20157 List *attachrel_children;
20158 List *partConstraint;
20165 const char *trigger_name;
20166 Oid defaultPartOid;
20167 List *partBoundConstraint;
20196 if (attachrel->
rd_rel->relispartition)
20198 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20199 errmsg(
"\"%s\" is already a partition",
20204 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20205 errmsg(
"cannot attach a typed table as partition")));
20213 Anum_pg_inherits_inhrelid,
20220 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20221 errmsg(
"cannot attach inheritance child as partition")));
20226 Anum_pg_inherits_inhparent,
20232 attachrel->
rd_rel->relkind == RELKIND_RELATION)
20234 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20235 errmsg(
"cannot attach inheritance parent as partition")));
20258 (
errcode(ERRCODE_DUPLICATE_TABLE),
20259 errmsg(
"circular inheritance not allowed"),
20260 errdetail(
"\"%s\" is already a child of \"%s\".",
20265 if (rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
20266 attachrel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
20268 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20269 errmsg(
"cannot attach a temporary relation as partition of permanent relation \"%s\"",
20273 if (rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20274 attachrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
20276 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20277 errmsg(
"cannot attach a permanent relation as partition of temporary relation \"%s\"",
20281 if (rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20284 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20285 errmsg(
"cannot attach as partition of temporary relation of another session")));
20288 if (attachrel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20291 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20292 errmsg(
"cannot attach temporary relation of another session as partition")));
20299 natts = tupleDesc->
natts;
20300 for (attno = 1; attno <= natts; attno++)
20303 char *attributeName =
NameStr(attribute->attname);
20306 if (attribute->attisdropped)
20309 if (attribute->attidentity)
20311 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20312 errmsg(
"table \"%s\" being attached contains an identity column \"%s\"",
20314 errdetail(
"The new partition may not contain an identity column."));
20321 (
errcode(ERRCODE_DATATYPE_MISMATCH),
20322 errmsg(
"table \"%s\" contains column \"%s\" not found in parent \"%s\"",
20325 errdetail(
"The new partition may contain only the columns present in parent.")));
20334 if (trigger_name != NULL)
20336 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
20337 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming a partition",
20339 errdetail(
"ROW triggers with transition tables are not supported on partitions.")));
20347 cmd->
bound, pstate);
20383 if (partConstraint)
20392 (
Node *) partConstraint);
20419 List *defPartConstraint;
20425 defPartConstraint =
20432 defPartConstraint =
20434 1, defaultrel, rel);
20436 defPartConstraint,
true);
20450 if (attachrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20454 foreach(l, attachrel_children)
20478 List *attachRelIdxs;
20486 "AttachPartitionEnsureIndexes",
20510 if (attachrel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
20512 foreach(cell, idxes)
20517 if (idxRel->
rd_index->indisunique ||
20520 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20521 errmsg(
"cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"",
20524 errdetail(
"Partitioned table \"%s\" contains unique indexes.",
20536 foreach(cell, idxes)
20542 bool found =
false;
20549 if (idxRel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
20573 if (attachrelIdxRels[
i]->rd_rel->relispartition)
20577 if (!attachrelIdxRels[
i]->rd_index->indisvalid)
20581 attachrelIdxRels[
i]->rd_indcollation,
20637 true,
false,
false,
false,
false);
20669 true, NULL, 1, &
key);
20688 if (!TRIGGER_FOR_ROW(trigForm->tgtype))
20695 if (trigForm->tgisinternal)
20701 if (!TRIGGER_FOR_BEFORE(trigForm->tgtype) &&
20702 !TRIGGER_FOR_AFTER(trigForm->tgtype))
20703 elog(
ERROR,
"unexpected trigger \"%s\" found",
20719 partition, parent);
20721 partition, parent);
20728 if (trigForm->tgattr.dim1 > 0)
20732 for (
i = 0;
i < trigForm->tgattr.dim1;
i++)
20737 trigForm->tgattr.values[
i] - 1);
20744 if (trigForm->tgnargs > 0)
20751 elog(
ERROR,
"tgargs is null for trigger \"%s\" in partition \"%s\"",
20756 for (
int i = 0;
i < trigForm->tgnargs;
i++)
20759 p += strlen(p) + 1;
20769 trigStmt->
args = trigargs;
20770 trigStmt->
row =
true;
20771 trigStmt->
timing = trigForm->tgtype & TRIGGER_TYPE_TIMING_MASK;
20772 trigStmt->
events = trigForm->tgtype & TRIGGER_TYPE_EVENT_MASK;
20776 trigStmt->
deferrable = trigForm->tgdeferrable;
20782 trigForm->tgfoid, trigForm->oid, qual,
20783 false,
true, trigForm->tgenabled);
20819 Oid defaultPartOid;
20846 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20847 errmsg(
"cannot detach partitions concurrently when a default partition exists")));
20889 char *parentrelname;
20951 if (partRel != NULL)
20952 elog(
WARNING,
"dangling partition \"%s\" remains, can't fix",
20955 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20956 errmsg(
"partitioned table \"%s\" was removed concurrently",
20959 if (partRel == NULL)
20961 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20962 errmsg(
"partition \"%s\" was removed concurrently", partrelname)));
20986 Oid defaultPartOid)
20992 Datum new_val[Natts_pg_class];
20993 bool new_null[Natts_pg_class],
20994 new_repl[Natts_pg_class];
21051 if (conform->contype != CONSTRAINT_FOREIGN ||
21073 Oid insertTriggerOid,
21078 &insertTriggerOid, &updateTriggerOid);
21105 int numfkdelsetcols;
21121 fkconstraint->
contype = CONSTRAINT_FOREIGN;
21123 fkconstraint->
deferrable = conform->condeferrable;
21125 fkconstraint->
is_enforced = conform->conenforced;
21129 fkconstraint->
pktable = NULL;
21141 for (
int i = 0;
i < numfks;
i++)
21168 conform->conperiod);
21191 ConstraintRelationId,
21201 foreach(cell, indexes)
21207 Oid parentConstrOid;
21239 elog(
ERROR,
"cache lookup failed for relation %u",
21244 memset(new_val, 0,
sizeof(new_val));
21245 memset(new_null,
false,
sizeof(new_null));
21246 memset(new_repl,
false,
sizeof(new_repl));
21247 new_val[Anum_pg_class_relpartbound - 1] = (
Datum) 0;
21248 new_null[Anum_pg_class_relpartbound - 1] =
true;
21249 new_repl[Anum_pg_class_relpartbound - 1] =
true;
21251 new_val, new_null, new_repl);
21265 if (!attr->attisdropped && attr->attidentity)
21299 if (partRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
21305 foreach(cell, children)
21356 List *constraintExpr;
21413 true, NULL, 1, &skey);
21439 RelationRelationId,
21478 if (!
state->lockedParentTbl)
21481 state->lockedParentTbl =
true;
21504 if (classform->relkind != RELKIND_PARTITIONED_INDEX &&
21505 classform->relkind != RELKIND_INDEX)
21507 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21542 state.lockedParentTbl =
false;
21550 (
errcode(ERRCODE_UNDEFINED_OBJECT),
21551 errmsg(
"index \"%s\" does not exist",
name->relname)));
21563 currParent = partIdx->
rd_rel->relispartition ?
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 already attached to another index.",
21596 if (partDesc->
oids[
i] ==
state.partitionOid)
21604 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21605 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21608 errdetail(
"Index \"%s\" is not an index on any partition of table \"%s\".",
21625 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21626 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21629 errdetail(
"The index definitions do not match.")));
21644 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21645 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21648 errdetail(
"The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\".",
21658 if (parentIdx->
rd_index->indisprimary)
21693 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21694 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21697 errdetail(
"Another index is already attached for partition \"%s\".",
21715 bool updated =
false;
21717 Assert(partedIdx->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX);
21739 elog(
ERROR,
"cache lookup failed for index %u", inhForm->inhrelid);
21741 if (indexForm->indisvalid)
21764 elog(
ERROR,
"cache lookup failed for index %u",
21768 indexForm->indisvalid =
true;
21781 if (updated && partedIdx->
rd_rel->relispartition)
21817 if (!att->attnotnull)
21819 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
21820 errmsg(
"invalid primary key definition"),
21821 errdetail(
"Column \"%s\" of relation \"%s\" is not marked NOT NULL.",
21870 constraints =
lappend_oid(constraints, constrForm->oid);
21876 return constraints;
21892 foreach(cell, constraints)
21902 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
21938 if (compression == NULL || strcmp(compression,
"default") == 0)
21955 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
21956 errmsg(
"column data type %s does not support compression",
21962 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
21963 errmsg(
"invalid compression method \"%s\"", compression)));
21977 cstorage = TYPSTORAGE_PLAIN;
21979 cstorage = TYPSTORAGE_EXTERNAL;
21981 cstorage = TYPSTORAGE_EXTENDED;
21983 cstorage = TYPSTORAGE_MAIN;
21988 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
21989 errmsg(
"invalid storage type \"%s\"",
21998 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
21999 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 void AlterConstrEnforceabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Oid fkrelid, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
static ObjectAddress ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode)
ObjectAddress RenameRelation(RenameStmt *stmt)
static AlteredTableInfo * ATGetQueueEntry(List **wqueue, Relation rel)
static void verifyNotNullPKCompatible(HeapTuple tuple, const char *colname)
static void ATExecDropOf(Relation rel, LOCKMODE lockmode)
static ObjectAddress ATExecAlterConstraint(List **wqueue, Relation rel, ATAlterConstraint *cmdcon, bool recurse, LOCKMODE lockmode)
static ColumnDef * MergeInheritedAttribute(List *inh_columns, int exist_attno, const ColumnDef *newdef)
static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool old_check_ok, LOCKMODE lockmode, Oid parentInsTrigger, Oid parentUpdTrigger, bool with_period)
static bool ConstraintImpliedByRelConstraint(Relation scanrel, List *testConstraint, List *provenConstraint)
static const char * storage_name(char c)
static ObjectAddress ATExecDropExpression(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode)
void AtEOSubXact_on_commit_actions(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid)
static void add_column_datatype_dependency(Oid relid, int32 attnum, Oid typid)
static ObjectAddress ATExecColumnDefault(Relation rel, const char *colName, Node *newDefault, LOCKMODE lockmode)
static void ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, List **wqueue, LOCKMODE lockmode, bool rewrite)
static void ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode)
static void drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid, DependencyType deptype)
static void DropForeignKeyConstraintTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid)
static void RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached)
void PreCommit_on_commit_actions(void)
static ObjectAddress dropconstraint_internal(Relation rel, HeapTuple constraintTup, DropBehavior behavior, bool recurse, bool recursing, bool missing_ok, LOCKMODE lockmode)
static void RemoveInheritedConstraint(Relation conrel, Relation trigrel, Oid conoid, Oid conrelid)
static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode, bool recurse, bool recursing)
static char GetAttributeCompression(Oid atttypid, const char *compression)
static int findAttrByName(const char *attributeName, const List *columns)
static void RememberIndexForRebuilding(Oid indoid, AlteredTableInfo *tab)
static bool ATColumnChangeRequiresRewrite(Node *expr, AttrNumber varattno)
static char * ChooseForeignKeyConstraintNameAddition(List *colnames)
static ObjectAddress ATExecValidateConstraint(List **wqueue, Relation rel, char *constrName, bool recurse, bool recursing, LOCKMODE lockmode)
void AlterTable(AlterTableStmt *stmt, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void RememberStatisticsForRebuilding(Oid stxoid, AlteredTableInfo *tab)
static CoercionPathType findFkeyCast(Oid targetTypeId, Oid sourceTypeId, Oid *funcid)
static void add_column_collation_dependency(Oid relid, int32 attnum, Oid collid)
static ObjectAddress ATExecDropNotNull(Relation rel, const char *colName, bool recurse, LOCKMODE lockmode)
static Oid transformFkeyCheckAttrs(Relation pkrel, int numattrs, int16 *attnums, bool with_period, Oid *opclasses, bool *pk_has_without_overlaps)
void RemoveRelations(DropStmt *drop)
static void ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel, const char *tablespacename, LOCKMODE lockmode)
static void ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void RememberReplicaIdentityForRebuilding(Oid indoid, AlteredTableInfo *tab)
static List * GetParentedForeignKeyRefs(Relation partition)
void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, bool hasDependEntry, ObjectAddresses *objsMoved)
static ObjectAddress ATExecAddConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *newConstraint, bool recurse, bool is_readd, LOCKMODE lockmode)
ObjectAddress renameatt(RenameStmt *stmt)
void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lockmode)
static void RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid, void *arg)
static void CheckAlterTableIsSafe(Relation rel)
static void DropErrorMsgWrongType(const char *relname, char wrongkind, char rightkind)
LOCKMODE AlterTableGetLockLevel(List *cmds)
struct ForeignTruncateInfo ForeignTruncateInfo
static ObjectAddress ATExecDetachPartition(List **wqueue, AlteredTableInfo *tab, Relation rel, RangeVar *name, bool concurrent)
static void AlterSeqNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved, LOCKMODE lockmode)
static void RangeVarCallbackForRenameAttribute(const RangeVar *rv, Oid relid, Oid oldrelid, void *arg)
TupleDesc BuildDescForRelation(const List *columns)
static void ATExecForceNoForceRowSecurity(Relation rel, bool force_rls)
void AtEOXact_on_commit_actions(bool isCommit)
static void checkFkeyPermissions(Relation rel, int16 *attnums, int natts)
struct OnCommitItem OnCommitItem
void CheckTableNotInUse(Relation rel, const char *stmt)
static bool ATExecAlterConstrInheritability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation rel, HeapTuple contuple, LOCKMODE lockmode)
static void createForeignKeyActionTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentDelTrigger, Oid parentUpdTrigger, Oid *deleteTrigOid, Oid *updateTrigOid)
static void ATExecEnableDisableTrigger(Relation rel, const char *trigname, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode)
static void AttachPartitionForeignKey(List **wqueue, Relation partition, Oid partConstrOid, Oid parentConstrOid, Oid parentInsTrigger, Oid parentUpdTrigger, Relation trigrel)
static List * MergeCheckConstraint(List *constraints, const char *name, Node *expr, bool is_enforced)
static void renameatt_check(Oid myrelid, Form_pg_class classform, bool recursing)
static void RangeVarCallbackForAttachIndex(const RangeVar *rv, Oid relOid, Oid oldRelOid, void *arg)
static void ATCheckPartitionsNotInUse(Relation rel, LOCKMODE lockmode)
static void truncate_check_activity(Relation rel)
static void validatePartitionedIndex(Relation partedIdx, Relation partedTbl)
static void AlterConstrUpdateConstraintEntry(ATAlterConstraint *cmdcon, Relation conrel, HeapTuple contuple)
static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *fkconstraint, bool recurse, bool recursing, LOCKMODE lockmode)
static void TryReuseIndex(Oid oldId, IndexStmt *stmt)
static void GetForeignKeyCheckTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid, Oid *insertTriggerOid, Oid *updateTriggerOid)
static ObjectAddress addFkConstraint(addFkConstraintSides fkside, char *constraintname, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool is_internal, bool with_period)
static void RememberClusterOnForRebuilding(Oid indoid, AlteredTableInfo *tab)
static ObjectAddress ATExecSetOptions(Relation rel, const char *colName, Node *options, bool isReset, LOCKMODE lockmode)
static bool ATExecAlterConstrEnforceability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Oid fkrelid, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
static void QueueNNConstraintValidation(List **wqueue, Relation conrel, Relation rel, HeapTuple contuple, bool recurse, bool recursing, LOCKMODE lockmode)
static ObjectAddress ATExecDropColumn(List **wqueue, Relation rel, const char *colName, DropBehavior behavior, bool recurse, bool recursing, bool missing_ok, LOCKMODE lockmode, ObjectAddresses *addrs)
static void CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
static void SetIndexStorageProperties(Relation rel, Relation attrelation, AttrNumber attnum, bool setstorage, char newstorage, bool setcompression, char newcompression, LOCKMODE lockmode)
static void ATController(AlterTableStmt *parsetree, Relation rel, List *cmds, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
bool CheckRelationTableSpaceMove(Relation rel, Oid newTableSpaceId)
static void ATExecSetRowSecurity(Relation rel, bool rls)
void find_composite_type_dependencies(Oid typeOid, Relation origRelation, const char *origTypeName)
static void truncate_check_perms(Oid relid, Form_pg_class reltuple)
static void truncate_check_rel(Oid relid, Form_pg_class reltuple)
static void change_owner_recurse_to_sequences(Oid relationOid, Oid newOwnerId, LOCKMODE lockmode)
static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, int32 seqNumber, Relation inhRelation, bool child_is_partition)
static void RememberAllDependentForRebuilding(AlteredTableInfo *tab, AlterTableType subtype, Relation rel, AttrNumber attnum, const char *colName)
static void ATPrepDropExpression(Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode)
static bool ATExecAlterConstraintInternal(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, LOCKMODE lockmode)
static void verifyPartitionIndexNotNull(IndexInfo *iinfo, Relation partition)
static ObjectAddress ATExecCookedColumnDefault(Relation rel, AttrNumber attnum, Node *newDefault)
static ObjectAddress rename_constraint_internal(Oid myrelid, Oid mytypid, const char *oldconname, const char *newconname, bool recurse, bool recursing, int expected_parents)
static void DropErrorMsgNonExistent(RangeVar *rel, char rightkind, bool missing_ok)
static void ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode)
static AlterTableCmd * ATParseTransformCmd(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
void AlterTableNamespaceInternal(Relation rel, Oid oldNspOid, Oid nspOid, ObjectAddresses *objsMoved)
static ObjectAddress ATAddCheckNNConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *constr, bool recurse, bool recursing, bool is_readd, LOCKMODE lockmode)
static void CloneFkReferenced(Relation parentRel, Relation partitionRel)
static void MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel)
static void ATPrepDropColumn(List **wqueue, Relation rel, bool recurse, bool recursing, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
void SetRelationHasSubclass(Oid relationId, bool relhassubclass)
static void MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const ColumnDef *newdef)
static void ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets)
static const char * alter_table_type_to_string(AlterTableType cmdtype)
static void 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 void TryReuseForeignKey(Oid oldId, Constraint *con)
struct AlteredTableInfo AlteredTableInfo
Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode)
static void AlterConstrDeferrabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, List **otherrelids, LOCKMODE lockmode)
struct NewConstraint NewConstraint
static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
static void ATSimpleRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, Oid defaultPartOid)
static void RebuildConstraintComment(AlteredTableInfo *tab, AlterTablePass pass, Oid objid, Relation rel, List *domname, const char *conname)
static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel, Relation partitionRel)
static void addFkRecurseReferenced(Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool old_check_ok, Oid parentDelTrigger, Oid parentUpdTrigger, bool with_period)
static bool check_for_column_name_collision(Relation rel, const char *colname, bool if_not_exists)
static ObjectAddress ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd **cmd, bool recurse, bool recursing, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
@ AT_PASS_ADD_OTHERCONSTR
@ AT_PASS_ADD_INDEXCONSTR
static ObjectAddress ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, LOCKMODE lockmode)
static void validateForeignKeyConstraint(char *conname, Relation rel, Relation pkrel, Oid pkindOid, Oid constraintOid, bool hasperiod)
static char * decompile_conbin(HeapTuple contup, TupleDesc tupdesc)
static void QueueCheckConstraintValidation(List **wqueue, Relation conrel, Relation rel, char *constrName, HeapTuple contuple, bool recurse, bool recursing, LOCKMODE lockmode)
void SetRelationTableSpace(Relation rel, Oid newTableSpaceId, RelFileNumber newRelFilenumber)
void remove_on_commit_action(Oid relid)
static void DetachAddConstraintIfNeeded(List **wqueue, Relation partRel)
static void ATExecDropCluster(Relation rel, LOCKMODE lockmode)
#define ATT_PARTITIONED_INDEX
static void CreateInheritance(Relation child_rel, Relation parent_rel, bool ispartition)
static const struct dropmsgstrings dropmsgstringarray[]
static void ATPrepChangePersistence(AlteredTableInfo *tab, Relation rel, bool toLogged)
static ObjectAddress ATExecSetExpression(AlteredTableInfo *tab, Relation rel, const char *colName, Node *newExpr, LOCKMODE lockmode)
ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, ObjectAddress *typaddress, const char *queryString)
static Oid CreateFKCheckTrigger(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentTrigOid, bool on_insert)
static void AlterConstrTriggerDeferrability(Oid conoid, Relation tgrel, Relation rel, bool deferrable, bool initdeferred, List **otherrelids)
static void ATPrepAddPrimaryKey(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void DropClonedTriggersFromPartition(Oid partitionId)
static void QueuePartitionConstraintValidation(List **wqueue, Relation scanrel, List *partConstraint, bool validate_default)
static ObjectAddress ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode)
static void RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, void *arg)
void AlterTableInternal(Oid relid, List *cmds, bool recurse)
static void GetForeignKeyActionTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid, Oid *deleteTriggerOid, Oid *updateTriggerOid)
void check_of_type(HeapTuple typetuple)
static ObjectAddress ATExecDropInherit(Relation rel, RangeVar *parent, LOCKMODE lockmode)
static void ATDetachCheckNoForeignKeyRefs(Relation partition)
static ObjectAddress ATExecAddIndexConstraint(AlteredTableInfo *tab, Relation rel, IndexStmt *stmt, LOCKMODE lockmode)
static void AlterIndexNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved)
#define ATT_PARTITIONED_TABLE
static void ATExecCmd(List **wqueue, AlteredTableInfo *tab, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
static bool ATExecAlterConstrDeferrability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, List **otherrelids, LOCKMODE lockmode)
static void ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode)
static void createForeignKeyCheckTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentInsTrigger, Oid parentUpdTrigger, Oid *insertTrigOid, Oid *updateTrigOid)
static void ATPrepAddInherit(Relation child_rel)
static ObjectAddress ATExecDetachPartitionFinalize(Relation rel, RangeVar *name)
static ObjectAddress ATExecSetStorage(Relation rel, const char *colName, Node *newValue, LOCKMODE lockmode)
static ObjectAddress ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, AlterTableUtilityContext *context)
static List * find_typed_table_dependencies(Oid typeOid, const char *typeName, DropBehavior behavior)
Oid AlterTableMoveAll(AlterTableMoveAllStmt *stmt)
static int transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid, List **attnamelist, int16 *attnums, Oid *atttypids, Oid *attcollids, Oid *opclasses, bool *pk_has_without_overlaps)
static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmode, bool recurse, bool recursing)
static void ATExecSetAccessMethodNoStorage(Relation rel, Oid newAccessMethodId)
static void ATExecDropConstraint(Relation rel, const char *constrName, DropBehavior behavior, bool recurse, bool missing_ok, LOCKMODE lockmode)
static ObjectAddress ATExecAddIndex(AlteredTableInfo *tab, Relation rel, IndexStmt *stmt, bool is_rebuild, LOCKMODE lockmode)
static ObjectAddress ATExecSetCompression(Relation rel, const char *column, Node *newValue, LOCKMODE lockmode)
static PartitionSpec * transformPartitionSpec(Relation rel, PartitionSpec *partspec)
static void ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void index_copy_data(Relation rel, RelFileLocator newrlocator)
static ObjectAddress ATExecSetNotNull(List **wqueue, Relation rel, char *conName, char *colName, bool recurse, bool recursing, LOCKMODE lockmode)
void RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bool is_index)
static void set_attnotnull(List **wqueue, Relation rel, AttrNumber attnum, bool is_valid, bool queue_validation)
static bool tryAttachPartitionForeignKey(List **wqueue, ForeignKeyCacheInfo *fk, Relation partition, Oid parentConstrOid, int numfks, AttrNumber *mapped_conkey, AttrNumber *confkey, Oid *conpfeqop, Oid parentInsTrigger, Oid parentUpdTrigger, Relation trigrel)
static void ATExecSetTableSpaceNoStorage(Relation rel, Oid newTableSpace)
static void ATPrepAlterColumnType(List **wqueue, AlteredTableInfo *tab, Relation rel, bool recurse, bool recursing, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static int transformColumnNameList(Oid relId, List *colList, int16 *attnums, Oid *atttypids, Oid *attcollids)
static void change_owner_fix_column_acls(Oid relationOid, Oid oldOwnerId, Oid newOwnerId)
#define ATT_COMPOSITE_TYPE
static ObjectAddress ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name)
bool PartConstraintImpliedByRelConstraint(Relation scanrel, List *partConstraint)
void RangeVarCallbackMaintainsTable(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
static bool constraints_equivalent(HeapTuple a, HeapTuple b, TupleDesc tupleDesc)
static ObjectAddress ATExecAddStatistics(AlteredTableInfo *tab, Relation rel, CreateStatsStmt *stmt, bool is_rebuild, LOCKMODE lockmode)
ObjectAddress RenameConstraint(RenameStmt *stmt)
static void ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context)
void register_on_commit_action(Oid relid, OnCommitAction action)
static void RangeVarCallbackForTruncate(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
static ObjectAddress ATExecClusterOn(Relation rel, const char *indexName, LOCKMODE lockmode)
static char GetAttributeStorage(Oid atttypid, const char *storagemode)
void RangeVarCallbackOwnsRelation(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
#define child_dependency_type(child_is_partition)
static void refuseDupeIndexAttach(Relation parentIdx, Relation partIdx, Relation partitionTbl)
void ExecuteTruncateGuts(List *explicit_rels, List *relids, List *relids_logged, DropBehavior behavior, bool restart_seqs, bool run_as_table_owner)
static void ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
static List * MergeAttributes(List *columns, const List *supers, char relpersistence, bool is_partition, List **supconstr, List **supnotnulls)
static void ATExecEnableDisableRule(Relation rel, const char *rulename, char fires_when, LOCKMODE lockmode)
struct NewColumnValue NewColumnValue
static void ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname)
static bool NotNullImpliedByRelConstraints(Relation rel, Form_pg_attribute attr)
const char * GetCompressionMethodName(char method)
char CompressionNameToMethod(const char *compression)
#define CompressionMethodIsValid(cm)
#define InvalidCompressionMethod
void AlterTableCreateToastTable(Oid relOid, Datum reloptions, LOCKMODE lockmode)
void ExecBSTruncateTriggers(EState *estate, ResultRelInfo *relinfo)
void EnableDisableTrigger(Relation rel, const char *tgname, Oid tgparent, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode)
const char * FindTriggerIncompatibleWithInheritance(TriggerDesc *trigdesc)
void ExecASTruncateTriggers(EState *estate, ResultRelInfo *relinfo)
ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, Oid funcoid, Oid parentTriggerOid, Node *whenClause, bool isInternal, bool in_partition)
void TriggerSetParentTrigger(Relation trigRel, Oid childTrigId, Oid parentTrigId, Oid childTableId)
ObjectAddress CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, Oid funcoid, Oid parentTriggerOid, Node *whenClause, bool isInternal, bool in_partition, char trigger_fires_when)
bool AfterTriggerPendingOnRel(Oid relid)
void AfterTriggerEndQuery(EState *estate)
void AfterTriggerBeginQuery(void)
#define TRIGGER_FIRES_ON_ORIGIN
#define TRIGGER_FIRES_ON_REPLICA
#define TRIGGER_EVENT_ROW
#define TRIGGER_FIRES_ALWAYS
#define TRIGGER_EVENT_INSERT
TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc)
Node * TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum)
TupleDesc CreateTemplateTupleDesc(int natts)
void populate_compact_attribute(TupleDesc tupdesc, int attnum)
void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
#define ReleaseTupleDesc(tupdesc)
#define ATTNULLABLE_VALID
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
static void slot_getallattrs(TupleTableSlot *slot)
static bool slot_attisnull(TupleTableSlot *slot, int attnum)
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
bool DomainHasConstraints(Oid type_id)
void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId)
ObjectAddress AlterDomainAddConstraint(List *names, Node *newConstraint, ObjectAddress *constrAddr)
void checkDomainOwner(HeapTuple tup)
Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, bool ignoreDependent, bool errorOnTableType, ObjectAddresses *objsMoved)
List * roleSpecsToIds(List *memberNames)
void SwitchToUntrustedUser(Oid userid, UserContext *context)
void RestoreUserContext(UserContext *context)
void ProcessUtilityForAlterTable(Node *stmt, AlterTableUtilityContext *context)
#define MAX_STATISTICS_TARGET
String * makeString(char *str)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
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)