100#include "utils/fmgroids.h"
167#define AT_NUM_PASSES (AT_PASS_MISC + 1)
266 gettext_noop(
"sequence \"%s\" does not exist, skipping"),
268 gettext_noop(
"Use DROP SEQUENCE to remove a sequence.")},
277 gettext_noop(
"materialized view \"%s\" does not exist"),
278 gettext_noop(
"materialized view \"%s\" does not exist, skipping"),
280 gettext_noop(
"Use DROP MATERIALIZED VIEW to remove a materialized view.")},
282 ERRCODE_UNDEFINED_OBJECT,
287 {RELKIND_COMPOSITE_TYPE,
288 ERRCODE_UNDEFINED_OBJECT,
293 {RELKIND_FOREIGN_TABLE,
294 ERRCODE_UNDEFINED_OBJECT,
296 gettext_noop(
"foreign table \"%s\" does not exist, skipping"),
298 gettext_noop(
"Use DROP FOREIGN TABLE to remove a foreign table.")},
299 {RELKIND_PARTITIONED_TABLE,
305 {RELKIND_PARTITIONED_INDEX,
306 ERRCODE_UNDEFINED_OBJECT,
311 {
'\0', 0, NULL, NULL, NULL, NULL}
329#define ATT_TABLE 0x0001
330#define ATT_VIEW 0x0002
331#define ATT_MATVIEW 0x0004
332#define ATT_INDEX 0x0008
333#define ATT_COMPOSITE_TYPE 0x0010
334#define ATT_FOREIGN_TABLE 0x0020
335#define ATT_PARTITIONED_INDEX 0x0040
336#define ATT_SEQUENCE 0x0080
337#define ATT_PARTITIONED_TABLE 0x0100
366#define child_dependency_type(child_is_partition) \
367 ((child_is_partition) ? DEPENDENCY_AUTO : DEPENDENCY_NORMAL)
375 bool is_partition,
List **supconstr,
383 bool child_is_partition);
386 bool child_is_partition);
403 Oid ReferencedParentDelTrigger,
404 Oid ReferencedParentUpdTrigger,
405 Oid ReferencingParentInsTrigger,
406 Oid ReferencingParentUpdTrigger);
415 bool deferrable,
bool initdeferred,
421 Oid ReferencedParentDelTrigger,
422 Oid ReferencedParentUpdTrigger,
423 Oid ReferencingParentInsTrigger,
424 Oid ReferencingParentUpdTrigger);
433 bool recurse,
bool recursing,
LOCKMODE lockmode);
438 bool recurse,
bool recursing,
LOCKMODE lockmode);
440 HeapTuple contuple,
bool recurse,
bool recursing,
447 Oid *opclasses,
bool *pk_has_without_overlaps);
449 int numattrs,
int16 *attnums,
450 bool with_period,
Oid *opclasses,
451 bool *pk_has_without_overlaps);
457 Oid pkindOid,
Oid constraintOid,
bool hasperiod);
463 bool recurse,
bool recursing,
LOCKMODE lockmode,
495 bool recurse,
bool recursing,
505 bool is_valid,
bool queue_validation);
507 char *conName,
char *colName,
508 bool recurse,
bool recursing,
512 List *testConstraint,
List *provenConstraint);
518 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing);
520 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing);
522 bool recurse,
bool recursing);
538 bool recurse,
bool recursing,
551 Constraint *newConstraint,
bool recurse,
bool is_readd,
559 bool recurse,
bool recursing,
bool is_readd,
563 bool recurse,
bool recursing,
566 int numfksetcols,
int16 *fksetcolsattnums,
569 char *constraintname,
574 Oid *pfeqoperators,
Oid *ppeqoperators,
575 Oid *ffeqoperators,
int numfkdelsetcols,
576 int16 *fkdelsetcols,
bool is_internal,
581 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
582 int numfkdelsetcols,
int16 *fkdelsetcols,
584 Oid parentDelTrigger,
Oid parentUpdTrigger,
589 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
590 int numfkdelsetcols,
int16 *fkdelsetcols,
591 bool old_check_ok,
LOCKMODE lockmode,
592 Oid parentInsTrigger,
Oid parentUpdTrigger,
602 Oid parentInsTrigger,
Oid parentUpdTrigger,
603 Oid *insertTrigOid,
Oid *updateTrigOid);
607 Oid parentDelTrigger,
Oid parentUpdTrigger,
608 Oid *deleteTrigOid,
Oid *updateTrigOid);
612 Oid parentConstrOid,
int numfks,
615 Oid parentInsTrigger,
616 Oid parentUpdTrigger,
619 Oid partConstrOid,
Oid parentConstrOid,
620 Oid parentInsTrigger,
Oid parentUpdTrigger,
623 Oid conoid,
Oid conrelid);
625 Oid confrelid,
Oid conrelid);
628 Oid *deleteTriggerOid,
629 Oid *updateTriggerOid);
632 Oid *insertTriggerOid,
633 Oid *updateTriggerOid);
636 bool missing_ok,
LOCKMODE lockmode);
639 bool recurse,
bool recursing,
640 bool missing_ok,
LOCKMODE lockmode);
643 bool recurse,
bool recursing,
661 const char *conname);
667 Oid oldOwnerId,
Oid newOwnerId);
678 const char *tablespacename,
LOCKMODE lockmode);
685 char fires_when,
bool skip_system,
bool recurse,
688 char fires_when,
LOCKMODE lockmode);
707 Oid oldRelOid,
void *
arg);
712 List **partexprs,
Oid *partopclass,
Oid *partcollation,
716 bool expect_detached);
722 List *partConstraint,
723 bool validate_default);
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 (relid != LargeObjectRelationId &&
2400 relid != LargeObjectMetadataRelationId)))
2402 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
2403 errmsg(
"permission denied: \"%s\" is a system catalog",
2439 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2440 errmsg(
"cannot truncate temporary tables of other sessions")));
2458 case TYPSTORAGE_PLAIN:
2460 case TYPSTORAGE_EXTERNAL:
2462 case TYPSTORAGE_EXTENDED:
2464 case TYPSTORAGE_MAIN:
2540 bool is_partition,
List **supconstr,
List **supnotnulls)
2545 bool have_bogus_defaults =
false;
2547 static Node bogus_marker = {0};
2564 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
2565 errmsg(
"tables can have at most %d columns",
2582 for (
int coldefpos = 0; coldefpos <
list_length(columns); coldefpos++)
2586 if (!is_partition && coldef->
typeName == NULL)
2595 (
errcode(ERRCODE_UNDEFINED_COLUMN),
2596 errmsg(
"column \"%s\" does not exist",
2601 for (
int restpos = coldefpos + 1; restpos <
list_length(columns);)
2621 (
errcode(ERRCODE_DUPLICATE_COLUMN),
2622 errmsg(
"column \"%s\" specified more than once",
2637 saved_columns = columns;
2653 List *inherited_defaults;
2654 List *cols_with_defaults;
2675 if (relation->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !is_partition)
2677 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2678 errmsg(
"cannot inherit from partitioned table \"%s\"",
2680 if (relation->
rd_rel->relispartition && !is_partition)
2682 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2683 errmsg(
"cannot inherit from partition \"%s\"",
2686 if (relation->
rd_rel->relkind != RELKIND_RELATION &&
2687 relation->
rd_rel->relkind != RELKIND_FOREIGN_TABLE &&
2688 relation->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
2690 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2691 errmsg(
"inherited relation \"%s\" is not a table or foreign table",
2699 relation->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
2700 relpersistence == RELPERSISTENCE_TEMP)
2702 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2703 errmsg(
"cannot create a temporary relation as partition of permanent relation \"%s\"",
2707 if (relpersistence != RELPERSISTENCE_TEMP &&
2708 relation->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
2710 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2712 ?
"cannot inherit from temporary relation \"%s\""
2713 :
"cannot create a permanent relation as partition of temporary relation \"%s\"",
2719 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2721 ?
"cannot inherit from temporary relation of another session"
2722 :
"cannot create as partition of temporary relation of another session")));
2733 constr = tupleDesc->
constr;
2743 inherited_defaults = cols_with_defaults =
NIL;
2759 char *attributeName =
NameStr(attribute->attname);
2767 if (attribute->attisdropped)
2774 attribute->atttypmod, attribute->attcollation);
2775 newdef->
storage = attribute->attstorage;
2776 newdef->
generated = attribute->attgenerated;
2787 newdef->
identity = attribute->attidentity;
2794 if (exist_attno > 0)
2801 newattmap->
attnums[parent_attno - 1] = exist_attno;
2816 inh_columns =
lappend(inh_columns, newdef);
2818 newattmap->
attnums[parent_attno - 1] = ++child_attno;
2831 if (attribute->atthasdef)
2836 if (this_default == NULL)
2837 elog(
ERROR,
"default expression not found for attribute %d of relation \"%s\"",
2846 inherited_defaults =
lappend(inherited_defaults, this_default);
2847 cols_with_defaults =
lappend(cols_with_defaults, mergeddef);
2855 forboth(lc1, inherited_defaults, lc2, cols_with_defaults)
2859 bool found_whole_row;
2873 if (found_whole_row)
2875 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2876 errmsg(
"cannot convert whole-row table reference"),
2877 errdetail(
"Generation expression for column \"%s\" contains a whole-row reference to table \"%s\".",
2893 have_bogus_defaults =
true;
2910 bool found_whole_row;
2913 if (check[
i].ccnoinherit)
2927 if (found_whole_row)
2929 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2930 errmsg(
"cannot convert whole-row table reference"),
2931 errdetail(
"Constraint \"%s\" contains a whole-row reference to table \"%s\".",
2936 check[
i].ccenforced);
2948 nn->attnum = newattmap->
attnums[nn->attnum - 1];
2950 nnconstraints =
lappend(nnconstraints, nn);
2969 if (inh_columns !=
NIL)
2971 int newcol_attno = 0;
2973 foreach(lc, columns)
2976 char *attributeName = newdef->
colname;
2991 if (exist_attno > 0)
3003 inh_columns =
lappend(inh_columns, newdef);
3007 columns = inh_columns;
3015 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
3016 errmsg(
"tables can have at most %d columns",
3027 foreach(lc, saved_columns)
3052 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3053 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3057 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3058 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3065 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3066 errmsg(
"child column \"%s\" specifies generation expression",
3068 errhint(
"A child table column cannot be generated unless its parent column is.")));
3073 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3074 errmsg(
"column \"%s\" inherits from generated column of different kind",
3076 errdetail(
"Parent column is %s, child column is %s.",
3077 coldef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3078 restdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3102 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3103 errmsg(
"column \"%s\" does not exist",
3112 if (have_bogus_defaults)
3114 foreach(lc, columns)
3122 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3123 errmsg(
"column \"%s\" inherits conflicting generation expressions",
3125 errhint(
"To resolve the conflict, specify a generation expression explicitly.")));
3128 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3129 errmsg(
"column \"%s\" inherits conflicting default values",
3131 errhint(
"To resolve the conflict, specify a default explicitly.")));
3136 *supconstr = constraints;
3137 *supnotnulls = nnconstraints;
3164 foreach(lc, constraints)
3180 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3181 errmsg(
"too many inheritance parents"));
3198 errmsg(
"check constraint name \"%s\" appears multiple times but with different expressions",
3209 newcon->
expr = expr;
3213 return lappend(constraints, newcon);
3240 char *attributeName = newdef->
colname;
3249 if (exist_attno == newcol_attno)
3251 (
errmsg(
"merging column \"%s\" with inherited definition",
3255 (
errmsg(
"moving and merging column \"%s\" with inherited definition", attributeName),
3256 errdetail(
"User-specified column moved to the position of the inherited column.")));
3265 if (inhtypeid != newtypeid || inhtypmod != newtypmod)
3267 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3268 errmsg(
"column \"%s\" has a type conflict",
3279 if (inhcollid != newcollid)
3281 (
errcode(ERRCODE_COLLATION_MISMATCH),
3282 errmsg(
"column \"%s\" has a collation conflict",
3301 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3302 errmsg(
"column \"%s\" has a storage parameter conflict",
3317 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3318 errmsg(
"column \"%s\" has a compression method conflict",
3346 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3347 errmsg(
"column \"%s\" inherits from generated column but specifies default",
3351 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3352 errmsg(
"column \"%s\" inherits from generated column but specifies identity",
3359 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3360 errmsg(
"child column \"%s\" specifies generation expression",
3362 errhint(
"A child table column cannot be generated unless its parent column is.")));
3367 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
3368 errmsg(
"column \"%s\" inherits from generated column of different kind",
3370 errdetail(
"Parent column is %s, child column is %s.",
3371 inhdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
3372 newdef->
generated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
3412 char *attributeName = newdef->
colname;
3422 (
errmsg(
"merging multiple inherited definitions of column \"%s\"",
3431 if (prevtypeid != newtypeid || prevtypmod != newtypmod)
3433 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3434 errmsg(
"inherited column \"%s\" has a type conflict",
3445 if (prevcollid != newcollid)
3447 (
errcode(ERRCODE_COLLATION_MISMATCH),
3448 errmsg(
"inherited column \"%s\" has a collation conflict",
3461 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3462 errmsg(
"inherited column \"%s\" has a storage parameter conflict",
3477 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3478 errmsg(
"column \"%s\" has a compression method conflict",
3489 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3490 errmsg(
"inherited column \"%s\" has a generation conflict",
3500 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
3501 errmsg(
"too many inheritance parents"));
3514 bool child_is_partition)
3540 foreach(entry, supers)
3545 child_is_partition);
3559 bool child_is_partition)
3570 parentobject.
classId = RelationRelationId;
3573 childobject.
classId = RelationRelationId;
3607 foreach(lc, columns)
3656 elog(
ERROR,
"cache lookup failed for relation %u", relationId);
3659 if (classtuple->relhassubclass != relhassubclass)
3661 classtuple->relhassubclass = relhassubclass;
3687 Oid oldTableSpaceId;
3693 oldTableSpaceId = rel->
rd_rel->reltablespace;
3694 if (newTableSpaceId == oldTableSpaceId ||
3704 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3705 errmsg(
"cannot move system relation \"%s\"",
3709 if (newTableSpaceId == GLOBALTABLESPACE_OID)
3711 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
3712 errmsg(
"only shared relations can be placed in pg_global tablespace")));
3720 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3721 errmsg(
"cannot move temporary tables of other sessions")));
3743 Oid newTableSpaceId,
3759 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
3767 rd_rel->relfilenode = newRelFilenumber;
3775 if (!RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
3777 rd_rel->reltablespace);
3789 char relkind = classform->relkind;
3791 if (classform->reloftype && !recursing)
3793 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3794 errmsg(
"cannot rename column of typed table")));
3803 if (relkind != RELKIND_RELATION &&
3804 relkind != RELKIND_VIEW &&
3805 relkind != RELKIND_MATVIEW &&
3806 relkind != RELKIND_COMPOSITE_TYPE &&
3807 relkind != RELKIND_INDEX &&
3808 relkind != RELKIND_PARTITIONED_INDEX &&
3809 relkind != RELKIND_FOREIGN_TABLE &&
3810 relkind != RELKIND_PARTITIONED_TABLE)
3812 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3813 errmsg(
"cannot rename columns of relation \"%s\"",
3825 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
3826 errmsg(
"permission denied: \"%s\" is a system catalog",
3827 NameStr(classform->relname))));
3837 const char *oldattname,
3838 const char *newattname,
3841 int expected_parents,
3885 forboth(lo, child_oids, li, child_numparents)
3890 if (childrelid == myrelid)
3893 renameatt_internal(childrelid, oldattname, newattname,
false,
true, numparents, behavior);
3904 if (expected_parents == 0 &&
3907 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3908 errmsg(
"inherited column \"%s\" must be renamed in child tables too",
3913 if (targetrelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
3922 foreach(lo, child_oids)
3931 (
errcode(ERRCODE_UNDEFINED_COLUMN),
3932 errmsg(
"column \"%s\" does not exist",
3936 attnum = attform->attnum;
3939 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3940 errmsg(
"cannot rename system column \"%s\"",
3952 if (attform->attinhcount > expected_parents)
3954 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
3955 errmsg(
"cannot rename inherited column \"%s\"",
4016 (
errmsg(
"relation \"%s\" does not exist, skipping",
4017 stmt->relation->relname)));
4025 stmt->relation->inh,
4041 const char *oldconname,
4042 const char *newconname,
4045 int expected_parents)
4053 Assert(!myrelid || !mytypid);
4074 elog(
ERROR,
"cache lookup failed for constraint %u",
4079 (con->contype == CONSTRAINT_CHECK ||
4080 con->contype == CONSTRAINT_NOTNULL) &&
4093 forboth(lo, child_oids, li, child_numparents)
4098 if (childrelid == myrelid)
4106 if (expected_parents == 0 &&
4109 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4110 errmsg(
"inherited constraint \"%s\" must be renamed in child tables too",
4114 if (con->coninhcount > expected_parents)
4116 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
4117 errmsg(
"cannot rename inherited constraint \"%s\"",
4122 && (con->contype == CONSTRAINT_PRIMARY
4123 || con->contype == CONSTRAINT_UNIQUE
4124 || con->contype == CONSTRAINT_EXCLUSION))
4162 elog(
ERROR,
"cache lookup failed for type %u", typid);
4177 (
errmsg(
"relation \"%s\" does not exist, skipping",
4178 stmt->relation->relname)));
4188 stmt->relation->inh),
4229 (
errmsg(
"relation \"%s\" does not exist, skipping",
4230 stmt->relation->relname)));
4241 obj_is_index = (relkind == RELKIND_INDEX ||
4242 relkind == RELKIND_PARTITIONED_INDEX);
4243 if (obj_is_index || is_index_stmt == obj_is_index)
4247 is_index_stmt = obj_is_index;
4291 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4297 (
errcode(ERRCODE_DUPLICATE_TABLE),
4298 errmsg(
"relation \"%s\" already exists",
4308 is_index == (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4309 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX));
4331 newrelname, namespaceId);
4336 if (targetrelation->
rd_rel->relkind == RELKIND_INDEX ||
4337 targetrelation->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
4368 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
4410 int expected_refcnt;
4415 (
errcode(ERRCODE_OBJECT_IN_USE),
4417 errmsg(
"cannot %s \"%s\" because it is being used by active queries in this session",
4420 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
4421 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
4424 (
errcode(ERRCODE_OBJECT_IN_USE),
4426 errmsg(
"cannot %s \"%s\" because it has pending trigger events",
4451 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4452 errmsg(
"cannot alter temporary tables of other sessions")));
4564 ATController(NULL, rel, cmds, recurse, lockmode, NULL);
4840 elog(
ERROR,
"unrecognized alter table type: %d",
4848 if (cmd_lockmode > lockmode)
4849 lockmode = cmd_lockmode;
4874 ATPrepCmd(&wqueue, rel, cmd, recurse,
false, lockmode, context);
4898 bool recurse,
bool recursing,
LOCKMODE lockmode,
4911 if (rel->
rd_rel->relispartition &&
4915 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
4916 errmsg(
"cannot alter partition \"%s\" with an incomplete detach",
4918 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
5144 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5145 errmsg(
"cannot change persistence setting twice")));
5161 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5162 errmsg(
"cannot have multiple SET ACCESS METHOD subcommands")));
5275 elog(
ERROR,
"unrecognized alter table type: %d",
5309 foreach(ltab, *wqueue)
5325 foreach(lcmd, subcmds)
5328 lockmode, pass, context);
5347 foreach(ltab, *wqueue)
5356 if (((tab->
relkind == RELKIND_RELATION ||
5357 tab->
relkind == RELKIND_PARTITIONED_TABLE) &&
5359 tab->
relkind == RELKIND_MATVIEW)
5381 lockmode, cur_pass, context);
5409 cmd->
recurse,
false, lockmode);
5462 cmd->
recurse,
false, lockmode);
5467 true,
true, lockmode);
5529 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE &&
5540 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
5541 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
5650 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
5662 Assert(rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
5671 elog(
ERROR,
"unrecognized alter table type: %d",
5731 foreach(lc, beforeStmts)
5740 foreach(lc, atstmt->
cmds)
5792 if (pass < cur_pass)
5795 elog(
ERROR,
"ALTER TABLE scheduling failure: too late for pass %d",
5798 else if (pass > cur_pass)
5815 elog(
ERROR,
"ALTER TABLE scheduling failure: bogus item for pass %d",
5836 foreach(ltab, *wqueue)
5841 if (!RELKIND_HAS_STORAGE(tab->
relkind))
5882 Oid NewAccessMethod;
5895 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5896 errmsg(
"cannot rewrite system relation \"%s\"",
5901 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5902 errmsg(
"cannot rewrite table \"%s\" used as a catalog table",
5913 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
5914 errmsg(
"cannot rewrite temporary tables of other sessions")));
5923 NewTableSpace = OldHeap->
rd_rel->reltablespace;
5932 NewAccessMethod = OldHeap->
rd_rel->relam;
5975 persistence, lockmode);
6034 foreach(lc, seqlist)
6050 foreach(ltab, *wqueue)
6057 if (!RELKIND_HAS_STORAGE(tab->
relkind))
6096 foreach(ltab, *wqueue)
6124 bool needscan =
false;
6125 List *notnull_attrs;
6126 List *notnull_virtual_attrs;
6191 elog(
ERROR,
"unrecognized constraint type: %d",
6211 notnull_attrs = notnull_virtual_attrs =
NIL;
6224 for (
i = 0;
i < newTupDesc->
natts;
i++)
6233 if (wholeatt->attgenerated != ATTRIBUTE_GENERATED_VIRTUAL)
6234 notnull_attrs =
lappend_int(notnull_attrs, wholeatt->attnum);
6236 notnull_virtual_attrs =
lappend_int(notnull_virtual_attrs,
6240 if (notnull_attrs || notnull_virtual_attrs)
6244 if (newrel || needscan)
6262 if (notnull_virtual_attrs !=
NIL)
6337 for (
i = 0;
i < newTupDesc->
natts;
i++)
6373 foreach(lc, dropped_attrs)
6427 insertslot = newslot;
6436 insertslot = oldslot;
6449 (
errcode(ERRCODE_NOT_NULL_VIOLATION),
6450 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6457 if (notnull_virtual_attrs !=
NIL)
6463 notnull_virtual_attrs);
6469 errcode(ERRCODE_NOT_NULL_VIOLATION),
6470 errmsg(
"column \"%s\" of relation \"%s\" contains null values",
6486 (
errcode(ERRCODE_CHECK_VIOLATION),
6487 errmsg(
"check constraint \"%s\" of relation \"%s\" is violated by some row",
6497 elog(
ERROR,
"unrecognized constraint type: %d",
6502 if (partqualstate && !
ExecCheck(partqualstate, econtext))
6506 (
errcode(ERRCODE_CHECK_VIOLATION),
6507 errmsg(
"updated partition constraint for default partition \"%s\" would be violated by some row",
6512 (
errcode(ERRCODE_CHECK_VIOLATION),
6513 errmsg(
"partition constraint of relation \"%s\" is violated by some row",
6521 ti_options, bistate);
6560 foreach(ltab, *wqueue)
6563 if (tab->
relid == relid)
6582 *wqueue =
lappend(*wqueue, tab);
6594 return "ADD COLUMN";
6597 return "ALTER COLUMN ... SET DEFAULT";
6599 return "ALTER COLUMN ... DROP NOT NULL";
6601 return "ALTER COLUMN ... SET NOT NULL";
6603 return "ALTER COLUMN ... SET EXPRESSION";
6605 return "ALTER COLUMN ... DROP EXPRESSION";
6607 return "ALTER COLUMN ... SET STATISTICS";
6609 return "ALTER COLUMN ... SET";
6611 return "ALTER COLUMN ... RESET";
6613 return "ALTER COLUMN ... SET STORAGE";
6615 return "ALTER COLUMN ... SET COMPRESSION";
6617 return "DROP COLUMN";
6625 return "ADD CONSTRAINT";
6627 return "ALTER CONSTRAINT";
6629 return "VALIDATE CONSTRAINT";
6631 return "DROP CONSTRAINT";
6635 return "ALTER COLUMN ... SET DATA TYPE";
6637 return "ALTER COLUMN ... OPTIONS";
6641 return "CLUSTER ON";
6643 return "SET WITHOUT CLUSTER";
6645 return "SET ACCESS METHOD";
6647 return "SET LOGGED";
6649 return "SET UNLOGGED";
6651 return "SET WITHOUT OIDS";
6653 return "SET TABLESPACE";
6661 return "ENABLE TRIGGER";
6663 return "ENABLE ALWAYS TRIGGER";
6665 return "ENABLE REPLICA TRIGGER";
6667 return "DISABLE TRIGGER";
6669 return "ENABLE TRIGGER ALL";
6671 return "DISABLE TRIGGER ALL";
6673 return "ENABLE TRIGGER USER";
6675 return "DISABLE TRIGGER USER";
6677 return "ENABLE RULE";
6679 return "ENABLE ALWAYS RULE";
6681 return "ENABLE REPLICA RULE";
6683 return "DISABLE RULE";
6687 return "NO INHERIT";
6693 return "REPLICA IDENTITY";
6695 return "ENABLE ROW SECURITY";
6697 return "DISABLE ROW SECURITY";
6699 return "FORCE ROW SECURITY";
6701 return "NO FORCE ROW SECURITY";
6705 return "ATTACH PARTITION";
6707 return "DETACH PARTITION";
6709 return "DETACH PARTITION ... FINALIZE";
6711 return "ALTER COLUMN ... ADD IDENTITY";
6713 return "ALTER COLUMN ... SET";
6715 return "ALTER COLUMN ... DROP IDENTITY";
6735 switch (rel->
rd_rel->relkind)
6737 case RELKIND_RELATION:
6740 case RELKIND_PARTITIONED_TABLE:
6746 case RELKIND_MATVIEW:
6752 case RELKIND_PARTITIONED_INDEX:
6755 case RELKIND_COMPOSITE_TYPE:
6758 case RELKIND_FOREIGN_TABLE:
6761 case RELKIND_SEQUENCE:
6770 if ((actual_target & allowed_targets) == 0)
6776 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
6778 errmsg(
"ALTER action %s cannot be performed on relation \"%s\"",
6783 elog(
ERROR,
"invalid ALTER action attempted on relation \"%s\"",
6794 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
6795 errmsg(
"permission denied: \"%s\" is a system catalog",
6816 if (recurse && rel->
rd_rel->relhassubclass)
6829 foreach(child, children)
6834 if (childrelid == relid)
6839 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
6855 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
6889 Assert(rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
6895 foreach(child, children)
6902 ATPrepCmd(wqueue, childrel, cmd,
true,
true, lockmode, context);
6929 const char *origTypeName)
6946 Anum_pg_depend_refclassid,
6950 Anum_pg_depend_refobjid,
6965 if (pg_depend->classid == TypeRelationId)
6974 origRelation, origTypeName);
6979 if (pg_depend->classid != RelationRelationId)
6998 if (pg_depend->objsubid > 0 && pg_depend->objsubid <= tupleDesc->
natts)
7003 for (
int attno = 1; attno <= tupleDesc->
natts; attno++)
7006 if (att->atttypid == typeOid && !att->attisdropped)
7027 if (RELKIND_HAS_STORAGE(rel->
rd_rel->relkind) ||
7028 RELKIND_HAS_PARTITIONS(rel->
rd_rel->relkind))
7032 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7033 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7037 else if (origRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7039 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7040 errmsg(
"cannot alter type \"%s\" because column \"%s.%s\" uses it",
7044 else if (origRelation->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
7046 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7047 errmsg(
"cannot alter foreign table \"%s\" because column \"%s.%s\" uses its row type",
7053 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7054 errmsg(
"cannot alter table \"%s\" because column \"%s.%s\" uses its row type",
7066 origRelation, origTypeName);
7097 Anum_pg_class_reloftype,
7109 (
errcode(ERRCODE_DEPENDENT_OBJECTS_STILL_EXIST),
7110 errmsg(
"cannot alter type \"%s\" because it is the type of a typed table",
7112 errhint(
"Use ALTER ... CASCADE to alter the typed tables too.")));
7138 bool typeOk =
false;
7140 if (typ->typtype == TYPTYPE_COMPOSITE)
7146 typeOk = (typeRelation->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE);
7157 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7158 errmsg(
"type %s is the row type of another table",
7160 errdetail(
"A typed table must use a stand-alone composite type created with CREATE TYPE.")));
7164 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7165 errmsg(
"type %s is not a composite type",
7189 if (rel->
rd_rel->reloftype && !recursing)
7191 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7192 errmsg(
"cannot add column to typed table")));
7194 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
7197 if (recurse && !is_view)
7216 bool if_not_exists = (*cmd)->missing_ok;
7239 if (rel->
rd_rel->relispartition && !recursing)
7241 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
7242 errmsg(
"cannot add column to a partition")));
7267 if (ctypeId != childatt->atttypid ||
7268 ctypmod != childatt->atttypmod)
7270 (
errcode(ERRCODE_DATATYPE_MISMATCH),
7271 errmsg(
"child table \"%s\" has different type for column \"%s\"",
7274 if (ccollid != childatt->attcollation)
7276 (
errcode(ERRCODE_COLLATION_MISMATCH),
7277 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
7285 &childatt->attinhcount))
7287 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7288 errmsg(
"too many inheritance parents"));
7295 (
errmsg(
"merging definition of column \"%s\" for child \"%s\"",
7325 if (context != NULL && !recursing)
7344 rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE &&
7347 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7348 errmsg(
"cannot recursively add identity column to table that has child tables")));
7354 elog(
ERROR,
"cache lookup failed for relation %u", myrelid);
7356 relkind = relform->relkind;
7359 newattnum = relform->relnatts + 1;
7362 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
7363 errmsg(
"tables can have at most %d columns",
7374 attribute->attnum = newattnum;
7388 relform->relnatts = newattnum;
7410 rawEnt->
attnum = attribute->attnum;
7419 false,
true,
false, NULL);
7457 if (RELKIND_HAS_STORAGE(relkind))
7459 bool has_domain_constraints;
7460 bool has_missing =
false;
7471 nve->
typeId = attribute->atttypid;
7473 defval = (
Expr *) nve;
7480 if (!defval && has_domain_constraints)
7486 baseTypeMod = attribute->atttypmod;
7493 attribute->atttypid,
7494 attribute->atttypmod,
7499 elog(
ERROR,
"failed to coerce base type to domain");
7511 newval->attnum = attribute->attnum;
7526 if (rel->
rd_rel->relkind == RELKIND_RELATION &&
7528 !has_domain_constraints &&
7559 if (colDef->
generated != ATTRIBUTE_GENERATED_VIRTUAL)
7592 if (children && !recurse)
7594 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7595 errmsg(
"column must be added to child tables too")));
7608 foreach(child, children)
7623 &childcmd, recurse,
true,
7624 lockmode, cur_pass, context);
7664 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7665 errmsg(
"column name \"%s\" conflicts with a system column name",
7672 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7673 errmsg(
"column \"%s\" of relation \"%s\" already exists, skipping",
7679 (
errcode(ERRCODE_DUPLICATE_COLUMN),
7680 errmsg(
"column \"%s\" of relation \"%s\" already exists",
7696 myself.
classId = RelationRelationId;
7699 referenced.
classId = TypeRelationId;
7717 myself.
classId = RelationRelationId;
7720 referenced.
classId = CollationRelationId;
7752 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7753 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7761 if (!attTup->attnotnull)
7770 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7771 errmsg(
"cannot alter system column \"%s\"",
7774 if (attTup->attidentity)
7776 (
errcode(ERRCODE_SYNTAX_ERROR),
7777 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
7783 if (rel->
rd_rel->relispartition)
7790 parent_attnum =
get_attnum(parentId, colName);
7793 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
7794 errmsg(
"column \"%s\" is marked NOT NULL in parent table",
7805 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
7833 bool is_valid,
bool queue_validation)
7838 Assert(!queue_validation || wqueue);
7847 if (attr->attisdropped)
7850 if (!attr->attnotnull)
7859 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
7867 attr->attnotnull =
true;
7874 if (queue_validation && wqueue &&
7906 bool recurse,
bool recursing,
LOCKMODE lockmode)
7914 bool is_no_inherit =
false;
7930 (
errcode(ERRCODE_UNDEFINED_COLUMN),
7931 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
7937 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7938 errmsg(
"cannot alter system column \"%s\"",
7946 bool changed =
false;
7951 if (conForm->connoinherit && recurse)
7953 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
7954 errmsg(
"cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"",
7966 &conForm->coninhcount))
7968 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
7969 errmsg(
"too many inheritance parents"));
7972 else if (!conForm->conislocal)
7974 conForm->conislocal =
true;
7977 else if (!conForm->convalidated)
7984 recurse, recursing, lockmode);
8013 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
8015 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8016 errmsg(
"constraint must be added to child tables too"),
8017 errhint(
"Do not specify the ONLY keyword."));
8019 is_no_inherit =
true;
8030 colName,
"not_null",
8037 constraint->
conname = conName;
8041 false, !recursing,
false, NULL);
8068 recurse,
true, lockmode);
8098 nnulltest->argisrow =
false;
8104 (
errmsg_internal(
"existing constraints on column \"%s.%s\" are sufficient to prove that it does not contain nulls",
8131 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8132 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8138 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8139 errmsg(
"cannot alter system column \"%s\"",
8144 (
errcode(ERRCODE_SYNTAX_ERROR),
8145 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
8148 newDefault ? 0 :
errhint(
"Use %s instead.",
8149 "ALTER TABLE ... ALTER COLUMN ... DROP IDENTITY")));
8153 (
errcode(ERRCODE_SYNTAX_ERROR),
8154 errmsg(
"column \"%s\" of relation \"%s\" is a generated column",
8158 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... SET EXPRESSION") :
8160 errhint(
"Use %s instead.",
"ALTER TABLE ... ALTER COLUMN ... DROP EXPRESSION") : 0)));
8172 newDefault != NULL);
8189 false,
true,
false, NULL);
8233 Node *def,
LOCKMODE lockmode,
bool recurse,
bool recursing)
8243 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8244 if (ispartitioned && !recurse)
8246 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8247 errmsg(
"cannot add identity to a column of only the partitioned table"),
8248 errhint(
"Do not specify the ONLY keyword.")));
8250 if (rel->
rd_rel->relispartition && !recursing)
8252 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8253 errmsg(
"cannot add identity to a column of a partition"));
8260 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8261 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8269 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8270 errmsg(
"cannot alter system column \"%s\"",
8278 if (!attTup->attnotnull)
8280 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8281 errmsg(
"column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added",
8288 if (attTup->attnotnull)
8296 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
8300 if (!conForm->convalidated)
8302 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8303 errmsg(
"incompatible NOT VALID constraint \"%s\" on relation \"%s\"",
8305 errhint(
"You might need to validate it using %s.",
8306 "ALTER TABLE ... VALIDATE CONSTRAINT"));
8309 if (attTup->attidentity)
8311 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8312 errmsg(
"column \"%s\" of relation \"%s\" is already an identity column",
8315 if (attTup->atthasdef)
8317 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8318 errmsg(
"column \"%s\" of relation \"%s\" already has a default value",
8321 attTup->attidentity = cdef->
identity;
8337 if (recurse && ispartitioned)
8344 foreach(lc, children)
8364 LOCKMODE lockmode,
bool recurse,
bool recursing)
8375 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8376 if (ispartitioned && !recurse)
8378 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8379 errmsg(
"cannot change identity column of only the partitioned table"),
8380 errhint(
"Do not specify the ONLY keyword.")));
8382 if (rel->
rd_rel->relispartition && !recursing)
8384 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8385 errmsg(
"cannot change identity column of a partition"));
8391 if (strcmp(defel->
defname,
"generated") == 0)
8395 (
errcode(ERRCODE_SYNTAX_ERROR),
8396 errmsg(
"conflicting or redundant options")));
8397 generatedEl = defel;
8400 elog(
ERROR,
"option \"%s\" not recognized",
8414 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8415 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8423 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8424 errmsg(
"cannot alter system column \"%s\"",
8427 if (!attTup->attidentity)
8429 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8430 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8454 if (generatedEl && recurse && ispartitioned)
8461 foreach(lc, children)
8481 bool recurse,
bool recursing)
8492 ispartitioned = (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
8493 if (ispartitioned && !recurse)
8495 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8496 errmsg(
"cannot drop identity from a column of only the partitioned table"),
8497 errhint(
"Do not specify the ONLY keyword.")));
8499 if (rel->
rd_rel->relispartition && !recursing)
8501 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8502 errmsg(
"cannot drop identity from a column of a partition"));
8508 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8509 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8517 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8518 errmsg(
"cannot alter system column \"%s\"",
8521 if (!attTup->attidentity)
8525 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8526 errmsg(
"column \"%s\" of relation \"%s\" is not an identity column",
8531 (
errmsg(
"column \"%s\" of relation \"%s\" is not an identity column, skipping",
8539 attTup->attidentity =
'\0';
8555 if (recurse && ispartitioned)
8562 foreach(lc, children)
8579 seqaddress.
classId = RelationRelationId;
8611 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8612 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8620 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8621 errmsg(
"cannot alter system column \"%s\"",
8624 attgenerated = attTup->attgenerated;
8627 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8628 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8635 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8638 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8639 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables with check constraints"),
8640 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8643 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL && attTup->attnotnull)
8653 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL &&
8656 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8657 errmsg(
"ALTER TABLE / SET EXPRESSION is not supported for virtual generated columns in tables that are part of a publication"),
8658 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8661 rewrite = (attgenerated == ATTRIBUTE_GENERATED_STORED);
8691 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8714 false,
true,
false, NULL);
8727 newval->is_generated =
true;
8763 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8764 errmsg(
"ALTER TABLE / DROP EXPRESSION must be applied to child tables too")));
8777 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8778 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8783 if (attTup->attinhcount > 0)
8785 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
8786 errmsg(
"cannot drop generation expression from inherited column")));
8807 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8808 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8816 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8817 errmsg(
"cannot alter system column \"%s\"",
8826 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8828 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8829 errmsg(
"ALTER TABLE / DROP EXPRESSION is not supported for virtual generated columns"),
8830 errdetail(
"Column \"%s\" of relation \"%s\" is a virtual generated column.",
8833 if (!attTup->attgenerated)
8837 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
8838 errmsg(
"column \"%s\" of relation \"%s\" is not a generated column",
8843 (
errmsg(
"column \"%s\" of relation \"%s\" is not a generated column, skipping",
8855 attTup->attgenerated =
'\0';
8872 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
8901 bool newtarget_default;
8908 Datum repl_val[Natts_pg_attribute];
8909 bool repl_null[Natts_pg_attribute];
8910 bool repl_repl[Natts_pg_attribute];
8916 if (rel->
rd_rel->relkind != RELKIND_INDEX &&
8917 rel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX &&
8920 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8921 errmsg(
"cannot refer to non-index column by number")));
8924 if (newValue &&
intVal(newValue) != -1)
8926 newtarget =
intVal(newValue);
8927 newtarget_default =
false;
8930 newtarget_default =
true;
8932 if (!newtarget_default)
8940 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8941 errmsg(
"statistics target %d is too low",
8948 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
8949 errmsg(
"lowering statistics target to %d",
8962 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8963 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
8972 (
errcode(ERRCODE_UNDEFINED_COLUMN),
8973 errmsg(
"column number %d of relation \"%s\" does not exist",
8979 attnum = attrtuple->attnum;
8982 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8983 errmsg(
"cannot alter system column \"%s\"",
8990 if (attrtuple->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
8992 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
8993 errmsg(
"cannot alter statistics on virtual generated column \"%s\"",
8996 if (rel->
rd_rel->relkind == RELKIND_INDEX ||
8997 rel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
9001 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9002 errmsg(
"cannot alter statistics on included column \"%s\" of index \"%s\"",
9006 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9007 errmsg(
"cannot alter statistics on non-expression column \"%s\" of index \"%s\"",
9009 errhint(
"Alter statistics on table column instead.")));
9013 memset(repl_null,
false,
sizeof(repl_null));
9014 memset(repl_repl,
false,
sizeof(repl_repl));
9015 if (!newtarget_default)
9016 repl_val[Anum_pg_attribute_attstattarget - 1] =
Int16GetDatum(newtarget);
9018 repl_null[Anum_pg_attribute_attstattarget - 1] =
true;
9019 repl_repl[Anum_pg_attribute_attstattarget - 1] =
true;
9021 repl_val, repl_null, repl_repl);
9055 Datum repl_val[Natts_pg_attribute];
9056 bool repl_null[Natts_pg_attribute];
9057 bool repl_repl[Natts_pg_attribute];
9065 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9066 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9070 attnum = attrtuple->attnum;
9073 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9074 errmsg(
"cannot alter system column \"%s\"",
9087 memset(repl_null,
false,
sizeof(repl_null));
9088 memset(repl_repl,
false,
sizeof(repl_repl));
9089 if (newOptions != (
Datum) 0)
9090 repl_val[Anum_pg_attribute_attoptions - 1] = newOptions;
9092 repl_null[Anum_pg_attribute_attoptions - 1] =
true;
9093 repl_repl[Anum_pg_attribute_attoptions - 1] =
true;
9095 repl_val, repl_null, repl_repl);
9124 bool setstorage,
char newstorage,
9125 bool setcompression,
char newcompression,
9139 for (
int i = 0;
i < indrel->
rd_index->indnatts;
i++)
9161 attrtuple->attstorage = newstorage;
9164 attrtuple->attcompression = newcompression;
9199 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9200 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9204 attnum = attrtuple->attnum;
9207 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9208 errmsg(
"cannot alter system column \"%s\"",
9224 true, attrtuple->attstorage,
9252 if (rel->
rd_rel->reloftype && !recursing)
9254 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
9255 errmsg(
"cannot drop column from typed table")));
9257 if (rel->
rd_rel->relkind == RELKIND_COMPOSITE_TYPE)
9278 bool recurse,
bool recursing,
9279 bool missing_ok,
LOCKMODE lockmode,
9295 Assert(!recursing || addrs != NULL);
9312 (
errcode(ERRCODE_UNDEFINED_COLUMN),
9313 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
9319 (
errmsg(
"column \"%s\" of relation \"%s\" does not exist, skipping",
9326 attnum = targetatt->attnum;
9331 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9332 errmsg(
"cannot drop system column \"%s\"",
9339 if (targetatt->attinhcount > 0 && !recursing)
9341 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9342 errmsg(
"cannot drop inherited column \"%s\"",
9354 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9355 errmsg(
"cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"",
9377 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
9379 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
9380 errmsg(
"cannot drop column from only the partitioned table when partitions exist"),
9381 errhint(
"Do not specify the ONLY keyword.")));
9384 foreach(child, children)
9396 elog(
ERROR,
"cache lookup failed for attribute \"%s\" of relation %u",
9397 colName, childrelid);
9400 if (childatt->attinhcount <= 0)
9401 elog(
ERROR,
"relation %u has non-inherited attribute \"%s\"",
9402 childrelid, colName);
9411 if (childatt->attinhcount == 1 && !childatt->attislocal)
9415 behavior,
true,
true,
9416 false, lockmode, addrs);
9421 childatt->attinhcount--;
9436 childatt->attinhcount--;
9437 childatt->attislocal =
true;
9453 object.classId = RelationRelationId;
9455 object.objectSubId =
attnum;
9497 bool got_children =
false;
9535 got_children =
true;
9545 errmsg(
"column \"%s\" of table \"%s\" is not marked NOT NULL",
9559 newcmd->
def = (
Node *) nnconstr;
9561 ATPrepCmd(wqueue, rel, newcmd,
true,
false, lockmode, context);
9574 if (conForm->contype != CONSTRAINT_NOTNULL)
9575 elog(
ERROR,
"constraint %u is not a not-null constraint", conForm->oid);
9578 if (conForm->connoinherit)
9580 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9581 errmsg(
"cannot create primary key on column \"%s\"", colname),
9583 errdetail(
"The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key.",
9584 NameStr(conForm->conname), colname,
9586 errhint(
"You might need to make the existing constraint inheritable using %s.",
9587 "ALTER TABLE ... ALTER CONSTRAINT ... INHERIT"));
9590 if (!conForm->convalidated)
9592 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
9593 errmsg(
"cannot create primary key on column \"%s\"", colname),
9595 errdetail(
"The constraint \"%s\" on column \"%s\" of table \"%s\", marked %s, is incompatible with a primary key.",
9596 NameStr(conForm->conname), colname,
9598 errhint(
"You might need to validate it using %s.",
9599 "ALTER TABLE ... VALIDATE CONSTRAINT"));
9627 check_rights = !is_rebuild;
9699 Oid index_oid =
stmt->indexOid;
9703 char *constraintName;
9704 char constraintType;
9716 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
9718 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
9719 errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables")));
9729 elog(
ERROR,
"index \"%s\" is not unique", indexName);
9738 constraintName =
stmt->idxname;
9739 if (constraintName == NULL)
9740 constraintName = indexName;
9741 else if (strcmp(constraintName, indexName) != 0)
9744 (
errmsg(
"ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index \"%s\" to \"%s\"",
9745 indexName, constraintName)));
9755 constraintType = CONSTRAINT_PRIMARY;
9757 constraintType = CONSTRAINT_UNIQUE;
9789 Constraint *newConstraint,
bool recurse,
bool is_readd,
9801 switch (newConstraint->
contype)
9807 newConstraint, recurse,
false, is_readd,
9823 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
9842 elog(
ERROR,
"unrecognized constraint type: %d",
9843 (
int) newConstraint->
contype);
9869 foreach(lc, colnames)
9874 buf[buflen++] =
'_';
9881 buflen += strlen(
buf + buflen);
9905 Constraint *constr,
bool recurse,
bool recursing,
9934 recursing || is_readd,
9944 foreach(lcon, newcons)
10012 if (!recurse && children !=
NIL)
10014 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10015 errmsg(
"constraint must be added to child tables too")));
10020 foreach(child, children)
10035 constr, recurse,
true, is_readd, lockmode);
10061 bool recurse,
bool recursing,
LOCKMODE lockmode)
10076 bool pk_has_without_overlaps;
10099 if (!recurse && rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10101 errcode(ERRCODE_WRONG_OBJECT_TYPE),
10102 errmsg(
"cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"",
10106 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10107 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10109 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10110 errmsg(
"referenced relation \"%s\" is not a table",
10115 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
10116 errmsg(
"permission denied: \"%s\" is a system catalog",
10127 switch (rel->
rd_rel->relpersistence)
10129 case RELPERSISTENCE_PERMANENT:
10132 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10133 errmsg(
"constraints on permanent tables may reference only permanent tables")));
10135 case RELPERSISTENCE_UNLOGGED:
10137 && pkrel->
rd_rel->relpersistence != RELPERSISTENCE_UNLOGGED)
10139 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10140 errmsg(
"constraints on unlogged tables may reference only permanent or unlogged tables")));
10142 case RELPERSISTENCE_TEMP:
10143 if (pkrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
10145 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10146 errmsg(
"constraints on temporary tables may reference only temporary tables")));
10149 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
10150 errmsg(
"constraints on temporary tables must involve temporary tables of this session")));
10160 fkattnum, fktypoid, fkcolloid);
10164 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10165 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10169 fkdelsetcols, NULL, NULL);
10186 pkattnum, pktypoid, pkcolloid,
10187 opclasses, &pk_has_without_overlaps);
10192 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10193 errmsg(
"foreign key uses PERIOD on the referenced table but not the referencing table"));
10199 pkattnum, pktypoid, pkcolloid);
10204 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10205 errmsg(
"foreign key uses PERIOD on the referencing table but not the referenced table"));
10209 with_period, opclasses, &pk_has_without_overlaps);
10216 if (pk_has_without_overlaps && !with_period)
10218 errcode(ERRCODE_INVALID_FOREIGN_KEY),
10219 errmsg(
"foreign key must use PERIOD when referencing a primary key using WITHOUT OVERLAPS"));
10229 for (
i = 0;
i < numfks;
i++)
10242 (
errcode(ERRCODE_SYNTAX_ERROR),
10243 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10248 (
errcode(ERRCODE_SYNTAX_ERROR),
10249 errmsg(
"invalid %s action for foreign key constraint containing generated column",
10261 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
10263 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10264 errmsg(
"foreign key constraints on virtual generated columns are not supported")));
10277 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10278 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10286 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
10287 errmsg(
"unsupported %s action for foreign key constraint using PERIOD",
10299 if (numfks != numpks)
10301 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
10302 errmsg(
"number of referencing and referenced columns for foreign key disagree")));
10311 for (
i = 0;
i < numpks;
i++)
10313 Oid pktype = pktypoid[
i];
10314 Oid fktype = fktypoid[
i];
10316 Oid pkcoll = pkcolloid[
i];
10317 Oid fkcoll = fkcolloid[
i];
10334 elog(
ERROR,
"cache lookup failed for opclass %u", opclasses[
i]);
10336 amid = cla_tup->opcmethod;
10337 opfamily = cla_tup->opcfamily;
10338 opcintype = cla_tup->opcintype;
10351 for_overlaps = with_period &&
i == numpks - 1;
10356 errcode(ERRCODE_UNDEFINED_OBJECT),
10358 ?
errmsg(
"could not identify an overlaps operator for foreign key")
10359 :
errmsg(
"could not identify an equality operator for foreign key"),
10360 errdetail(
"Could not translate compare type %d for operator family \"%s\" of access method \"%s\".",
10371 elog(
ERROR,
"missing operator %d(%u,%u) in opfamily %u",
10372 eqstrategy, opcintype, opcintype, opfamily);
10384 pfeqop_right = fktyped;
10406 Oid input_typeids[2];
10407 Oid target_typeids[2];
10409 input_typeids[0] = pktype;
10410 input_typeids[1] = fktype;
10411 target_typeids[0] = opcintype;
10412 target_typeids[1] = opcintype;
10416 pfeqop = ffeqop = ppeqop;
10417 pfeqop_right = opcintype;
10423 (
errcode(ERRCODE_DATATYPE_MISMATCH),
10424 errmsg(
"foreign key constraint \"%s\" cannot be implemented",
10426 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10427 "are of incompatible types: %s and %s.",
10438 elog(
ERROR,
"key columns are not both collatable");
10455 if ((!pkcolldet || !fkcolldet) && pkcoll != fkcoll)
10457 (
errcode(ERRCODE_COLLATION_MISMATCH),
10458 errmsg(
"foreign key constraint \"%s\" cannot be implemented", fkconstraint->
conname),
10459 errdetail(
"Key columns \"%s\" of the referencing table and \"%s\" of the referenced table "
10460 "have incompatible collations: \"%s\" and \"%s\". "
10461 "If either collation is nondeterministic, then both collations have to be the same.",
10476 old_check_ok = (pfeqop ==
lfirst_oid(old_pfeqop_item));
10498 old_fktype = attr->atttypid;
10499 new_fktype = fktype;
10505 old_fkcoll = attr->attcollation;
10506 new_fkcoll = fkcoll;
10541 old_check_ok = (new_pathtype == old_pathtype &&
10542 new_castfunc == old_castfunc &&
10543 (!IsPolymorphicType(pfeqop_right) ||
10544 new_fktype == old_fktype) &&
10545 (new_fkcoll == old_fkcoll ||
10549 pfeqoperators[
i] = pfeqop;
10550 ppeqoperators[
i] = ppeqop;
10551 ffeqoperators[
i] = ffeqop;
10565 Oid aggedperiodoperoid;
10566 Oid intersectoperoid;
10569 &intersectoperoid);
10574 fkconstraint->
conname, fkconstraint, rel, pkrel,
10639 int numfksetcols,
int16 *fksetcolsattnums,
10642 int numcolsout = 0;
10644 for (
int i = 0;
i < numfksetcols;
i++)
10646 int16 setcol_attnum = fksetcolsattnums[
i];
10650 for (
int j = 0;
j < numfks;
j++)
10652 if (fkattnums[
j] == setcol_attnum)
10664 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
10665 errmsg(
"column \"%s\" referenced in ON DELETE SET action must be part of foreign key", col)));
10670 for (
int j = 0;
j < numcolsout;
j++)
10672 if (fksetcolsattnums[
j] == setcol_attnum)
10679 fksetcolsattnums[numcolsout++] = setcol_attnum;
10715 char *constraintname,
Constraint *fkconstraint,
10717 int numfks,
int16 *pkattnum,
10718 int16 *fkattnum,
Oid *pfeqoperators,
Oid *ppeqoperators,
10719 Oid *ffeqoperators,
int numfkdelsetcols,
int16 *fkdelsetcols,
10720 bool is_internal,
bool with_period)
10733 if (pkrel->
rd_rel->relkind != RELKIND_RELATION &&
10734 pkrel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE)
10736 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
10737 errmsg(
"referenced relation \"%s\" is not a table",
10754 conname = constraintname;
10756 if (fkconstraint->
conname == NULL)
10761 conislocal =
false;
10763 connoinherit =
false;
10773 connoinherit = rel->
rd_rel->relkind != RELKIND_PARTITIONED_TABLE;
10781 CONSTRAINT_FOREIGN,
10896 Oid *ppeqoperators,
Oid *ffeqoperators,
10897 int numfkdelsetcols,
int16 *fkdelsetcols,
10899 Oid parentDelTrigger,
Oid parentUpdTrigger,
10916 parentConstr, indexOid,
10917 parentDelTrigger, parentUpdTrigger,
10918 &deleteTriggerOid, &updateTriggerOid);
10925 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
10950 for (
int j = 0;
j < numfks;
j++)
10951 mapped_pkattnum[
j] = map->
attnums[pkattnum[
j] - 1];
10954 mapped_pkattnum = pkattnum;
10959 elog(
ERROR,
"index for %u not found in partition %s",
10964 fkconstraint->
conname, fkconstraint, rel,
10965 partRel, partIndexId, parentConstr,
10966 numfks, mapped_pkattnum,
10967 fkattnum, pfeqoperators, ppeqoperators,
10968 ffeqoperators, numfkdelsetcols,
10969 fkdelsetcols,
true, with_period);
10972 partIndexId, address.
objectId, numfks,
10973 mapped_pkattnum, fkattnum,
10974 pfeqoperators, ppeqoperators, ffeqoperators,
10975 numfkdelsetcols, fkdelsetcols,
10977 deleteTriggerOid, updateTriggerOid,
10984 pfree(mapped_pkattnum);
11032 int numfks,
int16 *pkattnum,
int16 *fkattnum,
11033 Oid *pfeqoperators,
Oid *ppeqoperators,
Oid *ffeqoperators,
11034 int numfkdelsetcols,
int16 *fkdelsetcols,
11035 bool old_check_ok,
LOCKMODE lockmode,
11036 Oid parentInsTrigger,
Oid parentUpdTrigger,
11046 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
11048 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
11049 errmsg(
"foreign key constraints are not supported on foreign tables")));
11063 parentInsTrigger, parentUpdTrigger,
11064 &insertTriggerOid, &updateTriggerOid);
11066 if (rel->
rd_rel->relkind == RELKIND_RELATION)
11089 newcon->
conid = parentConstr;
11091 newcon->
qual = (
Node *) fkconstraint;
11096 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11128 for (
int j = 0;
j < numfks;
j++)
11129 mapped_fkattnum[
j] = attmap->
attnums[fkattnum[
j] - 1];
11162 fkconstraint->
conname, fkconstraint,
11163 partition, pkrel, indexOid, parentConstr,
11165 mapped_fkattnum, pfeqoperators,
11166 ppeqoperators, ffeqoperators,
11167 numfkdelsetcols, fkdelsetcols,
true,
11213 Assert(parentRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
11288 foreach(cell, clone)
11302 int numfkdelsetcols;
11311 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
11327 indexOid = constrForm->conindid;
11338 for (
int i = 0;
i < numfks;
i++)
11339 mapped_confkey[
i] = attmap->
attnums[confkey[
i] - 1];
11342 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11344 fkconstraint->
deferrable = constrForm->condeferrable;
11347 fkconstraint->
pktable = NULL;
11350 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11356 fkconstraint->
is_enforced = constrForm->conenforced;
11361 for (
int i = 0;
i < numfks;
i++)
11378 elog(
ERROR,
"index for %u not found in partition %s",
11386 if (constrForm->conenforced)
11388 constrForm->confrelid, constrForm->conrelid,
11389 &deleteTriggerOid, &updateTriggerOid);
11393 fkconstraint->
conname, fkconstraint, fkRel,
11394 partitionRel, partIndexId, constrOid,
11395 numfks, mapped_confkey,
11396 conkey, conpfeqop, conppeqop, conffeqop,
11397 numfkdelsetcols, confdelsetcols,
false,
11398 constrForm->conperiod);
11416 constrForm->conperiod);
11464 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
11465 errmsg(
"cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"",
11479 if (partRel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
11481 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
11482 errmsg(
"foreign key constraints are not supported on foreign tables")));
11502 foreach(cell, clone)
11515 int numfkdelsetcols;
11528 elog(
ERROR,
"cache lookup failed for constraint %u",
11544 if (pkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
11549 conpfeqop, conppeqop, conffeqop,
11550 &numfkdelsetcols, confdelsetcols);
11551 for (
int i = 0;
i < numfks;
i++)
11552 mapped_conkey[
i] = attmap->
attnums[conkey[
i] - 1];
11563 if (constrForm->conenforced)
11565 constrForm->confrelid, constrForm->conrelid,
11566 &insertTriggerOid, &updateTriggerOid);
11576 foreach(lc, partFKs)
11605 fkconstraint->
contype = CONSTRAINT_FOREIGN;
11607 fkconstraint->
deferrable = constrForm->condeferrable;
11610 fkconstraint->
pktable = NULL;
11613 fkconstraint->
fk_matchtype = constrForm->confmatchtype;
11619 fkconstraint->
is_enforced = constrForm->conenforced;
11622 for (
int i = 0;
i < numfks;
i++)
11627 mapped_conkey[
i] - 1);
11632 indexOid = constrForm->conindid;
11633 with_period = constrForm->conperiod;
11637 NameStr(constrForm->conname), fkconstraint,
11638 partRel, pkrel, indexOid, parentConstrOid,
11640 mapped_conkey, conpfeqop,
11641 conppeqop, conffeqop,
11642 numfkdelsetcols, confdelsetcols,
11643 false, with_period);
11689 Oid parentConstrOid,
11694 Oid parentInsTrigger,
11695 Oid parentUpdTrigger,
11706 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11713 if (fk->
confrelid != parentConstr->confrelid || fk->
nkeys != numfks)
11718 for (
int i = 0;
i < numfks;
i++)
11720 if (fk->conkey[
i] != mapped_conkey[
i] ||
11721 fk->confkey[
i] != confkey[
i] ||
11722 fk->conpfeqop[
i] != conpfeqop[
i])
11743 if (partConstr->conenforced != parentConstr->conenforced)
11745 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
11746 errmsg(
"constraint \"%s\" enforceability conflicts with constraint \"%s\" on relation \"%s\"",
11747 NameStr(parentConstr->conname),
11748 NameStr(partConstr->conname),
11752 partConstr->condeferrable != parentConstr->condeferrable ||
11753 partConstr->condeferred != parentConstr->condeferred ||
11754 partConstr->confupdtype != parentConstr->confupdtype ||
11755 partConstr->confdeltype != parentConstr->confdeltype ||
11756 partConstr->confmatchtype != parentConstr->confmatchtype)
11768 parentConstrOid, parentInsTrigger,
11769 parentUpdTrigger, trigrel);
11785 Oid parentConstrOid,
11786 Oid parentInsTrigger,
11787 Oid parentUpdTrigger,
11794 bool queueValidation;
11795 Oid partConstrFrelid;
11796 Oid partConstrRelid;
11797 bool parentConstrIsEnforced;
11803 elog(
ERROR,
"cache lookup failed for constraint %u", parentConstrOid);
11805 parentConstrIsEnforced = parentConstr->conenforced;
11811 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11813 partConstrFrelid = partConstr->confrelid;
11814 partConstrRelid = partConstr->conrelid;
11836 queueValidation = parentConstr->convalidated && !partConstr->convalidated;
11858 if (parentConstrIsEnforced)
11860 Oid insertTriggerOid,
11864 partConstrOid, partConstrFrelid, partConstrRelid,
11865 &insertTriggerOid, &updateTriggerOid);
11885 if (queueValidation)
11894 elog(
ERROR,
"cache lookup failed for constraint %u", partConstrOid);
11923 Anum_pg_constraint_conrelid,
11928 ConstraintRelidTypidNameIndexId,
11929 true, NULL, 1, &
key);
11935 if (conform->conparentid != conoid)
11954 ConstraintRelationId,
11963 Anum_pg_trigger_tgconstraint,
11967 true, NULL, 1, &key2);
12003 Anum_pg_trigger_tgconstraint,
12016 if (
OidIsValid(conrelid) && trgform->tgconstrrelid != conrelid)
12018 if (
OidIsValid(confrelid) && trgform->tgrelid != confrelid)
12022 Assert(trgform->tgfoid == F_RI_FKEY_CHECK_INS ||
12023 trgform->tgfoid == F_RI_FKEY_CHECK_UPD ||
12024 trgform->tgfoid == F_RI_FKEY_CASCADE_DEL ||
12025 trgform->tgfoid == F_RI_FKEY_CASCADE_UPD ||
12026 trgform->tgfoid == F_RI_FKEY_RESTRICT_DEL ||
12027 trgform->tgfoid == F_RI_FKEY_RESTRICT_UPD ||
12028 trgform->tgfoid == F_RI_FKEY_SETNULL_DEL ||
12029 trgform->tgfoid == F_RI_FKEY_SETNULL_UPD ||
12030 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_DEL ||
12031 trgform->tgfoid == F_RI_FKEY_SETDEFAULT_UPD ||
12032 trgform->tgfoid == F_RI_FKEY_NOACTION_DEL ||
12033 trgform->tgfoid == F_RI_FKEY_NOACTION_UPD);
12064 Oid conoid,
Oid confrelid,
Oid conrelid,
12065 Oid *deleteTriggerOid,
12066 Oid *updateTriggerOid)
12072 *deleteTriggerOid = *updateTriggerOid =
InvalidOid;
12074 Anum_pg_trigger_tgconstraint,
12084 if (trgform->tgconstrrelid != conrelid)
12086 if (trgform->tgrelid != confrelid)
12091 if (TRIGGER_FOR_DELETE(trgform->tgtype))
12094 *deleteTriggerOid = trgform->oid;
12096 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12099 *updateTriggerOid = trgform->oid;
12101#ifndef USE_ASSERT_CHECKING
12109 elog(
ERROR,
"could not find ON DELETE action trigger of foreign key constraint %u",
12112 elog(
ERROR,
"could not find ON UPDATE action trigger of foreign key constraint %u",
12125 Oid conoid,
Oid confrelid,
Oid conrelid,
12126 Oid *insertTriggerOid,
12127 Oid *updateTriggerOid)
12133 *insertTriggerOid = *updateTriggerOid =
InvalidOid;
12135 Anum_pg_trigger_tgconstraint,
12145 if (trgform->tgconstrrelid != confrelid)
12147 if (trgform->tgrelid != conrelid)
12152 if (TRIGGER_FOR_INSERT(trgform->tgtype))
12155 *insertTriggerOid = trgform->oid;
12157 else if (TRIGGER_FOR_UPDATE(trgform->tgtype))
12160 *updateTriggerOid = trgform->oid;
12162#ifndef USE_ASSERT_CHECKING
12170 elog(
ERROR,
"could not find ON INSERT check triggers of foreign key constraint %u",
12173 elog(
ERROR,
"could not find ON UPDATE check triggers of foreign key constraint %u",
12205 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE && !recurse)
12207 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
12208 errmsg(
"constraint must be altered in child tables too"),
12209 errhint(
"Do not specify the ONLY keyword."));
12219 Anum_pg_constraint_conrelid,
12223 Anum_pg_constraint_contypid,
12227 Anum_pg_constraint_conname,
12231 true, NULL, 3, skey);
12236 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12237 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12243 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12244 errmsg(
"constraint \"%s\" of relation \"%s\" is not a foreign key constraint",
12248 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
12249 errmsg(
"cannot alter enforceability of constraint \"%s\" of relation \"%s\"",
12252 currcon->contype != CONSTRAINT_NOTNULL)
12254 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12255 errmsg(
"constraint \"%s\" of relation \"%s\" is not a not-null constraint",
12260 cmdcon->
noinherit && currcon->coninhcount > 0)
12262 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12263 errmsg(
"cannot alter inherited constraint \"%s\" on relation \"%s\"",
12279 Oid parent = currcon->conparentid;
12280 char *ancestorname = NULL;
12281 char *ancestortable = NULL;
12297 parent = contup->conparentid;
12302 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12303 errmsg(
"cannot alter constraint \"%s\" on relation \"%s\"",
12305 ancestorname && ancestortable ?
12306 errdetail(
"Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\".",
12307 cmdcon->
conname, ancestorname, ancestortable) : 0,
12308 errhint(
"You may alter the constraint it derives from instead.")));
12317 contuple, recurse, lockmode))
12339 bool changed =
false;
12358 currcon->conrelid, currcon->confrelid,
12365 contuple, recurse, &otherrelids,
12406 Oid fkrelid,
Oid pkrelid,
12408 Oid ReferencedParentDelTrigger,
12409 Oid ReferencedParentUpdTrigger,
12410 Oid ReferencingParentInsTrigger,
12411 Oid ReferencingParentUpdTrigger)
12416 bool changed =
false;
12424 conoid = currcon->oid;
12427 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12429 rel =
table_open(currcon->conrelid, lockmode);
12445 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12448 fkrelid, pkrelid, contuple,
12471 if (currcon->conrelid == fkrelid)
12473 currcon->confrelid,
12477 ReferencedParentDelTrigger,
12478 ReferencedParentUpdTrigger,
12479 &ReferencedDelTriggerOid,
12480 &ReferencedUpdTriggerOid);
12483 if (currcon->confrelid == pkrelid)
12489 ReferencingParentInsTrigger,
12490 ReferencingParentUpdTrigger,
12491 &ReferencingInsTriggerOid,
12492 &ReferencingUpdTriggerOid);
12500 if (rel->
rd_rel->relkind == RELKIND_RELATION &&
12501 currcon->confrelid == pkrelid)
12509 newcon->
refrelid = currcon->confrelid;
12510 newcon->
refindid = currcon->conindid;
12511 newcon->
conid = currcon->oid;
12512 newcon->
qual = (
Node *) fkconstraint;
12524 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12527 fkrelid, pkrelid, contuple,
12528 lockmode, ReferencedDelTriggerOid,
12529 ReferencedUpdTriggerOid,
12530 ReferencingInsTriggerOid,
12531 ReferencingUpdTriggerOid);
12557 bool changed =
false;
12565 refrelid = currcon->confrelid;
12568 Assert(currcon->contype == CONSTRAINT_FOREIGN);
12574 if (currcon->condeferrable != cmdcon->
deferrable ||
12593 if (recurse && changed &&
12594 (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
12597 contuple, recurse, otherrelids,
12621 Assert(currcon->contype == CONSTRAINT_NOTNULL);
12627 if (cmdcon->
noinherit == currcon->connoinherit)
12635 colName =
get_attname(currcon->conrelid, colNum,
false);
12654 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
12655 colName, childoid);
12657 Assert(childcon->coninhcount > 0);
12658 childcon->coninhcount--;
12659 childcon->conislocal =
true;
12668 colName,
true,
true, lockmode);
12687 bool deferrable,
bool initdeferred,
12688 List **otherrelids)
12695 Anum_pg_trigger_tgconstraint,
12722 if (tgform->tgfoid != F_RI_FKEY_NOACTION_DEL &&
12723 tgform->tgfoid != F_RI_FKEY_NOACTION_UPD &&
12724 tgform->tgfoid != F_RI_FKEY_CHECK_INS &&
12725 tgform->tgfoid != F_RI_FKEY_CHECK_UPD)
12731 copy_tg->tgdeferrable = deferrable;
12732 copy_tg->tginitdeferred = initdeferred;
12757 Oid fkrelid,
Oid pkrelid,
12759 Oid ReferencedParentDelTrigger,
12760 Oid ReferencedParentUpdTrigger,
12761 Oid ReferencingParentInsTrigger,
12762 Oid ReferencingParentUpdTrigger)
12771 conoid = currcon->oid;
12774 Anum_pg_constraint_conparentid,
12779 true, NULL, 1, &pkey);
12783 pkrelid, childtup, lockmode,
12784 ReferencedParentDelTrigger,
12785 ReferencedParentUpdTrigger,
12786 ReferencingParentInsTrigger,
12787 ReferencingParentUpdTrigger);
12816 conoid = currcon->oid;
12819 Anum_pg_constraint_conparentid,
12824 true, NULL, 1, &pkey);
12831 childrel =
table_open(childcon->conrelid, lockmode);
12834 childtup, recurse, otherrelids, lockmode);
12873 copy_con->condeferrable = cmdcon->
deferrable;
12877 copy_con->connoinherit = cmdcon->
noinherit;
12901 bool recurse,
bool recursing,
LOCKMODE lockmode)
12916 Anum_pg_constraint_conrelid,
12920 Anum_pg_constraint_contypid,
12924 Anum_pg_constraint_conname,
12928 true, NULL, 3, skey);
12933 (
errcode(ERRCODE_UNDEFINED_OBJECT),
12934 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
12938 if (con->contype != CONSTRAINT_FOREIGN &&
12939 con->contype != CONSTRAINT_CHECK &&
12940 con->contype != CONSTRAINT_NOTNULL)
12942 errcode(ERRCODE_WRONG_OBJECT_TYPE),
12943 errmsg(
"cannot validate constraint \"%s\" of relation \"%s\"",
12945 errdetail(
"This operation is not supported for this type of constraint."));
12947 if (!con->conenforced)
12949 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
12950 errmsg(
"cannot validate NOT ENFORCED constraint")));
12952 if (!con->convalidated)
12954 if (con->contype == CONSTRAINT_FOREIGN)
12959 else if (con->contype == CONSTRAINT_CHECK)
12962 tuple, recurse, recursing, lockmode);
12964 else if (con->contype == CONSTRAINT_NOTNULL)
12967 tuple, recurse, recursing, lockmode);
12999 Assert(con->contype == CONSTRAINT_FOREIGN);
13000 Assert(!con->convalidated);
13011 if (fkrel->
rd_rel->relkind == RELKIND_RELATION &&
13012 con->confrelid == pkrelid)
13025 newcon->
refrelid = con->confrelid;
13027 newcon->
conid = con->oid;
13028 newcon->
qual = (
Node *) fkconstraint;
13040 if (fkrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE ||
13048 Anum_pg_constraint_conparentid,
13053 true, NULL, 1, &pkey);
13067 if (childcon->convalidated)
13070 childrel =
table_open(childcon->conrelid, lockmode);
13077 childtup, lockmode);
13093 copy_con->convalidated =
true;
13111 bool recurse,
bool recursing,
LOCKMODE lockmode)
13125 Assert(con->contype == CONSTRAINT_CHECK);
13132 if (!recursing && !con->connoinherit)
13143 foreach(child, children)
13158 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13159 errmsg(
"constraint must be validated on child tables too")));
13171 newcon->
name = constrName;
13175 newcon->
conid = con->oid;
13178 Anum_pg_constraint_conbin);
13196 copy_con->convalidated =
true;
13213 HeapTuple contuple,
bool recurse,
bool recursing,
13225 Assert(con->contype == CONSTRAINT_NOTNULL);
13237 if (!recursing && !con->connoinherit)
13258 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
13259 errmsg(
"constraint must be validated on child tables too"));
13267 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation \"%s\"",
13270 if (childcon->convalidated)
13279 false,
true, lockmode);
13299 copy_con->convalidated =
true;
13326 foreach(l, colList)
13335 (
errcode(ERRCODE_UNDEFINED_COLUMN),
13336 errmsg(
"column \"%s\" referenced in foreign key constraint does not exist",
13339 if (attform->attnum < 0)
13341 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
13342 errmsg(
"system columns cannot be used in foreign keys")));
13345 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
13346 errmsg(
"cannot have more than %d keys in a foreign key",
13348 attnums[
attnum] = attform->attnum;
13349 if (atttypids != NULL)
13350 atttypids[
attnum] = attform->atttypid;
13351 if (attcollids != NULL)
13352 attcollids[
attnum] = attform->attcollation;
13375 List **attnamelist,
13377 Oid *opclasses,
bool *pk_has_without_overlaps)
13379 List *indexoidlist;
13383 Datum indclassDatum;
13396 foreach(indexoidscan, indexoidlist)
13402 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13404 if (indexStruct->indisprimary && indexStruct->indisvalid)
13411 if (!indexStruct->indimmediate)
13413 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13414 errmsg(
"cannot use a deferrable primary key for referenced table \"%s\"",
13417 *indexOid = indexoid;
13430 (
errcode(ERRCODE_UNDEFINED_OBJECT),
13431 errmsg(
"there is no primary key for referenced table \"%s\"",
13436 Anum_pg_index_indclass);
13443 *attnamelist =
NIL;
13444 for (
i = 0;
i < indexStruct->indnkeyatts;
i++)
13446 int pkattno = indexStruct->indkey.values[
i];
13448 attnums[
i] = pkattno;
13451 opclasses[
i] = indclass->
values[
i];
13452 *attnamelist =
lappend(*attnamelist,
13456 *pk_has_without_overlaps = indexStruct->indisexclusion;
13478 int numattrs,
int16 *attnums,
13479 bool with_period,
Oid *opclasses,
13480 bool *pk_has_without_overlaps)
13483 bool found =
false;
13484 bool found_deferrable =
false;
13485 List *indexoidlist;
13497 for (
i = 0;
i < numattrs;
i++)
13499 for (
j =
i + 1;
j < numattrs;
j++)
13501 if (attnums[
i] == attnums[
j])
13503 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13504 errmsg(
"foreign key referenced-columns list must not contain duplicates")));
13515 foreach(indexoidscan, indexoidlist)
13523 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
13531 if (indexStruct->indnkeyatts == numattrs &&
13532 (with_period ? indexStruct->indisexclusion : indexStruct->indisunique) &&
13533 indexStruct->indisvalid &&
13537 Datum indclassDatum;
13542 Anum_pg_index_indclass);
13555 for (
i = 0;
i < numattrs;
i++)
13558 for (
j = 0;
j < numattrs;
j++)
13560 if (attnums[
i] == indexStruct->indkey.values[
j])
13562 opclasses[
i] = indclass->
values[
j];
13571 if (found && with_period)
13573 int16 periodattnum = attnums[numattrs - 1];
13575 found = (periodattnum == indexStruct->indkey.values[numattrs - 1]);
13583 if (found && !indexStruct->indimmediate)
13589 found_deferrable =
true;
13595 *pk_has_without_overlaps = indexStruct->indisexclusion;
13604 if (found_deferrable)
13606 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
13607 errmsg(
"cannot use a deferrable unique constraint for referenced table \"%s\"",
13611 (
errcode(ERRCODE_INVALID_FOREIGN_KEY),
13612 errmsg(
"there is no unique constraint matching given keys for referenced table \"%s\"",
13632 if (targetTypeId == sourceTypeId)
13643 elog(
ERROR,
"could not find cast from %u to %u",
13644 sourceTypeId, targetTypeId);
13669 for (
i = 0;
i < natts;
i++)
13701 (
errmsg_internal(
"validating foreign key constraint \"%s\"", conname)));
13736 "validateForeignKeyConstraint",
13757 trigdata.
type = T_TriggerData;
13764 fcinfo->context = (
Node *) &trigdata;
13787 Oid constraintOid,
Oid indexOid,
Oid parentTrigOid,
13805 fk_trigger->
trigname =
"RI_ConstraintTrigger_c";
13812 fk_trigger->
events = TRIGGER_TYPE_INSERT;
13817 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13821 fk_trigger->
row =
true;
13822 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13830 trigAddress =
CreateTrigger(fk_trigger, NULL, myRelOid, refRelOid,
13832 parentTrigOid, NULL,
true,
false);
13850 Oid constraintOid,
Oid indexOid,
13851 Oid parentDelTrigger,
Oid parentUpdTrigger,
13852 Oid *deleteTrigOid,
Oid *updateTrigOid)
13864 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13867 fk_trigger->
row =
true;
13868 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13869 fk_trigger->
events = TRIGGER_TYPE_DELETE;
13903 elog(
ERROR,
"unrecognized FK action type: %d",
13908 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13910 parentDelTrigger, NULL,
true,
false);
13912 *deleteTrigOid = trigAddress.
objectId;
13924 fk_trigger->
trigname =
"RI_ConstraintTrigger_a";
13927 fk_trigger->
row =
true;
13928 fk_trigger->
timing = TRIGGER_TYPE_AFTER;
13929 fk_trigger->
events = TRIGGER_TYPE_UPDATE;
13963 elog(
ERROR,
"unrecognized FK action type: %d",
13968 trigAddress =
CreateTrigger(fk_trigger, NULL, refRelOid, myRelOid,
13970 parentUpdTrigger, NULL,
true,
false);
13972 *updateTrigOid = trigAddress.
objectId;
13987 Oid parentInsTrigger,
Oid parentUpdTrigger,
13988 Oid *insertTrigOid,
Oid *updateTrigOid)
13991 constraintOid, indexOid,
13992 parentInsTrigger,
true);
13994 constraintOid, indexOid,
13995 parentUpdTrigger,
false);
14006 bool missing_ok,
LOCKMODE lockmode)
14012 bool found =
false;
14020 Anum_pg_constraint_conrelid,
14024 Anum_pg_constraint_contypid,
14028 Anum_pg_constraint_conname,
14032 true, NULL, 3, skey);
14038 missing_ok, lockmode);
14048 errcode(ERRCODE_UNDEFINED_OBJECT),
14049 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
14053 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist, skipping",
14070 bool recurse,
bool recursing,
bool missing_ok,
14077 bool is_no_inherit_constraint =
false;
14079 char *colname = NULL;
14092 constrName =
NameStr(con->conname);
14095 if (con->coninhcount > 0 && !recursing)
14097 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14098 errmsg(
"cannot drop inherited constraint \"%s\" of relation \"%s\"",
14108 if (con->contype == CONSTRAINT_NOTNULL)
14129 if (pkattrs == NULL &&
14130 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14139 for (
int i = 0;
i < pk->
rd_index->indnkeyatts;
i++)
14149 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14150 errmsg(
"column \"%s\" is in a primary key",
14157 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14158 errmsg(
"column \"%s\" is in index used as replica identity",
14164 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
14167 if (attForm->attidentity !=
'\0')
14169 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
14170 errmsg(
"column \"%s\" of relation \"%s\" is an identity column",
14176 if (attForm->attnotnull)
14178 attForm->attnotnull =
false;
14185 is_no_inherit_constraint = con->connoinherit;
14194 if (con->contype == CONSTRAINT_FOREIGN &&
14215 if (con->contype != CONSTRAINT_CHECK &&
14216 con->contype != CONSTRAINT_NOTNULL &&
14217 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
14228 if (!is_no_inherit_constraint)
14247 if (con->contype == CONSTRAINT_NOTNULL)
14251 elog(
ERROR,
"cache lookup failed for not-null constraint on column \"%s\" of relation %u",
14260 Anum_pg_constraint_conrelid,
14264 Anum_pg_constraint_contypid,
14268 Anum_pg_constraint_conname,
14272 true, NULL, 3, skey);
14277 (
errcode(ERRCODE_UNDEFINED_OBJECT),
14278 errmsg(
"constraint \"%s\" of relation \"%s\" does not exist",
14288 if (childcon->contype != CONSTRAINT_CHECK &&
14289 childcon->contype != CONSTRAINT_NOTNULL)
14290 elog(
ERROR,
"inherited constraint is not a CHECK or not-null constraint");
14292 if (childcon->coninhcount <= 0)
14293 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
14294 childrelid,
NameStr(childcon->conname));
14302 if (childcon->coninhcount == 1 && !childcon->conislocal)
14306 recurse,
true, missing_ok,
14312 childcon->coninhcount--;
14327 childcon->coninhcount--;
14328 if (childcon->coninhcount == 0)
14329 childcon->conislocal =
true;
14367 bool recurse,
bool recursing,
14371 char *colName = cmd->
name;
14379 int32 targettypmod;
14388 if (rel->
rd_rel->reloftype && !recursing)
14390 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14391 errmsg(
"cannot alter column type of typed table"),
14398 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14399 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14403 attnum = attTup->attnum;
14408 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14409 errmsg(
"cannot alter system column \"%s\"", colName),
14418 (
errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
14419 errmsg(
"cannot specify USING when altering type of generated column"),
14420 errdetail(
"Column \"%s\" is a generated column.", colName),
14428 if (attTup->attinhcount > 0 && !recursing)
14430 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14431 errmsg(
"cannot alter inherited column \"%s\"", colName),
14439 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14440 errmsg(
"cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"",
14459 if (attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14463 else if (tab->
relkind == RELKIND_RELATION ||
14464 tab->
relkind == RELKIND_PARTITIONED_TABLE)
14478 attTup->atttypid, attTup->atttypmod,
14479 attTup->attcollation,
14485 targettype, targettypmod,
14489 if (transform == NULL)
14494 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14495 errmsg(
"result of USING clause for column \"%s\""
14496 " cannot be cast automatically to type %s",
14498 errhint(
"You might need to add an explicit cast.")));
14501 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14502 errmsg(
"column \"%s\" cannot be cast automatically to type %s",
14504 !attTup->attgenerated ?
14506 errhint(
"You might need to specify \"USING %s::%s\".",
14509 targettypmod)) : 0));
14528 newval->is_generated =
false;
14534 else if (transform)
14536 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
14537 errmsg(
"\"%s\" is not a table",
14540 if (!RELKIND_HAS_STORAGE(tab->
relkind) || attTup->attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
14569 &child_numparents);
14576 forboth(lo, child_oids, li, child_numparents)
14584 if (childrelid == relid)
14601 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14602 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14606 if (childattTup->attinhcount > numparents)
14608 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14609 errmsg(
"cannot alter inherited column \"%s\" of relation \"%s\"",
14621 bool found_whole_row;
14634 if (found_whole_row)
14636 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14637 errmsg(
"cannot convert whole-row table reference"),
14638 errdetail(
"USING expression contains a whole-row table reference.")));
14641 ATPrepCmd(wqueue, childrel, cmd,
false,
true, lockmode, context);
14645 else if (!recursing &&
14648 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
14649 errmsg(
"type of inherited column \"%s\" must be changed in child tables too",
14652 if (tab->
relkind == RELKIND_COMPOSITE_TYPE)
14678 if (
IsA(expr,
Var) && ((
Var *) expr)->varattno == varattno)
14696 case F_TIMESTAMPTZ_TIMESTAMP:
14697 case F_TIMESTAMP_TIMESTAMPTZ:
14721 char *colName = cmd->
name;
14731 int32 targettypmod;
14762 (
errcode(ERRCODE_UNDEFINED_COLUMN),
14763 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
14766 attnum = attTup->attnum;
14770 if (attTup->atttypid != attOldTup->atttypid ||
14771 attTup->atttypmod != attOldTup->atttypmod)
14773 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
14774 errmsg(
"cannot alter type of column \"%s\" twice",
14778 typeTuple =
typenameType(NULL, typeName, &targettypmod);
14780 targettype = tform->oid;
14796 if (attTup->atthasdef)
14802 defaultexpr,
exprType(defaultexpr),
14803 targettype, targettypmod,
14807 if (defaultexpr == NULL)
14809 if (attTup->attgenerated)
14811 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14812 errmsg(
"generation expression for column \"%s\" cannot be cast automatically to type %s",
14816 (
errcode(ERRCODE_DATATYPE_MISMATCH),
14817 errmsg(
"default for column \"%s\" cannot be cast automatically to type %s",
14822 defaultexpr = NULL;
14843 Anum_pg_depend_classid,
14847 Anum_pg_depend_objid,
14851 Anum_pg_depend_objsubid,
14863 foundObject.
classId = foundDep->refclassid;
14864 foundObject.
objectId = foundDep->refobjid;
14868 elog(
ERROR,
"found unexpected dependency type '%c'",
14869 foundDep->deptype);
14870 if (!(foundDep->refclassid == TypeRelationId &&
14871 foundDep->refobjid == attTup->atttypid) &&
14872 !(foundDep->refclassid == CollationRelationId &&
14873 foundDep->refobjid == attTup->attcollation))
14874 elog(
ERROR,
"found unexpected dependency for column: %s",
14889 if (attTup->atthasmissing)
14899 Anum_pg_attribute_attmissingval,
14900 attrelation->rd_att,
14916 Datum valuesAtt[Natts_pg_attribute] = {0};
14917 bool nullsAtt[Natts_pg_attribute] = {0};
14918 bool replacesAtt[Natts_pg_attribute] = {0};
14936 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
14937 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
14938 nullsAtt[Anum_pg_attribute_attmissingval - 1] =
false;
14941 valuesAtt, nullsAtt, replacesAtt);
14948 attTup->atttypid = targettype;
14949 attTup->atttypmod = targettypmod;
14950 attTup->attcollation = targetcollid;
14953 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
14954 errmsg(
"too many array dimensions"));
14955 attTup->attndims =
list_length(typeName->arrayBounds);
14956 attTup->attlen = tform->typlen;
14957 attTup->attbyval = tform->typbyval;
14958 attTup->attalign = tform->typalign;
14959 attTup->attstorage = tform->typstorage;
14994 if (attTup->attgenerated)
14999 elog(
ERROR,
"could not find attrdef tuple for relation %u attnum %d",
15048 Anum_pg_depend_refclassid,
15052 Anum_pg_depend_refobjid,
15056 Anum_pg_depend_refobjsubid,
15068 foundObject.
classId = foundDep->classid;
15069 foundObject.
objectId = foundDep->objid;
15074 case RelationRelationId:
15078 if (relKind == RELKIND_INDEX ||
15079 relKind == RELKIND_PARTITIONED_INDEX)
15084 else if (relKind == RELKIND_SEQUENCE)
15095 elog(
ERROR,
"unexpected object depending on column: %s",
15101 case ConstraintRelationId:
15106 case ProcedureRelationId:
15120 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15121 errmsg(
"cannot alter type of a column used by a function or procedure"),
15122 errdetail(
"%s depends on column \"%s\"",
15127 case RewriteRelationId:
15135 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15136 errmsg(
"cannot alter type of a column used by a view or rule"),
15137 errdetail(
"%s depends on column \"%s\"",
15142 case TriggerRelationId:
15155 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15156 errmsg(
"cannot alter type of a column used in a trigger definition"),
15157 errdetail(
"%s depends on column \"%s\"",
15162 case PolicyRelationId:
15174 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15175 errmsg(
"cannot alter type of a column used in a policy definition"),
15176 errdetail(
"%s depends on column \"%s\"",
15181 case AttrDefaultRelationId:
15205 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15206 errmsg(
"cannot alter type of a column used by a generated column"),
15207 errdetail(
"Column \"%s\" is used by generated column \"%s\".",
15216 case StatisticExtRelationId:
15225 case PublicationRelRelationId:
15233 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
15234 errmsg(
"cannot alter type of a column used by a publication WHERE clause"),
15235 errdetail(
"%s depends on column \"%s\"",
15246 elog(
ERROR,
"unexpected object depending on column: %s",
15267 elog(
ERROR,
"relation %u has multiple indexes marked as replica identity", tab->
relid);
15282 elog(
ERROR,
"relation %u has multiple clustered indexes", tab->
relid);
15470 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15473 relid = con->conrelid;
15479 elog(
ERROR,
"could not identify relation associated with constraint %u", oldId);
15481 confrelid = con->confrelid;
15482 conislocal = con->conislocal;
15504 if (relid != tab->
relid)
15508 (
char *)
lfirst(def_item),
15509 wqueue, lockmode, tab->
rewrite);
15511 forboth(oid_item, tab->changedIndexOids,
15512 def_item, tab->changedIndexDefs)
15523 if (relid != tab->relid)
15527 (
char *)
lfirst(def_item),
15528 wqueue, lockmode, tab->rewrite);
15535 forboth(oid_item, tab->changedStatisticsOids,
15536 def_item, tab->changedStatisticsDefs)
15553 if (relid != tab->relid)
15557 (
char *)
lfirst(def_item),
15558 wqueue, lockmode, tab->rewrite);
15567 if (tab->replicaIdentityIndex)
15573 subcmd->
name = tab->replicaIdentityIndex;
15585 if (tab->clusterOnIndex)
15590 cmd->
name = tab->clusterOnIndex;
15623 List *raw_parsetree_list;
15624 List *querytree_list;
15635 querytree_list =
NIL;
15636 foreach(list_item, raw_parsetree_list)
15642 querytree_list =
lappend(querytree_list,
15656 querytree_list =
list_concat(querytree_list, beforeStmts);
15658 querytree_list =
list_concat(querytree_list, afterStmts);
15661 querytree_list =
lappend(querytree_list,
15680 foreach(list_item, querytree_list)
15694 stmt->reset_default_tblspc =
true;
15709 foreach(lcmd,
stmt->cmds)
15725 RelationRelationId, 0);
15747 !rewrite && tab->
rewrite == 0)
15771 elog(
ERROR,
"unexpected statement subtype: %d",
15798 elog(
ERROR,
"unexpected statement subtype: %d",
15799 (
int)
stmt->subtype);
15807 stmt->stxcomment =
GetComment(oldId, StatisticExtRelationId, 0);
15816 elog(
ERROR,
"unexpected statement type: %d",
15836 const char *conname)
15843 comment_str =
GetComment(objid, ConstraintRelationId, 0);
15844 if (comment_str == NULL)
15881 stmt->accessMethod,
15883 stmt->excludeOpNames,
15884 stmt->iswithoutoverlaps))
15889 if (irel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
15921 elog(
ERROR,
"cache lookup failed for constraint %u", oldId);
15924 Anum_pg_constraint_conpfeqop);
15931 elog(
ERROR,
"conpfeqop is not a 1-D Oid array");
15935 for (
i = 0;
i < numkeys;
i++)
15948 const char *colName,
15959 Datum repl_val[Natts_pg_attribute];
15960 bool repl_null[Natts_pg_attribute];
15961 bool repl_repl[Natts_pg_attribute];
15976 (
errcode(ERRCODE_UNDEFINED_OBJECT),
15977 errmsg(
"foreign table \"%s\" does not exist",
15990 (
errcode(ERRCODE_UNDEFINED_COLUMN),
15991 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
15996 attnum = atttableform->attnum;
15999 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16000 errmsg(
"cannot alter system column \"%s\"", colName)));
16004 memset(repl_val, 0,
sizeof(repl_val));
16005 memset(repl_null,
false,
sizeof(repl_null));
16006 memset(repl_repl,
false,
sizeof(repl_repl));
16011 Anum_pg_attribute_attfdwoptions,
16023 repl_val[Anum_pg_attribute_attfdwoptions - 1] = datum;
16025 repl_null[Anum_pg_attribute_attfdwoptions - 1] =
true;
16027 repl_repl[Anum_pg_attribute_attfdwoptions - 1] =
true;
16032 repl_val, repl_null, repl_repl);
16038 atttableform->attnum);
16082 elog(
ERROR,
"cache lookup failed for relation %u", relationOid);
16086 switch (tuple_class->relkind)
16088 case RELKIND_RELATION:
16090 case RELKIND_MATVIEW:
16091 case RELKIND_FOREIGN_TABLE:
16092 case RELKIND_PARTITIONED_TABLE:
16095 case RELKIND_INDEX:
16105 if (tuple_class->relowner != newOwnerId)
16107 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16108 errmsg(
"cannot change owner of index \"%s\"",
16109 NameStr(tuple_class->relname)),
16110 errhint(
"Change the ownership of the index's table instead.")));
16112 newOwnerId = tuple_class->relowner;
16115 case RELKIND_PARTITIONED_INDEX:
16119 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16120 errmsg(
"cannot change owner of index \"%s\"",
16121 NameStr(tuple_class->relname)),
16122 errhint(
"Change the ownership of the index's table instead.")));
16124 case RELKIND_SEQUENCE:
16126 tuple_class->relowner != newOwnerId)
16135 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16136 errmsg(
"cannot change owner of sequence \"%s\"",
16137 NameStr(tuple_class->relname)),
16138 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
16139 NameStr(tuple_class->relname),
16143 case RELKIND_COMPOSITE_TYPE:
16147 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16148 errmsg(
"\"%s\" is a composite type",
16149 NameStr(tuple_class->relname)),
16154 case RELKIND_TOASTVALUE:
16160 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16161 errmsg(
"cannot change owner of relation \"%s\"",
16162 NameStr(tuple_class->relname)),
16170 if (tuple_class->relowner != newOwnerId)
16172 Datum repl_val[Natts_pg_class];
16173 bool repl_null[Natts_pg_class];
16174 bool repl_repl[Natts_pg_class];
16186 Oid namespaceOid = tuple_class->relnamespace;
16198 aclresult =
object_aclcheck(NamespaceRelationId, namespaceOid, newOwnerId,
16206 memset(repl_null,
false,
sizeof(repl_null));
16207 memset(repl_repl,
false,
sizeof(repl_repl));
16209 repl_repl[Anum_pg_class_relowner - 1] =
true;
16217 Anum_pg_class_relacl,
16222 tuple_class->relowner, newOwnerId);
16223 repl_repl[Anum_pg_class_relacl - 1] =
true;
16238 tuple_class->relowner,
16246 if (tuple_class->relkind != RELKIND_COMPOSITE_TYPE &&
16247 tuple_class->relkind != RELKIND_INDEX &&
16248 tuple_class->relkind != RELKIND_PARTITIONED_INDEX &&
16249 tuple_class->relkind != RELKIND_TOASTVALUE)
16264 if (tuple_class->relkind == RELKIND_RELATION ||
16265 tuple_class->relkind == RELKIND_PARTITIONED_TABLE ||
16266 tuple_class->relkind == RELKIND_MATVIEW ||
16267 tuple_class->relkind == RELKIND_TOASTVALUE)
16269 List *index_oid_list;
16276 foreach(
i, index_oid_list)
16283 if (tuple_class->reltoastrelid !=
InvalidOid)
16314 Anum_pg_attribute_attrelid,
16318 true, NULL, 1,
key);
16322 Datum repl_val[Natts_pg_attribute];
16323 bool repl_null[Natts_pg_attribute];
16324 bool repl_repl[Natts_pg_attribute];
16331 if (att->attisdropped)
16335 Anum_pg_attribute_attacl,
16342 memset(repl_null,
false,
sizeof(repl_null));
16343 memset(repl_repl,
false,
sizeof(repl_repl));
16346 oldOwnerId, newOwnerId);
16347 repl_repl[Anum_pg_attribute_attacl - 1] =
true;
16352 repl_val, repl_null, repl_repl);
16384 Anum_pg_depend_refclassid,
16388 Anum_pg_depend_refobjid,
16402 if (depForm->refobjsubid == 0 ||
16403 depForm->classid != RelationRelationId ||
16404 depForm->objsubid != 0 ||
16448 (
errcode(ERRCODE_UNDEFINED_OBJECT),
16449 errmsg(
"index \"%s\" for table \"%s\" does not exist",
16459 RelationRelationId, indexOid);
16492 if (amname != NULL)
16494 else if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
16500 if (rel->
rd_rel->relam == amoid)
16520 Oid oldAccessMethodId;
16536 elog(
ERROR,
"cache lookup failed for relation %u", reloid);
16540 oldAccessMethodId = rd_rel->relam;
16541 rd_rel->relam = newAccessMethodId;
16544 if (rd_rel->relam == oldAccessMethodId)
16580 AccessMethodRelationId,
16590 AccessMethodRelationId,
16591 oldAccessMethodId, rd_rel->relam);
16627 (
errcode(ERRCODE_SYNTAX_ERROR),
16628 errmsg(
"cannot have multiple SET TABLESPACE subcommands")));
16646 Datum repl_val[Natts_pg_class];
16647 bool repl_null[Natts_pg_class];
16648 bool repl_repl[Natts_pg_class];
16660 elog(
ERROR,
"cache lookup failed for relation %u", relid);
16686 switch (rel->
rd_rel->relkind)
16688 case RELKIND_RELATION:
16689 case RELKIND_MATVIEW:
16692 case RELKIND_PARTITIONED_TABLE:
16698 case RELKIND_INDEX:
16699 case RELKIND_PARTITIONED_INDEX:
16702 case RELKIND_TOASTVALUE:
16706 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
16707 errmsg(
"cannot set options for relation \"%s\"",
16714 if (rel->
rd_rel->relkind == RELKIND_VIEW)
16719 bool check_option =
false;
16721 foreach(cell, view_options)
16725 if (strcmp(defel->
defname,
"check_option") == 0)
16726 check_option =
true;
16735 const char *view_updatable_error =
16738 if (view_updatable_error)
16740 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
16741 errmsg(
"WITH CHECK OPTION is supported only on automatically updatable views"),
16742 errhint(
"%s",
_(view_updatable_error))));
16750 memset(repl_val, 0,
sizeof(repl_val));
16751 memset(repl_null,
false,
sizeof(repl_null));
16752 memset(repl_repl,
false,
sizeof(repl_repl));
16754 if (newOptions != (
Datum) 0)
16755 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16757 repl_null[Anum_pg_class_reloptions - 1] =
true;
16759 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16762 repl_val, repl_null, repl_repl);
16777 Oid toastid = rel->
rd_rel->reltoastrelid;
16784 elog(
ERROR,
"cache lookup failed for relation %u", toastid);
16810 memset(repl_val, 0,
sizeof(repl_val));
16811 memset(repl_null,
false,
sizeof(repl_null));
16812 memset(repl_repl,
false,
sizeof(repl_repl));
16814 if (newOptions != (
Datum) 0)
16815 repl_val[Anum_pg_class_reloptions - 1] = newOptions;
16817 repl_null[Anum_pg_class_reloptions - 1] =
true;
16819 repl_repl[Anum_pg_class_reloptions - 1] =
true;
16822 repl_val, repl_null, repl_repl);
16868 reltoastrelid = rel->
rd_rel->reltoastrelid;
16883 rel->
rd_rel->relpersistence);
16887 newrlocator.
relNumber = newrelfilenumber;
16888 newrlocator.
spcOid = newTableSpace;
16891 if (rel->
rd_rel->relkind == RELKIND_INDEX)
16923 foreach(lc, reltoastidxids)
16985 Oid orig_tablespaceoid;
16986 Oid new_tablespaceoid;
16993 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
16994 errmsg(
"only tables, indexes, and materialized views exist in tablespaces")));
17002 if (orig_tablespaceoid == GLOBALTABLESPACE_OID ||
17003 new_tablespaceoid == GLOBALTABLESPACE_OID)
17005 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
17006 errmsg(
"cannot move relations in to or out of pg_global tablespace")));
17035 if (orig_tablespaceoid == new_tablespaceoid)
17036 return new_tablespaceoid;
17043 Anum_pg_class_reltablespace,
17052 Oid relOid = relForm->oid;
17063 relForm->relisshared ||
17070 relForm->relkind != RELKIND_RELATION &&
17071 relForm->relkind != RELKIND_PARTITIONED_TABLE) ||
17073 relForm->relkind != RELKIND_INDEX &&
17074 relForm->relkind != RELKIND_PARTITIONED_INDEX) ||
17076 relForm->relkind != RELKIND_MATVIEW))
17094 if (
stmt->nowait &&
17097 (
errcode(ERRCODE_OBJECT_IN_USE),
17098 errmsg(
"aborting because lock on relation \"%s.%s\" is not available",
17100 NameStr(relForm->relname))));
17111 if (relations ==
NIL)
17113 (
errcode(ERRCODE_NO_DATA_FOUND),
17114 errmsg(
"no matching relations in tablespace \"%s\" found",
17115 orig_tablespaceoid ==
InvalidOid ?
"(database default)" :
17119 foreach(l, relations)
17125 cmd->
name =
stmt->new_tablespacename;
17135 return new_tablespaceoid;
17162 rel->
rd_rel->relpersistence);
17177 (rel->
rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED &&
17181 rel->
rd_rel->relpersistence);
17197 char fires_when,
bool skip_system,
bool recurse,
17201 fires_when, skip_system, recurse,
17215 char fires_when,
LOCKMODE lockmode)
17233 if (child_rel->
rd_rel->reloftype)
17235 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17236 errmsg(
"cannot change inheritance of typed table")));
17238 if (child_rel->
rd_rel->relispartition)
17240 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17241 errmsg(
"cannot change inheritance of a partition")));
17243 if (child_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17245 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17246 errmsg(
"cannot change inheritance of partitioned table")));
17258 const char *trigger_name;
17274 if (parent_rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
17275 child_rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
17277 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17278 errmsg(
"cannot inherit from temporary relation \"%s\"",
17284 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17285 errmsg(
"cannot inherit from temporary relation of another session")));
17290 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17291 errmsg(
"cannot inherit to temporary relation of another session")));
17294 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17296 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17297 errmsg(
"cannot inherit from partitioned table \"%s\"",
17301 if (parent_rel->
rd_rel->relispartition)
17303 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17304 errmsg(
"cannot inherit from a partition")));
17325 (
errcode(ERRCODE_DUPLICATE_TABLE),
17326 errmsg(
"circular inheritance not allowed"),
17327 errdetail(
"\"%s\" is already a child of \"%s\".",
17337 if (trigger_name != NULL)
17339 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
17340 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming an inheritance child",
17342 errdetail(
"ROW triggers with transition tables are not supported in inheritance hierarchies.")));
17385 Anum_pg_inherits_inhrelid,
17389 true, NULL, 1, &
key);
17399 (
errcode(ERRCODE_DUPLICATE_TABLE),
17400 errmsg(
"relation \"%s\" would be inherited from more than once",
17403 if (inh->inhseqno > inhseqno)
17404 inhseqno = inh->inhseqno;
17421 parent_rel->
rd_rel->relkind ==
17422 RELKIND_PARTITIONED_TABLE);
17441 attr =
heap_getattr(contup, Anum_pg_constraint_conbin, tupdesc, &isnull);
17443 elog(
ERROR,
"null conbin for constraint %u", con->oid);
17466 if (acon->condeferrable != bcon->condeferrable ||
17467 acon->condeferred != bcon->condeferred ||
17498 for (
AttrNumber parent_attno = 1; parent_attno <= parent_desc->
natts; parent_attno++)
17501 char *parent_attname =
NameStr(parent_att->attname);
17505 if (parent_att->attisdropped)
17514 if (parent_att->atttypid != child_att->atttypid ||
17515 parent_att->atttypmod != child_att->atttypmod)
17517 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17518 errmsg(
"child table \"%s\" has different type for column \"%s\"",
17521 if (parent_att->attcollation != child_att->attcollation)
17523 (
errcode(ERRCODE_COLLATION_MISMATCH),
17524 errmsg(
"child table \"%s\" has different collation for column \"%s\"",
17533 if (parent_att->attnotnull && !child_att->attnotnull)
17538 parent_att->attnum);
17542 errcode(ERRCODE_DATATYPE_MISMATCH),
17543 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17550 if (parent_att->attgenerated && !child_att->attgenerated)
17552 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17553 errmsg(
"column \"%s\" in child table must be a generated column", parent_attname)));
17554 if (child_att->attgenerated && !parent_att->attgenerated)
17556 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17557 errmsg(
"column \"%s\" in child table must not be a generated column", parent_attname)));
17559 if (parent_att->attgenerated && child_att->attgenerated && child_att->attgenerated != parent_att->attgenerated)
17561 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17562 errmsg(
"column \"%s\" inherits from generated column of different kind", parent_attname),
17563 errdetail(
"Parent column is %s, child column is %s.",
17564 parent_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL",
17565 child_att->attgenerated == ATTRIBUTE_GENERATED_STORED ?
"STORED" :
"VIRTUAL")));
17573 child_att->attidentity = parent_att->attidentity;
17580 &child_att->attinhcount))
17582 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17583 errmsg(
"too many inheritance parents"));
17590 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17592 Assert(child_att->attinhcount == 1);
17593 child_att->attislocal =
false;
17602 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17603 errmsg(
"child table is missing column \"%s\"", parent_attname)));
17641 Anum_pg_constraint_conrelid,
17645 true, NULL, 1, &parent_key);
17658 bool found =
false;
17660 if (parent_con->contype != CONSTRAINT_CHECK &&
17661 parent_con->contype != CONSTRAINT_NOTNULL)
17665 if (parent_con->connoinherit)
17668 if (parent_con->contype == CONSTRAINT_NOTNULL)
17675 Anum_pg_constraint_conrelid,
17679 true, NULL, 1, &child_key);
17686 if (child_con->contype != parent_con->contype)
17693 if (child_con->contype == CONSTRAINT_CHECK)
17695 if (strcmp(
NameStr(parent_con->conname),
17696 NameStr(child_con->conname)) != 0)
17699 else if (child_con->contype == CONSTRAINT_NOTNULL)
17707 if (parent_attno != attmap->
attnums[child_attno - 1])
17712 if (parent_attr->attisdropped || child_attr->attisdropped)
17713 elog(
ERROR,
"found not-null constraint on dropped columns");
17716 if (child_con->contype == CONSTRAINT_CHECK &&
17719 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17720 errmsg(
"child table \"%s\" has different definition for check constraint \"%s\"",
17726 if (child_con->connoinherit)
17728 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17729 errmsg(
"constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"",
17736 if (parent_con->convalidated && child_con->conenforced &&
17737 !child_con->convalidated)
17739 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17740 errmsg(
"constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"",
17748 if (parent_con->conenforced && !child_con->conenforced)
17750 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
17751 errmsg(
"constraint \"%s\" conflicts with NOT ENFORCED constraint on child table \"%s\"",
17762 &child_con->coninhcount))
17764 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
17765 errmsg(
"too many inheritance parents"));
17772 if (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
17774 Assert(child_con->coninhcount == 1);
17775 child_con->conislocal =
false;
17789 if (parent_con->contype == CONSTRAINT_NOTNULL)
17791 errcode(ERRCODE_DATATYPE_MISMATCH),
17792 errmsg(
"column \"%s\" in child table \"%s\" must be marked NOT NULL",
17799 (
errcode(ERRCODE_DATATYPE_MISMATCH),
17800 errmsg(
"child table is missing constraint \"%s\"",
17801 NameStr(parent_con->conname))));
17820 if (rel->
rd_rel->relispartition)
17822 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
17823 errmsg(
"cannot change inheritance of a partition")));
17863 bool found =
false;
17865 Assert(parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17873 Anum_pg_inherits_inhparent,
17877 true, NULL, 1, &
key);
17884 if (inhForm->inhdetachpending)
17886 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
17887 errmsg(
"partition \"%s\" already pending detach in partitioned table \"%s.%s\"",
17891 errhint(
"Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation."));
17916 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17951 bool is_partitioning;
17953 is_partitioning = (parent_rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
17961 if (is_partitioning)
17964 errmsg(
"relation \"%s\" is not a partition of relation \"%s\"",
17970 errmsg(
"relation \"%s\" is not a parent of relation \"%s\"",
17980 Anum_pg_attribute_attrelid,
17984 true, NULL, 1,
key);
17990 if (att->attisdropped)
17992 if (att->attinhcount <= 0)
18002 copy_att->attinhcount--;
18003 if (copy_att->attinhcount == 0)
18004 copy_att->attislocal =
true;
18028 Anum_pg_constraint_conrelid,
18032 true, NULL, 1,
key);
18041 if (con->connoinherit)
18044 if (con->contype == CONSTRAINT_CHECK)
18046 if (con->contype == CONSTRAINT_NOTNULL)
18058 Anum_pg_constraint_conrelid,
18062 true, NULL, 1,
key);
18067 bool match =
false;
18073 if (con->contype == CONSTRAINT_CHECK)
18077 if (con->contype == CONSTRAINT_CHECK &&
18078 strcmp(
NameStr(con->conname), chkname) == 0)
18086 else if (con->contype == CONSTRAINT_NOTNULL)
18092 if (prevattno == child_attno)
18109 if (copy_con->coninhcount <= 0)
18110 elog(
ERROR,
"relation %u has non-inherited constraint \"%s\"",
18113 copy_con->coninhcount--;
18114 if (copy_con->coninhcount == 0)
18115 copy_con->conislocal =
true;
18123 if (connames !=
NIL || nncolumns !=
NIL)
18124 elog(
ERROR,
"%d unmatched constraints while removing inheritance from \"%s\" to \"%s\"",
18132 RelationRelationId,
18165 Anum_pg_depend_classid,
18169 Anum_pg_depend_objid,
18173 Anum_pg_depend_objsubid,
18184 if (dep->refclassid == refclassid &&
18185 dep->refobjid == refobjid &&
18186 dep->refobjsubid == 0 &&
18187 dep->deptype == deptype)
18228 typeid = typeform->oid;
18233 Anum_pg_inherits_inhrelid,
18237 true, NULL, 1, &
key);
18240 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18241 errmsg(
"typed tables cannot inherit")));
18252 for (type_attno = 1; type_attno <= typeTupleDesc->
natts; type_attno++)
18256 const char *type_attname,
18261 if (type_attr->attisdropped)
18263 type_attname =
NameStr(type_attr->attname);
18268 if (table_attno > tableTupleDesc->
natts)
18270 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18271 errmsg(
"table is missing column \"%s\"",
18273 table_attr =
TupleDescAttr(tableTupleDesc, table_attno - 1);
18275 }
while (table_attr->attisdropped);
18276 table_attname =
NameStr(table_attr->attname);
18279 if (strncmp(table_attname, type_attname,
NAMEDATALEN) != 0)
18281 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18282 errmsg(
"table has column \"%s\" where type requires \"%s\"",
18283 table_attname, type_attname)));
18286 if (table_attr->atttypid != type_attr->atttypid ||
18287 table_attr->atttypmod != type_attr->atttypmod ||
18288 table_attr->attcollation != type_attr->attcollation)
18290 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18291 errmsg(
"table \"%s\" has different type for column \"%s\"",
18297 for (; table_attno <= tableTupleDesc->
natts; table_attno++)
18302 if (!table_attr->attisdropped)
18304 (
errcode(ERRCODE_DATATYPE_MISMATCH),
18305 errmsg(
"table has extra column \"%s\"",
18306 NameStr(table_attr->attname))));
18310 if (rel->
rd_rel->reloftype)
18315 tableobj.
classId = RelationRelationId;
18318 typeobj.
classId = TypeRelationId;
18327 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18356 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18357 errmsg(
"\"%s\" is not a typed table",
18372 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18410 elog(
ERROR,
"cache lookup failed for relation \"%s\"",
18413 if (pg_class_form->relreplident != ri_type)
18415 pg_class_form->relreplident = ri_type;
18428 bool dirty =
false;
18433 elog(
ERROR,
"cache lookup failed for index %u", thisIndexOid);
18436 if (thisIndexOid == indexOid)
18439 if (!pg_index_form->indisreplident)
18442 pg_index_form->indisreplident =
true;
18448 if (pg_index_form->indisreplident)
18451 pg_index_form->indisreplident =
false;
18486 if (
stmt->identity_type == REPLICA_IDENTITY_DEFAULT)
18491 else if (
stmt->identity_type == REPLICA_IDENTITY_FULL)
18496 else if (
stmt->identity_type == REPLICA_IDENTITY_NOTHING)
18501 else if (
stmt->identity_type == REPLICA_IDENTITY_INDEX)
18506 elog(
ERROR,
"unexpected identity type %u",
stmt->identity_type);
18512 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18513 errmsg(
"index \"%s\" for table \"%s\" does not exist",
18522 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18523 errmsg(
"\"%s\" is not an index for table \"%s\"",
18533 !indexRel->
rd_index->indisunique) &&
18536 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18537 errmsg(
"cannot use non-unique index \"%s\" as replica identity",
18540 if (!indexRel->
rd_index->indimmediate)
18542 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18543 errmsg(
"cannot use non-immediate index \"%s\" as replica identity",
18548 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18549 errmsg(
"cannot use expression index \"%s\" as replica identity",
18554 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18555 errmsg(
"cannot use partial index \"%s\" as replica identity",
18571 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
18572 errmsg(
"index \"%s\" cannot be used as replica identity because column %d is a system column",
18576 if (!attr->attnotnull)
18578 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
18579 errmsg(
"index \"%s\" cannot be used as replica identity because column \"%s\" is nullable",
18608 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18637 elog(
ERROR,
"cache lookup failed for relation %u", relid);
18660 Datum repl_val[Natts_pg_foreign_table];
18661 bool repl_null[Natts_pg_foreign_table];
18662 bool repl_repl[Natts_pg_foreign_table];
18675 (
errcode(ERRCODE_UNDEFINED_OBJECT),
18676 errmsg(
"foreign table \"%s\" does not exist",
18682 memset(repl_val, 0,
sizeof(repl_val));
18683 memset(repl_null,
false,
sizeof(repl_null));
18684 memset(repl_repl,
false,
sizeof(repl_repl));
18689 Anum_pg_foreign_table_ftoptions,
18701 repl_val[Anum_pg_foreign_table_ftoptions - 1] = datum;
18703 repl_null[Anum_pg_foreign_table_ftoptions - 1] =
true;
18705 repl_repl[Anum_pg_foreign_table_ftoptions - 1] =
true;
18710 repl_val, repl_null, repl_repl);
18735 const char *column,
18747 compression =
strVal(newValue);
18755 (
errcode(ERRCODE_UNDEFINED_COLUMN),
18756 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
18761 attnum = atttableform->attnum;
18764 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18765 errmsg(
"cannot alter system column \"%s\"", column)));
18774 atttableform->attcompression = cmethod;
18823 switch (rel->
rd_rel->relpersistence)
18825 case RELPERSISTENCE_TEMP:
18827 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18828 errmsg(
"cannot change logged status of table \"%s\" because it is temporary",
18832 case RELPERSISTENCE_PERMANENT:
18837 case RELPERSISTENCE_UNLOGGED:
18851 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
18852 errmsg(
"cannot change table \"%s\" to unlogged because it is part of a publication",
18854 errdetail(
"Unlogged relations cannot be replicated.")));
18868 toLogged ? Anum_pg_constraint_conrelid :
18869 Anum_pg_constraint_confrelid,
18873 toLogged ? ConstraintRelidTypidNameIndexId :
InvalidOid,
18874 true, NULL, 1, skey);
18880 if (con->contype == CONSTRAINT_FOREIGN)
18886 foreignrelid = toLogged ? con->confrelid : con->conrelid;
18898 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18899 errmsg(
"could not change table \"%s\" to logged because it references unlogged table \"%s\"",
18908 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
18909 errmsg(
"could not change table \"%s\" to unlogged because it references logged table \"%s\"",
18954 (
errmsg(
"relation \"%s\" does not exist, skipping",
18955 stmt->relation->relname)));
18964 if (rel->
rd_rel->relkind == RELKIND_SEQUENCE)
18972 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
18973 errmsg(
"cannot move an owned sequence into another schema"),
18974 errdetail(
"Sequence \"%s\" is linked to table \"%s\".",
18993 *oldschema = oldNspOid;
19012 Assert(objsMoved != NULL);
19018 nspOid,
true, objsMoved);
19045 Oid oldNspOid,
Oid newNspOid,
19046 bool hasDependEntry,
19052 bool already_done =
false;
19057 elog(
ERROR,
"cache lookup failed for relation %u", relOid);
19060 Assert(classForm->relnamespace == oldNspOid);
19062 thisobj.
classId = RelationRelationId;
19072 if (!already_done && oldNspOid != newNspOid)
19080 (
errcode(ERRCODE_DUPLICATE_TABLE),
19081 errmsg(
"relation \"%s\" already exists in schema \"%s\"",
19086 classForm->relnamespace = newNspOid;
19093 if (hasDependEntry &&
19096 NamespaceRelationId,
19099 elog(
ERROR,
"could not change schema dependency for relation \"%s\"",
19100 NameStr(classForm->relname));
19129 foreach(l, indexList)
19134 thisobj.
classId = RelationRelationId;
19149 oldNspOid, newNspOid,
19182 Anum_pg_depend_refclassid,
19186 Anum_pg_depend_refobjid,
19200 if (depForm->refobjsubid == 0 ||
19201 depForm->classid != RelationRelationId ||
19202 depForm->objsubid != 0 ||
19219 oldNspOid, newNspOid,
19295 if (oc->
relid == relid)
19313 List *oids_to_truncate =
NIL;
19354 if (oids_to_truncate !=
NIL)
19357 if (oids_to_drop !=
NIL)
19361 foreach(l, oids_to_drop)
19365 object.
classId = RelationRelationId;
19367 object.objectSubId = 0;
19389#ifdef USE_ASSERT_CHECKING
19502 if (relkind != RELKIND_RELATION && relkind != RELKIND_TOASTVALUE &&
19503 relkind != RELKIND_MATVIEW && relkind != RELKIND_PARTITIONED_TABLE)
19505 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19506 errmsg(
"\"%s\" is not a table or materialized view", relation->
relname)));
19531 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19555 elog(
ERROR,
"cache lookup failed for relation %u", relId);
19564 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19565 errmsg(
"permission denied: \"%s\" is a system catalog",
19590 relkind = classform->relkind;
19599 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
19600 errmsg(
"permission denied: \"%s\" is a system catalog",
19611 aclresult =
object_aclcheck(NamespaceRelationId, classform->relnamespace,
19638 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19641 if (reltype ==
OBJECT_VIEW && relkind != RELKIND_VIEW)
19643 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19648 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19649 errmsg(
"\"%s\" is not a materialized view", rv->
relname)));
19653 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19656 if (reltype ==
OBJECT_TYPE && relkind != RELKIND_COMPOSITE_TYPE)
19658 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19661 if (reltype ==
OBJECT_INDEX && relkind != RELKIND_INDEX &&
19662 relkind != RELKIND_PARTITIONED_INDEX
19665 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19672 if (reltype !=
OBJECT_TYPE && relkind == RELKIND_COMPOSITE_TYPE)
19674 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19686 if (relkind == RELKIND_INDEX || relkind == RELKIND_PARTITIONED_INDEX)
19688 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19689 errmsg(
"cannot change schema of index \"%s\"",
19691 errhint(
"Change the schema of the table instead.")));
19692 else if (relkind == RELKIND_COMPOSITE_TYPE)
19694 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19695 errmsg(
"cannot change schema of composite type \"%s\"",
19700 else if (relkind == RELKIND_TOASTVALUE)
19702 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
19703 errmsg(
"cannot change schema of TOAST table \"%s\"",
19705 errhint(
"Change the schema of the table instead.")));
19734 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19735 errmsg(
"cannot use \"list\" partition strategy with more than one column")));
19743 NULL,
false,
true);
19776 List **partexprs,
Oid *partopclass,
Oid *partcollation,
19784 foreach(lc, partParams)
19790 if (pelem->
name != NULL)
19800 (
errcode(ERRCODE_UNDEFINED_COLUMN),
19801 errmsg(
"column \"%s\" named in partition key does not exist",
19806 if (attform->attnum <= 0)
19808 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19809 errmsg(
"cannot use system column \"%s\" in partition key",
19820 if (attform->attgenerated)
19822 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19823 errmsg(
"cannot use generated column in partition key"),
19824 errdetail(
"Column \"%s\" is a generated column.",
19828 partattrs[attn] = attform->attnum;
19829 atttype = attform->atttypid;
19830 attcollation = attform->attcollation;
19837 char partattname[16];
19851 snprintf(partattname,
sizeof(partattname),
"%d", attn + 1);
19853 atttype, attcollation,
19891 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19892 errmsg(
"partition key expressions cannot contain system column references")));
19904 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19905 errmsg(
"cannot use generated column in partition key"),
19906 errdetail(
"Column \"%s\" is a generated column.",
19912 ((
Var *) expr)->varattno > 0)
19919 partattrs[attn] = ((
Var *) expr)->varattno;
19923 partattrs[attn] = 0;
19924 *partexprs =
lappend(*partexprs, expr);
19955 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19956 errmsg(
"functions in partition key expression must be marked IMMUTABLE")));
19964 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
19965 errmsg(
"cannot use constant expression as partition key")));
19985 (
errcode(ERRCODE_INDETERMINATE_COLLATION),
19986 errmsg(
"could not determine which collation to use for partition expression"),
19987 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
19993 (
errcode(ERRCODE_DATATYPE_MISMATCH),
19994 errmsg(
"collations are not supported by type %s",
19998 partcollation[attn] = attcollation;
20006 am_oid = HASH_AM_OID;
20008 am_oid = BTREE_AM_OID;
20018 (
errcode(ERRCODE_UNDEFINED_OBJECT),
20019 errmsg(
"data type %s has no default operator class for access method \"%s\"",
20021 errhint(
"You must specify a hash operator class or define a default hash operator class for the data type.")));
20024 (
errcode(ERRCODE_UNDEFINED_OBJECT),
20025 errmsg(
"data type %s has no default operator class for access method \"%s\"",
20027 errhint(
"You must specify a btree operator class or define a default btree operator class for the data type.")));
20033 am_oid == HASH_AM_OID ?
"hash" :
"btree",
20050 List *partConstraint)
20060 for (
i = 1;
i <= natts;
i++)
20072 wholeatt->atttypid,
20073 wholeatt->atttypmod,
20074 wholeatt->attcollation,
20083 ntest->argisrow =
false;
20085 existConstraint =
lappend(existConstraint, ntest);
20111 num_check = (constr != NULL) ? constr->
num_check : 0;
20112 for (
i = 0;
i < num_check;
i++)
20168 List *partConstraint,
20169 bool validate_default)
20177 if (!validate_default)
20179 (
errmsg_internal(
"partition constraint for table \"%s\" is implied by existing constraints",
20183 (
errmsg_internal(
"updated partition constraint for default partition \"%s\" is implied by existing constraints",
20193 if (scanrel->
rd_rel->relkind == RELKIND_RELATION)
20203 else if (scanrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20211 List *thisPartConstraint;
20222 thisPartConstraint =
20224 part_rel, scanrel);
20227 thisPartConstraint,
20245 List *attachrel_children;
20246 List *partConstraint;
20253 const char *trigger_name;
20254 Oid defaultPartOid;
20255 List *partBoundConstraint;
20284 if (attachrel->
rd_rel->relispartition)
20286 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20287 errmsg(
"\"%s\" is already a partition",
20292 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20293 errmsg(
"cannot attach a typed table as partition")));
20301 Anum_pg_inherits_inhrelid,
20308 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20309 errmsg(
"cannot attach inheritance child as partition")));
20314 Anum_pg_inherits_inhparent,
20320 attachrel->
rd_rel->relkind == RELKIND_RELATION)
20322 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20323 errmsg(
"cannot attach inheritance parent as partition")));
20346 (
errcode(ERRCODE_DUPLICATE_TABLE),
20347 errmsg(
"circular inheritance not allowed"),
20348 errdetail(
"\"%s\" is already a child of \"%s\".",
20353 if (rel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP &&
20354 attachrel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
20356 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20357 errmsg(
"cannot attach a temporary relation as partition of permanent relation \"%s\"",
20361 if (rel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP &&
20362 attachrel->
rd_rel->relpersistence != RELPERSISTENCE_TEMP)
20364 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20365 errmsg(
"cannot attach a permanent relation as partition of temporary relation \"%s\"",
20371 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20372 errmsg(
"cannot attach as partition of temporary relation of another session")));
20377 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20378 errmsg(
"cannot attach temporary relation of another session as partition")));
20385 natts = tupleDesc->
natts;
20386 for (attno = 1; attno <= natts; attno++)
20389 char *attributeName =
NameStr(attribute->attname);
20392 if (attribute->attisdropped)
20395 if (attribute->attidentity)
20397 errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20398 errmsg(
"table \"%s\" being attached contains an identity column \"%s\"",
20400 errdetail(
"The new partition may not contain an identity column."));
20407 (
errcode(ERRCODE_DATATYPE_MISMATCH),
20408 errmsg(
"table \"%s\" contains column \"%s\" not found in parent \"%s\"",
20411 errdetail(
"The new partition may contain only the columns present in parent.")));
20420 if (trigger_name != NULL)
20422 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
20423 errmsg(
"trigger \"%s\" prevents table \"%s\" from becoming a partition",
20425 errdetail(
"ROW triggers with transition tables are not supported on partitions.")));
20433 cmd->
bound, pstate);
20469 if (partConstraint)
20478 (
Node *) partConstraint);
20505 List *defPartConstraint;
20511 defPartConstraint =
20518 defPartConstraint =
20520 1, defaultrel, rel);
20522 defPartConstraint,
true);
20536 if (attachrel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
20540 foreach(l, attachrel_children)
20564 List *attachRelIdxs;
20572 "AttachPartitionEnsureIndexes",
20596 if (attachrel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
20598 foreach(cell, idxes)
20603 if (idxRel->
rd_index->indisunique ||
20606 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
20607 errmsg(
"cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"",
20610 errdetail(
"Partitioned table \"%s\" contains unique indexes.",
20622 foreach(cell, idxes)
20628 bool found =
false;
20635 if (idxRel->
rd_rel->relkind != RELKIND_PARTITIONED_INDEX)
20659 if (attachrelIdxRels[
i]->rd_rel->relispartition)
20663 if (!attachrelIdxRels[
i]->rd_index->indisvalid)
20667 attachrelIdxRels[
i]->rd_indcollation,
20723 true,
false,
false,
false,
false);
20755 true, NULL, 1, &
key);
20774 if (!TRIGGER_FOR_ROW(trigForm->tgtype))
20781 if (trigForm->tgisinternal)
20787 if (!TRIGGER_FOR_BEFORE(trigForm->tgtype) &&
20788 !TRIGGER_FOR_AFTER(trigForm->tgtype))
20789 elog(
ERROR,
"unexpected trigger \"%s\" found",
20805 partition, parent);
20807 partition, parent);
20814 if (trigForm->tgattr.dim1 > 0)
20818 for (
i = 0;
i < trigForm->tgattr.dim1;
i++)
20823 trigForm->tgattr.values[
i] - 1);
20830 if (trigForm->tgnargs > 0)
20837 elog(
ERROR,
"tgargs is null for trigger \"%s\" in partition \"%s\"",
20842 for (
int i = 0;
i < trigForm->tgnargs;
i++)
20845 p += strlen(p) + 1;
20855 trigStmt->
args = trigargs;
20856 trigStmt->
row =
true;
20857 trigStmt->
timing = trigForm->tgtype & TRIGGER_TYPE_TIMING_MASK;
20858 trigStmt->
events = trigForm->tgtype & TRIGGER_TYPE_EVENT_MASK;
20862 trigStmt->
deferrable = trigForm->tgdeferrable;
20868 trigForm->tgfoid, trigForm->oid, qual,
20869 false,
true, trigForm->tgenabled);
20905 Oid defaultPartOid;
20932 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
20933 errmsg(
"cannot detach partitions concurrently when a default partition exists")));
20975 char *parentrelname;
21031 if (partRel != NULL)
21032 elog(
WARNING,
"dangling partition \"%s\" remains, can't fix",
21035 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21036 errmsg(
"partitioned table \"%s\" was removed concurrently",
21039 if (partRel == NULL)
21041 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21042 errmsg(
"partition \"%s\" was removed concurrently", partrelname)));
21074 Oid defaultPartOid)
21080 Datum new_val[Natts_pg_class];
21081 bool new_null[Natts_pg_class],
21082 new_repl[Natts_pg_class];
21139 if (conform->contype != CONSTRAINT_FOREIGN ||
21161 Oid insertTriggerOid,
21166 &insertTriggerOid, &updateTriggerOid);
21193 int numfkdelsetcols;
21209 fkconstraint->
contype = CONSTRAINT_FOREIGN;
21211 fkconstraint->
deferrable = conform->condeferrable;
21213 fkconstraint->
is_enforced = conform->conenforced;
21217 fkconstraint->
pktable = NULL;
21229 for (
int i = 0;
i < numfks;
i++)
21256 conform->conperiod);
21279 ConstraintRelationId,
21289 foreach(cell, indexes)
21295 Oid parentConstrOid;
21327 elog(
ERROR,
"cache lookup failed for relation %u",
21332 memset(new_val, 0,
sizeof(new_val));
21333 memset(new_null,
false,
sizeof(new_null));
21334 memset(new_repl,
false,
sizeof(new_repl));
21335 new_val[Anum_pg_class_relpartbound - 1] = (
Datum) 0;
21336 new_null[Anum_pg_class_relpartbound - 1] =
true;
21337 new_repl[Anum_pg_class_relpartbound - 1] =
true;
21339 new_val, new_null, new_repl);
21353 if (!attr->attisdropped && attr->attidentity)
21387 if (partRel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
21393 foreach(cell, children)
21458 true, NULL, 1, &skey);
21484 RelationRelationId,
21523 if (!
state->lockedParentTbl)
21526 state->lockedParentTbl =
true;
21549 if (classform->relkind != RELKIND_PARTITIONED_INDEX &&
21550 classform->relkind != RELKIND_INDEX)
21552 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21587 state.lockedParentTbl =
false;
21595 (
errcode(ERRCODE_UNDEFINED_OBJECT),
21596 errmsg(
"index \"%s\" does not exist",
name->relname)));
21608 currParent = partIdx->
rd_rel->relispartition ?
21629 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21630 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21633 errdetail(
"Index \"%s\" is already attached to another index.",
21641 if (partDesc->
oids[
i] ==
state.partitionOid)
21649 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21650 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21653 errdetail(
"Index \"%s\" is not an index on any partition of table \"%s\".",
21670 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21671 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21674 errdetail(
"The index definitions do not match.")));
21689 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
21690 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21693 errdetail(
"The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\".",
21703 if (parentIdx->
rd_index->indisprimary)
21738 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
21739 errmsg(
"cannot attach index \"%s\" as a partition of index \"%s\"",
21742 errdetail(
"Another index \"%s\" is already attached for partition \"%s\".",
21761 bool updated =
false;
21763 Assert(partedIdx->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX);
21785 elog(
ERROR,
"cache lookup failed for index %u", inhForm->inhrelid);
21787 if (indexForm->indisvalid)
21810 elog(
ERROR,
"cache lookup failed for index %u",
21814 indexForm->indisvalid =
true;
21827 if (updated && partedIdx->
rd_rel->relispartition)
21863 if (!att->attnotnull)
21865 errcode(ERRCODE_INVALID_TABLE_DEFINITION),
21866 errmsg(
"invalid primary key definition"),
21867 errdetail(
"Column \"%s\" of relation \"%s\" is not marked NOT NULL.",
21916 constraints =
lappend_oid(constraints, constrForm->oid);
21922 return constraints;
21938 foreach(cell, constraints)
21948 elog(
ERROR,
"cache lookup failed for constraint %u", constrOid);
21984 if (compression == NULL || strcmp(compression,
"default") == 0)
22001 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
22002 errmsg(
"column data type %s does not support compression",
22008 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
22009 errmsg(
"invalid compression method \"%s\"", compression)));
22023 cstorage = TYPSTORAGE_PLAIN;
22025 cstorage = TYPSTORAGE_EXTERNAL;
22027 cstorage = TYPSTORAGE_EXTENDED;
22029 cstorage = TYPSTORAGE_MAIN;
22034 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
22035 errmsg(
"invalid storage type \"%s\"",
22044 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
22045 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)
Bitmapset * bms_add_range(Bitmapset *a, int lower, int upper)
Bitmapset * bms_del_member(Bitmapset *a, int x)
bool bms_is_member(int x, const Bitmapset *a)
Bitmapset * bms_add_member(Bitmapset *a, int x)
void FlushRelationBuffers(Relation rel)
#define TextDatumGetCString(d)
#define PG_USED_FOR_ASSERTS_ONLY
#define InvalidSubTransactionId
#define MemSet(start, val, len)
#define OidIsValid(objectId)
bool IsToastNamespace(Oid namespaceId)
bool IsSystemRelation(Relation relation)
RelFileNumber GetNewRelFileNumber(Oid reltablespace, Relation pg_class, char relpersistence)
bool IsCatalogNamespace(Oid namespaceId)
bool IsSystemClass(Oid relid, Form_pg_class reltuple)
bool contain_mutable_functions(Node *clause)
Node * eval_const_expressions(PlannerInfo *root, Node *node)
bool contain_volatile_functions(Node *clause)
void check_index_is_clusterable(Relation OldHeap, Oid indexOid, LOCKMODE lockmode)
void finish_heap_swap(Oid OIDOldHeap, Oid OIDNewHeap, bool is_system_catalog, bool swap_toast_by_content, bool check_constraints, bool is_internal, TransactionId frozenXid, MultiXactId cutoffMulti, char newrelpersistence)
Oid make_new_heap(Oid OIDOldHeap, Oid NewTableSpace, Oid NewAccessMethod, char relpersistence, LOCKMODE lockmode)
void mark_index_clustered(Relation rel, Oid indexOid, bool is_internal)
void ResetSequence(Oid seq_relid)
void SequenceChangePersistence(Oid relid, char newrelpersistence)
int32 defGetInt32(DefElem *def)
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
bool object_address_present(const ObjectAddress *object, const ObjectAddresses *addrs)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
void free_object_addresses(ObjectAddresses *addrs)
#define PERFORM_DELETION_CONCURRENTLY
@ DEPENDENCY_PARTITION_PRI
@ DEPENDENCY_PARTITION_SEC
#define PERFORM_DELETION_QUIETLY
#define PERFORM_DELETION_INTERNAL
void * hash_search(HTAB *hashp, const void *keyPtr, HASHACTION action, bool *foundPtr)
HTAB * hash_create(const char *tabname, int64 nelem, const HASHCTL *info, int flags)
void hash_destroy(HTAB *hashp)
void * hash_seq_search(HASH_SEQ_STATUS *status)
void hash_seq_init(HASH_SEQ_STATUS *status, HTAB *hashp)
int errmsg_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool equal(const void *a, const void *b)
void EventTriggerAlterTableStart(Node *parsetree)
void EventTriggerTableRewrite(Node *parsetree, Oid tableOid, int reason)
void EventTriggerAlterTableRelid(Oid objectId)
void EventTriggerAlterTableEnd(void)
void EventTriggerCollectAlterTableSubcmd(Node *subcmd, ObjectAddress address)
#define AT_REWRITE_ALTER_PERSISTENCE
#define AT_REWRITE_DEFAULT_VAL
#define AT_REWRITE_ACCESS_METHOD
#define AT_REWRITE_COLUMN_REWRITE
ExprState * ExecInitExpr(Expr *node, PlanState *parent)
ExprState * ExecPrepareExpr(Expr *node, EState *estate)
bool ExecCheck(ExprState *state, ExprContext *econtext)
void InitResultRelInfo(ResultRelInfo *resultRelInfo, Relation resultRelationDesc, Index resultRelationIndex, ResultRelInfo *partition_root_rri, int instrument_options)
AttrNumber ExecRelGenVirtualNotNull(ResultRelInfo *resultRelInfo, TupleTableSlot *slot, EState *estate, List *notnull_virtual_attrs)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
HeapTuple ExecFetchSlotHeapTuple(TupleTableSlot *slot, bool materialize, bool *shouldFree)
TupleTableSlot * ExecStoreAllNullTuple(TupleTableSlot *slot)
void FreeExecutorState(EState *estate)
EState * CreateExecutorState(void)
struct ResultRelInfo ResultRelInfo
#define GetPerTupleExprContext(estate)
#define ResetExprContext(econtext)
#define GetPerTupleMemoryContext(estate)
static Datum ExecEvalExpr(ExprState *state, ExprContext *econtext, bool *isNull)
#define palloc0_object(type)
#define DirectFunctionCall2(func, arg1, arg2)
#define DatumGetByteaPP(X)
#define SizeForFunctionCallInfo(nargs)
#define LOCAL_FCINFO(name, nargs)
ForeignDataWrapper * GetForeignDataWrapper(Oid fdwid)
FdwRoutine * GetFdwRoutineByServerId(Oid serverid)
ForeignServer * GetForeignServer(Oid serverid)
Oid GetForeignServerIdByRelId(Oid relid)
Datum transformGenericOptions(Oid catalogId, Datum oldOptions, List *options, Oid fdwvalidator)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
struct RelationData * Relation
bool allowSystemTableMods
Assert(PointerIsAligned(start, uint64))
void RelationClearMissing(Relation rel)
List * heap_truncate_find_FKs(List *relationIds)
void StorePartitionKey(Relation rel, char strategy, int16 partnatts, AttrNumber *partattrs, List *partexprs, Oid *partopclass, Oid *partcollation)
void RemoveStatistics(Oid relid, AttrNumber attnum)
Oid heap_create_with_catalog(const char *relname, Oid relnamespace, Oid reltablespace, Oid relid, Oid reltypeid, Oid reloftypeid, Oid ownerid, Oid accessmtd, TupleDesc tupdesc, List *cooked_constraints, char relkind, char relpersistence, bool shared_relation, bool mapped_relation, OnCommitAction oncommit, Datum reloptions, bool use_user_acl, bool allow_system_table_mods, bool is_internal, Oid relrewrite, ObjectAddress *typaddress)
void heap_truncate(List *relids)
void CheckAttributeType(const char *attname, Oid atttypid, Oid attcollation, List *containing_rowtypes, int flags)
void heap_truncate_check_FKs(List *relations, bool tempTables)
void StorePartitionBound(Relation rel, Relation parent, PartitionBoundSpec *bound)
List * AddRelationNotNullConstraints(Relation rel, List *constraints, List *old_notnulls)
List * AddRelationNewConstraints(Relation rel, List *newColDefaults, List *newConstraints, bool allow_merge, bool is_local, bool is_internal, const char *queryString)
void InsertPgAttributeTuples(Relation pg_attribute_rel, TupleDesc tupdesc, Oid new_rel_oid, const FormExtraData_pg_attribute tupdesc_extra[], CatalogIndexState indstate)
void heap_truncate_one_rel(Relation rel)
void StoreAttrMissingVal(Relation rel, AttrNumber attnum, Datum missingval)
#define CHKATYPE_IS_VIRTUAL
#define CHKATYPE_IS_PARTKEY
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
BulkInsertState GetBulkInsertState(void)
void FreeBulkInsertState(BulkInsertState bistate)
#define XLOG_HEAP_TRUNCATE
#define XLH_TRUNCATE_RESTART_SEQS
#define SizeOfHeapTruncate
#define XLH_TRUNCATE_CASCADE
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_copytuple(HeapTuple tuple)
bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static Datum heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
static void * GETSTRUCT(const HeapTupleData *tuple)
#define MaxHeapAttributeNumber
Oid IndexGetRelation(Oid indexId, bool missing_ok)
bool CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2, const Oid *collations1, const Oid *collations2, const Oid *opfamilies1, const Oid *opfamilies2, const AttrMap *attmap)
bool reindex_relation(const ReindexStmt *stmt, Oid relid, int flags, const ReindexParams *params)
IndexInfo * BuildIndexInfo(Relation index)
void index_check_primary_key(Relation heapRel, const IndexInfo *indexInfo, bool is_alter_table, const IndexStmt *stmt)
ObjectAddress index_constraint_create(Relation heapRelation, Oid indexRelationId, Oid parentConstraintId, const IndexInfo *indexInfo, const char *constraintName, char constraintType, bits16 constr_flags, bool allow_system_table_mods, bool is_internal)
#define REINDEX_REL_PROCESS_TOAST
#define INDEX_CONSTR_CREATE_UPDATE_INDEX
#define INDEX_CONSTR_CREATE_REMOVE_OLD_DEPS
#define INDEX_CONSTR_CREATE_DEFERRABLE
#define INDEX_CONSTR_CREATE_MARK_AS_PRIMARY
#define INDEX_CONSTR_CREATE_INIT_DEFERRED
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
ObjectAddress DefineIndex(Oid tableId, IndexStmt *stmt, Oid indexRelationId, Oid parentIndexId, Oid parentConstraintId, int total_parts, bool is_alter_table, bool check_rights, bool check_not_in_use, bool skip_build, bool quiet)
void IndexSetParentIndex(Relation partitionIdx, Oid parentOid)
Oid GetDefaultOpClass(Oid type_id, Oid am_id)
bool CheckIndexCompatible(Oid oldId, const char *accessMethodName, const List *attributeList, const List *exclusionOpNames, bool isWithoutOverlaps)
void WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
Oid ResolveOpClass(const List *opclass, Oid attrType, const char *accessMethodName, Oid accessMethodId)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, const ItemPointerData *tid)
static bool pg_add_s16_overflow(int16 a, int16 b, int16 *result)
void AcceptInvalidationMessages(void)
void CacheInvalidateRelcache(Relation relation)
void CacheInvalidateRelcacheByRelid(Oid relid)
void CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
if(TABLE==NULL||TABLE_index==NULL)
Datum is_valid(PG_FUNCTION_ARGS)
List * lcons_oid(Oid datum, List *list)
List * lappend(List *list, void *datum)
List * list_difference_ptr(const List *list1, const List *list2)
List * list_delete_nth_cell(List *list, int n)
List * list_concat(List *list1, const List *list2)
List * list_concat_copy(const List *list1, const List *list2)
List * list_copy(const List *oldlist)
List * lappend_int(List *list, int datum)
List * lappend_oid(List *list, Oid datum)
List * lcons(void *datum, List *list)
List * list_append_unique_oid(List *list, Oid datum)
void list_free(List *list)
bool list_member_oid(const List *list, Oid datum)
void list_free_deep(List *list)
bool ConditionalLockRelationOid(Oid relid, LOCKMODE lockmode)
void UnlockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
bool CheckRelationLockedByMe(Relation relation, LOCKMODE lockmode, bool orstronger)
bool CheckRelationOidLockedByMe(Oid relid, LOCKMODE lockmode, bool orstronger)
#define SET_LOCKTAG_RELATION(locktag, dboid, reloid)
#define AccessExclusiveLock
#define ShareRowExclusiveLock
#define InplaceUpdateTupleLock
#define ShareUpdateExclusiveLock
char * get_rel_name(Oid relid)
AttrNumber get_attnum(Oid relid, const char *attname)
Oid get_constraint_index(Oid conoid)
char get_typstorage(Oid typid)
bool get_index_isreplident(Oid index_oid)
char get_rel_relkind(Oid relid)
Oid get_typcollation(Oid typid)
char * get_collation_name(Oid colloid)
bool get_index_isclustered(Oid index_oid)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
char * get_constraint_name(Oid conoid)
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
bool get_collation_isdeterministic(Oid colloid)
char * get_opfamily_name(Oid opfid, bool missing_ok)
Oid get_rel_relam(Oid relid)
bool type_is_collatable(Oid typid)
Oid get_rel_tablespace(Oid relid)
Oid get_typ_typrelid(Oid typid)
Oid getBaseTypeAndTypmod(Oid typid, int32 *typmod)
Oid getBaseType(Oid typid)
char * get_namespace_name(Oid nspid)
char get_constraint_type(Oid conoid)
Oid get_relname_relid(const char *relname, Oid relnamespace)
#define TypeIsToastable(typid)
Expr * make_ands_explicit(List *andclauses)
TypeName * makeTypeNameFromNameList(List *names)
Var * makeVar(int varno, AttrNumber varattno, Oid vartype, int32 vartypmod, Oid varcollid, Index varlevelsup)
ColumnDef * makeColumnDef(const char *colname, Oid typeOid, int32 typmod, Oid collOid)
Const * makeNullConst(Oid consttype, int32 consttypmod, Oid constcollid)
RangeVar * makeRangeVar(char *schemaname, char *relname, int location)
Constraint * makeNotNullConstraint(String *colname)
List * make_ands_implicit(Expr *clause)
char * MemoryContextStrdup(MemoryContext context, const char *string)
void MemoryContextReset(MemoryContext context)
char * pstrdup(const char *in)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
MemoryContext CacheMemoryContext
void MemoryContextDelete(MemoryContext context)
MemoryContext PortalContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define ALLOCSET_SMALL_SIZES
#define CHECK_FOR_INTERRUPTS()
bool InSecurityRestrictedOperation(void)
MultiXactId ReadNextMultiXactId(void)
void namestrcpy(Name name, const char *str)
Oid RangeVarGetAndCheckCreationNamespace(RangeVar *relation, LOCKMODE lockmode, Oid *existing_relation_id)
bool isAnyTempNamespace(Oid namespaceId)
Oid get_collation_oid(List *collname, bool missing_ok)
void CheckSetNamespace(Oid oldNspOid, Oid nspOid)
RangeVar * makeRangeVarFromNameList(const List *names)
Oid LookupNamespaceNoError(const char *nspname)
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
#define RangeVarGetRelid(relation, lockmode, missing_ok)
Oid exprType(const Node *expr)
Oid exprCollation(const Node *expr)
Node * strip_implicit_coercions(Node *node)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define InvokeObjectTruncateHook(objectId)
#define InvokeObjectPostAlterHook(classId, objectId, subId)
#define InvokeObjectPostAlterHookArg(classId, objectId, subId, auxiliaryId, is_internal)
ObjectType get_relkind_objtype(char relkind)
char * getObjectDescription(const ObjectAddress *object, bool missing_ok)
const ObjectAddress InvalidObjectAddress
#define ObjectAddressSet(addr, class_id, object_id)
#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
CoercionPathType find_coercion_pathway(Oid targetTypeId, Oid sourceTypeId, CoercionContext ccontext, Oid *funcid)
bool can_coerce_type(int nargs, const Oid *input_typeids, const Oid *target_typeids, CoercionContext ccontext)
Node * coerce_to_target_type(ParseState *pstate, Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat, int location)
@ COERCION_PATH_RELABELTYPE
void assign_expr_collations(ParseState *pstate, Node *expr)
Node * transformExpr(ParseState *pstate, Node *expr, ParseExprKind exprKind)
int parser_errposition(ParseState *pstate, int location)
ParseState * make_parsestate(ParseState *parentParseState)
@ EXPR_KIND_PARTITION_EXPRESSION
ParseNamespaceItem * addRangeTableEntryForRelation(ParseState *pstate, Relation rel, int lockmode, Alias *alias, bool inh, bool inFromCl)
Oid attnumCollationId(Relation rd, int attid)
void addNSItemToQuery(ParseState *pstate, ParseNamespaceItem *nsitem, bool addToJoinList, bool addToRelNameSpace, bool addToVarNameSpace)
Oid attnumTypeId(Relation rd, int attid)
const NameData * attnumAttName(Relation rd, int attid)
void typenameTypeIdAndMod(ParseState *pstate, const TypeName *typeName, Oid *typeid_p, int32 *typmod_p)
Type typenameType(ParseState *pstate, const TypeName *typeName, int32 *typmod_p)
Oid GetColumnDefCollation(ParseState *pstate, const ColumnDef *coldef, Oid typeOid)
Oid typenameTypeId(ParseState *pstate, const TypeName *typeName)
IndexStmt * transformIndexStmt(Oid relid, IndexStmt *stmt, const char *queryString)
AlterTableStmt * transformAlterTableStmt(Oid relid, AlterTableStmt *stmt, const char *queryString, List **beforeStmts, List **afterStmts)
CreateStatsStmt * transformStatsStmt(Oid relid, CreateStatsStmt *stmt, const char *queryString)
PartitionBoundSpec * transformPartitionBound(ParseState *pstate, Relation parent, PartitionBoundSpec *spec)
IndexStmt * generateClonedIndexStmt(RangeVar *heapRel, Relation source_idx, const AttrMap *attmap, Oid *constraintOid)
#define FKCONSTR_ACTION_RESTRICT
#define FKCONSTR_ACTION_SETDEFAULT
@ PARTITION_STRATEGY_HASH
@ PARTITION_STRATEGY_LIST
@ AT_DetachPartitionFinalize
@ AT_ReAddDomainConstraint
@ AT_AlterColumnGenericOptions
#define FKCONSTR_ACTION_CASCADE
#define FKCONSTR_ACTION_SETNULL
#define FKCONSTR_ACTION_NOACTION
List * SystemFuncName(char *name)
void check_new_partition_bound(char *relname, Relation parent, PartitionBoundSpec *spec, ParseState *pstate)
List * get_qual_from_partbound(Relation parent, PartitionBoundSpec *spec)
void check_default_partition_contents(Relation parent, Relation default_rel, PartitionBoundSpec *new_spec)
List * RelationGetPartitionQual(Relation rel)
PartitionDesc RelationGetPartitionDesc(Relation rel, bool omit_detached)
Oid get_default_oid_from_partdesc(PartitionDesc partdesc)
List * map_partition_varattnos(List *expr, int fromrel_varno, Relation to_rel, Relation from_rel)
bool has_partition_attrs(Relation rel, Bitmapset *attnums, bool *used_in_expr)
List * get_proposed_default_constraint(List *new_part_constraints)
void update_default_partition_oid(Oid parentId, Oid defaultPartId)
Oid index_get_partition(Relation partition, Oid indexId)
Oid get_partition_parent(Oid relid, bool even_if_detached)
Oid StoreAttrDefault(Relation rel, AttrNumber attnum, Node *expr, bool is_internal)
Oid GetAttrDefaultOid(Oid relid, AttrNumber attnum)
ObjectAddress GetAttrDefaultColumnAddress(Oid attrdefoid)
void RemoveAttrDefault(Oid relid, AttrNumber attnum, DropBehavior behavior, bool complain, bool internal)
FormData_pg_attribute * Form_pg_attribute
int errdetail_relkind_not_supported(char relkind)
FormData_pg_class * Form_pg_class
#define PARTITION_MAX_KEYS
Oid CreateConstraintEntry(const char *constraintName, Oid constraintNamespace, char constraintType, bool isDeferrable, bool isDeferred, bool isEnforced, bool isValidated, Oid parentConstrId, Oid relId, const int16 *constraintKey, int constraintNKeys, int constraintNTotalKeys, Oid domainId, Oid indexRelId, Oid foreignRelId, const int16 *foreignKey, const Oid *pfEqOp, const Oid *ppEqOp, const Oid *ffEqOp, int foreignNKeys, char foreignUpdateType, char foreignDeleteType, const int16 *fkDeleteSetCols, int numFkDeleteSetCols, char foreignMatchType, const Oid *exclOp, Node *conExpr, const char *conBin, bool conIsLocal, int16 conInhCount, bool conNoInherit, bool conPeriod, bool is_internal)
HeapTuple findNotNullConstraint(Oid relid, const char *colname)
bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId, const char *conname)
void FindFKPeriodOpers(Oid opclass, Oid *containedbyoperoid, Oid *aggedcontainedbyoperoid, Oid *intersectoperoid)
void RenameConstraintById(Oid conId, const char *newname)
Oid get_relation_idx_constraint_oid(Oid relationId, Oid indexId)
void ConstraintSetParentConstraint(Oid childConstrId, Oid parentConstrId, Oid childTableId)
void DeconstructFkConstraintRow(HeapTuple tuple, int *numfks, AttrNumber *conkey, AttrNumber *confkey, Oid *pf_eq_oprs, Oid *pp_eq_oprs, Oid *ff_eq_oprs, int *num_fk_del_set_cols, AttrNumber *fk_del_set_cols)
HeapTuple findNotNullConstraintAttnum(Oid relid, AttrNumber attnum)
void AlterConstraintNamespaces(Oid ownerId, Oid oldNspId, Oid newNspId, bool isType, ObjectAddresses *objsMoved)
List * RelationGetNotNullConstraints(Oid relid, bool cooked, bool include_noinh)
char * ChooseConstraintName(const char *name1, const char *name2, const char *label, Oid namespaceid, List *others)
Oid get_relation_constraint_oid(Oid relid, const char *conname, bool missing_ok)
AttrNumber extractNotNullColumn(HeapTuple constrTup)
Oid get_domain_constraint_oid(Oid typid, const char *conname, bool missing_ok)
FormData_pg_constraint * Form_pg_constraint
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long changeDependencyFor(Oid classId, Oid objectId, Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
List * getOwnedSequences(Oid relid)
long deleteDependencyRecordsFor(Oid classId, Oid objectId, bool skipExtensionDeps)
long deleteDependencyRecordsForSpecific(Oid classId, Oid objectId, char deptype, Oid refclassId, Oid refobjectId)
Oid getIdentitySequence(Relation rel, AttrNumber attnum, bool missing_ok)
Oid get_index_constraint(Oid indexId)
bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId)
FormData_pg_depend * Form_pg_depend
FormData_pg_foreign_table * Form_pg_foreign_table
FormData_pg_index * Form_pg_index
List * find_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)
bool DeleteInheritsTuple(Oid inhrelid, Oid inhparent, bool expect_detach_pending, const char *childname)
List * find_inheritance_children(Oid parentrelId, LOCKMODE lockmode)
void StoreSingleInheritance(Oid relationId, Oid parentOid, int32 seqNumber)
bool has_superclass(Oid relationId)
bool PartitionHasPendingDetach(Oid partoid)
FormData_pg_inherits * Form_pg_inherits
#define lfirst_node(type, lc)
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
#define foreach_current_index(var_or_cell)
#define foreach_delete_current(lst, var_or_cell)
#define list_make1_oid(x1)
#define foreach_ptr(type, var, lst)
#define for_each_from(cell, lst, N)
static void * list_nth(const List *list, int n)
#define list_make3(x1, x2, x3)
#define foreach_node(type, var, lst)
static ListCell * list_head(const List *l)
#define foreach_oid(var, lst)
#define list_nth_node(type, list, n)
static ListCell * lnext(const List *l, const ListCell *c)
#define list_make2(x1, x2)
#define foreach_int(var, lst)
FormData_pg_opclass * Form_pg_opclass
List * GetRelationPublications(Oid relid)
void changeDependencyOnOwner(Oid classId, Oid objectId, Oid newOwnerId)
void changeDependencyOnTablespace(Oid classId, Oid objectId, Oid newTablespaceId)
FormData_pg_trigger * Form_pg_trigger
void RenameTypeInternal(Oid typeOid, const char *newTypeName, Oid typeNamespace)
FormData_pg_type * Form_pg_type
#define ERRCODE_UNDEFINED_TABLE
void pgstat_count_truncate(Relation rel)
Expr * expression_planner(Expr *expr)
int pg_strcasecmp(const char *s1, const char *s2)
size_t strlcpy(char *dst, const char *src, size_t siz)
static Datum PointerGetDatum(const void *X)
static Datum Int16GetDatum(int16 X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
void CheckTableForSerializableConflictIn(Relation relation)
void TransferPredicateLocksToHeapRelation(Relation relation)
bool predicate_implied_by(List *predicate_list, List *clause_list, bool weak)
Expr * canonicalize_qual(Expr *qual, bool is_check)
void * stringToNode(const char *str)
#define RelationGetForm(relation)
#define RelationGetRelid(relation)
#define RelationIsLogicallyLogged(relation)
#define RelationIsUsedAsCatalogTable(relation)
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationGetDescr(relation)
#define RelationIsMapped(relation)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
#define RelationGetNamespace(relation)
#define IndexRelationGetNumberOfKeyAttributes(relation)
#define RelationIsPermanent(relation)
List * RelationGetIndexList(Relation relation)
Oid RelationGetPrimaryKeyIndex(Relation relation, bool deferrable_ok)
int errtableconstraint(Relation rel, const char *conname)
int errtablecol(Relation rel, int attnum)
List * RelationGetIndexPredicate(Relation relation)
Bitmapset * RelationGetIndexAttrBitmap(Relation relation, IndexAttrBitmapKind attrKind)
void RelationSetNewRelfilenumber(Relation relation, char persistence)
List * RelationGetFKeyList(Relation relation)
List * RelationGetIndexExpressions(Relation relation)
void RelationAssumeNewRelfilelocator(Relation relation)
int errtable(Relation rel)
@ INDEX_ATTR_BITMAP_PRIMARY_KEY
@ INDEX_ATTR_BITMAP_IDENTITY_KEY
List * untransformRelOptions(Datum options)
bytea * view_reloptions(Datum reloptions, bool validate)
bytea * index_reloptions(amoptions_function amoptions, Datum reloptions, bool validate)
bytea * partitioned_table_reloptions(Datum reloptions, bool validate)
Datum transformRelOptions(Datum oldOptions, List *defList, const char *nameSpace, const char *const validnsps[], bool acceptOidsOff, bool isReset)
LOCKMODE AlterTableGetRelOptionsLockLevel(List *defList)
bytea * attribute_reloptions(Datum reloptions, bool validate)
bytea * heap_reloptions(char relkind, Datum reloptions, bool validate)
#define HEAP_RELOPT_NAMESPACES
#define RelFileNumberIsValid(relnumber)
void EnableDisableRule(Relation rel, const char *rulename, char fires_when)
#define RULE_FIRES_ON_ORIGIN
#define RULE_FIRES_ON_REPLICA
#define RULE_FIRES_ALWAYS
Query * get_view_query(Relation view)
const char * view_query_is_auto_updatable(Query *viewquery, bool check_cols)
Node * build_column_default(Relation rel, int attrno)
Node * expand_generated_columns_in_expr(Node *node, Relation rel, int rt_index)
Node * map_variable_attnos(Node *node, int target_varno, int sublevels_up, const AttrMap *attno_map, Oid to_rowtype, bool *found_whole_row)
Datum RI_FKey_check_ins(PG_FUNCTION_ARGS)
bool RI_Initial_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
void RI_PartitionRemove_Check(Trigger *trigger, Relation fk_rel, Relation pk_rel)
int RI_FKey_trigger_type(Oid tgfoid)
char * pg_get_statisticsobjdef_string(Oid statextid)
char * pg_get_indexdef_string(Oid indexrelid)
const char * quote_identifier(const char *ident)
Datum pg_get_expr(PG_FUNCTION_ARGS)
char * pg_get_constraintdef_command(Oid constraintId)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
void smgrclose(SMgrRelation reln)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
Snapshot GetTransactionSnapshot(void)
Snapshot GetLatestSnapshot(void)
void UnregisterSnapshot(Snapshot snapshot)
void PushActiveSnapshot(Snapshot snapshot)
Snapshot RegisterSnapshot(Snapshot snapshot)
void PopActiveSnapshot(void)
Snapshot GetActiveSnapshot(void)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation try_relation_open(Oid relationId, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
void check_stack_depth(void)
ObjectAddress CreateStatistics(CreateStatsStmt *stmt, bool check_rights)
Oid StatisticsGetRelation(Oid statId, bool missing_ok)
void RelationPreserveStorage(RelFileLocator rlocator, bool atCommit)
void RelationCopyStorage(SMgrRelation src, SMgrRelation dst, ForkNumber forkNum, char relpersistence)
SMgrRelation RelationCreateStorage(RelFileLocator rlocator, char relpersistence, bool register_delete)
void log_smgrcreate(const RelFileLocator *rlocator, ForkNumber forkNum)
void RelationDropStorage(Relation rel)
#define BTEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
List * changedConstraintDefs
Expr * partition_constraint
List * changedStatisticsDefs
char * replicaIdentityIndex
List * changedStatisticsOids
List * changedConstraintOids
List * subcmds[AT_NUM_PASSES]
RangeVar * identitySequence
bool reset_default_tblspc
char actual_relpersistence
MemoryContext es_query_cxt
List * es_opened_result_relations
TupleTableSlot * ecxt_scantuple
ExecForeignTruncate_function ExecForeignTruncate
amoptions_function amoptions
AttrNumber ii_IndexAttrNumbers[INDEX_MAX_KEYS]
bool reset_default_tblspc
NullTestType nulltesttype
SubTransactionId creating_subid
SubTransactionId deleting_subid
const char * p_sourcetext
PartitionBoundSpec * bound
PartitionStrategy strategy
struct IndexAmRoutine * rd_indam
SubTransactionId rd_firstRelfilelocatorSubid
SubTransactionId rd_newRelfilelocatorSubid
SubTransactionId rd_createSubid
RelFileLocator rd_locator
TupleTableSlot * tg_trigslot
bool has_generated_virtual
const char * skipping_msg
const char * nonexistent_msg
const char * drophint_msg
Oid values[FLEXIBLE_ARRAY_MEMBER]
#define FirstLowInvalidHeapAttributeNumber
HeapTuple SearchSysCacheCopyAttName(Oid relid, const char *attname)
HeapTuple SearchSysCacheCopyAttNum(Oid relid, int16 attnum)
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCacheLocked1(int cacheId, Datum key1)
HeapTuple SearchSysCacheLockedCopy1(int cacheId, Datum key1)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
HeapTuple SearchSysCacheAttNum(Oid relid, int16 attnum)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
bool SearchSysCacheExistsAttName(Oid relid, const char *attname)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
HeapTuple SearchSysCacheAttName(Oid relid, const char *attname)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
#define SearchSysCacheCopy1(cacheId, key1)
#define SearchSysCacheExists2(cacheId, key1, key2)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
Relation table_openrv(const RangeVar *relation, LOCKMODE lockmode)
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
char * default_table_access_method
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, ScanKeyData *key)
const TupleTableSlotOps * table_slot_callbacks(Relation relation)
static void table_endscan(TableScanDesc scan)
#define TABLE_INSERT_SKIP_FSM
static void table_tuple_insert(Relation rel, TupleTableSlot *slot, CommandId cid, int options, BulkInsertStateData *bistate)
static void table_finish_bulk_insert(Relation rel, int options)
static void table_relation_copy_data(Relation rel, const RelFileLocator *newrlocator)
static bool table_scan_getnextslot(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot)
static TableScanDesc table_beginscan(Relation rel, Snapshot snapshot, int nkeys, ScanKeyData *key)
static void QueueFKConstraintValidation(List **wqueue, Relation conrel, Relation fkrel, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode)
static AttrNumber renameatt_internal(Oid myrelid, const char *oldattname, const char *newattname, bool recurse, bool recursing, int expected_parents, DropBehavior behavior)
void ResetRelRewrite(Oid myrelid)
static int validateFkOnDeleteSetColumns(int numfks, const int16 *fkattnums, int numfksetcols, int16 *fksetcolsattnums, List *fksetcols)
static void MergeAttributesIntoExisting(Relation child_rel, Relation parent_rel, bool ispartition)
static void MarkInheritDetached(Relation child_rel, Relation parent_rel)
static ObjectAddress ATExecAlterColumnGenericOptions(Relation rel, const char *colName, List *options, LOCKMODE lockmode)
static void ATRewriteCatalogs(List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void AlterConstrEnforceabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Oid fkrelid, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
static ObjectAddress ATExecAddInherit(Relation child_rel, RangeVar *parent, LOCKMODE lockmode)
ObjectAddress RenameRelation(RenameStmt *stmt)
static AlteredTableInfo * ATGetQueueEntry(List **wqueue, Relation rel)
static void verifyNotNullPKCompatible(HeapTuple tuple, const char *colname)
static void ATExecDropOf(Relation rel, LOCKMODE lockmode)
static ObjectAddress ATExecAlterConstraint(List **wqueue, Relation rel, ATAlterConstraint *cmdcon, bool recurse, LOCKMODE lockmode)
static ColumnDef * MergeInheritedAttribute(List *inh_columns, int exist_attno, const ColumnDef *newdef)
static void addFkRecurseReferencing(List **wqueue, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool old_check_ok, LOCKMODE lockmode, Oid parentInsTrigger, Oid parentUpdTrigger, bool with_period)
static bool ConstraintImpliedByRelConstraint(Relation scanrel, List *testConstraint, List *provenConstraint)
static const char * storage_name(char c)
static ObjectAddress ATExecDropExpression(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode)
void AtEOSubXact_on_commit_actions(bool isCommit, SubTransactionId mySubid, SubTransactionId parentSubid)
static void add_column_datatype_dependency(Oid relid, int32 attnum, Oid typid)
static ObjectAddress ATExecColumnDefault(Relation rel, const char *colName, Node *newDefault, LOCKMODE lockmode)
static void ATPostAlterTypeParse(Oid oldId, Oid oldRelId, Oid refRelId, char *cmd, List **wqueue, LOCKMODE lockmode, bool rewrite)
static void ATExecSetTableSpace(Oid tableOid, Oid newTableSpace, LOCKMODE lockmode)
static void drop_parent_dependency(Oid relid, Oid refclassid, Oid refobjid, DependencyType deptype)
static void DropForeignKeyConstraintTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid)
static void RemoveInheritance(Relation child_rel, Relation parent_rel, bool expect_detached)
void PreCommit_on_commit_actions(void)
static ObjectAddress dropconstraint_internal(Relation rel, HeapTuple constraintTup, DropBehavior behavior, bool recurse, bool recursing, bool missing_ok, LOCKMODE lockmode)
static void RemoveInheritedConstraint(Relation conrel, Relation trigrel, Oid conoid, Oid conrelid)
static ObjectAddress ATExecDropIdentity(Relation rel, const char *colName, bool missing_ok, LOCKMODE lockmode, bool recurse, bool recursing)
static char GetAttributeCompression(Oid atttypid, const char *compression)
static int findAttrByName(const char *attributeName, const List *columns)
static void RememberIndexForRebuilding(Oid indoid, AlteredTableInfo *tab)
static bool ATColumnChangeRequiresRewrite(Node *expr, AttrNumber varattno)
static char * ChooseForeignKeyConstraintNameAddition(List *colnames)
static ObjectAddress ATExecValidateConstraint(List **wqueue, Relation rel, char *constrName, bool recurse, bool recursing, LOCKMODE lockmode)
void AlterTable(AlterTableStmt *stmt, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void RememberStatisticsForRebuilding(Oid stxoid, AlteredTableInfo *tab)
static CoercionPathType findFkeyCast(Oid targetTypeId, Oid sourceTypeId, Oid *funcid)
static void add_column_collation_dependency(Oid relid, int32 attnum, Oid collid)
static ObjectAddress ATExecDropNotNull(Relation rel, const char *colName, bool recurse, LOCKMODE lockmode)
static Oid transformFkeyCheckAttrs(Relation pkrel, int numattrs, int16 *attnums, bool with_period, Oid *opclasses, bool *pk_has_without_overlaps)
void RemoveRelations(DropStmt *drop)
static void ATPrepSetTableSpace(AlteredTableInfo *tab, Relation rel, const char *tablespacename, LOCKMODE lockmode)
static void ATTypedTableRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void RememberReplicaIdentityForRebuilding(Oid indoid, AlteredTableInfo *tab)
static List * GetParentedForeignKeyRefs(Relation partition)
void AlterRelationNamespaceInternal(Relation classRel, Oid relOid, Oid oldNspOid, Oid newNspOid, bool hasDependEntry, ObjectAddresses *objsMoved)
static ObjectAddress ATExecAddConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *newConstraint, bool recurse, bool is_readd, LOCKMODE lockmode)
ObjectAddress renameatt(RenameStmt *stmt)
void ATExecChangeOwner(Oid relationOid, Oid newOwnerId, bool recursing, LOCKMODE lockmode)
static void RangeVarCallbackForAlterRelation(const RangeVar *rv, Oid relid, Oid oldrelid, void *arg)
static void CheckAlterTableIsSafe(Relation rel)
static void DropErrorMsgWrongType(const char *relname, char wrongkind, char rightkind)
LOCKMODE AlterTableGetLockLevel(List *cmds)
struct ForeignTruncateInfo ForeignTruncateInfo
static ObjectAddress ATExecDetachPartition(List **wqueue, AlteredTableInfo *tab, Relation rel, RangeVar *name, bool concurrent)
static void AlterSeqNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved, LOCKMODE lockmode)
static void RangeVarCallbackForRenameAttribute(const RangeVar *rv, Oid relid, Oid oldrelid, void *arg)
TupleDesc BuildDescForRelation(const List *columns)
static void ATExecForceNoForceRowSecurity(Relation rel, bool force_rls)
void AtEOXact_on_commit_actions(bool isCommit)
static void checkFkeyPermissions(Relation rel, int16 *attnums, int natts)
struct OnCommitItem OnCommitItem
void CheckTableNotInUse(Relation rel, const char *stmt)
static bool ATExecAlterConstrInheritability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation rel, HeapTuple contuple, LOCKMODE lockmode)
static void createForeignKeyActionTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentDelTrigger, Oid parentUpdTrigger, Oid *deleteTrigOid, Oid *updateTrigOid)
static void ATExecEnableDisableTrigger(Relation rel, const char *trigname, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode)
static void AttachPartitionForeignKey(List **wqueue, Relation partition, Oid partConstrOid, Oid parentConstrOid, Oid parentInsTrigger, Oid parentUpdTrigger, Relation trigrel)
static List * MergeCheckConstraint(List *constraints, const char *name, Node *expr, bool is_enforced)
static void renameatt_check(Oid myrelid, Form_pg_class classform, bool recursing)
static void RangeVarCallbackForAttachIndex(const RangeVar *rv, Oid relOid, Oid oldRelOid, void *arg)
static void ATCheckPartitionsNotInUse(Relation rel, LOCKMODE lockmode)
static void truncate_check_activity(Relation rel)
static void validatePartitionedIndex(Relation partedIdx, Relation partedTbl)
static void AlterConstrUpdateConstraintEntry(ATAlterConstraint *cmdcon, Relation conrel, HeapTuple contuple)
static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *fkconstraint, bool recurse, bool recursing, LOCKMODE lockmode)
static void TryReuseIndex(Oid oldId, IndexStmt *stmt)
static void GetForeignKeyCheckTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid, Oid *insertTriggerOid, Oid *updateTriggerOid)
static ObjectAddress addFkConstraint(addFkConstraintSides fkside, char *constraintname, Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool is_internal, bool with_period)
static void RememberClusterOnForRebuilding(Oid indoid, AlteredTableInfo *tab)
static ObjectAddress ATExecSetOptions(Relation rel, const char *colName, Node *options, bool isReset, LOCKMODE lockmode)
static bool ATExecAlterConstrEnforceability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Oid fkrelid, Oid pkrelid, HeapTuple contuple, LOCKMODE lockmode, Oid ReferencedParentDelTrigger, Oid ReferencedParentUpdTrigger, Oid ReferencingParentInsTrigger, Oid ReferencingParentUpdTrigger)
static void QueueNNConstraintValidation(List **wqueue, Relation conrel, Relation rel, HeapTuple contuple, bool recurse, bool recursing, LOCKMODE lockmode)
static ObjectAddress ATExecDropColumn(List **wqueue, Relation rel, const char *colName, DropBehavior behavior, bool recurse, bool recursing, bool missing_ok, LOCKMODE lockmode, ObjectAddresses *addrs)
static void CloneFkReferencing(List **wqueue, Relation parentRel, Relation partRel)
static void SetIndexStorageProperties(Relation rel, Relation attrelation, AttrNumber attnum, bool setstorage, char newstorage, bool setcompression, char newcompression, LOCKMODE lockmode)
static void ATController(AlterTableStmt *parsetree, Relation rel, List *cmds, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
bool CheckRelationTableSpaceMove(Relation rel, Oid newTableSpaceId)
static void ATExecSetRowSecurity(Relation rel, bool rls)
void find_composite_type_dependencies(Oid typeOid, Relation origRelation, const char *origTypeName)
static void truncate_check_perms(Oid relid, Form_pg_class reltuple)
static void truncate_check_rel(Oid relid, Form_pg_class reltuple)
static void change_owner_recurse_to_sequences(Oid relationOid, Oid newOwnerId, LOCKMODE lockmode)
static void StoreCatalogInheritance1(Oid relationId, Oid parentOid, int32 seqNumber, Relation inhRelation, bool child_is_partition)
static void RememberAllDependentForRebuilding(AlteredTableInfo *tab, AlterTableType subtype, Relation rel, AttrNumber attnum, const char *colName)
static void ATPrepDropExpression(Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode)
static bool ATExecAlterConstraintInternal(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, LOCKMODE lockmode)
static void verifyPartitionIndexNotNull(IndexInfo *iinfo, Relation partition)
static ObjectAddress ATExecCookedColumnDefault(Relation rel, AttrNumber attnum, Node *newDefault)
static ObjectAddress rename_constraint_internal(Oid myrelid, Oid mytypid, const char *oldconname, const char *newconname, bool recurse, bool recursing, int expected_parents)
static void DropErrorMsgNonExistent(RangeVar *rel, char rightkind, bool missing_ok)
static void ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode)
static AlterTableCmd * ATParseTransformCmd(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
void AlterTableNamespaceInternal(Relation rel, Oid oldNspOid, Oid nspOid, ObjectAddresses *objsMoved)
static ObjectAddress ATAddCheckNNConstraint(List **wqueue, AlteredTableInfo *tab, Relation rel, Constraint *constr, bool recurse, bool recursing, bool is_readd, LOCKMODE lockmode)
static void CloneFkReferenced(Relation parentRel, Relation partitionRel)
static void MergeConstraintsIntoExisting(Relation child_rel, Relation parent_rel)
static void ATPrepDropColumn(List **wqueue, Relation rel, bool recurse, bool recursing, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
void SetRelationHasSubclass(Oid relationId, bool relhassubclass)
static void MergeChildAttribute(List *inh_columns, int exist_attno, int newcol_attno, const ColumnDef *newdef)
static void ATSimplePermissions(AlterTableType cmdtype, Relation rel, int allowed_targets)
static const char * alter_table_type_to_string(AlterTableType cmdtype)
static void ATExecSetRelOptions(Relation rel, List *defList, AlterTableType operation, LOCKMODE lockmode)
static ObjectAddress ATExecSetIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmode, bool recurse, bool recursing)
ObjectAddress AlterTableNamespace(AlterObjectSchemaStmt *stmt, Oid *oldschema)
static void RememberConstraintForRebuilding(Oid conoid, AlteredTableInfo *tab)
void ExecuteTruncate(TruncateStmt *stmt)
static void relation_mark_replica_identity(Relation rel, char ri_type, Oid indexOid, bool is_internal)
#define ATT_FOREIGN_TABLE
static void ATPrepAddColumn(List **wqueue, Relation rel, bool recurse, bool recursing, bool is_view, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNumber *partattrs, List **partexprs, Oid *partopclass, Oid *partcollation, PartitionStrategy strategy)
static void CloneRowTriggersToPartition(Relation parent, Relation partition)
static void AttachPartitionEnsureIndexes(List **wqueue, Relation rel, Relation attachrel)
static void StoreCatalogInheritance(Oid relationId, List *supers, bool child_is_partition)
static void ATExecGenericOptions(Relation rel, List *options)
static void TryReuseForeignKey(Oid oldId, Constraint *con)
struct AlteredTableInfo AlteredTableInfo
Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode)
static void AlterConstrDeferrabilityRecurse(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, List **otherrelids, LOCKMODE lockmode)
struct NewConstraint NewConstraint
static ObjectAddress ATExecSetStatistics(Relation rel, const char *colName, int16 colNum, Node *newValue, LOCKMODE lockmode)
static void ATSimpleRecursion(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void DetachPartitionFinalize(Relation rel, Relation partRel, bool concurrent, Oid defaultPartOid)
static void RebuildConstraintComment(AlteredTableInfo *tab, AlterTablePass pass, Oid objid, Relation rel, List *domname, const char *conname)
static void CloneForeignKeyConstraints(List **wqueue, Relation parentRel, Relation partitionRel)
static void addFkRecurseReferenced(Constraint *fkconstraint, Relation rel, Relation pkrel, Oid indexOid, Oid parentConstr, int numfks, int16 *pkattnum, int16 *fkattnum, Oid *pfeqoperators, Oid *ppeqoperators, Oid *ffeqoperators, int numfkdelsetcols, int16 *fkdelsetcols, bool old_check_ok, Oid parentDelTrigger, Oid parentUpdTrigger, bool with_period)
static bool check_for_column_name_collision(Relation rel, const char *colname, bool if_not_exists)
static ObjectAddress ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, AlterTableCmd **cmd, bool recurse, bool recursing, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
@ AT_PASS_ADD_OTHERCONSTR
@ AT_PASS_ADD_INDEXCONSTR
static ObjectAddress ATExecAlterColumnType(AlteredTableInfo *tab, Relation rel, AlterTableCmd *cmd, LOCKMODE lockmode)
static void validateForeignKeyConstraint(char *conname, Relation rel, Relation pkrel, Oid pkindOid, Oid constraintOid, bool hasperiod)
static char * decompile_conbin(HeapTuple contup, TupleDesc tupdesc)
static void QueueCheckConstraintValidation(List **wqueue, Relation conrel, Relation rel, char *constrName, HeapTuple contuple, bool recurse, bool recursing, LOCKMODE lockmode)
void SetRelationTableSpace(Relation rel, Oid newTableSpaceId, RelFileNumber newRelFilenumber)
void remove_on_commit_action(Oid relid)
static void ATExecDropCluster(Relation rel, LOCKMODE lockmode)
#define ATT_PARTITIONED_INDEX
static void CreateInheritance(Relation child_rel, Relation parent_rel, bool ispartition)
static const struct dropmsgstrings dropmsgstringarray[]
static void ATPrepChangePersistence(AlteredTableInfo *tab, Relation rel, bool toLogged)
static ObjectAddress ATExecSetExpression(AlteredTableInfo *tab, Relation rel, const char *colName, Node *newExpr, LOCKMODE lockmode)
ObjectAddress DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId, ObjectAddress *typaddress, const char *queryString)
static Oid CreateFKCheckTrigger(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentTrigOid, bool on_insert)
static void AlterConstrTriggerDeferrability(Oid conoid, Relation tgrel, Relation rel, bool deferrable, bool initdeferred, List **otherrelids)
static void ATPrepAddPrimaryKey(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void DropClonedTriggersFromPartition(Oid partitionId)
static void QueuePartitionConstraintValidation(List **wqueue, Relation scanrel, List *partConstraint, bool validate_default)
static ObjectAddress ATExecAddOf(Relation rel, const TypeName *ofTypename, LOCKMODE lockmode)
static void RangeVarCallbackForDropRelation(const RangeVar *rel, Oid relOid, Oid oldRelOid, void *arg)
void AlterTableInternal(Oid relid, List *cmds, bool recurse)
static void GetForeignKeyActionTriggers(Relation trigrel, Oid conoid, Oid confrelid, Oid conrelid, Oid *deleteTriggerOid, Oid *updateTriggerOid)
void check_of_type(HeapTuple typetuple)
static ObjectAddress ATExecDropInherit(Relation rel, RangeVar *parent, LOCKMODE lockmode)
static void ATDetachCheckNoForeignKeyRefs(Relation partition)
static ObjectAddress ATExecAddIndexConstraint(AlteredTableInfo *tab, Relation rel, IndexStmt *stmt, LOCKMODE lockmode)
static void AlterIndexNamespaces(Relation classRel, Relation rel, Oid oldNspOid, Oid newNspOid, ObjectAddresses *objsMoved)
#define ATT_PARTITIONED_TABLE
static void ATExecCmd(List **wqueue, AlteredTableInfo *tab, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTablePass cur_pass, AlterTableUtilityContext *context)
static bool ATExecAlterConstrDeferrability(List **wqueue, ATAlterConstraint *cmdcon, Relation conrel, Relation tgrel, Relation rel, HeapTuple contuple, bool recurse, List **otherrelids, LOCKMODE lockmode)
static void ATExecReplicaIdentity(Relation rel, ReplicaIdentityStmt *stmt, LOCKMODE lockmode)
static void createForeignKeyCheckTriggers(Oid myRelOid, Oid refRelOid, Constraint *fkconstraint, Oid constraintOid, Oid indexOid, Oid parentInsTrigger, Oid parentUpdTrigger, Oid *insertTrigOid, Oid *updateTrigOid)
static void ATPrepAddInherit(Relation child_rel)
static ObjectAddress ATExecDetachPartitionFinalize(Relation rel, RangeVar *name)
static ObjectAddress ATExecSetStorage(Relation rel, const char *colName, Node *newValue, LOCKMODE lockmode)
static ObjectAddress ATExecAttachPartition(List **wqueue, Relation rel, PartitionCmd *cmd, AlterTableUtilityContext *context)
static List * find_typed_table_dependencies(Oid typeOid, const char *typeName, DropBehavior behavior)
Oid AlterTableMoveAll(AlterTableMoveAllStmt *stmt)
static int transformFkeyGetPrimaryKey(Relation pkrel, Oid *indexOid, List **attnamelist, int16 *attnums, Oid *atttypids, Oid *attcollids, Oid *opclasses, bool *pk_has_without_overlaps)
static ObjectAddress ATExecAddIdentity(Relation rel, const char *colName, Node *def, LOCKMODE lockmode, bool recurse, bool recursing)
static void ATExecSetAccessMethodNoStorage(Relation rel, Oid newAccessMethodId)
static void ATExecDropConstraint(Relation rel, const char *constrName, DropBehavior behavior, bool recurse, bool missing_ok, LOCKMODE lockmode)
static ObjectAddress ATExecAddIndex(AlteredTableInfo *tab, Relation rel, IndexStmt *stmt, bool is_rebuild, LOCKMODE lockmode)
static ObjectAddress ATExecSetCompression(Relation rel, const char *column, Node *newValue, LOCKMODE lockmode)
static PartitionSpec * transformPartitionSpec(Relation rel, PartitionSpec *partspec)
static void ATPrepCmd(List **wqueue, Relation rel, AlterTableCmd *cmd, bool recurse, bool recursing, LOCKMODE lockmode, AlterTableUtilityContext *context)
static void index_copy_data(Relation rel, RelFileLocator newrlocator)
static ObjectAddress ATExecSetNotNull(List **wqueue, Relation rel, char *conName, char *colName, bool recurse, bool recursing, LOCKMODE lockmode)
void RenameRelationInternal(Oid myrelid, const char *newrelname, bool is_internal, bool is_index)
static void set_attnotnull(List **wqueue, Relation rel, AttrNumber attnum, bool is_valid, bool queue_validation)
static bool tryAttachPartitionForeignKey(List **wqueue, ForeignKeyCacheInfo *fk, Relation partition, Oid parentConstrOid, int numfks, AttrNumber *mapped_conkey, AttrNumber *confkey, Oid *conpfeqop, Oid parentInsTrigger, Oid parentUpdTrigger, Relation trigrel)
static void ATExecSetTableSpaceNoStorage(Relation rel, Oid newTableSpace)
static void ATPrepAlterColumnType(List **wqueue, AlteredTableInfo *tab, Relation rel, bool recurse, bool recursing, AlterTableCmd *cmd, LOCKMODE lockmode, AlterTableUtilityContext *context)
static int transformColumnNameList(Oid relId, List *colList, int16 *attnums, Oid *atttypids, Oid *attcollids)
static void change_owner_fix_column_acls(Oid relationOid, Oid oldOwnerId, Oid newOwnerId)
#define ATT_COMPOSITE_TYPE
static ObjectAddress ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name)
bool PartConstraintImpliedByRelConstraint(Relation scanrel, List *partConstraint)
void RangeVarCallbackMaintainsTable(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
static bool constraints_equivalent(HeapTuple a, HeapTuple b, TupleDesc tupleDesc)
static ObjectAddress ATExecAddStatistics(AlteredTableInfo *tab, Relation rel, CreateStatsStmt *stmt, bool is_rebuild, LOCKMODE lockmode)
ObjectAddress RenameConstraint(RenameStmt *stmt)
static void ATRewriteTables(AlterTableStmt *parsetree, List **wqueue, LOCKMODE lockmode, AlterTableUtilityContext *context)
void register_on_commit_action(Oid relid, OnCommitAction action)
static void RangeVarCallbackForTruncate(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
static ObjectAddress ATExecClusterOn(Relation rel, const char *indexName, LOCKMODE lockmode)
static char GetAttributeStorage(Oid atttypid, const char *storagemode)
void RangeVarCallbackOwnsRelation(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
#define child_dependency_type(child_is_partition)
static void refuseDupeIndexAttach(Relation parentIdx, Relation partIdx, Relation partitionTbl)
void ExecuteTruncateGuts(List *explicit_rels, List *relids, List *relids_logged, DropBehavior behavior, bool restart_seqs, bool run_as_table_owner)
static void ATRewriteTable(AlteredTableInfo *tab, Oid OIDNewHeap)
static List * MergeAttributes(List *columns, const List *supers, char relpersistence, bool is_partition, List **supconstr, List **supnotnulls)
static void ATExecEnableDisableRule(Relation rel, const char *rulename, char fires_when, LOCKMODE lockmode)
struct NewColumnValue NewColumnValue
static void ATPrepSetAccessMethod(AlteredTableInfo *tab, Relation rel, const char *amname)
static bool NotNullImpliedByRelConstraints(Relation rel, Form_pg_attribute attr)
const char * GetCompressionMethodName(char method)
char CompressionNameToMethod(const char *compression)
#define CompressionMethodIsValid(cm)
#define InvalidCompressionMethod
void AlterTableCreateToastTable(Oid relOid, Datum reloptions, LOCKMODE lockmode)
void ExecBSTruncateTriggers(EState *estate, ResultRelInfo *relinfo)
void EnableDisableTrigger(Relation rel, const char *tgname, Oid tgparent, char fires_when, bool skip_system, bool recurse, LOCKMODE lockmode)
const char * FindTriggerIncompatibleWithInheritance(TriggerDesc *trigdesc)
void ExecASTruncateTriggers(EState *estate, ResultRelInfo *relinfo)
ObjectAddress CreateTrigger(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, Oid funcoid, Oid parentTriggerOid, Node *whenClause, bool isInternal, bool in_partition)
void TriggerSetParentTrigger(Relation trigRel, Oid childTrigId, Oid parentTrigId, Oid childTableId)
ObjectAddress CreateTriggerFiringOn(CreateTrigStmt *stmt, const char *queryString, Oid relOid, Oid refRelOid, Oid constraintOid, Oid indexOid, Oid funcoid, Oid parentTriggerOid, Node *whenClause, bool isInternal, bool in_partition, char trigger_fires_when)
bool AfterTriggerPendingOnRel(Oid relid)
void AfterTriggerEndQuery(EState *estate)
void AfterTriggerBeginQuery(void)
#define TRIGGER_FIRES_ON_ORIGIN
#define TRIGGER_FIRES_ON_REPLICA
#define TRIGGER_EVENT_ROW
#define TRIGGER_FIRES_ALWAYS
#define TRIGGER_EVENT_INSERT
TupleDesc CreateTupleDescCopyConstr(TupleDesc tupdesc)
Node * TupleDescGetDefault(TupleDesc tupdesc, AttrNumber attnum)
TupleDesc CreateTemplateTupleDesc(int natts)
void populate_compact_attribute(TupleDesc tupdesc, int attnum)
void TupleDescInitEntryCollation(TupleDesc desc, AttrNumber attributeNumber, Oid collationid)
void TupleDescInitEntry(TupleDesc desc, AttrNumber attributeNumber, const char *attributeName, Oid oidtypeid, int32 typmod, int attdim)
#define ReleaseTupleDesc(tupdesc)
#define ATTNULLABLE_VALID
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static CompactAttribute * TupleDescCompactAttr(TupleDesc tupdesc, int i)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
static void slot_getallattrs(TupleTableSlot *slot)
static bool slot_attisnull(TupleTableSlot *slot, int attnum)
TupleDesc lookup_rowtype_tupdesc(Oid type_id, int32 typmod)
bool DomainHasConstraints(Oid type_id)
void AlterTypeOwnerInternal(Oid typeOid, Oid newOwnerId)
ObjectAddress AlterDomainAddConstraint(List *names, Node *newConstraint, ObjectAddress *constrAddr)
void checkDomainOwner(HeapTuple tup)
Oid AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid, bool isImplicitArray, bool ignoreDependent, bool errorOnTableType, ObjectAddresses *objsMoved)
List * roleSpecsToIds(List *memberNames)
void SwitchToUntrustedUser(Oid userid, UserContext *context)
void RestoreUserContext(UserContext *context)
void ProcessUtilityForAlterTable(Node *stmt, AlterTableUtilityContext *context)
#define MAX_STATISTICS_TARGET
String * makeString(char *str)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
static char * VARDATA_ANY(const void *PTR)
SubTransactionId GetCurrentSubTransactionId(void)
void CommandCounterIncrement(void)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)
CommandId GetCurrentCommandId(bool used)
#define XACT_FLAGS_ACCESSEDTEMPNAMESPACE
#define XLogLogicalInfoActive()
#define XLOG_INCLUDE_ORIGIN
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterData(const void *data, uint32 len)
void XLogSetRecordFlags(uint8 flags)
void XLogBeginInsert(void)