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)
675 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
677 errmsg(
"no collation was derived for partition key column %s with collatable type %s",
679 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
682 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
683 errmsg(
"no collation was derived for column \"%s\" with collatable type %s",
685 errhint(
"Use the COLLATE clause to set the collation explicitly.")));
719 bool close_index =
false;
727 for (
int i = 0;
i < nslots;
i++)
730 while (natts < tupdesc->natts)
737 memset(slot[slotCount]->tts_isnull,
false,
738 slot[slotCount]->tts_tupleDescriptor->natts *
sizeof(
bool));
774 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attstattarget - 1] =
true;
775 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attoptions - 1] =
true;
781 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attacl - 1] =
true;
782 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attfdwoptions - 1] =
true;
783 slot[slotCount]->
tts_isnull[Anum_pg_attribute_attmissingval - 1] =
true;
792 if (slotCount == nslots || natts == tupdesc->
natts - 1)
812 for (
int i = 0;
i < nslots;
i++)
831 int natts = tupdesc->
natts;
845 for (
int i = 0;
i < natts;
i++)
856 attr->attcollation != DEFAULT_COLLATION_OID)
869 if (relkind != RELKIND_VIEW && relkind != RELKIND_COMPOSITE_TYPE)
909 bool nulls[Natts_pg_class];
914 memset(nulls,
false,
sizeof(nulls));
939 values[Anum_pg_class_relforcerowsecurity - 1] =
BoolGetDatum(rd_rel->relforcerowsecurity);
947 if (relacl != (
Datum) 0)
948 values[Anum_pg_class_relacl - 1] = relacl;
950 nulls[Anum_pg_class_relacl - 1] =
true;
951 if (reloptions != (
Datum) 0)
952 values[Anum_pg_class_reloptions - 1] = reloptions;
954 nulls[Anum_pg_class_reloptions - 1] =
true;
957 nulls[Anum_pg_class_relpartbound - 1] =
true;
993 new_rel_reltup = new_rel_desc->
rd_rel;
996 new_rel_reltup->relpages = 0;
997 new_rel_reltup->reltuples = -1;
998 new_rel_reltup->relallvisible = 0;
999 new_rel_reltup->relallfrozen = 0;
1002 if (relkind == RELKIND_SEQUENCE)
1004 new_rel_reltup->relpages = 1;
1005 new_rel_reltup->reltuples = 1;
1008 new_rel_reltup->relfrozenxid = relfrozenxid;
1009 new_rel_reltup->relminmxid = relminmxid;
1010 new_rel_reltup->relowner = relowner;
1011 new_rel_reltup->reltype = new_type_oid;
1012 new_rel_reltup->reloftype = reloftype;
1015 new_rel_reltup->relispartition =
false;
1018 new_rel_desc->
rd_att->
tdtypeid = new_type_oid ? new_type_oid : RECORDOID;
1023 relacl, reloptions);
1051 TYPCATEGORY_COMPOSITE,
1070 TYPSTORAGE_EXTENDED,
1121 List *cooked_constraints,
1123 char relpersistence,
1124 bool shared_relation,
1125 bool mapped_relation,
1129 bool allow_system_table_mods,
1168 (
errcode(ERRCODE_DUPLICATE_TABLE),
1186 errhint(
"A relation has an associated type of the same name, "
1187 "so you must use a name that doesn't conflict "
1188 "with any existing type.")));
1194 if (shared_relation && reltablespace != GLOBALTABLESPACE_OID)
1195 elog(
ERROR,
"shared relations must be placed in pg_global tablespace");
1212 Assert(relkind != RELKIND_INDEX);
1213 Assert(relkind != RELKIND_PARTITIONED_INDEX);
1215 if (relkind == RELKIND_TOASTVALUE)
1225 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1226 errmsg(
"toast relfilenumber value not set when in binary upgrade mode")));
1236 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1237 errmsg(
"pg_class heap OID value not set when in binary upgrade mode")));
1242 if (RELKIND_HAS_STORAGE(relkind))
1246 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
1247 errmsg(
"relfilenumber value not set when in binary upgrade mode")));
1274 case RELKIND_RELATION:
1276 case RELKIND_MATVIEW:
1277 case RELKIND_FOREIGN_TABLE:
1278 case RELKIND_PARTITIONED_TABLE:
1282 case RELKIND_SEQUENCE:
1314 allow_system_table_mods,
1321 new_rel_desc->
rd_rel->relrewrite = relrewrite;
1328 if (!(relkind == RELKIND_SEQUENCE ||
1329 relkind == RELKIND_TOASTVALUE ||
1330 relkind == RELKIND_INDEX ||
1331 relkind == RELKIND_PARTITIONED_INDEX))
1359 new_type_oid = new_type_addr.
objectId;
1361 *typaddress = new_type_addr;
1384 F_ARRAY_SUBSCRIPT_HANDLER,
1393 TYPSTORAGE_EXTENDED,
1399 pfree(relarrayname);
1405 Assert(typaddress == NULL);
1449 if (relkind != RELKIND_COMPOSITE_TYPE &&
1450 relkind != RELKIND_TOASTVALUE &&
1484 if ((RELKIND_HAS_TABLE_AM(relkind) && relkind != RELKIND_TOASTVALUE) ||
1485 (relkind == RELKIND_PARTITIONED_TABLE &&
OidIsValid(accessmtd)))
1543 Anum_pg_inherits_inhrelid,
1576 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1607 Anum_pg_attribute_attrelid,
1644 Anum_pg_attribute_attrelid,
1648 Anum_pg_attribute_attnum,
1680 Datum valuesAtt[Natts_pg_attribute] = {0};
1681 bool nullsAtt[Natts_pg_attribute] = {0};
1682 bool replacesAtt[Natts_pg_attribute] = {0};
1698 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
1703 attStruct->attisdropped =
true;
1716 attStruct->attnotnull =
false;
1719 attStruct->attgenerated =
'\0';
1724 snprintf(newattname,
sizeof(newattname),
1725 "........pg.dropped.%d........",
attnum);
1726 namestrcpy(&(attStruct->attname), newattname);
1729 attStruct->atthasmissing =
false;
1730 nullsAtt[Anum_pg_attribute_attmissingval - 1] =
true;
1731 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
1737 nullsAtt[Anum_pg_attribute_attstattarget - 1] =
true;
1738 replacesAtt[Anum_pg_attribute_attstattarget - 1] =
true;
1739 nullsAtt[Anum_pg_attribute_attacl - 1] =
true;
1740 replacesAtt[Anum_pg_attribute_attacl - 1] =
true;
1741 nullsAtt[Anum_pg_attribute_attoptions - 1] =
true;
1742 replacesAtt[Anum_pg_attribute_attoptions - 1] =
true;
1743 nullsAtt[Anum_pg_attribute_attfdwoptions - 1] =
true;
1744 replacesAtt[Anum_pg_attribute_attfdwoptions - 1] =
true;
1747 valuesAtt, nullsAtt, replacesAtt);
1793 elog(
ERROR,
"cache lookup failed for relation %u", relid);
1809 if (
OidIsValid(defaultPartOid) && relid != defaultPartOid)
1838 if (rel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
1847 elog(
ERROR,
"cache lookup failed for foreign table %u", relid);
1858 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
1865 if (relid == defaultPartOid)
1871 if (RELKIND_HAS_STORAGE(rel->
rd_rel->relkind))
1930 if (
OidIsValid(defaultPartOid) && relid != defaultPartOid)
1960 Datum repl_val[Natts_pg_attribute];
1961 bool repl_null[Natts_pg_attribute];
1962 bool repl_repl[Natts_pg_attribute];
1967 memset(repl_val, 0,
sizeof(repl_val));
1968 memset(repl_null,
false,
sizeof(repl_null));
1969 memset(repl_repl,
false,
sizeof(repl_repl));
1971 repl_val[Anum_pg_attribute_atthasmissing - 1] =
BoolGetDatum(
false);
1972 repl_null[Anum_pg_attribute_attmissingval - 1] =
true;
1974 repl_repl[Anum_pg_attribute_atthasmissing - 1] =
true;
1975 repl_repl[Anum_pg_attribute_attmissingval - 1] =
true;
1988 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
1994 if (attrtuple->atthasmissing)
1997 repl_val, repl_null, repl_repl);
2022 Datum valuesAtt[Natts_pg_attribute] = {0};
2023 bool nullsAtt[Natts_pg_attribute] = {0};
2024 bool replacesAtt[Natts_pg_attribute] = {0};
2040 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
2047 attStruct->atttypid,
2049 attStruct->attbyval,
2050 attStruct->attalign));
2053 valuesAtt[Anum_pg_attribute_atthasmissing - 1] =
BoolGetDatum(
true);
2054 replacesAtt[Anum_pg_attribute_atthasmissing - 1] =
true;
2056 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
2057 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
2060 valuesAtt, nullsAtt, replacesAtt);
2078 Datum valuesAtt[Natts_pg_attribute] = {0};
2079 bool nullsAtt[Natts_pg_attribute] = {0};
2080 bool replacesAtt[Natts_pg_attribute] = {0};
2092 if (tablerel->
rd_rel->relkind != RELKIND_RELATION)
2102 elog(
ERROR,
"cache lookup failed for attribute %s of relation %u",
2113 valuesAtt[Anum_pg_attribute_atthasmissing - 1] =
BoolGetDatum(
true);
2114 replacesAtt[Anum_pg_attribute_atthasmissing - 1] =
true;
2115 valuesAtt[Anum_pg_attribute_attmissingval - 1] = missingval;
2116 replacesAtt[Anum_pg_attribute_attmissingval - 1] =
true;
2119 valuesAtt, nullsAtt, replacesAtt);
2138 bool is_enforced,
bool is_validated,
bool is_local,
2139 int16 inhcount,
bool is_no_inherit,
bool is_internal)
2168 foreach(vl, varList)
2173 for (
j = 0;
j <
i;
j++)
2188 if (is_no_inherit &&
2189 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
2191 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
2192 errmsg(
"cannot add NO INHERIT constraint to partitioned table \"%s\"",
2245 bool is_validated,
bool is_local,
int inhcount,
2305 if (cooked_constraints ==
NIL)
2315 foreach(lc, cooked_constraints)
2335 elog(
ERROR,
"unrecognized constraint type: %d",
2376 List *newColDefaults,
2377 List *newConstraints,
2381 const char *queryString)
2383 List *cookedConstraints =
NIL;
2399 oldconstr = tupleDesc->
constr;
2428 atp->atttypid, atp->atttypmod,
2445 (!colDef->generated &&
2455 cooked->
name = NULL;
2456 cooked->
attnum = colDef->attnum;
2457 cooked->
expr = expr;
2461 cooked->
inhcount = is_local ? 0 : 1;
2463 cookedConstraints =
lappend(cookedConstraints, cooked);
2469 numchecks = numoldchecks;
2480 if (cdef->raw_expr != NULL)
2482 Assert(cdef->cooked_expr == NULL);
2493 Assert(cdef->cooked_expr != NULL);
2505 if (cdef->conname != NULL)
2507 ccname = cdef->conname;
2512 if (strcmp(chkname, ccname) == 0)
2515 errmsg(
"check constraint \"%s\" already exists",
2520 checknames =
lappend(checknames, ccname);
2529 allow_merge, is_local,
2531 cdef->initially_valid,
2532 cdef->is_no_inherit))
2572 checknames =
lappend(checknames, ccname);
2580 cdef->initially_valid, is_local,
2581 is_local ? 0 : 1, cdef->is_no_inherit,
2588 cooked->
conoid = constrOid;
2589 cooked->
name = ccname;
2591 cooked->
expr = expr;
2595 cooked->
inhcount = is_local ? 0 : 1;
2597 cookedConstraints =
lappend(cookedConstraints, cooked);
2603 int16 inhcount = is_local ? 0 : 1;
2610 errcode(ERRCODE_UNDEFINED_COLUMN),
2611 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
2615 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2616 errmsg(
"cannot add not-null constraint on system column \"%s\"",
2619 Assert(cdef->initially_valid != cdef->skip_validation);
2628 is_local, cdef->is_no_inherit,
2629 cdef->skip_validation))
2643 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
2645 nnname = cdef->conname;
2653 nnnames =
lappend(nnnames, nnname);
2657 cdef->initially_valid,
2660 cdef->is_no_inherit);
2664 nncooked->
conoid = constrOid;
2665 nncooked->
name = nnname;
2666 nncooked->
attnum = colnum;
2667 nncooked->
expr = NULL;
2674 cookedConstraints =
lappend(cookedConstraints, nncooked);
2687 return cookedConstraints;
2702 bool allow_merge,
bool is_local,
2704 bool is_initially_valid,
2719 Anum_pg_constraint_conrelid,
2723 Anum_pg_constraint_contypid,
2727 Anum_pg_constraint_conname,
2740 if (con->contype == CONSTRAINT_CHECK)
2746 Anum_pg_constraint_conbin,
2747 conDesc->
rd_att, &isnull);
2763 if (is_local && !con->conislocal && !rel->
rd_rel->relispartition)
2766 if (!found || !allow_merge)
2769 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
2773 if (con->connoinherit)
2775 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2776 errmsg(
"constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"",
2784 if (con->coninhcount > 0 && is_no_inherit)
2786 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2787 errmsg(
"constraint \"%s\" conflicts with inherited constraint on relation \"%s\"",
2794 if (is_initially_valid && con->conenforced && !con->convalidated)
2796 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2797 errmsg(
"constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"",
2805 if ((!is_local && is_enforced && !con->conenforced) ||
2806 (is_local && !is_enforced && con->conenforced))
2808 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2809 errmsg(
"constraint \"%s\" conflicts with NOT ENFORCED constraint on relation \"%s\"",
2814 (
errmsg(
"merging constraint \"%s\" with inherited definition",
2825 if (rel->
rd_rel->relispartition)
2827 con->coninhcount = 1;
2828 con->conislocal =
false;
2833 con->conislocal =
true;
2837 errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
2838 errmsg(
"too many inheritance parents"));
2844 con->connoinherit =
true;
2853 if (is_enforced && !con->conenforced)
2856 con->conenforced =
true;
2857 con->convalidated =
true;
2914 for (
int outerpos = 0; outerpos <
list_length(constraints); outerpos++)
2929 errcode(ERRCODE_UNDEFINED_COLUMN),
2930 errmsg(
"column \"%s\" of relation \"%s\" does not exist",
2935 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2936 errmsg(
"cannot add not-null constraint on system column \"%s\"",
2944 for (
int restpos = outerpos + 1; restpos <
list_length(constraints);)
2954 errcode(ERRCODE_SYNTAX_ERROR),
2955 errmsg(
"conflicting NO INHERIT declaration for not-null constraint on column \"%s\"",
2968 errcode(ERRCODE_SYNTAX_ERROR),
2969 errmsg(
"conflicting not-null constraint names \"%s\" and \"%s\"",
2990 if (old->attnum ==
attnum)
2998 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2999 errmsg(
"cannot define not-null constraint on column \"%s\" with NO INHERIT",
3001 errdetail(
"The column has an inherited not-null constraint.")));
3017 if (strcmp(thisname, constr->
conname) == 0)
3020 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
3026 givennames =
lappend(givennames, conname);
3035 nnnames =
lappend(nnnames, conname);
3058 for (
int outerpos = 0; outerpos <
list_length(old_notnulls); outerpos++)
3061 char *conname = NULL;
3071 if (conname == NULL)
3072 conname = cooked->
name;
3074 for (
int restpos = outerpos + 1; restpos <
list_length(old_notnulls);)
3082 if (conname == NULL)
3083 conname = other->
name;
3093 if (conname != NULL)
3097 if (strcmp(thisname, conname) == 0)
3106 if (conname == NULL)
3113 nnnames =
lappend(nnnames, conname);
3117 false, inhcount,
false);
3146 elog(
ERROR,
"cache lookup failed for relation %u",
3150 if (relStruct->relchecks != numchecks)
3152 relStruct->relchecks = numchecks;
3190 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
3191 errmsg(
"cannot use generated column \"%s\" in column generation expression",
3193 errdetail(
"A generated column cannot reference another generated column."),
3198 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
3199 errmsg(
"cannot use whole-row variable in column generation expression"),
3200 errdetail(
"This would cause the generated column to depend on its own value."),
3239 Assert(raw_default != NULL);
3254 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
3255 errmsg(
"generation expression is not immutable")));
3276 atttypid, atttypmod,
3282 (
errcode(ERRCODE_DATATYPE_MISMATCH),
3283 errmsg(
"column \"%s\" is of type %s"
3284 " but default expression is of type %s",
3288 errhint(
"You will need to rewrite or cast the expression.")));
3308 Node *raw_constraint,
3334 (
errcode(ERRCODE_INVALID_COLUMN_REFERENCE),
3335 errmsg(
"only table \"%s\" can be referenced in check constraint",
3357 Anum_pg_statistic_starelid,
3362 true, NULL, 1,
key);
3373 statform->starelid = torelid;
3376 if (indstate == NULL)
3386 if (indstate != NULL)
3409 Anum_pg_statistic_starelid,
3418 Anum_pg_statistic_staattnum,
3476 index_build(heapRelation, currentIndex, indexInfo,
true,
false);
3499 foreach(cell, relids)
3505 relations =
lappend(relations, rel);
3512 foreach(cell, relations)
3542 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
3552 toastrelid = rel->
rd_rel->reltoastrelid;
3592 foreach(cell, relations)
3596 if (rel->
rd_rel->relhastriggers ||
3597 rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
3612 if (dependents ==
NIL)
3629 foreach(cell2, dependents)
3640 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3641 errmsg(
"unsupported ON COMMIT and foreign key combination"),
3642 errdetail(
"Table \"%s\" references \"%s\", but they do not have the same ON COMMIT setting.",
3646 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3647 errmsg(
"cannot truncate a table referenced in a foreign key constraint"),
3648 errdetail(
"Table \"%s\" references \"%s\".",
3650 errhint(
"Truncate table \"%s\" at the same time, "
3651 "or use TRUNCATE ... CASCADE.",
3705 if (con->contype != CONSTRAINT_FOREIGN)
3720 parent_cons =
lappend_oid(parent_cons, con->conparentid);
3739 foreach(cell, parent_cons)
3744 Anum_pg_constraint_oid,
3749 true, NULL, 1, &
key);
3812 Datum partexprDatum;
3816 bool nulls[Natts_pg_partitioned_table] = {0};
3821 Assert(rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE);
3838 partexprDatum = (
Datum) 0;
3844 nulls[Anum_pg_partitioned_table_partexprs - 1] =
true;
3853 values[Anum_pg_partitioned_table_partexprs - 1] = partexprDatum;
3865 for (
i = 0;
i < partnatts;
i++)
3872 partcollation[
i] != DEFAULT_COLLATION_OID)
3888 for (
i = 0;
i < partnatts;
i++)
3890 if (partattrs[
i] == 0)
3934 elog(
ERROR,
"cache lookup failed for partition key of relation %u",
3961 Datum new_val[Natts_pg_class];
3962 bool new_null[Natts_pg_class],
3963 new_repl[Natts_pg_class];
3971 elog(
ERROR,
"cache lookup failed for relation %u",
3974#ifdef USE_ASSERT_CHECKING
3980 Assert(!classForm->relispartition);
3988 memset(new_val, 0,
sizeof(new_val));
3989 memset(new_null,
false,
sizeof(new_null));
3990 memset(new_repl,
false,
sizeof(new_repl));
3992 new_null[Anum_pg_class_relpartbound - 1] =
false;
3993 new_repl[Anum_pg_class_relpartbound - 1] =
true;
3995 new_val, new_null, new_repl);
4003 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 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)
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)
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 CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogTuplesMultiInsertWithInfo(Relation heapRel, TupleTableSlot **slot, int ntuples, CatalogIndexState indstate)
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, ItemPointer 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)
#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 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)