73#include "utils/fmgroids.h"
105 const List *indexColNames,
107 const Oid *collationIds,
108 const Oid *opclassIds);
110 int numatts,
Oid indexoid);
115 const Oid *collationOids,
116 const Oid *opclassOids,
117 const int16 *coloptions,
161 foreach(indexoidscan, indexoidlist)
168 elog(
ERROR,
"cache lookup failed for index %u", indexoid);
215 if ((is_alter_table || heapRel->
rd_rel->relispartition) &&
219 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
220 errmsg(
"multiple primary keys for table \"%s\" are not allowed",
233 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
234 errmsg(
"primary keys cannot use NULLS NOT DISTINCT indexes")));
250 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
251 errmsg(
"primary keys cannot be expressions")));
261 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
265 if (!attform->attnotnull)
267 (
errcode(ERRCODE_INVALID_TABLE_DEFINITION),
268 errmsg(
"primary key column \"%s\" is not marked NOT NULL",
283 const List *indexColNames,
285 const Oid *collationIds,
286 const Oid *opclassIds)
313 for (
i = 0;
i < numatts;
i++)
324 to->attislocal =
true;
325 to->attcollation = (
i < numkeyatts) ? collationIds[
i] :
InvalidOid;
330 if (colnames_item == NULL)
331 elog(
ERROR,
"too few entries in colnames list");
333 colnames_item =
lnext(indexColNames, colnames_item);
348 elog(
ERROR,
"invalid column number %d", atnum);
352 to->atttypid = from->atttypid;
353 to->attlen = from->attlen;
354 to->attndims = from->attndims;
355 to->atttypmod = from->atttypmod;
356 to->attbyval = from->attbyval;
357 to->attalign = from->attalign;
358 to->attstorage = from->attstorage;
359 to->attcompression = from->attcompression;
366 if (indexpr_item == NULL)
367 elog(
ERROR,
"too few entries in indexprs list");
377 elog(
ERROR,
"cache lookup failed for type %u", keyType);
383 to->atttypid = keyType;
384 to->attlen = typeTup->typlen;
386 to->attbyval = typeTup->typbyval;
387 to->attalign = typeTup->typalign;
388 to->attstorage = typeTup->typstorage;
411 to->atttypid, to->attcollation,
429 if (i < indexInfo->ii_NumIndexKeyAttrs)
433 elog(
ERROR,
"cache lookup failed for opclass %u", opclassIds[
i]);
436 keyType = opclassTup->opckeytype;
447 if (keyType == ANYELEMENTOID && opclassTup->opcintype == ANYARRAYOID)
451 elog(
ERROR,
"could not get element type of array type %u",
462 if (
OidIsValid(keyType) && keyType != to->atttypid)
466 elog(
ERROR,
"cache lookup failed for type %u", keyType);
469 to->atttypid = keyType;
471 to->attlen = typeTup->typlen;
472 to->attbyval = typeTup->typbyval;
473 to->attalign = typeTup->typalign;
474 to->attstorage = typeTup->typstorage;
503 for (
i = 0;
i < numatts;
i += 1)
567 const Oid *collationOids,
568 const Oid *opclassOids,
569 const int16 *coloptions,
583 bool nulls[Natts_pg_index] = {0};
611 exprsDatum = (
Datum) 0;
626 predDatum = (
Datum) 0;
656 values[Anum_pg_index_indexprs - 1] = exprsDatum;
657 if (exprsDatum == (
Datum) 0)
658 nulls[Anum_pg_index_indexprs - 1] =
true;
659 values[Anum_pg_index_indpred - 1] = predDatum;
660 if (predDatum == (
Datum) 0)
661 nulls[Anum_pg_index_indpred - 1] =
true;
727 const char *indexRelationName,
729 Oid parentIndexRelid,
730 Oid parentConstraintId,
733 const List *indexColNames,
736 const Oid *collationIds,
737 const Oid *opclassIds,
738 const Datum *opclassOptions,
739 const int16 *coloptions,
744 bool allow_system_table_mods,
752 bool shared_relation;
753 bool mapped_relation;
768 Assert((constr_flags == 0) ||
773 relkind = partitioned ? RELKIND_PARTITIONED_INDEX : RELKIND_INDEX;
785 shared_relation = heapRelation->
rd_rel->relisshared;
787 relpersistence = heapRelation->
rd_rel->relpersistence;
793 elog(
ERROR,
"must index at least one column");
795 if (!allow_system_table_mods &&
799 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
800 errmsg(
"user-defined indexes on system catalog tables are not supported")));
823 Oid collation = collationIds[
i];
824 Oid opclass = opclassIds[
i];
828 if ((opclass == TEXT_BTREE_PATTERN_OPS_OID ||
829 opclass == VARCHAR_BTREE_PATTERN_OPS_OID ||
830 opclass == BPCHAR_BTREE_PATTERN_OPS_OID) &&
837 elog(
ERROR,
"cache lookup failed for operator class %u", opclass);
839 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
840 errmsg(
"nondeterministic collations are not supported for operator class \"%s\"",
854 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
855 errmsg(
"concurrent index creation on system catalog tables is not supported")));
861 if (concurrent && is_exclusion)
863 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
864 errmsg(
"concurrent index creation for exclusion constraints is not supported")));
872 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
873 errmsg(
"shared indexes cannot be created after initdb")));
878 if (shared_relation && tableSpaceId != GLOBALTABLESPACE_OID)
879 elog(
ERROR,
"shared relations must be placed in pg_global tablespace");
892 (
errcode(ERRCODE_DUPLICATE_TABLE),
893 errmsg(
"relation \"%s\" already exists, skipping",
894 indexRelationName)));
900 (
errcode(ERRCODE_DUPLICATE_TABLE),
901 errmsg(
"relation \"%s\" already exists",
902 indexRelationName)));
915 errmsg(
"constraint \"%s\" for relation \"%s\" already exists",
942 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
943 errmsg(
"pg_class index OID value not set when in binary upgrade mode")));
949 if ((relkind == RELKIND_INDEX) &&
952 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
953 errmsg(
"index relfilenumber value not set when in binary upgrade mode")));
987 allow_system_table_mods,
1009 indexRelation->
rd_rel->relowner = heapRelation->
rd_rel->relowner;
1010 indexRelation->
rd_rel->relam = accessMethodId;
1047 collationIds, opclassIds, coloptions,
1048 isprimary, is_exclusion,
1091 char constraintType;
1095 constraintType = CONSTRAINT_PRIMARY;
1097 constraintType = CONSTRAINT_UNIQUE;
1098 else if (is_exclusion)
1099 constraintType = CONSTRAINT_EXCLUSION;
1102 elog(
ERROR,
"constraint must be PRIMARY, UNIQUE or EXCLUDE");
1113 allow_system_table_mods,
1116 *constraintId = localaddr.
objectId;
1120 bool have_simple_col =
false;
1133 have_simple_col =
true;
1143 if (!have_simple_col)
1177 if (
OidIsValid(collationIds[
i]) && collationIds[
i] != DEFAULT_COLLATION_OID)
1222 indexRelationId, 0, is_internal);
1278 index_build(heapRelation, indexRelation, indexInfo,
false,
true);
1287 return indexRelationId;
1301 Oid tablespaceOid,
const char *newName)
1309 Datum indclassDatum,
1312 Datum *opclassOptions;
1332 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1333 errmsg(
"concurrent index creation for exclusion constraints is not supported")));
1338 elog(
ERROR,
"cache lookup failed for index %u", oldIndexId);
1340 Anum_pg_index_indclass);
1344 Anum_pg_index_indoption);
1350 elog(
ERROR,
"cache lookup failed for relation %u", oldIndexId);
1352 Anum_pg_class_reloptions, &isnull);
1365 Anum_pg_index_indexprs);
1376 Anum_pg_index_indpred);
1430 elog(
ERROR,
"cache lookup failed for attribute %d of relation %u",
1432 dat =
SysCacheGetAttr(ATTNUM, tp, Anum_pg_attribute_attstattarget, &isnull);
1434 stattargets[
i].
value = dat;
1435 stattargets[
i].
isnull = isnull;
1453 indexRelation->
rd_rel->relam,
1486 Oid indexRelationId)
1490 int save_sec_context;
1525 index_build(heapRel, indexRelation, indexInfo,
false,
true);
1569 Oid indexConstraintOid;
1585 elog(
ERROR,
"could not find tuple for relation %u", oldIndexId);
1589 elog(
ERROR,
"could not find tuple for relation %u", newIndexId);
1599 isPartition = newClassForm->relispartition;
1600 newClassForm->relispartition = oldClassForm->relispartition;
1601 oldClassForm->relispartition = isPartition;
1615 elog(
ERROR,
"could not find tuple for relation %u", oldIndexId);
1619 elog(
ERROR,
"could not find tuple for relation %u", newIndexId);
1628 newIndexForm->indisprimary = oldIndexForm->indisprimary;
1629 oldIndexForm->indisprimary =
false;
1630 newIndexForm->indisexclusion = oldIndexForm->indisexclusion;
1631 oldIndexForm->indisexclusion =
false;
1632 newIndexForm->indimmediate = oldIndexForm->indimmediate;
1633 oldIndexForm->indimmediate =
true;
1636 newIndexForm->indisreplident = oldIndexForm->indisreplident;
1639 newIndexForm->indisclustered = oldIndexForm->indisclustered;
1645 newIndexForm->indisvalid =
true;
1646 oldIndexForm->indisvalid =
false;
1647 oldIndexForm->indisclustered =
false;
1648 oldIndexForm->indisreplident =
false;
1665 constraintOids =
lappend_oid(constraintOids, indexConstraintOid);
1670 foreach(lc, constraintOids)
1683 elog(
ERROR,
"could not find tuple for constraint %u", constraintOid);
1687 if (conForm->conindid == oldIndexId)
1689 conForm->conindid = newIndexId;
1698 Anum_pg_trigger_tgconstraint,
1709 if (tgForm->tgconstrindid != oldIndexId)
1716 tgForm->tgconstrindid = newIndexId;
1735 bool nulls[Natts_pg_description] = {0};
1736 bool replaces[Natts_pg_description] = {0};
1739 replaces[Anum_pg_description_objoid - 1] =
true;
1742 Anum_pg_description_objoid,
1746 Anum_pg_description_classoid,
1750 Anum_pg_description_objsubid,
1762 values, nulls, replaces);
1886 Oid indexRelationId,
1887 Oid parentConstraintId,
1889 const char *constraintName,
1890 char constraintType,
1892 bool allow_system_table_mods,
1901 bool mark_as_primary;
1904 bool is_without_overlaps;
1916 if (!allow_system_table_mods &&
1920 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1921 errmsg(
"user-defined indexes on system catalog tables are not supported")));
1925 constraintType != CONSTRAINT_EXCLUSION)
1926 elog(
ERROR,
"constraints cannot have index expressions");
1988 is_without_overlaps,
2027 trigger->
trigname = (constraintType == CONSTRAINT_PRIMARY) ?
2028 "PK_ConstraintTrigger" :
2029 "Unique_ConstraintTrigger";
2033 trigger->
row =
true;
2034 trigger->
timing = TRIGGER_TYPE_AFTER;
2035 trigger->
events = TRIGGER_TYPE_INSERT | TRIGGER_TYPE_UPDATE;
2057 (mark_as_primary || deferrable))
2063 bool marked_as_primary =
false;
2070 elog(
ERROR,
"cache lookup failed for index %u", indexRelationId);
2073 if (mark_as_primary && !indexForm->indisprimary)
2075 indexForm->indisprimary =
true;
2077 marked_as_primary =
true;
2080 if (deferrable && indexForm->indimmediate)
2082 indexForm->indimmediate =
false;
2096 if (marked_as_primary)
2142 (!concurrent && !concurrent_lock_mode));
2164 userHeapRelation =
table_open(heapId, lockmode);
2165 userIndexRelation =
index_open(indexId, lockmode);
2221 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2222 errmsg(
"DROP INDEX CONCURRENTLY must be first action in transaction")));
2325 if (RELKIND_HAS_STORAGE(userIndexRelation->
rd_rel->relkind))
2353 elog(
ERROR,
"cache lookup failed for index %u", indexId);
2436 numAtts = indexStruct->indnatts;
2438 elog(
ERROR,
"invalid indnatts %d for index %u",
2446 indexStruct->indnkeyatts,
2447 index->rd_rel->relam,
2450 indexStruct->indisunique,
2451 indexStruct->indnullsnotdistinct,
2452 indexStruct->indisready,
2454 index->rd_indam->amsummarizing,
2455 indexStruct->indisexclusion && indexStruct->indisunique);
2458 for (
i = 0;
i < numAtts;
i++)
2462 if (indexStruct->indisexclusion)
2496 numAtts = indexStruct->indnatts;
2498 elog(
ERROR,
"invalid indnatts %d for index %u",
2506 indexStruct->indnkeyatts,
2507 index->rd_rel->relam,
2510 indexStruct->indisunique,
2511 indexStruct->indnullsnotdistinct,
2512 indexStruct->indisready,
2514 index->rd_indam->amsummarizing,
2515 indexStruct->indisexclusion && indexStruct->indisunique);
2518 for (
i = 0;
i < numAtts;
i++)
2538 const Oid *collations1,
const Oid *collations2,
2539 const Oid *opfamilies1,
const Oid *opfamilies2,
2592 if (collations1[
i] != collations2[
i])
2594 if (opfamilies1[
i] != opfamilies2[
i])
2606 bool found_whole_row;
2612 if (found_whole_row)
2630 bool found_whole_row;
2636 if (found_whole_row)
2690 for (
i = 0;
i < indnkeyatts;
i++)
2694 index->rd_rel->relam,
2703 elog(
ERROR,
"missing operator %d(%u,%u) in opfamily %u",
2758 else if (keycol != 0)
2771 if (indexpr_item == NULL)
2772 elog(
ERROR,
"wrong number of index expressions");
2782 if (indexpr_item != NULL)
2783 elog(
ERROR,
"wrong number of index expressions");
2835 if (reltuples == 0 && rel->
rd_rel->reltuples < 0)
2850 if (rel->
rd_rel->relkind == RELKIND_RELATION ||
2851 rel->
rd_rel->relkind == RELKIND_TOASTVALUE ||
2852 rel->
rd_rel->relkind == RELKIND_MATVIEW)
2859 update_stats =
false;
2862 update_stats =
false;
2876 if (rel->
rd_rel->relkind != RELKIND_INDEX)
2918 elog(
ERROR,
"could not find tuple for relation %u", relid);
2922 Assert(rd_rel->relkind != RELKIND_PARTITIONED_INDEX);
2927 if (rd_rel->relhasindex != hasindex)
2929 rd_rel->relhasindex = hasindex;
2935 if (rd_rel->relpages != (
int32) relpages)
2937 rd_rel->relpages = (
int32) relpages;
2940 if (rd_rel->reltuples != (
float4) reltuples)
2942 rd_rel->reltuples = (
float4) reltuples;
2945 if (rd_rel->relallvisible != (
int32) relallvisible)
2947 rd_rel->relallvisible = (
int32) relallvisible;
2950 if (rd_rel->relallfrozen != (
int32) relallfrozen)
2952 rd_rel->relallfrozen = (
int32) relallfrozen;
3010 int save_sec_context;
3040 (
errmsg_internal(
"building index \"%s\" on table \"%s\" with request for %d parallel workers",
3058 const int progress_index[] = {
3066 const int64 progress_vals[] = {
3089 if (indexRelation->
rd_rel->relpersistence == RELPERSISTENCE_UNLOGGED &&
3139 elog(
ERROR,
"cache lookup failed for index %u", indexId);
3143 Assert(!indexForm->indcheckxmin);
3145 indexForm->indcheckxmin =
true;
3248 if (predicate != NULL)
3250 if (!
ExecQual(predicate, econtext))
3267 indexRelation, indexInfo,
3358 int save_sec_context;
3362 const int progress_index[] = {
3369 const int64 progress_vals[] = {
3406 ivinfo.
index = indexRelation;
3407 ivinfo.
heaprel = heapRelation;
3433 const int progress_index[] = {
3438 const int64 progress_vals[] = {
3465 "validate_index found %.0f heap tuples, %.0f index tuples; inserted %.0f missing tuples",
3515 elog(
ERROR,
"cache lookup failed for index %u", indexId);
3523 Assert(indexForm->indislive);
3524 Assert(!indexForm->indisready);
3525 Assert(!indexForm->indisvalid);
3526 indexForm->indisready =
true;
3530 Assert(indexForm->indislive);
3531 Assert(indexForm->indisready);
3532 Assert(!indexForm->indisvalid);
3533 indexForm->indisvalid =
true;
3550 indexForm->indisvalid =
false;
3551 indexForm->indisclustered =
false;
3552 indexForm->indisreplident =
false;
3563 Assert(!indexForm->indisvalid);
3564 Assert(!indexForm->indisclustered);
3565 Assert(!indexForm->indisreplident);
3566 indexForm->indisready =
false;
3567 indexForm->indislive =
false;
3594 elog(
ERROR,
"cache lookup failed for index %u", indexId);
3599 result =
index->indrelid;
3609 bool skip_constraint_checks,
char persistence,
3616 int save_sec_context;
3619 volatile bool skipped_constraint =
false;
3622 bool set_tablespace =
false;
3658 const int progress_cols[] = {
3662 const int64 progress_vals[] = {
3717 if (iRel->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX)
3718 elog(
ERROR,
"cannot reindex partitioned index \"%s.%s\"",
3728 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3729 errmsg(
"cannot reindex temporary tables of other sessions")));
3739 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3740 errmsg(
"cannot reindex invalid index on TOAST table")));
3755 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3756 errmsg(
"cannot move system relation \"%s\"",
3762 set_tablespace =
true;
3796 if (skip_constraint_checks)
3799 skipped_constraint =
true;
3814 index_build(heapRelation, iRel, indexInfo,
true,
true);
3847 if (!skipped_constraint)
3859 elog(
ERROR,
"cache lookup failed for index %u", indexId);
3862 index_bad = (!indexForm->indisvalid ||
3863 !indexForm->indisready ||
3864 !indexForm->indislive);
3869 indexForm->indcheckxmin =
false;
3871 indexForm->indcheckxmin =
true;
3872 indexForm->indisvalid =
true;
3873 indexForm->indisready =
true;
3874 indexForm->indislive =
true;
3893 (
errmsg(
"index \"%s\" was reindexed",
3955 bool result =
false;
3977 if (rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE)
3978 elog(
ERROR,
"cannot reindex partitioned table \"%s.%s\"",
3982 toast_relid = rel->
rd_rel->reltoastrelid;
4036 persistence = RELPERSISTENCE_UNLOGGED;
4038 persistence = RELPERSISTENCE_PERMANENT;
4040 persistence = rel->
rd_rel->relpersistence;
4044 foreach(indexId, indexIds)
4058 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
4059 errmsg(
"cannot reindex invalid index \"%s.%s\" on TOAST table, skipping",
4074 persistence, params);
4092 result |= (indexIds !=
NIL);
4156 elog(
ERROR,
"cannot reindex while reindexing");
4188 elog(
ERROR,
"cannot reindex while reindexing");
4190 elog(
ERROR,
"cannot modify reindex state during a parallel operation");
4203 elog(
ERROR,
"cannot modify reindex state during a parallel operation");
StrategyNumber IndexAmTranslateCompareType(CompareType cmptype, Oid amoid, Oid opfamily, bool missing_ok)
IndexAmRoutine * GetIndexAmRoutineByAmId(Oid amoid, bool noerror)
#define AttrNumberGetAttrOffset(attNum)
#define InvalidAttrNumber
bool AutoVacuumingActive(void)
void pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid)
void pgstat_progress_update_param(int index, int64 val)
void pgstat_progress_update_multi_param(int nparam, const int *index, const int64 *val)
void pgstat_progress_end_command(void)
@ PROGRESS_COMMAND_CREATE_INDEX
static Datum values[MAXATTR]
void index_register(Oid heap, Oid ind, const IndexInfo *indexInfo)
#define RelationGetNumberOfBlocks(reln)
#define CStringGetTextDatum(s)
#define TextDatumGetCString(d)
TransactionId MultiXactId
#define PointerIsValid(pointer)
#define FLEXIBLE_ARRAY_MEMBER
#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 IsCatalogRelation(Relation relation)
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)
@ DEPENDENCY_PARTITION_PRI
@ DEPENDENCY_PARTITION_SEC
int errmsg_internal(const char *fmt,...)
int errdetail_internal(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
bool equal(const void *a, const void *b)
void EventTriggerCollectSimpleCommand(ObjectAddress address, ObjectAddress secondaryObject, Node *parsetree)
ExprState * ExecPrepareQual(List *qual, EState *estate)
List * ExecPrepareExprList(List *nodes, EState *estate)
void check_exclusion_constraint(Relation heap, Relation index, IndexInfo *indexInfo, ItemPointer tupleid, const Datum *values, const bool *isnull, EState *estate, bool newIndex)
void ExecDropSingleTupleTableSlot(TupleTableSlot *slot)
void FreeExecutorState(EState *estate)
EState * CreateExecutorState(void)
#define GetPerTupleExprContext(estate)
static bool ExecQual(ExprState *state, ExprContext *econtext)
static Datum ExecEvalExprSwitchContext(ExprState *state, ExprContext *econtext, bool *isNull)
#define palloc0_array(type, count)
Datum Int64GetDatum(int64 X)
void systable_endscan(SysScanDesc sysscan)
void systable_inplace_update_cancel(void *state)
void systable_inplace_update_begin(Relation relation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, const ScanKeyData *key, HeapTuple *oldtupcopy, void **state)
void systable_inplace_update_finish(void *state, HeapTuple tuple)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
int NewGUCNestLevel(void)
void RestrictSearchPath(void)
void AtEOXact_GUC(bool isCommit, int nestLevel)
Assert(PointerIsAligned(start, uint64))
void DeleteRelationTuple(Oid relid)
void DeleteAttributeTuples(Oid relid)
void RemoveStatistics(Oid relid, AttrNumber attnum)
void CheckAttributeType(const char *attname, Oid atttypid, Oid attcollation, List *containing_rowtypes, int flags)
void CopyStatistics(Oid fromrelid, Oid torelid)
void InsertPgClassTuple(Relation pg_class_desc, Relation new_rel_desc, Oid new_rel_oid, Datum relacl, Datum reloptions)
void InsertPgAttributeTuples(Relation pg_attribute_rel, TupleDesc tupdesc, Oid new_rel_oid, const FormExtraData_pg_attribute tupdesc_extra[], CatalogIndexState indstate)
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)
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)
bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
bool ReindexIsProcessingIndex(Oid indexOid)
static bool validate_index_callback(ItemPointer itemptr, void *opaque)
void validate_index(Oid heapId, Oid indexId, Snapshot snapshot)
void index_drop(Oid indexId, bool concurrent, bool concurrent_lock_mode)
void ResetReindexState(int nestLevel)
Oid IndexGetRelation(Oid indexId, bool missing_ok)
static int reindexingNestLevel
void index_concurrently_set_dead(Oid heapId, Oid indexId)
Oid index_create(Relation heapRelation, const char *indexRelationName, Oid indexRelationId, Oid parentIndexRelid, Oid parentConstraintId, RelFileNumber relFileNumber, IndexInfo *indexInfo, const List *indexColNames, Oid accessMethodId, Oid tableSpaceId, const Oid *collationIds, const Oid *opclassIds, const Datum *opclassOptions, const int16 *coloptions, const NullableDatum *stattargets, Datum reloptions, bits16 flags, bits16 constr_flags, bool allow_system_table_mods, bool is_internal, Oid *constraintId)
static Oid currentlyReindexedHeap
static void ResetReindexProcessing(void)
void index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName)
static void RemoveReindexPending(Oid indexOid)
static List * pendingReindexedIndexes
void index_set_state_flags(Oid indexId, IndexStateFlagsAction action)
bool CompareIndexInfo(const IndexInfo *info1, const IndexInfo *info2, const Oid *collations1, const Oid *collations2, const Oid *opfamilies1, const Oid *opfamilies2, const AttrMap *attmap)
RelFileNumber binary_upgrade_next_index_pg_class_relfilenumber
IndexInfo * BuildDummyIndexInfo(Relation index)
bool reindex_relation(const ReindexStmt *stmt, Oid relid, int flags, const ReindexParams *params)
void SerializeReindexState(Size maxsize, char *start_address)
static void index_update_stats(Relation rel, bool hasindex, double reltuples)
IndexInfo * BuildIndexInfo(Relation index)
static bool relationHasPrimaryKey(Relation rel)
static void SetReindexProcessing(Oid heapOid, Oid indexOid)
static void IndexCheckExclusion(Relation heapRelation, Relation indexRelation, IndexInfo *indexInfo)
static void InitializeAttributeOids(Relation indexRelation, int numatts, Oid indexoid)
Oid index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, Oid tablespaceOid, const char *newName)
Oid binary_upgrade_next_index_pg_class_oid
static void AppendAttributeTuples(Relation indexRelation, const Datum *attopts, const NullableDatum *stattargets)
void BuildSpeculativeIndexInfo(Relation index, IndexInfo *ii)
void index_check_primary_key(Relation heapRel, const IndexInfo *indexInfo, bool is_alter_table, const IndexStmt *stmt)
bool ReindexIsProcessingHeap(Oid heapOid)
static bool ReindexIsCurrentlyProcessingIndex(Oid indexOid)
void RestoreReindexState(const void *reindexstate)
static TupleDesc ConstructTupleDescriptor(Relation heapRelation, const IndexInfo *indexInfo, const List *indexColNames, Oid accessMethodId, const Oid *collationIds, const Oid *opclassIds)
void index_build(Relation heapRelation, Relation indexRelation, IndexInfo *indexInfo, bool isreindex, bool parallel)
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)
void FormIndexDatum(IndexInfo *indexInfo, TupleTableSlot *slot, EState *estate, Datum *values, bool *isnull)
static void SetReindexPending(List *indexes)
void index_concurrently_build(Oid heapRelationId, Oid indexRelationId)
static void UpdateIndexRelation(Oid indexoid, Oid heapoid, Oid parentIndexId, const IndexInfo *indexInfo, const Oid *collationOids, const Oid *opclassOids, const int16 *coloptions, bool primary, bool isexclusion, bool immediate, bool isvalid, bool isready)
static Oid currentlyReindexedIndex
Size EstimateReindexStateSpace(void)
void reindex_index(const ReindexStmt *stmt, Oid indexId, bool skip_constraint_checks, char persistence, const ReindexParams *params)
#define INDEX_CREATE_IS_PRIMARY
#define INDEX_CREATE_IF_NOT_EXISTS
#define REINDEX_REL_PROCESS_TOAST
#define INDEX_CREATE_PARTITIONED
#define REINDEXOPT_MISSING_OK
#define INDEX_CREATE_INVALID
#define INDEX_CONSTR_CREATE_WITHOUT_OVERLAPS
static int64 itemptr_encode(ItemPointer itemptr)
#define INDEX_CREATE_ADD_CONSTRAINT
#define INDEX_CREATE_SKIP_BUILD
#define INDEX_CONSTR_CREATE_UPDATE_INDEX
#define REINDEX_REL_FORCE_INDEXES_UNLOGGED
#define INDEX_CONSTR_CREATE_REMOVE_OLD_DEPS
#define INDEX_CONSTR_CREATE_DEFERRABLE
#define REINDEXOPT_REPORT_PROGRESS
#define INDEX_CONSTR_CREATE_MARK_AS_PRIMARY
#define REINDEX_REL_SUPPRESS_INDEX_USE
#define REINDEX_REL_FORCE_INDEXES_PERMANENT
#define INDEX_CONSTR_CREATE_INIT_DEFERRED
#define INDEX_CREATE_CONCURRENT
#define REINDEXOPT_VERBOSE
#define REINDEX_REL_CHECK_CONSTRAINTS
bytea * index_opclass_options(Relation indrel, AttrNumber attnum, Datum attoptions, bool validate)
IndexBulkDeleteResult * index_bulk_delete(IndexVacuumInfo *info, IndexBulkDeleteResult *istat, IndexBulkDeleteCallback callback, void *callback_state)
void index_insert_cleanup(Relation indexRelation, IndexInfo *indexInfo)
void index_close(Relation relation, LOCKMODE lockmode)
Relation try_index_open(Oid relationId, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
void CatalogTupleUpdate(Relation heapRel, ItemPointer otid, HeapTuple tup)
void CatalogCloseIndexes(CatalogIndexState indstate)
void CatalogTupleInsert(Relation heapRel, HeapTuple tup)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
int2vector * buildint2vector(const int16 *int2s, int n)
void CacheInvalidateRelcache(Relation relation)
void CacheInvalidateRelcacheByTuple(HeapTuple classTuple)
invalidindex index d is invalid
if(TABLE==NULL||TABLE_index==NULL)
List * lappend(List *list, void *datum)
List * list_delete_oid(List *list, Oid datum)
List * list_copy(const List *oldlist)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
bool list_member_oid(const List *list, Oid datum)
void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
void LockRelation(Relation relation, LOCKMODE lockmode)
void WaitForLockers(LOCKTAG heaplocktag, LOCKMODE lockmode, bool progress)
void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
#define SET_LOCKTAG_RELATION(locktag, dboid, reloid)
#define AccessExclusiveLock
#define ShareUpdateExclusiveLock
char * get_rel_name(Oid relid)
bool get_rel_relispartition(Oid relid)
char get_rel_persistence(Oid relid)
bool get_index_isvalid(Oid index_oid)
Datum get_attoptions(Oid relid, int16 attnum)
Oid get_rel_namespace(Oid relid)
RegProcedure get_opcode(Oid opno)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
bool get_collation_isdeterministic(Oid colloid)
Oid get_base_element_type(Oid typid)
char * get_namespace_name(Oid nspid)
Oid get_relname_relid(const char *relname, Oid relnamespace)
Expr * make_ands_explicit(List *andclauses)
IndexInfo * makeIndexInfo(int numattrs, int numkeyattrs, Oid amoid, List *expressions, List *predicates, bool unique, bool nulls_not_distinct, bool isready, bool concurrent, bool summarizing, bool withoutoverlaps)
List * make_ands_implicit(Expr *clause)
void MemoryContextReset(MemoryContext context)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext TopMemoryContext
#define IsBootstrapProcessingMode()
#define SECURITY_RESTRICTED_OPERATION
#define CHECK_FOR_INTERRUPTS()
#define IsNormalProcessingMode()
void GetUserIdAndSecContext(Oid *userid, int *sec_context)
void SetUserIdAndSecContext(Oid userid, int sec_context)
#define InvalidMultiXactId
void namestrcpy(Name name, const char *str)
Oid exprType(const Node *expr)
int32 exprTypmod(const Node *expr)
#define InvokeObjectPostAlterHookArg(classId, objectId, subId, auxiliaryId, is_internal)
#define InvokeObjectPostCreateHookArg(classId, objectId, subId, is_internal)
const ObjectAddress InvalidObjectAddress
#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)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
List * SystemFuncName(char *name)
List * get_partition_ancestors(Oid relid)
#define ATTRIBUTE_FIXED_PART_SIZE
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)
FormData_pg_constraint * Form_pg_constraint
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
long changeDependenciesOf(Oid classId, Oid oldObjectId, Oid newObjectId)
List * get_index_ref_constraints(Oid indexId)
long changeDependenciesOn(Oid refClassId, Oid oldRefObjectId, Oid newRefObjectId)
Oid get_index_constraint(Oid indexId)
FormData_pg_index * Form_pg_index
bool DeleteInheritsTuple(Oid inhrelid, Oid inhparent, bool expect_detach_pending, const char *childname)
void StoreSingleInheritance(Oid relationId, Oid parentOid, int32 seqNumber)
static int list_length(const List *l)
static ListCell * list_head(const List *l)
static ListCell * lnext(const List *l, const ListCell *c)
FormData_pg_opclass * Form_pg_opclass
const char * pg_rusage_show(const PGRUsage *ru0)
void pg_rusage_init(PGRUsage *ru0)
FormData_pg_trigger * Form_pg_trigger
FormData_pg_type * Form_pg_type
void pgstat_copy_relation_stats(Relation dst, Relation src)
void pgstat_drop_relation(Relation rel)
int plan_create_index_workers(Oid tableOid, Oid indexOid)
static Datum PointerGetDatum(const void *X)
static Datum Int16GetDatum(int16 X)
static Datum BoolGetDatum(bool X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum Int32GetDatum(int32 X)
void TransferPredicateLocksToHeapRelation(Relation relation)
#define PROGRESS_CREATEIDX_PHASE_BUILD
#define PROGRESS_CREATEIDX_PHASE_VALIDATE_TABLESCAN
#define PROGRESS_CREATEIDX_ACCESS_METHOD_OID
#define PROGRESS_CREATEIDX_TUPLES_TOTAL
#define PROGRESS_CREATEIDX_PHASE_VALIDATE_SORT
#define PROGRESS_SCAN_BLOCKS_DONE
#define PROGRESS_CREATEIDX_TUPLES_DONE
#define PROGRESS_CREATEIDX_SUBPHASE
#define PROGRESS_CREATEIDX_SUBPHASE_INITIALIZE
#define PROGRESS_CREATEIDX_PHASE
#define PROGRESS_CREATEIDX_COMMAND_REINDEX
#define PROGRESS_CLUSTER_INDEX_REBUILD_COUNT
#define PROGRESS_CREATEIDX_PHASE_VALIDATE_IDXSCAN
#define PROGRESS_SCAN_BLOCKS_TOTAL
#define PROGRESS_CREATEIDX_INDEX_OID
#define PROGRESS_CREATEIDX_COMMAND
void * stringToNode(const char *str)
#define RelationGetForm(relation)
#define RelationGetRelid(relation)
static SMgrRelation RelationGetSmgr(Relation rel)
#define RelationGetDescr(relation)
#define RelationIsMapped(relation)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
#define RelationIsValid(relation)
#define RelationGetNamespace(relation)
#define IndexRelationGetNumberOfKeyAttributes(relation)
List * RelationGetIndexList(Relation relation)
List * RelationGetDummyIndexExpressions(Relation relation)
void RelationInitIndexAccessInfo(Relation relation)
List * RelationGetIndexPredicate(Relation relation)
void RelationSetNewRelfilenumber(Relation relation, char persistence)
void RelationForgetRelation(Oid rid)
List * RelationGetIndexExpressions(Relation relation)
void RelationAssumeNewRelfilelocator(Relation relation)
void RelationGetExclusionInfo(Relation indexRelation, Oid **operators, Oid **procs, uint16 **strategies)
#define InvalidRelFileNumber
#define RelFileNumberIsValid(relnumber)
Node * map_variable_attnos(Node *node, int target_varno, int sublevels_up, const AttrMap *attno_map, Oid to_rowtype, bool *found_whole_row)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Size mul_size(Size s1, Size s2)
void smgrcreate(SMgrRelation reln, ForkNumber forknum, bool isRedo)
bool smgrexists(SMgrRelation reln, ForkNumber forknum)
Snapshot GetTransactionSnapshot(void)
Snapshot GetLatestSnapshot(void)
void UnregisterSnapshot(Snapshot snapshot)
void PushActiveSnapshot(Snapshot snapshot)
bool ActiveSnapshotSet(void)
Snapshot RegisterSnapshot(Snapshot snapshot)
void PopActiveSnapshot(void)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
void log_smgrcreate(const RelFileLocator *rlocator, ForkNumber forkNum)
void RelationDropStorage(Relation rel)
#define BTEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
MemoryContext ecxt_per_tuple_memory
TupleTableSlot * ecxt_scantuple
ambuildempty_function ambuildempty
uint16 * ii_ExclusionStrats
ExprState * ii_PredicateState
List * ii_ExpressionsState
AttrNumber ii_IndexAttrNumbers[INDEX_MAX_KEYS]
BufferAccessStrategy strategy
struct IndexAmRoutine * rd_indam
MemoryContext rd_indexcxt
RelFileLocator rd_locator
Oid currentlyReindexedHeap
Oid currentlyReindexedIndex
int numPendingReindexedIndexes
Oid pendingReindexedIndexes[FLEXIBLE_ARRAY_MEMBER]
int16 values[FLEXIBLE_ARRAY_MEMBER]
Oid values[FLEXIBLE_ARRAY_MEMBER]
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)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
#define SearchSysCacheCopy1(cacheId, key1)
Relation try_table_open(Oid relationId, LOCKMODE lockmode)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
TupleTableSlot * table_slot_create(Relation relation, List **reglist)
static void table_endscan(TableScanDesc scan)
static void table_index_validate_scan(Relation table_rel, Relation index_rel, struct IndexInfo *index_info, Snapshot snapshot, struct ValidateIndexState *state)
static TableScanDesc table_beginscan_strat(Relation rel, Snapshot snapshot, int nkeys, struct ScanKeyData *key, bool allow_strat, bool allow_sync)
static bool table_scan_getnextslot(TableScanDesc sscan, ScanDirection direction, TupleTableSlot *slot)
void CheckTableNotInUse(Relation rel, const char *stmt)
bool CheckRelationTableSpaceMove(Relation rel, Oid newTableSpaceId)
void SetRelationHasSubclass(Oid relationId, bool relhassubclass)
void SetRelationTableSpace(Relation rel, Oid newTableSpaceId, RelFileNumber newRelFilenumber)
#define InvalidCompressionMethod
#define InvalidTransactionId
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)
TupleDesc CreateTemplateTupleDesc(int natts)
void populate_compact_attribute(TupleDesc tupdesc, int attnum)
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
void tuplesort_performsort(Tuplesortstate *state)
void tuplesort_end(Tuplesortstate *state)
void tuplesort_putdatum(Tuplesortstate *state, Datum val, bool isNull)
Tuplesortstate * tuplesort_begin_datum(Oid datumType, Oid sortOperator, Oid sortCollation, bool nullsFirstFlag, int workMem, SortCoordinate coordinate, int sortopt)
static Datum slot_getsysattr(TupleTableSlot *slot, int attnum, bool *isnull)
static Datum slot_getattr(TupleTableSlot *slot, int attnum, bool *isnull)
void visibilitymap_count(Relation rel, BlockNumber *all_visible, BlockNumber *all_frozen)
int GetCurrentTransactionNestLevel(void)
void CommandCounterIncrement(void)
TransactionId GetTopTransactionIdIfAny(void)
void StartTransactionCommand(void)
bool IsInParallelMode(void)
void CommitTransactionCommand(void)