74#include "utils/fmgroids.h"
106 bool is_enforced,
bool is_validated,
bool is_local,
107 int16 inhcount,
bool is_no_inherit,
bool is_internal);
111 bool allow_merge,
bool is_local,
113 bool is_initially_valid,
117 Node *raw_constraint,
216 .attname = {
"tableoid"},
218 .attlen =
sizeof(
Oid),
239 elog(
ERROR,
"invalid system attribute number %d", attno);
240 return SysAtt[-attno - 1];
294 bool shared_relation,
295 bool mapped_relation,
296 bool allow_system_table_mods,
315 if (!allow_system_table_mods &&
320 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
321 errmsg(
"permission denied to create \"%s.%s\"",
323 errdetail(
"System catalog modifications are currently disallowed.")));
332 if (!RELKIND_HAS_TABLESPACE(relkind))
336 if (!RELKIND_HAS_STORAGE(relkind))
337 create_storage =
false;
345 relfilenumber = relid;
384 if (RELKIND_HAS_TABLE_AM(rel->
rd_rel->relkind))
387 relfrozenxid, relminmxid);
388 else if (RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
399 if (!create_storage && reltablespace !=
InvalidOid)
457 int natts = tupdesc->
natts;
462 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
463 errmsg(
"tables can have at most %d columns",
472 if (relkind != RELKIND_VIEW && relkind != RELKIND_COMPOSITE_TYPE)
474 for (
i = 0;
i < natts;
i++)
480 (
errcode(ERRCODE_DUPLICATE_COLUMN),
481 errmsg(
"column name \"%s\" conflicts with a system column name",
489 for (
i = 1;
i < natts;
i++)
491 for (
j = 0;
j <
i;
j++)
496 (
errcode(ERRCODE_DUPLICATE_COLUMN),
497 errmsg(
"column name \"%s\" specified more than once",
505 for (
i = 0;
i < natts;
i++)
545 Oid atttypid,
Oid attcollation,
546 List *containing_rowtypes,
555 if (att_typtype == TYPTYPE_PSEUDO)
573 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
575 errmsg(
"partition key column %s has pseudo-type %s",
579 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
580 errmsg(
"column \"%s\" has pseudo-type %s",
584 else if (att_typtype == TYPTYPE_DOMAIN)
594 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
595 errmsg(
"virtual generated column \"%s\" cannot have a domain type",
attname));
604 else if (att_typtype == TYPTYPE_COMPOSITE)
621 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
622 errmsg(
"composite type %s cannot be made a member of itself",
625 containing_rowtypes =
lappend_oid(containing_rowtypes, atttypid);
631 for (
i = 0;
i < tupdesc->
natts;
i++)
635 if (attr->attisdropped)
638 attr->atttypid, attr->attcollation,
647 else if (att_typtype == TYPTYPE_RANGE)
672 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
673 errmsg(
"virtual generated column \"%s\" cannot have a user-defined type",
attname),
674 errdetail(
"Virtual generated columns that make use of user-defined types are not yet supported."));
684 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
686 errmsg(
"no collation was derived for partition key column %s with collatable type %s",
688 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
691 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
692 errmsg(
"no collation was derived for column \"%s\" with collatable type %s",
694 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
728 bool close_index =
false;
736 for (
int i = 0;
i < nslots;
i++)
739 while (natts < tupdesc->natts)
746 memset(slot[slotCount]->tts_isnull,
false,
747 slot[slotCount]->tts_tupleDescriptor->natts *
sizeof(
bool));
783 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attstattarget - 1] =
true;
784 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attoptions - 1] =
true;
790 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attacl - 1] =
true;
791 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attfdwoptions - 1] =
true;
792 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attmissingval - 1] =
true;
801 if (slotCount == nslots || natts == tupdesc->
natts - 1)
821 for (
int i = 0;
i < nslots;
i++)
840 int natts = tupdesc->
natts;
854 for (
int i = 0;
i < natts;
i++)
865 attr->attcollation != DEFAULT_COLLATION_OID)
878 if (relkind != RELKIND_VIEW && relkind != RELKIND_COMPOSITE_TYPE)
918 bool nulls[Natts_pg_class];
923 memset(nulls,
false,
sizeof(nulls));
948 values[Anum_pg_class_relforcerowsecurity - 1] =
BoolGetDatum(rd_rel->relforcerowsecurity);
956 if (relacl != (
Datum) 0)
957 values[Anum_pg_class_relacl - 1] = relacl;
959 nulls[Anum_pg_class_relacl - 1] =
true;
960 if (reloptions != (
Datum) 0)
961 values[Anum_pg_class_reloptions - 1] = reloptions;
963 nulls[Anum_pg_class_reloptions - 1] =
true;
966 nulls[Anum_pg_class_relpartbound - 1] =
true;
1002 new_rel_reltup = new_rel_desc->
rd_rel;
1005 new_rel_reltup->relpages = 0;
1006 new_rel_reltup->reltuples = -1;
1007 new_rel_reltup->relallvisible = 0;
1008 new_rel_reltup->relallfrozen = 0;
1011 if (relkind == RELKIND_SEQUENCE)
1013 new_rel_reltup->relpages = 1;
1014 new_rel_reltup->reltuples = 1;
1017 new_rel_reltup->relfrozenxid = relfrozenxid;
1018 new_rel_reltup->relminmxid = relminmxid;
1019 new_rel_reltup->relowner = relowner;
1020 new_rel_reltup->reltype = new_type_oid;
1021 new_rel_reltup->reloftype = reloftype;
1024 new_rel_reltup->relispartition =
false;
1027 new_rel_desc->
rd_att->
tdtypeid = new_type_oid ? new_type_oid : RECORDOID;
1032 relacl, reloptions);
1060 TYPCATEGORY_COMPOSITE,
1079 TYPSTORAGE_EXTENDED,
1131 List *cooked_constraints,
1133 char relpersistence,
1134 bool shared_relation,
1135 bool mapped_relation,
1139 bool allow_system_table_mods,
1178 (
errcode(ERRCODE_DUPLICATE_TABLE),
1196 errhint(
"A relation has an associated type of the same name, "
1197 "so you must use a name that doesn't conflict "
1198 "with any existing type.")));
1204 if (shared_relation && reltablespace != GLOBALTABLESPACE_OID)
1205 elog(
ERROR,
"shared relations must be placed in pg_global tablespace");
1222 Assert(relkind != RELKIND_INDEX);
1223 Assert(relkind != RELKIND_PARTITIONED_INDEX);
1225 if (relkind == RELKIND_TOASTVALUE)
1235 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1236 errmsg(
"toast relfilenumber value not set when in binary upgrade mode")));
1246 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1247 errmsg(
"pg_class heap OID value not set when in binary upgrade mode")));
1252 if (RELKIND_HAS_STORAGE(relkind))
1256 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1257 errmsg(
"relfilenumber value not set when in binary upgrade mode")));
1284 case RELKIND_RELATION:
1286 case RELKIND_MATVIEW:
1287 case RELKIND_FOREIGN_TABLE:
1288 case RELKIND_PARTITIONED_TABLE:
1292 case RELKIND_SEQUENCE:
1324 allow_system_table_mods,
1331 new_rel_desc->
rd_rel->relrewrite = relrewrite;
1338 if (!(relkind == RELKIND_SEQUENCE ||
1339 relkind == RELKIND_TOASTVALUE ||
1340 relkind == RELKIND_INDEX ||
1341 relkind == RELKIND_PARTITIONED_INDEX))
1369 new_type_oid = new_type_addr.
objectId;
1371 *typaddress = new_type_addr;
1394 F_ARRAY_SUBSCRIPT_HANDLER,
1403 TYPSTORAGE_EXTENDED,
1409 pfree(relarrayname);
1415 Assert(typaddress == NULL);
1459 if (relkind != RELKIND_COMPOSITE_TYPE &&
1460 relkind != RELKIND_TOASTVALUE &&
1494 if ((RELKIND_HAS_TABLE_AM(relkind) && relkind != RELKIND_TOASTVALUE) ||
1495 (relkind == RELKIND_PARTITIONED_TABLE &&
OidIsValid(accessmtd)))
1553 Anum_pg_inherits_inhrelid,
1586 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1617 Anum_pg_attribute_attrelid,
1654 Anum_pg_attribute_attrelid,
1658 Anum_pg_attribute_attnum,
1690 Datum valuesAtt[Natts_pg_attribute] = {0};
1691 bool nullsAtt[Natts_pg_attribute] = {0};
1692 bool replacesAtt[Natts_pg_attribute] = {0};
1708 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
1713 attStruct->attisdropped =
true;
1726 attStruct->attnotnull =
false;
1729 attStruct->attgenerated =
'\0';
1734 snprintf(newattname,
sizeof(newattname),
1735 "........pg.dropped.%d........",
attnum);
1736 namestrcpy(&(attStruct->attname), newattname);
1739 attStruct->atthasmissing =
false;
1740 nullsAtt[Anum_pg_attribute_attmissingval - 1] =
true;
1741 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
1747 nullsAtt[Anum_pg_attribute_attstattarget - 1] =
true;
1748 replacesAtt[Anum_pg_attribute_attstattarget - 1] =
true;
1749 nullsAtt[Anum_pg_attribute_attacl - 1] =
true;
1750 replacesAtt[Anum_pg_attribute_attacl - 1] =
true;
1751 nullsAtt[Anum_pg_attribute_attoptions - 1] =
true;
1752 replacesAtt[Anum_pg_attribute_attoptions - 1] =
true;
1753 nullsAtt[Anum_pg_attribute_attfdwoptions - 1] =
true;
1754 replacesAtt[Anum_pg_attribute_attfdwoptions - 1] =
true;
1757 valuesAtt, nullsAtt, replacesAtt);
1803 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1819 if (
OidIsValid(defaultPartOid) && relid != defaultPartOid)
1848 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
1857 elog(
ERROR,
"cache lookup failed for foreign table %u", relid);
1868 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
1875 if (relid == defaultPartOid)
1881 if (RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
1940 if (
OidIsValid(defaultPartOid) && relid != defaultPartOid)
1970 Datum repl_val[Natts_pg_attribute];
1971 bool repl_null[Natts_pg_attribute];
1972 bool repl_repl[Natts_pg_attribute];
1977 memset(repl_val, 0,
sizeof(repl_val));
1978 memset(repl_null,
false,
sizeof(repl_null));
1979 memset(repl_repl,
false,
sizeof(repl_repl));
1981 repl_val[Anum_pg_attribute_atthasmissing - 1] =
BoolGetDatum(
false);
1982 repl_null[Anum_pg_attribute_attmissingval - 1] =
true;
1984 repl_repl[Anum_pg_attribute_atthasmissing - 1] =
true;
1985 repl_repl[Anum_pg_attribute_attmissingval - 1] =
true;
1998 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
2004 if (attrtuple->atthasmissing)
2007 repl_val, repl_null, repl_repl);
2032 Datum valuesAtt[Natts_pg_attribute] = {0};
2033 bool nullsAtt[Natts_pg_attribute] = {0};
2034 bool replacesAtt[Natts_pg_attribute] = {0};
2050 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
2057 attStruct->atttypid,
2059 attStruct->attbyval,
2060 attStruct->attalign));
2063 valuesAtt[Anum_pg_attribute_atthasmissing - 1] =
BoolGetDatum(
true);
2064 replacesAtt[Anum_pg_attribute_atthasmissing - 1] =
true;
2066 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
2067 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
2070 valuesAtt, nullsAtt, replacesAtt);
2088 Datum valuesAtt[Natts_pg_attribute] = {0};
2089 bool nullsAtt[Natts_pg_attribute] = {0};
2090 bool replacesAtt[Natts_pg_attribute] = {0};
2102 if (tablerel->
rd_rel->relkind != RELKIND_RELATION)
2112 elog(
ERROR,
"cache lookup failed for attribute %s of relation %u",
2123 valuesAtt[Anum_pg_attribute_atthasmissing - 1] =
BoolGetDatum(
true);
2124 replacesAtt[Anum_pg_attribute_atthasmissing - 1] =
true;
2125 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
2126 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
2129 valuesAtt, nullsAtt, replacesAtt);
2148 bool is_enforced,
bool is_validated,
bool is_local,
2149 int16 inhcount,
bool is_no_inherit,
bool is_internal)
2178 foreach(vl, varList)
2183 for (
j = 0;
j <
i;
j++)
2198 if (is_no_inherit &&
2199 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
2201 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
2202 errmsg(
"cannot add NO INHERIT constraint to partitioned table \"%s\"",
2255 bool is_validated,
bool is_local,
int inhcount,
2315 if (cooked_constraints ==
NIL)
2325 foreach(lc, cooked_constraints)
2345 elog(
ERROR,
"unrecognized constraint type: %d",
2386 List *newColDefaults,
2387 List *newConstraints,
2391 const char *queryString)
2393 List *cookedConstraints =
NIL;
2409 oldconstr = tupleDesc->
constr;
2438 atp->atttypid, atp->atttypmod,
2455 (!colDef->generated &&
2465 cooked->
name = NULL;
2466 cooked->
attnum = colDef->attnum;
2467 cooked->
expr = expr;
2471 cooked->
inhcount = is_local ? 0 : 1;
2473 cookedConstraints =
lappend(cookedConstraints, cooked);
2479 numchecks = numoldchecks;
2490 if (cdef->raw_expr != NULL)
2492 Assert(cdef->cooked_expr == NULL);
2503 Assert(cdef->cooked_expr != NULL);
2515 if (cdef->conname != NULL)
2517 ccname = cdef->conname;
2522 if (strcmp(chkname, ccname) == 0)
2525 errmsg(
"check constraint \"%s\" already exists",
2530 checknames =
lappend(checknames, ccname);
2539 allow_merge, is_local,
2541 cdef->initially_valid,
2542 cdef->is_no_inherit))
2582 checknames =
lappend(checknames, ccname);
2590 cdef->initially_valid, is_local,
2591 is_local ? 0 : 1, cdef->is_no_inherit,
2598 cooked->
conoid = constrOid;
2599 cooked->
name = ccname;
2601 cooked->
expr = expr;
2605 cooked->
inhcount = is_local ? 0 : 1;
2607 cookedConstraints =
lappend(cookedConstraints, cooked);
2613 int16 inhcount = is_local ? 0 : 1;
2620 errcode(ERRCODE_UNDEFINED_COLUMN),
2621 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
2625 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2626 errmsg(
"cannot add not-null constraint on system column \"%s\"",
2629 Assert(cdef->initially_valid != cdef->skip_validation);
2638 is_local, cdef->is_no_inherit,
2639 cdef->skip_validation))
2653 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
2655 nnname = cdef->conname;
2663 nnnames =
lappend(nnnames, nnname);
2667 cdef->initially_valid,
2670 cdef->is_no_inherit);
2674 nncooked->
conoid = constrOid;
2675 nncooked->
name = nnname;
2676 nncooked->
attnum = colnum;
2677 nncooked->
expr = NULL;
2684 cookedConstraints =
lappend(cookedConstraints, nncooked);
2697 return cookedConstraints;
2712 bool allow_merge,
bool is_local,
2714 bool is_initially_valid,
2729 Anum_pg_constraint_conrelid,
2733 Anum_pg_constraint_contypid,
2737 Anum_pg_constraint_conname,
2750 if (con->contype == CONSTRAINT_CHECK)
2756 Anum_pg_constraint_conbin,
2757 conDesc->
rd_att, &isnull);
2773 if (is_local && !con->conislocal && !rel->
rd_rel->relispartition)
2776 if (!found || !allow_merge)
2779 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
2783 if (con->connoinherit)
2785 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2786 errmsg(
"constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"",
2794 if (con->coninhcount > 0 && is_no_inherit)
2796 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2797 errmsg(
"constraint \"%s\" conflicts with inherited constraint on relation \"%s\"",
2804 if (is_initially_valid && con->conenforced && !con->convalidated)
2806 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2807 errmsg(
"constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"",
2815 if ((!is_local && is_enforced && !con->conenforced) ||
2816 (is_local && !is_enforced && con->conenforced))
2818 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2819 errmsg(
"constraint \"%s\" conflicts with NOT ENFORCED constraint on relation \"%s\"",
2824 (
errmsg(
"merging constraint \"%s\" with inherited definition",
2835 if (rel->
rd_rel->relispartition)
2837 con->coninhcount = 1;
2838 con->conislocal =
false;
2843 con->conislocal =
true;
2847 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
2848 errmsg(
"too many inheritance parents"));
2854 con->connoinherit =
true;
2863 if (is_enforced && !con->conenforced)
2866 con->conenforced =
true;
2867 con->convalidated =
true;
2924 for (
int outerpos = 0; outerpos <
list_length(constraints); outerpos++)
2939 errcode(ERRCODE_UNDEFINED_COLUMN),
2940 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
2945 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2946 errmsg(
"cannot add not-null constraint on system column \"%s\"",
2954 for (
int restpos = outerpos + 1; restpos <
list_length(constraints);)
2964 errcode(ERRCODE_SYNTAX_ERROR),
2965 errmsg(
"conflicting NO INHERIT declaration for not-null constraint on column \"%s\"",
2978 errcode(ERRCODE_SYNTAX_ERROR),
2979 errmsg(
"conflicting not-null constraint names \"%s\" and \"%s\"",
3000 if (old->attnum ==
attnum)
3008 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3009 errmsg(
"cannot define not-null constraint with NO INHERIT on column \"%s\"",
3011 errdetail(
"The column has an inherited not-null constraint.")));
3027 if (strcmp(thisname, constr->
conname) == 0)
3030 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
3036 givennames =
lappend(givennames, conname);
3045 nnnames =
lappend(nnnames, conname);
3068 for (
int outerpos = 0; outerpos <
list_length(old_notnulls); outerpos++)
3071 char *conname = NULL;
3081 if (conname == NULL)
3082 conname = cooked->
name;
3084 for (
int restpos = outerpos + 1; restpos <
list_length(old_notnulls);)
3092 if (conname == NULL)
3093 conname = other->
name;
3103 if (conname != NULL)
3107 if (strcmp(thisname, conname) == 0)
3116 if (conname == NULL)
3123 nnnames =
lappend(nnnames, conname);
3127 false, inhcount,
false);
3156 elog(
ERROR,
"cache lookup failed for relation %u",
3160 if (relStruct->relchecks != numchecks)
3162 relStruct->relchecks = numchecks;
3200 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
3201 errmsg(
"cannot use generated column \"%s\" in column generation expression",
3203 errdetail(
"A generated column cannot reference another generated column."),
3208 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
3209 errmsg(
"cannot use whole-row variable in column generation expression"),
3210 errdetail(
"This would cause the generated column to depend on its own value."),
3276 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3277 errmsg(
"generation expression uses user-defined function"),
3278 errdetail(
"Virtual generated columns that make use of user-defined functions are not yet supported."),
3292 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3293 errmsg(
"generation expression uses user-defined type"),
3294 errdetail(
"Virtual generated columns that make use of user-defined types are not yet supported."),
3329 Assert(raw_default != NULL);
3344 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
3345 errmsg(
"generation expression is not immutable")));
3348 if (attgenerated == ATTRIBUTE_GENERATED_VIRTUAL)
3370 atttypid, atttypmod,
3376 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3377 errmsg(
"column \"%s\" is of type %s"
3378 " but default expression is of type %s",
3382 errhint(
"You will need to rewrite or cast the expression.")));
3402 Node *raw_constraint,
3428 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
3429 errmsg(
"only table \"%s\" can be referenced in check constraint",
3451 Anum_pg_statistic_starelid,
3456 true, NULL, 1,
key);
3467 statform->starelid = torelid;
3470 if (indstate == NULL)
3480 if (indstate != NULL)
3503 Anum_pg_statistic_starelid,
3512 Anum_pg_statistic_staattnum,
3570 index_build(heapRelation, currentIndex, indexInfo,
true,
false);
3593 foreach(cell, relids)
3599 relations =
lappend(relations, rel);
3606 foreach(cell, relations)
3636 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
3646 toastrelid = rel->
rd_rel->reltoastrelid;
3686 foreach(cell, relations)
3690 if (rel->
rd_rel->relhastriggers ||
3691 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
3706 if (dependents ==
NIL)
3723 foreach(cell2, dependents)
3734 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3735 errmsg(
"unsupported ON COMMIT and foreign key combination"),
3736 errdetail(
"Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting.",
3740 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3741 errmsg(
"cannot truncate a table referenced in a foreign key constraint"),
3742 errdetail(
"Table \"%s\" references \"%s\".",
3744 errhint(
"Truncate table \"%s\" at the same time, "
3745 "or use TRUNCATE ... CASCADE.",
3799 if (con->contype != CONSTRAINT_FOREIGN)
3814 parent_cons =
lappend_oid(parent_cons, con->conparentid);
3833 foreach(cell, parent_cons)
3838 Anum_pg_constraint_oid,
3843 true, NULL, 1, &
key);
3906 Datum partexprDatum;
3910 bool nulls[Natts_pg_partitioned_table] = {0};
3915 Assert(rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
3932 partexprDatum = (
Datum) 0;
3938 nulls[Anum_pg_partitioned_table_partexprs - 1] =
true;
3947 values[Anum_pg_partitioned_table_partexprs - 1] = partexprDatum;
3959 for (
i = 0;
i < partnatts;
i++)
3966 partcollation[
i] != DEFAULT_COLLATION_OID)
3982 for (
i = 0;
i < partnatts;
i++)
3984 if (partattrs[
i] == 0)
4028 elog(
ERROR,
"cache lookup failed for partition key of relation %u",
4055 Datum new_val[Natts_pg_class];
4056 bool new_null[Natts_pg_class],
4057 new_repl[Natts_pg_class];
4065 elog(
ERROR,
"cache lookup failed for relation %u",
4068#ifdef USE_ASSERT_CHECKING
4074 Assert(!classForm->relispartition);
4082 memset(new_val, 0,
sizeof(new_val));
4083 memset(new_null,
false,
sizeof(new_null));
4084 memset(new_repl,
false,
sizeof(new_repl));
4086 new_null[Anum_pg_class_relpartbound - 1] =
false;
4087 new_repl[Anum_pg_class_relpartbound - 1] =
true;
4089 new_val, new_null, new_repl);
4097 if (rel->
rd_rel->relkind == RELKIND_RELATION && rel->
rd_rel->relhassubclass)
void recordDependencyOnNewAcl(Oid classId, Oid objectId, int32 objsubId, Oid ownerId, Acl *acl)
Acl * get_user_default_acl(ObjectType objtype, Oid ownerId, Oid nsp_oid)
ArrayType * construct_array(Datum *elems, int nelems, Oid elmtype, int elmlen, bool elmbyval, char elmalign)
#define InvalidAttrNumber
static Datum values[MAXATTR]
#define CStringGetTextDatum(s)
#define TextDatumGetCString(d)
TransactionId MultiXactId
#define OidIsValid(objectId)
bool IsToastNamespace(Oid namespaceId)
RelFileNumber GetNewRelFileNumber(Oid reltablespace, Relation pg_class, char relpersistence)
bool IsCatalogNamespace(Oid namespaceId)
bool contain_mutable_functions_after_planning(Expr *expr)
void record_object_address_dependencies(const ObjectAddress *depender, ObjectAddresses *referenced, DependencyType behavior)
void recordDependencyOnSingleRelExpr(const ObjectAddress *depender, Node *expr, Oid relId, DependencyType behavior, DependencyType self_behavior, bool reverse_self)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
void free_object_addresses(ObjectAddresses *addrs)
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)
TupleTableSlot * MakeSingleTupleTableSlot(TupleDesc tupdesc, const TupleTableSlotOps *tts_ops)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
TupleTableSlot * ExecStoreVirtualTuple(TupleTableSlot *slot)
const TupleTableSlotOps TTSOpsHeapTuple
#define OidFunctionCall3(functionId, arg1, arg2, arg3)
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)
Assert(PointerIsAligned(start, uint64))
void RemoveAttributeById(Oid relid, AttrNumber attnum)
void RelationClearMissing(Relation rel)
void SetAttrMissing(Oid relid, char *attname, char *value)
static Oid StoreRelCheck(Relation rel, const char *ccname, Node *expr, bool is_enforced, bool is_validated, bool is_local, int16 inhcount, bool is_no_inherit, bool is_internal)
List * heap_truncate_find_FKs(List *relationIds)
void DeleteSystemAttributeTuples(Oid relid)
void StorePartitionKey(Relation rel, char strategy, int16 partnatts, AttrNumber *partattrs, List *partexprs, Oid *partopclass, Oid *partcollation)
static void StoreConstraints(Relation rel, List *cooked_constraints, bool is_internal)
static void AddNewAttributeTuples(Oid new_rel_oid, TupleDesc tupdesc, char relkind)
void DeleteRelationTuple(Oid relid)
static void RelationTruncateIndexes(Relation heapRelation)
RelFileNumber binary_upgrade_next_heap_pg_class_relfilenumber
static void AddNewRelationTuple(Relation pg_class_desc, Relation new_rel_desc, Oid new_rel_oid, Oid new_type_oid, Oid reloftype, Oid relowner, char relkind, TransactionId relfrozenxid, TransactionId relminmxid, Datum relacl, Datum reloptions)
void DeleteAttributeTuples(Oid relid)
void RemoveStatistics(Oid relid, AttrNumber attnum)
static const FormData_pg_attribute a4
RelFileNumber binary_upgrade_next_toast_pg_class_relfilenumber
static ObjectAddress AddNewRelationType(const char *typeName, Oid typeNamespace, Oid new_rel_oid, char new_rel_kind, Oid ownerid, Oid new_row_type, Oid new_array_type)
static bool contains_user_functions_checker(Oid func_id, void *context)
static const FormData_pg_attribute a1
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)
static bool MergeWithExistingConstraint(Relation rel, const char *ccname, Node *expr, bool allow_merge, bool is_local, bool is_enforced, bool is_initially_valid, bool is_no_inherit)
static const FormData_pg_attribute *const SysAtt[]
static Oid StoreRelNotNull(Relation rel, const char *nnname, AttrNumber attnum, bool is_validated, bool is_local, int inhcount, bool is_no_inherit)
void CheckAttributeType(const char *attname, Oid atttypid, Oid attcollation, List *containing_rowtypes, int flags)
const FormData_pg_attribute * SystemAttributeByName(const char *attname)
void CopyStatistics(Oid fromrelid, Oid torelid)
static void check_virtual_generated_security(ParseState *pstate, Node *node)
void heap_truncate_check_FKs(List *relations, bool tempTables)
static const FormData_pg_attribute a6
static bool check_nested_generated_walker(Node *node, void *context)
static void SetRelationNumChecks(Relation rel, int numchecks)
static const FormData_pg_attribute a3
static void RelationRemoveInheritance(Oid relid)
static const FormData_pg_attribute a2
void StorePartitionBound(Relation rel, Relation parent, PartitionBoundSpec *bound)
List * AddRelationNotNullConstraints(Relation rel, List *constraints, List *old_notnulls)
void heap_drop_with_catalog(Oid relid)
List * AddRelationNewConstraints(Relation rel, List *newColDefaults, List *newConstraints, bool allow_merge, bool is_local, bool is_internal, const char *queryString)
void InsertPgClassTuple(Relation pg_class_desc, Relation new_rel_desc, Oid new_rel_oid, Datum relacl, Datum reloptions)
static bool check_virtual_generated_security_walker(Node *node, void *context)
void CheckAttributeNamesTypes(TupleDesc tupdesc, char relkind, int flags)
static void check_nested_generated(ParseState *pstate, Node *node)
Oid binary_upgrade_next_toast_pg_class_oid
void InsertPgAttributeTuples(Relation pg_attribute_rel, TupleDesc tupdesc, Oid new_rel_oid, const FormExtraData_pg_attribute tupdesc_extra[], CatalogIndexState indstate)
Node * cookDefault(ParseState *pstate, Node *raw_default, Oid atttypid, int32 atttypmod, const char *attname, char attgenerated)
void heap_truncate_one_rel(Relation rel)
void RemovePartitionKeyByRelId(Oid relid)
Oid binary_upgrade_next_heap_pg_class_oid
const FormData_pg_attribute * SystemAttributeDefinition(AttrNumber attno)
static const FormData_pg_attribute a5
void StoreAttrMissingVal(Relation rel, AttrNumber attnum, Datum missingval)
Relation heap_create(const char *relname, Oid relnamespace, Oid reltablespace, Oid relid, RelFileNumber relfilenumber, Oid accessmtd, TupleDesc tupDesc, char relkind, char relpersistence, bool shared_relation, bool mapped_relation, bool allow_system_table_mods, TransactionId *relfrozenxid, MultiXactId *relminmxid, bool create_storage)
static Node * cookConstraint(ParseState *pstate, Node *raw_constraint, char *relname)
#define CHKATYPE_ANYRECORD
#define CHKATYPE_ANYARRAY
#define CHKATYPE_IS_VIRTUAL
#define CHKATYPE_IS_PARTKEY
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_copytuple(HeapTuple tuple)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
#define MaxHeapAttributeNumber
static Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
IndexInfo * BuildDummyIndexInfo(Relation index)
void index_build(Relation heapRelation, Relation indexRelation, IndexInfo *indexInfo, bool isreindex, bool parallel)
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
void CatalogTuplesMultiInsertWithInfo(Relation heapRel, TupleTableSlot **slot, int ntuples, CatalogIndexState indstate)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
void CatalogTupleInsertWithInfo(Relation heapRel, HeapTuple tup, CatalogIndexState indstate)
void CatalogCloseIndexes(CatalogIndexState indstate)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
void CatalogTupleDelete(Relation heapRel, const ItemPointerData *tid)
#define MAX_CATALOG_MULTI_INSERT_BYTES
int2vector * buildint2vector(const int16 *int2s, int n)
static bool pg_add_s16_overflow(int16 a, int16 b, int16 *result)
void CacheInvalidateRelcache(Relation relation)
void CacheInvalidateRelcacheByRelid(Oid relid)
struct ItemPointerData ItemPointerData
List * lappend(List *list, void *datum)
void list_sort(List *list, list_sort_comparator cmp)
List * list_delete_nth_cell(List *list, int n)
List * list_copy(const List *oldlist)
List * lappend_int(List *list, int datum)
List * lappend_oid(List *list, Oid datum)
List * list_append_unique_oid(List *list, Oid datum)
void list_deduplicate_oid(List *list)
int list_oid_cmp(const ListCell *p1, const ListCell *p2)
List * list_delete_last(List *list)
void list_free(List *list)
bool list_member_oid(const List *list, Oid datum)
List * list_union(const List *list1, const List *list2)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
#define AccessExclusiveLock
Oid get_range_subtype(Oid rangeOid)
char * get_rel_name(Oid relid)
AttrNumber get_attnum(Oid relid, const char *attname)
Oid get_element_type(Oid typid)
char get_attgenerated(Oid relid, AttrNumber attnum)
char * get_attname(Oid relid, AttrNumber attnum, bool missing_ok)
Oid get_range_collation(Oid rangeOid)
bool type_is_collatable(Oid typid)
Oid get_typ_typrelid(Oid typid)
char get_typtype(Oid typid)
Oid getBaseType(Oid typid)
char * get_namespace_name(Oid nspid)
Oid get_relname_relid(const char *relname, Oid relnamespace)
char * pstrdup(const char *in)
void pfree(void *pointer)
#define IsBootstrapProcessingMode()
#define IsNormalProcessingMode()
#define InvalidMultiXactId
void namestrcpy(Name name, const char *str)
Oid exprType(const Node *expr)
bool check_functions_in_node(Node *node, check_function_callback checker, void *context)
int exprLocation(const Node *expr)
#define expression_tree_walker(n, w, c)
#define IsA(nodeptr, _type_)
#define castNode(_type_, nodeptr)
#define InvokeObjectPostCreateHookArg(classId, objectId, subId, is_internal)
#define ObjectAddressSet(addr, class_id, object_id)
#define ObjectAddressSubSet(addr, class_id, object_id, object_sub_id)
oidvector * buildoidvector(const Oid *oids, int n)
char * nodeToString(const void *obj)
Node * coerce_to_boolean(ParseState *pstate, Node *node, const char *constructName)
Node * coerce_to_target_type(ParseState *pstate, Node *expr, Oid exprtype, Oid targettype, int32 targettypmod, CoercionContext ccontext, CoercionForm cformat, int location)
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_COLUMN_DEFAULT
@ EXPR_KIND_GENERATED_COLUMN
@ EXPR_KIND_CHECK_CONSTRAINT
ParseNamespaceItem * addRangeTableEntryForRelation(ParseState *pstate, Relation rel, int lockmode, Alias *alias, bool inh, bool inFromCl)
void addNSItemToQuery(ParseState *pstate, ParseNamespaceItem *nsitem, bool addToJoinList, bool addToRelNameSpace, bool addToVarNameSpace)
#define rt_fetch(rangetable_index, rangetable)
PartitionDesc RelationGetPartitionDesc(Relation rel, bool omit_detached)
Oid get_default_oid_from_partdesc(PartitionDesc partdesc)
void update_default_partition_oid(Oid parentId, Oid defaultPartId)
Oid get_default_partition_oid(Oid parentId)
Oid get_partition_parent(Oid relid, bool even_if_detached)
Oid StoreAttrDefault(Relation rel, AttrNumber attnum, Node *expr, bool is_internal)
FormData_pg_attribute * Form_pg_attribute
FormData_pg_class * Form_pg_class
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)
bool ConstraintNameIsUsed(ConstraintCategory conCat, Oid objId, const char *conname)
char * ChooseConstraintName(const char *name1, const char *name2, const char *label, Oid namespaceid, List *others)
bool AdjustNotNullInheritance(Oid relid, AttrNumber attnum, bool is_local, bool is_no_inherit, bool is_notvalid)
FormData_pg_constraint * Form_pg_constraint
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
void recordDependencyOnCurrentExtension(const ObjectAddress *object, bool isReplace)
static int list_length(const List *l)
#define foreach_delete_current(lst, var_or_cell)
#define list_make1_oid(x1)
#define foreach_ptr(type, var, lst)
static void * list_nth(const List *list, int n)
#define foreach_node(type, var, lst)
#define list_nth_node(type, list, n)
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
void recordDependencyOnTablespace(Oid classId, Oid objectId, Oid tablespace)
FormData_pg_statistic * Form_pg_statistic
void RemoveSubscriptionRel(Oid subid, Oid relid)
ObjectAddress TypeCreate(Oid newTypeOid, const char *typeName, Oid typeNamespace, Oid relationOid, char relationKind, Oid ownerId, int16 internalSize, char typeType, char typeCategory, bool typePreferred, char typDelim, Oid inputProcedure, Oid outputProcedure, Oid receiveProcedure, Oid sendProcedure, Oid typmodinProcedure, Oid typmodoutProcedure, Oid analyzeProcedure, Oid subscriptProcedure, Oid elementType, bool isImplicitArray, Oid arrayType, Oid baseType, const char *defaultTypeValue, char *defaultTypeBin, bool passedByValue, char alignment, char storage, int32 typeMod, int32 typNDims, bool typeNotNull, Oid typeCollation)
bool moveArrayTypeName(Oid typeOid, const char *typeName, Oid typeNamespace)
char * makeArrayTypeName(const char *typeName, Oid typeNamespace)
void pgstat_create_relation(Relation rel)
void pgstat_drop_relation(Relation rel)
static Datum PointerGetDatum(const void *X)
static Datum Float4GetDatum(float4 X)
static Datum TransactionIdGetDatum(TransactionId X)
static Datum Int16GetDatum(int16 X)
static Datum MultiXactIdGetDatum(MultiXactId X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static Datum NameGetDatum(const NameData *X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
static Datum CharGetDatum(char X)
void CheckTableForSerializableConflictIn(Relation relation)
void * stringToNode(const char *str)
#define RelationGetRelid(relation)
#define RelationGetDescr(relation)
#define RelationGetNumberOfAttributes(relation)
#define RelationGetRelationName(relation)
#define RelationGetNamespace(relation)
List * RelationGetIndexList(Relation relation)
void RelationForgetRelation(Oid rid)
Relation RelationBuildLocalRelation(const char *relname, Oid relnamespace, TupleDesc tupDesc, Oid relid, Oid accessmtd, RelFileNumber relfilenumber, Oid reltablespace, bool shared_relation, bool mapped_relation, char relpersistence, char relkind)
#define InvalidRelFileNumber
#define RelFileNumberIsValid(relnumber)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
void check_stack_depth(void)
SMgrRelation RelationCreateStorage(RelFileLocator rlocator, char relpersistence, bool register_delete)
void RelationDropStorage(Relation rel)
void RelationTruncate(Relation rel, BlockNumber nblocks)
#define BTEqualStrategyNumber
#define BTLessEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
const char * p_sourcetext
RelFileLocator rd_locator
#define MinTransactionIdAttributeNumber
#define MaxCommandIdAttributeNumber
#define MaxTransactionIdAttributeNumber
#define TableOidAttributeNumber
#define SelfItemPointerAttributeNumber
#define MinCommandIdAttributeNumber
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
Datum SysCacheGetAttr(int cacheId, HeapTuple tup, AttrNumber attributeNumber, bool *isNull)
HeapTuple SearchSysCache2(int cacheId, Datum key1, Datum key2)
HeapTuple SearchSysCacheAttName(Oid relid, const char *attname)
#define SearchSysCacheCopy1(cacheId, key1)
#define SearchSysCacheCopy2(cacheId, key1, key2)
#define GetSysCacheOid2(cacheId, oidcol, key1, key2)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
static void table_relation_set_new_filelocator(Relation rel, const RelFileLocator *newrlocator, char persistence, TransactionId *freezeXid, MultiXactId *minmulti)
static void table_relation_nontransactional_truncate(Relation rel)
void CheckTableNotInUse(Relation rel, const char *stmt)
void remove_on_commit_action(Oid relid)
void register_on_commit_action(Oid relid, OnCommitAction action)
#define FirstUnpinnedObjectId
#define InvalidTransactionId
void FreeTupleDesc(TupleDesc tupdesc)
TupleDesc CreateTupleDesc(int natts, Form_pg_attribute *attrs)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
static TupleTableSlot * ExecClearTuple(TupleTableSlot *slot)
Oid AssignTypeArrayOid(void)
bool contain_var_clause(Node *node)
List * pull_var_clause(Node *node, int flags)
void CommandCounterIncrement(void)