62#include "utils/fmgroids.h"
83 Datum *opclassOptions,
86 const List *exclusionOpNames,
88 const char *accessMethodName,
92 bool iswithoutoverlaps,
95 int *ddl_save_nestlevel);
97 const List *colnames,
const List *exclusionOpNames,
98 bool primary,
bool isconstraint);
179 const char *accessMethodName,
180 const List *attributeList,
181 const List *exclusionOpNames,
182 bool isWithoutOverlaps)
188 Datum *opclassOptions;
199 int numberOfAttributes;
215 isconstraint =
false;
218 Assert(numberOfAttributes > 0);
225 (
errcode(ERRCODE_UNDEFINED_OBJECT),
226 errmsg(
"access method \"%s\" does not exist",
229 accessMethodId = accessMethodForm->oid;
244 indexInfo =
makeIndexInfo(numberOfAttributes, numberOfAttributes,
245 accessMethodId,
NIL,
NIL,
false,
false,
246 false,
false, amsummarizing, isWithoutOverlaps);
253 typeIds, collationIds, opclassIds, opclassOptions,
254 coloptions, attributeList,
255 exclusionOpNames, relationId,
256 accessMethodName, accessMethodId,
257 amcanorder, isconstraint, isWithoutOverlaps,
InvalidOid,
263 elog(
ERROR,
"cache lookup failed for index %u", oldId);
272 indexForm->indisvalid))
279 old_natts = indexForm->indnkeyatts;
280 Assert(old_natts == numberOfAttributes);
288 ret = (memcmp(old_indclass->
values, opclassIds, old_natts *
sizeof(
Oid)) == 0 &&
289 memcmp(old_indcollation->
values, collationIds, old_natts *
sizeof(
Oid)) == 0);
298 for (
i = 0;
i < old_natts;
i++)
313 for (
i = 0;
i < old_natts;
i++)
318 pfree(oldOpclassOptions);
330 old_natts *
sizeof(
Oid)) == 0;
335 for (
i = 0;
i < old_natts && ret;
i++)
341 if ((IsPolymorphicType(left) || IsPolymorphicType(right)) &&
367 if (!opts1 && !opts2)
371 for (
i = 0;
i < natts;
i++)
376 if (opt1 == (
Datum) 0)
378 if (opt2 == (
Datum) 0)
383 else if (opt2 == (
Datum) 0)
448 for (
i = 0;
i < n_old_snapshots;
i++)
457 int n_newer_snapshots;
466 for (
j =
i;
j < n_old_snapshots;
j++)
470 for (k = 0; k < n_newer_snapshots; k++)
476 if (k >= n_newer_snapshots)
479 pfree(newer_snapshots);
549 Oid parentConstraintId,
553 bool check_not_in_use,
558 char *indexRelationName;
559 char *accessMethodName;
563 Datum *opclassOptions;
569 List *allIndexParams;
575 bool amissummarizing;
585 int numberOfAttributes;
586 int numberOfKeyAttributes;
593 Oid root_save_userid;
594 int root_save_sec_context;
595 int root_save_nestlevel;
606 if (
stmt->reset_default_tblspc)
656 stmt->indexIncludingParams);
659 if (numberOfKeyAttributes <= 0)
661 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
662 errmsg(
"must specify at least one column")));
665 (
errcode(ERRCODE_TOO_MANY_COLUMNS),
666 errmsg(
"cannot use more than %d columns in an index",
702 exclusion =
stmt->excludeOpNames ||
stmt->iswithoutoverlaps;
705 switch (rel->
rd_rel->relkind)
707 case RELKIND_RELATION:
708 case RELKIND_MATVIEW:
709 case RELKIND_PARTITIONED_TABLE:
714 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
715 errmsg(
"cannot create index on relation \"%s\"",
729 partitioned = rel->
rd_rel->relkind == RELKIND_PARTITIONED_TABLE;
738 if (
stmt->concurrent)
740 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
741 errmsg(
"cannot create index on partitioned table \"%s\" concurrently",
750 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
751 errmsg(
"cannot create indexes on temporary tables of other sessions")));
759 if (check_not_in_use)
772 aclresult =
object_aclcheck(NamespaceRelationId, namespaceId, root_save_userid,
783 if (
stmt->tableSpace)
788 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
789 errmsg(
"cannot specify default tablespace for partitioned relations")));
804 aclresult =
object_aclcheck(TableSpaceRelationId, tablespaceId, root_save_userid,
816 if (rel->
rd_rel->relisshared)
817 tablespaceId = GLOBALTABLESPACE_OID;
818 else if (tablespaceId == GLOBALTABLESPACE_OID)
820 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
821 errmsg(
"only shared relations can be placed in pg_global tablespace")));
831 indexRelationName =
stmt->idxname;
832 if (indexRelationName == NULL)
836 stmt->excludeOpNames,
843 accessMethodName =
stmt->accessMethod;
851 if (strcmp(accessMethodName,
"rtree") == 0)
854 (
errmsg(
"substituting access method \"gist\" for obsolete method \"rtree\"")));
855 accessMethodName =
"gist";
861 (
errcode(ERRCODE_UNDEFINED_OBJECT),
862 errmsg(
"access method \"%s\" does not exist",
866 accessMethodId = accessMethodForm->oid;
874 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
875 errmsg(
"access method \"%s\" does not support unique indexes",
879 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
880 errmsg(
"access method \"%s\" does not support included columns",
884 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
885 errmsg(
"access method \"%s\" does not support multicolumn indexes",
887 if (exclusion && amRoutine->
amgettuple == NULL)
889 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
890 errmsg(
"access method \"%s\" does not support exclusion constraints",
892 if (
stmt->iswithoutoverlaps && strcmp(accessMethodName,
"gist") != 0)
894 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
895 errmsg(
"access method \"%s\" does not support WITHOUT OVERLAPS constraints",
907 if (
stmt->whereClause)
914 NULL, NULL,
false,
false);
924 numberOfKeyAttributes,
929 stmt->nulls_not_distinct,
933 stmt->iswithoutoverlaps);
942 typeIds, collationIds, opclassIds, opclassOptions,
943 coloptions, allIndexParams,
944 stmt->excludeOpNames, tableId,
945 accessMethodName, accessMethodId,
946 amcanorder,
stmt->isconstraint,
stmt->iswithoutoverlaps,
947 root_save_userid, root_save_sec_context,
948 &root_save_nestlevel);
966 if (partitioned && (
stmt->unique || exclusion))
969 const char *constraint_type;
973 constraint_type =
"PRIMARY KEY";
974 else if (
stmt->unique)
975 constraint_type =
"UNIQUE";
976 else if (
stmt->excludeOpNames)
977 constraint_type =
"EXCLUDE";
981 constraint_type = NULL;
988 for (
i = 0;
i <
key->partnatts;
i++)
1007 key->partopcintype[
i],
1008 key->partopcintype[
i],
1011 elog(
ERROR,
"missing operator %d(%u,%u) in partition opfamily %u",
1012 eq_strategy,
key->partopcintype[
i],
key->partopcintype[
i],
1013 key->partopfamily[
i]);
1019 if (
key->partattrs[
i] == 0)
1021 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1022 errmsg(
"unsupported %s constraint with partition key definition",
1024 errdetail(
"%s constraints cannot be used when partition keys include expressions.",
1039 if (
key->partcollation[
i] != collationIds[
j])
1048 if (
stmt->unique && !
stmt->iswithoutoverlaps)
1058 errcode(ERRCODE_UNDEFINED_OBJECT),
1060 errdetail(
"There is no suitable operator in operator family \"%s\" for access method \"%s\".",
1063 if (ptkey_eqop == idx_eqop)
1079 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1080 errmsg(
"cannot match partition key to index on column \"%s\" using non-equal operator \"%s\"",
1093 key->partattrs[
i] - 1);
1095 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1096 errmsg(
"unique constraint on partitioned table must include all partitioning columns"),
1097 errdetail(
"%s constraint on table \"%s\" lacks column \"%s\" which is part of the partition key.",
1118 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1119 errmsg(
"index creation on system columns is not supported")));
1124 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1126 errmsg(
"primary keys on virtual generated columns are not supported") :
1127 stmt->isconstraint ?
1128 errmsg(
"unique constraints on virtual generated columns are not supported") :
1129 errmsg(
"indexes on virtual generated columns are not supported"));
1149 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1150 errmsg(
"index creation on system columns is not supported")));
1165 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1166 stmt->isconstraint ?
1167 errmsg(
"unique constraints on virtual generated columns are not supported") :
1168 errmsg(
"indexes on virtual generated columns are not supported")));
1180 if (
stmt->isconstraint && !quiet)
1182 const char *constraint_type;
1185 constraint_type =
"PRIMARY KEY";
1186 else if (
stmt->unique)
1187 constraint_type =
"UNIQUE";
1188 else if (
stmt->excludeOpNames)
1189 constraint_type =
"EXCLUDE";
1193 constraint_type = NULL;
1197 (
errmsg_internal(
"%s %s will create implicit index \"%s\" for table \"%s\"",
1198 is_alter_table ?
"ALTER TABLE / ADD" :
"CREATE TABLE /",
1215 flags = constr_flags = 0;
1216 if (
stmt->isconstraint)
1218 if (skip_build || concurrent || partitioned)
1220 if (
stmt->if_not_exists)
1233 if (partitioned &&
stmt->relation && !
stmt->relation->inh)
1241 if (
stmt->deferrable)
1243 if (
stmt->initdeferred)
1245 if (
stmt->iswithoutoverlaps)
1249 index_create(rel, indexRelationName, indexRelationId, parentIndexId,
1251 stmt->oldNumber, indexInfo, indexColNames,
1252 accessMethodId, tablespaceId,
1253 collationIds, opclassIds, opclassOptions,
1254 coloptions, NULL, reloptions,
1255 flags, constr_flags,
1257 &createdConstraintId);
1291 if (
stmt->idxcomment != NULL)
1306 if ((!
stmt->relation ||
stmt->relation->inh) && partdesc->
nparts > 0)
1308 int nparts = partdesc->
nparts;
1310 bool invalidate_parent =
false;
1333 if (total_parts < 0)
1346 memcpy(part_oids, partdesc->
oids,
sizeof(
Oid) * nparts);
1356 parentIndex =
index_open(indexRelationId, lockmode);
1369 for (
int i = 0;
i < nparts;
i++)
1371 Oid childRelid = part_oids[
i];
1373 Oid child_save_userid;
1374 int child_save_sec_context;
1375 int child_save_nestlevel;
1384 &child_save_sec_context);
1395 if (childrel->
rd_rel->relkind == RELKIND_FOREIGN_TABLE)
1399 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
1400 errmsg(
"cannot create unique index on partitioned table \"%s\"",
1402 errdetail(
"Table \"%s\" contains partitions that are foreign tables.",
1407 child_save_sec_context);
1418 foreach(cell, childidxs)
1464 createdConstraintId,
1468 invalidate_parent =
true;
1494 child_save_sec_context);
1523 root_save_sec_context);
1526 childRelid, childStmt,
1529 createdConstraintId,
1531 is_alter_table, check_rights,
1535 child_save_sec_context);
1543 invalidate_parent =
true;
1556 if (invalidate_parent)
1565 elog(
ERROR,
"cache lookup failed for index %u",
1661 const int progress_cols[] = {
1665 const int64 progress_vals[] = {
1768 limitXmin = snapshot->
xmin;
1861 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
1862 errmsg(
"functions in index predicate must be marked IMMUTABLE")));
1880 Datum *opclassOptions,
1882 const List *attList,
1883 const List *exclusionOpNames,
1885 const char *accessMethodName,
1889 bool iswithoutoverlaps,
1891 int ddl_sec_context,
1892 int *ddl_save_nestlevel)
1899 int save_sec_context;
1902 if (exclusionOpNames)
1908 nextExclOp =
list_head(exclusionOpNames);
1919 if (iswithoutoverlaps)
1921 if (exclusionOpNames ==
NIL)
1937 foreach(lc, attList)
1946 if (attribute->
name != NULL)
1959 (
errcode(ERRCODE_UNDEFINED_COLUMN),
1960 errmsg(
"column \"%s\" named in key does not exist",
1965 (
errcode(ERRCODE_UNDEFINED_COLUMN),
1966 errmsg(
"column \"%s\" does not exist",
1972 atttype = attform->atttypid;
1973 attcollation = attform->attcollation;
1983 if (attn >= nkeycols)
1985 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
1986 errmsg(
"expressions are not supported in included columns"),
2027 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2028 errmsg(
"functions in index expression must be marked IMMUTABLE"),
2033 typeOids[attn] = atttype;
2039 if (attn >= nkeycols)
2043 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2044 errmsg(
"including column does not support a collation"),
2048 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2049 errmsg(
"including column does not support an operator class"),
2053 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2054 errmsg(
"including column does not support ASC/DESC options"),
2058 (
errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
2059 errmsg(
"including column does not support NULLS FIRST/LAST options"),
2063 opclassOptions[attn] = (
Datum) 0;
2064 colOptions[attn] = 0;
2102 (
errcode(ERRCODE_INDETERMINATE_COLLATION),
2103 errmsg(
"could not determine which collation to use for index expression"),
2104 errhint(
"Use the COLLATE clause to set the collation explicitly."),
2111 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2112 errmsg(
"collations are not supported by type %s",
2117 collationOids[attn] = attcollation;
2179 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2180 errmsg(
"operator %s is not commutative",
2182 errdetail(
"Only commutative operators can be used in exclusion constraints."),
2192 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
2193 errmsg(
"operator %s is not a member of operator family \"%s\"",
2196 errdetail(
"The exclusion operator must be related to the index operator class for the constraint."),
2202 nextExclOp =
lnext(exclusionOpNames, nextExclOp);
2204 else if (iswithoutoverlaps)
2210 if (attn == nkeycols - 1)
2225 colOptions[attn] = 0;
2230 colOptions[attn] |= INDOPTION_DESC;
2235 colOptions[attn] |= INDOPTION_NULLS_FIRST;
2238 colOptions[attn] |= INDOPTION_NULLS_FIRST;
2245 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2246 errmsg(
"access method \"%s\" does not support ASC/DESC options",
2251 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
2252 errmsg(
"access method \"%s\" does not support NULLS FIRST/LAST options",
2262 opclassOptions[attn] =
2264 NULL, NULL,
false,
false);
2267 opclassOptions[attn] = (
Datum) 0;
2281 const char *accessMethodName,
Oid accessMethodId)
2296 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2297 errmsg(
"data type %s has no default operator class for access method \"%s\"",
2299 errhint(
"You must specify an operator class for the index or define a default operator class for the data type.")));
2327 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2328 errmsg(
"operator class \"%s\" does not exist for access method \"%s\"",
2329 opcname, accessMethodName)));
2335 (
errcode(ERRCODE_UNDEFINED_OBJECT),
2336 errmsg(
"operator class \"%s\" does not exist for access method \"%s\"",
2344 opClassId = opform->oid;
2345 opInputType = opform->opcintype;
2349 (
errcode(ERRCODE_DATATYPE_MISMATCH),
2350 errmsg(
"operator class \"%s\" does not accept data type %s",
2369 int ncompatible = 0;
2370 int ncompatiblepreferred = 0;
2397 Anum_pg_opclass_opcmethod,
2409 if (!opclass->opcdefault)
2411 if (opclass->opcintype == type_id)
2414 result = opclass->oid;
2416 else if (nexact == 0 &&
2421 ncompatiblepreferred++;
2422 result = opclass->oid;
2424 else if (ncompatiblepreferred == 0)
2427 result = opclass->oid;
2440 errmsg(
"there are multiple default operator classes for data type %s",
2444 ncompatiblepreferred == 1 ||
2445 (ncompatiblepreferred == 0 && ncompatible == 1))
2481 elog(
ERROR,
"cache lookup failed for opclass %u", opclass);
2491 errcode(ERRCODE_UNDEFINED_OBJECT),
2495 errdetail(
"Could not translate compare type %d for operator family \"%s\" of access method \"%s\".",
2504 rhstype = opcintype;
2509 errcode(ERRCODE_UNDEFINED_OBJECT),
2513 errdetail(
"There is no suitable operator in operator family \"%s\" for access method \"%s\".",
2549 name1chars = strlen(name1);
2552 name2chars = strlen(name2);
2558 overhead += strlen(
label) + 1;
2568 while (name1chars + name2chars > availchars)
2570 if (name1chars > name2chars)
2576 name1chars =
pg_mbcliplen(name1, name1chars, name1chars);
2578 name2chars =
pg_mbcliplen(name2, name2chars, name2chars);
2581 name =
palloc(name1chars + name2chars + overhead + 1);
2582 memcpy(
name, name1, name1chars);
2587 memcpy(
name + ndx, name2, name2chars);
2629 const char *
label,
Oid namespaceid,
2655 Anum_pg_class_relname,
2659 Anum_pg_class_relnamespace,
2675 if (!isconstraint ||
2682 snprintf(modlabel,
sizeof(modlabel),
"%s%d",
label, ++pass);
2697 const List *colnames,
const List *exclusionOpNames,
2698 bool primary,
bool isconstraint)
2711 else if (exclusionOpNames !=
NIL)
2719 else if (isconstraint)
2758 foreach(lc, colnames)
2760 const char *
name = (
const char *)
lfirst(lc);
2763 buf[buflen++] =
'_';
2770 buflen += strlen(
buf + buflen);
2790 foreach(lc, indexElems)
2793 const char *origname;
2794 const char *curname;
2801 else if (ielem->
name)
2802 origname = ielem->
name;
2814 foreach(lc2, result)
2816 if (strcmp(curname, (
char *)
lfirst(lc2)) == 0)
2827 memcpy(
buf, origname, nlen);
2828 strcpy(
buf + nlen, nbuf);
2850 bool concurrently =
false;
2852 char *tablespacename = NULL;
2855 foreach(lc,
stmt->params)
2859 if (strcmp(opt->
defname,
"verbose") == 0)
2861 else if (strcmp(opt->
defname,
"concurrently") == 0)
2863 else if (strcmp(opt->
defname,
"tablespace") == 0)
2867 (
errcode(ERRCODE_SYNTAX_ERROR),
2868 errmsg(
"unrecognized %s option \"%s\"",
2875 "REINDEX CONCURRENTLY");
2885 if (tablespacename != NULL)
2926 "REINDEX DATABASE");
2930 elog(
ERROR,
"unrecognized object type: %d",
2975 if (relkind == RELKIND_PARTITIONED_INDEX)
2978 persistence != RELPERSISTENCE_TEMP)
3017 if (relId != oldRelId &&
OidIsValid(oldRelId))
3029 if (relkind != RELKIND_INDEX &&
3030 relkind != RELKIND_PARTITIONED_INDEX)
3032 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3047 if (relId == oldRelId && table_oid !=
state->locked_table_oid)
3049 (
errcode(ERRCODE_UNDEFINED_OBJECT),
3050 errmsg(
"index \"%s\" was concurrently dropped",
3059 if (relId != oldRelId)
3062 state->locked_table_oid = table_oid;
3100 (
errmsg(
"table \"%s\" has no indexes that can be reindexed concurrently",
3114 (
errmsg(
"table \"%s\" has no indexes to reindex",
3142 bool concurrent_warning =
false;
3143 bool tablespace_warning =
false;
3144 const char *objectName =
stmt->name;
3160 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3161 errmsg(
"cannot reindex system catalogs concurrently")));
3184 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3185 errmsg(
"can only reindex the currently open database")));
3199 "ReindexMultipleTables",
3211 Anum_pg_class_relnamespace,
3229 Oid relid = classtuple->oid;
3238 if (classtuple->relkind != RELKIND_RELATION &&
3239 classtuple->relkind != RELKIND_MATVIEW)
3243 if (classtuple->relpersistence == RELPERSISTENCE_TEMP &&
3263 if (classtuple->relisshared &&
3274 if (!concurrent_warning)
3276 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3277 errmsg(
"cannot reindex system catalogs concurrently, skipping all")));
3278 concurrent_warning =
true;
3288 bool skip_rel =
false;
3294 if (RELKIND_HAS_STORAGE(classtuple->relkind) &&
3307 if (!tablespace_warning)
3309 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
3310 errmsg(
"cannot move system relations, skipping all")));
3311 tablespace_warning =
true;
3326 if (relid == RelationRelationId)
3355 if (errinfo->
relkind == RELKIND_PARTITIONED_TABLE)
3356 errcontext(
"while reindexing partitioned table \"%s.%s\"",
3358 else if (errinfo->
relkind == RELKIND_PARTITIONED_INDEX)
3359 errcontext(
"while reindexing partitioned index \"%s.%s\"",
3382 Assert(RELKIND_HAS_PARTITIONS(relkind));
3392 errcallback.
arg = &errinfo;
3397 relkind == RELKIND_PARTITIONED_TABLE ?
3398 "REINDEX TABLE" :
"REINDEX INDEX");
3420 foreach(lc, inhoids)
3430 if (!RELKIND_HAS_STORAGE(partkind))
3433 Assert(partkind == RELKIND_INDEX ||
3434 partkind == RELKIND_RELATION);
3475 char relpersistence;
3515 Assert(!RELKIND_HAS_PARTITIONS(relkind));
3518 relpersistence != RELPERSISTENCE_TEMP)
3528 else if (relkind == RELKIND_INDEX)
3552 (
errmsg(
"table \"%s.%s\" was reindexed",
3592 typedef struct ReindexIndexInfo
3609 char *relationName = NULL;
3610 char *relationNamespace = NULL;
3612 const int progress_index[] = {
3618 int64 progress_vals[4];
3627 "ReindexConcurrent",
3651 case RELKIND_RELATION:
3652 case RELKIND_MATVIEW:
3653 case RELKIND_TOASTVALUE:
3665 heapRelationIds =
lappend_oid(heapRelationIds, relationOid);
3671 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3672 errmsg(
"cannot reindex system catalogs concurrently")));
3690 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3691 errmsg(
"cannot move system relation \"%s\"",
3701 if (!indexRelation->
rd_index->indisvalid)
3703 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
3704 errmsg(
"skipping reindex of invalid index \"%s.%s\"",
3707 errhint(
"Use DROP INDEX or REINDEX INDEX.")));
3708 else if (indexRelation->
rd_index->indisexclusion)
3710 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3711 errmsg(
"cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping",
3716 ReindexIndexInfo *
idx;
3722 idx->indexId = cellOid;
3736 Oid toastOid = heapRelation->
rd_rel->reltoastrelid;
3744 heapRelationIds =
lappend_oid(heapRelationIds, toastOid);
3754 if (!indexRelation->
rd_index->indisvalid)
3756 (
errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
3757 errmsg(
"skipping reindex of invalid index \"%s.%s\"",
3760 errhint(
"Use DROP INDEX or REINDEX INDEX.")));
3763 ReindexIndexInfo *
idx;
3772 idx->indexId = cellOid;
3793 ReindexIndexInfo *
idx;
3801 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3802 errmsg(
"cannot reindex system catalogs concurrently")));
3812 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3813 errmsg(
"cannot reindex invalid index on TOAST table")));
3836 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3837 errmsg(
"cannot move system relation \"%s\"",
3853 idx->indexId = relationOid;
3861 case RELKIND_PARTITIONED_TABLE:
3862 case RELKIND_PARTITIONED_INDEX:
3866 (
errcode(ERRCODE_WRONG_OBJECT_TYPE),
3867 errmsg(
"cannot reindex this type of relation concurrently")));
3878 if (indexIds ==
NIL)
3884 (
errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
3885 errmsg(
"cannot move non-shared relation to tablespace \"%s\"",
3915 foreach(lc, indexIds)
3917 char *concurrentName;
3919 ReindexIndexInfo *newidx;
3924 int save_sec_context;
3949#ifdef USE_INJECTION_POINTS
3960 if (indexRel->
rd_rel->relpersistence == RELPERSISTENCE_TEMP)
3961 elog(
ERROR,
"cannot reindex a temporary table concurrently");
3966 progress_vals[1] = 0;
3967 progress_vals[2] =
idx->indexId;
3968 progress_vals[3] =
idx->amId;
3980 heapRel->
rd_rel->relkind != RELKIND_TOASTVALUE)
3983 tablespaceid = indexRel->
rd_rel->reltablespace;
4003 newidx->indexId = newIndexId;
4004 newidx->safe =
idx->safe;
4005 newidx->tableId =
idx->tableId;
4006 newidx->amId =
idx->amId;
4008 newIndexIds =
lappend(newIndexIds, newidx);
4018 relationLocks =
lappend(relationLocks, lockrelid);
4021 relationLocks =
lappend(relationLocks, lockrelid);
4055 foreach(lc, heapRelationIds)
4067 relationLocks =
lappend(relationLocks, lockrelid);
4073 lockTags =
lappend(lockTags, heaplocktag);
4082 foreach(lc, relationLocks)
4113 foreach(lc, newIndexIds)
4115 ReindexIndexInfo *newidx =
lfirst(lc);
4141 progress_vals[2] = newidx->indexId;
4142 progress_vals[3] = newidx->amId;
4172 foreach(lc, newIndexIds)
4174 ReindexIndexInfo *newidx =
lfirst(lc);
4205 progress_vals[2] = newidx->indexId;
4206 progress_vals[3] = newidx->amId;
4215 limitXmin = snapshot->
xmin;
4265 forboth(lc, indexIds, lc2, newIndexIds)
4267 ReindexIndexInfo *oldidx =
lfirst(lc);
4268 ReindexIndexInfo *newidx =
lfirst(lc2);
4334 INJECTION_POINT(
"reindex-relation-concurrently-before-set-dead", NULL);
4339 foreach(lc, indexIds)
4341 ReindexIndexInfo *oldidx =
lfirst(lc);
4386 foreach(lc, indexIds)
4391 object.
classId = RelationRelationId;
4392 object.objectId =
idx->indexId;
4393 object.objectSubId = 0;
4412 foreach(lc, relationLocks)
4425 if (relkind == RELKIND_INDEX)
4427 (
errmsg(
"index \"%s.%s\" was reindexed",
4428 relationNamespace, relationName),
4433 foreach(lc, newIndexIds)
4436 Oid indOid =
idx->indexId;
4439 (
errmsg(
"index \"%s.%s\" was reindexed",
4446 (
errmsg(
"table \"%s.%s\" was reindexed",
4447 relationNamespace, relationName),
4477 Assert(partitionIdx->
rd_rel->relkind == RELKIND_INDEX ||
4478 partitionIdx->
rd_rel->relkind == RELKIND_PARTITIONED_INDEX);
4485 Anum_pg_inherits_inhrelid,
4489 Anum_pg_inherits_inhseqno,
4531 if (inhForm->inhparent != parentOid)
4534 elog(
ERROR,
"bogus pg_inherit row: inhrelid %u inhparent %u",
4535 inhForm->inhrelid, inhForm->inhparent);
4608 elog(
ERROR,
"cache lookup failed for relation %u", relationId);
Datum idx(PG_FUNCTION_ARGS)
bool has_privs_of_role(Oid member, Oid role)
void aclcheck_error(AclResult aclerr, ObjectType objtype, const char *objectname)
AclResult object_aclcheck(Oid classid, Oid objectid, Oid roleid, AclMode mode)
bool object_ownercheck(Oid classid, Oid objectid, Oid roleid)
AclResult pg_class_aclcheck(Oid table_oid, Oid roleid, AclMode mode)
const IndexAmRoutine * GetIndexAmRoutine(Oid amhandler)
StrategyNumber IndexAmTranslateCompareType(CompareType cmptype, Oid amoid, Oid opfamily, bool missing_ok)
bytea *(* amoptions_function)(Datum reloptions, bool validate)
char * get_am_name(Oid amOid)
void free_attrmap(AttrMap *map)
AttrMap * build_attrmap_by_name(TupleDesc indesc, TupleDesc outdesc, bool missing_ok)
#define InvalidAttrNumber
char * get_tablespace_name(Oid spc_oid)
Oid get_tablespace_oid(const char *tablespacename, bool missing_ok)
Oid GetDefaultTablespace(char relpersistence, bool partitioned)
void pgstat_progress_start_command(ProgressCommandType cmdtype, Oid relid)
void pgstat_progress_incr_param(int index, int64 incr)
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
int bms_next_member(const Bitmapset *a, int prevbit)
bool bms_is_member(int x, const Bitmapset *a)
#define OidIsValid(objectId)
bool IsToastNamespace(Oid namespaceId)
bool IsSystemRelation(Relation relation)
bool IsCatalogRelationOid(Oid relid)
bool IsSystemClass(Oid relid, Form_pg_class reltuple)
bool contain_mutable_functions_after_planning(Expr *expr)
char * defGetString(DefElem *def)
bool defGetBoolean(DefElem *def)
void performMultipleDeletions(const ObjectAddresses *objects, DropBehavior behavior, int flags)
void add_exact_object_address(const ObjectAddress *object, ObjectAddresses *addrs)
ObjectAddresses * new_object_addresses(void)
@ DEPENDENCY_PARTITION_PRI
@ DEPENDENCY_PARTITION_SEC
#define PERFORM_DELETION_CONCURRENT_LOCK
#define PERFORM_DELETION_INTERNAL
int errmsg_internal(const char *fmt,...)
int errdetail(const char *fmt,...)
ErrorContextCallback * error_context_stack
int errhint(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void EventTriggerCollectSimpleCommand(ObjectAddress address, ObjectAddress secondaryObject, Node *parsetree)
#define palloc_object(type)
#define palloc_array(type, count)
Datum FunctionCall2Coll(FmgrInfo *flinfo, Oid collation, Datum arg1, Datum arg2)
void fmgr_info(Oid functionId, FmgrInfo *finfo)
void systable_endscan(SysScanDesc sysscan)
HeapTuple systable_getnext(SysScanDesc sysscan)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
bool allowSystemTableMods
int NewGUCNestLevel(void)
void RestrictSearchPath(void)
void AtEOXact_GUC(bool isCommit, int nestLevel)
int set_config_option(const char *name, const char *value, GucContext context, GucSource source, GucAction action, bool changeVal, int elevel, bool is_reload)
Assert(PointerIsAligned(start, uint64))
HeapTuple heap_getnext(TableScanDesc sscan, ScanDirection direction)
HeapTuple heap_copytuple(HeapTuple tuple)
bool heap_attisnull(HeapTuple tup, int attnum, TupleDesc tupleDesc)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
static void * GETSTRUCT(const HeapTupleData *tuple)
void validate_index(Oid heapId, Oid indexId, Snapshot snapshot)
Oid IndexGetRelation(Oid indexId, bool missing_ok)
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)
void index_concurrently_swap(Oid newIndexId, Oid oldIndexId, const char *oldName)
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)
bool reindex_relation(const ReindexStmt *stmt, Oid relid, int flags, const ReindexParams *params)
IndexInfo * BuildIndexInfo(Relation index)
Oid index_concurrently_create_copy(Relation heapRelation, Oid oldIndexId, Oid tablespaceOid, const char *newName)
void index_check_primary_key(Relation heapRel, const IndexInfo *indexInfo, bool is_alter_table, const IndexStmt *stmt)
void index_concurrently_build(Oid heapRelationId, Oid indexRelationId)
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_CONCURRENTLY
#define REINDEXOPT_MISSING_OK
#define INDEX_CREATE_INVALID
#define INDEX_CONSTR_CREATE_WITHOUT_OVERLAPS
#define INDEX_CREATE_ADD_CONSTRAINT
#define INDEX_CREATE_SKIP_BUILD
#define INDEX_CONSTR_CREATE_DEFERRABLE
#define REINDEXOPT_REPORT_PROGRESS
#define INDEX_CONSTR_CREATE_INIT_DEFERRED
#define INDEX_CREATE_CONCURRENT
#define REINDEXOPT_VERBOSE
#define REINDEX_REL_CHECK_CONSTRAINTS
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
static bool ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const ReindexParams *params)
void ExecReindex(ParseState *pstate, const ReindexStmt *stmt, bool isTopLevel)
static void set_indexsafe_procflags(void)
char * ChooseRelationName(const char *name1, const char *name2, const char *label, Oid namespaceid, bool isconstraint)
static void reindex_error_callback(void *arg)
ObjectAddress DefineIndex(ParseState *pstate, Oid tableId, IndexStmt *stmt, Oid indexRelationId, Oid parentIndexId, Oid parentConstraintId, int total_parts, bool is_alter_table, bool check_rights, bool check_not_in_use, bool skip_build, bool quiet)
static void ReindexIndex(const ReindexStmt *stmt, const ReindexParams *params, bool isTopLevel)
void IndexSetParentIndex(Relation partitionIdx, Oid parentOid)
char * makeObjectName(const char *name1, const char *name2, const char *label)
Oid GetDefaultOpClass(Oid type_id, Oid am_id)
static char * ChooseIndexNameAddition(const List *colnames)
static void ReindexMultipleTables(const ReindexStmt *stmt, const ReindexParams *params)
static bool CompareOpclassOptions(const Datum *opts1, const Datum *opts2, int natts)
static void update_relispartition(Oid relationId, bool newval)
bool CheckIndexCompatible(Oid oldId, const char *accessMethodName, const List *attributeList, const List *exclusionOpNames, bool isWithoutOverlaps)
void WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
Oid ResolveOpClass(const List *opclass, Oid attrType, const char *accessMethodName, Oid accessMethodId)
static void ReindexPartitions(const ReindexStmt *stmt, Oid relid, const ReindexParams *params, bool isTopLevel)
struct ReindexErrorInfo ReindexErrorInfo
static Oid ReindexTable(const ReindexStmt *stmt, const ReindexParams *params, bool isTopLevel)
static void CheckPredicate(Expr *predicate)
static void ReindexMultipleInternal(const ReindexStmt *stmt, const List *relids, const ReindexParams *params)
static void RangeVarCallbackForReindexIndex(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
static List * ChooseIndexColumnNames(const List *indexElems)
void GetOperatorFromCompareType(Oid opclass, Oid rhstype, CompareType cmptype, Oid *opid, StrategyNumber *strat)
static char * ChooseIndexName(const char *tabname, Oid namespaceId, const List *colnames, const List *exclusionOpNames, bool primary, bool isconstraint)
static void ComputeIndexAttrs(ParseState *pstate, IndexInfo *indexInfo, Oid *typeOids, Oid *collationOids, Oid *opclassOids, Datum *opclassOptions, int16 *colOptions, const List *attList, const List *exclusionOpNames, Oid relId, const char *accessMethodName, Oid accessMethodId, bool amcanorder, bool isconstraint, bool iswithoutoverlaps, Oid ddl_userid, int ddl_sec_context, int *ddl_save_nestlevel)
void CatalogTupleUpdate(Relation heapRel, const ItemPointerData *otid, HeapTuple tup)
void CatalogTupleDelete(Relation heapRel, const ItemPointerData *tid)
#define INJECTION_POINT(name, arg)
void CacheInvalidateRelcacheByRelid(Oid relid)
List * lcons_oid(Oid datum, List *list)
List * lappend(List *list, void *datum)
List * list_concat_copy(const List *list1, const List *list2)
List * lappend_oid(List *list, Oid datum)
void list_free(List *list)
void UnlockTuple(Relation relation, const ItemPointerData *tid, LOCKMODE lockmode)
void UnlockRelationOid(Oid relid, LOCKMODE lockmode)
void WaitForLockersMultiple(List *locktags, LOCKMODE lockmode, bool progress)
void LockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
void LockRelationOid(Oid relid, LOCKMODE lockmode)
void WaitForLockers(LOCKTAG heaplocktag, LOCKMODE lockmode, bool progress)
void UnlockRelationIdForSession(LockRelId *relid, LOCKMODE lockmode)
bool VirtualXactLock(VirtualTransactionId vxid, bool wait)
#define VirtualTransactionIdIsValid(vxid)
#define SET_LOCKTAG_RELATION(locktag, dboid, reloid)
#define VirtualTransactionIdEquals(vxid1, vxid2)
#define SetInvalidVirtualTransactionId(vxid)
#define AccessExclusiveLock
#define InplaceUpdateTupleLock
#define ShareUpdateExclusiveLock
char * get_rel_name(Oid relid)
Oid get_opclass_method(Oid opclass)
char get_rel_persistence(Oid relid)
bool get_index_isvalid(Oid index_oid)
Oid get_opclass_input_type(Oid opclass)
Oid get_opclass_family(Oid opclass)
Oid get_opfamily_member_for_cmptype(Oid opfamily, Oid lefttype, Oid righttype, CompareType cmptype)
bool get_opclass_opfamily_and_input_type(Oid opclass, Oid *opfamily, Oid *opcintype)
char * get_database_name(Oid dbid)
char * get_opname(Oid opno)
Datum get_attoptions(Oid relid, int16 attnum)
char get_rel_relkind(Oid relid)
Oid get_rel_namespace(Oid relid)
RegProcedure get_opcode(Oid opno)
int get_op_opfamily_strategy(Oid opno, Oid opfamily)
Oid get_opfamily_member(Oid opfamily, Oid lefttype, Oid righttype, int16 strategy)
char * get_opfamily_name(Oid opfid, bool missing_ok)
bool type_is_collatable(Oid typid)
Oid get_opfamily_method(Oid opfid)
Oid getBaseType(Oid typid)
char * get_namespace_name(Oid nspid)
Oid get_commutator(Oid opno)
void op_input_types(Oid opno, Oid *lefttype, Oid *righttype)
bool LWLockAcquire(LWLock *lock, LWLockMode mode)
void LWLockRelease(LWLock *lock)
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)
int pg_mbcliplen(const char *mbstr, int len, int limit)
char * pstrdup(const char *in)
void pfree(void *pointer)
void MemoryContextDelete(MemoryContext context)
MemoryContext PortalContext
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define ALLOCSET_SMALL_SIZES
#define IsBootstrapProcessingMode()
#define SECURITY_RESTRICTED_OPERATION
#define CHECK_FOR_INTERRUPTS()
void GetUserIdAndSecContext(Oid *userid, int *sec_context)
void SetUserIdAndSecContext(Oid userid, int sec_context)
Oid OpclassnameGetOpcid(Oid amid, const char *opcname)
char * NameListToString(const List *names)
Oid LookupExplicitNamespace(const char *nspname, bool missing_ok)
bool isTempNamespace(Oid namespaceId)
Oid get_collation_oid(List *collname, bool missing_ok)
void DeconstructQualifiedName(const List *names, char **nspname_p, char **objname_p)
Oid get_namespace_oid(const char *nspname, bool missing_ok)
Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, uint32 flags, RangeVarGetRelidCallback callback, void *callback_arg)
Oid exprType(const Node *expr)
Oid exprCollation(const Node *expr)
#define IsA(nodeptr, _type_)
const ObjectAddress InvalidObjectAddress
#define ObjectAddressSet(addr, class_id, object_id)
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
TYPCATEGORY TypeCategory(Oid type)
bool IsBinaryCoercible(Oid srctype, Oid targettype)
bool IsPreferredType(TYPCATEGORY category, Oid type)
int parser_errposition(ParseState *pstate, int location)
Oid compatible_oper_opid(List *op, Oid arg1, Oid arg2, bool noError)
IndexStmt * generateClonedIndexStmt(RangeVar *heapRel, Relation source_idx, const AttrMap *attmap, Oid *constraintOid)
@ PARTITION_STRATEGY_HASH
@ REINDEX_OBJECT_DATABASE
PartitionKey RelationGetPartitionKey(Relation rel)
PartitionDesc RelationGetPartitionDesc(Relation rel, bool omit_detached)
FormData_pg_am * Form_pg_am
FormData_pg_attribute * Form_pg_attribute
static void fix_dependencies(ArchiveHandle *AH)
int errdetail_relkind_not_supported(char relkind)
FormData_pg_class * Form_pg_class
Oid get_relation_idx_constraint_oid(Oid relationId, Oid indexId)
void ConstraintSetParentConstraint(Oid childConstrId, Oid parentConstrId, Oid childTableId)
bool ConstraintNameExists(const char *conname, Oid namespaceid)
void recordDependencyOn(const ObjectAddress *depender, const ObjectAddress *referenced, DependencyType behavior)
long deleteDependencyRecordsForClass(Oid classId, Oid objectId, Oid refclassId, char deptype)
FormData_pg_index * Form_pg_index
List * find_all_inheritors(Oid parentrelId, LOCKMODE lockmode, List **numparents)
void StoreSingleInheritance(Oid relationId, Oid parentOid, int32 seqNumber)
bool has_superclass(Oid relationId)
FormData_pg_inherits * Form_pg_inherits
static int list_length(const List *l)
#define forboth(cell1, list1, cell2, list2)
#define list_make1_oid(x1)
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)
static char buf[DEFAULT_XLOG_SEG_SIZE]
size_t strlcpy(char *dst, const char *src, size_t siz)
static bool DatumGetBool(Datum X)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Pointer DatumGetPointer(Datum X)
static Datum CStringGetDatum(const char *X)
static Datum Int32GetDatum(int32 X)
#define PROC_IS_AUTOVACUUM
VirtualTransactionId * GetCurrentVirtualXIDs(TransactionId limitXmin, bool excludeXmin0, bool allDbs, int excludeVacuum, int *nvxids)
PGPROC * ProcNumberGetProc(ProcNumber procNumber)
#define PROGRESS_CREATEIDX_PHASE_WAIT_4
#define PROGRESS_CREATEIDX_PHASE_BUILD
#define PROGRESS_CREATEIDX_PARTITIONS_DONE
#define PROGRESS_CREATEIDX_PHASE_WAIT_1
#define PROGRESS_CREATEIDX_COMMAND_CREATE_CONCURRENTLY
#define PROGRESS_CREATEIDX_ACCESS_METHOD_OID
#define PROGRESS_WAITFOR_DONE
#define PROGRESS_CREATEIDX_PHASE_WAIT_3
#define PROGRESS_WAITFOR_TOTAL
#define PROGRESS_CREATEIDX_COMMAND_REINDEX_CONCURRENTLY
#define PROGRESS_CREATEIDX_COMMAND_CREATE
#define PROGRESS_WAITFOR_CURRENT_PID
#define PROGRESS_CREATEIDX_PHASE_WAIT_2
#define PROGRESS_CREATEIDX_PHASE
#define PROGRESS_CREATEIDX_PHASE_VALIDATE_IDXSCAN
#define PROGRESS_CREATEIDX_PHASE_WAIT_5
#define PROGRESS_CREATEIDX_INDEX_OID
#define PROGRESS_CREATEIDX_PARTITIONS_TOTAL
#define PROGRESS_CREATEIDX_COMMAND
char * format_operator(Oid operator_oid)
#define RelationGetRelid(relation)
#define RelationGetDescr(relation)
#define RelationGetRelationName(relation)
#define RELATION_IS_OTHER_TEMP(relation)
#define RelationGetNamespace(relation)
List * RelationGetIndexList(Relation relation)
List * RelationGetIndexPredicate(Relation relation)
List * RelationGetIndexExpressions(Relation relation)
void RelationGetExclusionInfo(Relation indexRelation, Oid **operators, Oid **procs, uint16 **strategies)
bytea * index_reloptions(amoptions_function amoptions, Datum reloptions, bool validate)
Datum transformRelOptions(Datum oldOptions, List *defList, const char *nameSpace, const char *const validnsps[], bool acceptOidsOff, bool isReset)
#define RelFileNumberIsValid(relnumber)
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Snapshot GetTransactionSnapshot(void)
void UnregisterSnapshot(Snapshot snapshot)
void PushActiveSnapshot(Snapshot snapshot)
bool ActiveSnapshotSet(void)
Snapshot RegisterSnapshot(Snapshot snapshot)
void PopActiveSnapshot(void)
#define InitDirtySnapshot(snapshotdata)
void relation_close(Relation relation, LOCKMODE lockmode)
Relation relation_open(Oid relationId, LOCKMODE lockmode)
#define HTEqualStrategyNumber
#define BTEqualStrategyNumber
#define ERRCODE_DUPLICATE_OBJECT
struct ErrorContextCallback * previous
void(* callback)(void *arg)
amoptions_function amoptions
amgettuple_function amgettuple
SortByNulls nulls_ordering
uint16 * ii_ExclusionStrats
AttrNumber ii_IndexAttrNumbers[INDEX_MAX_KEYS]
Oid values[FLEXIBLE_ARRAY_MEMBER]
#define FirstLowInvalidHeapAttributeNumber
void ReleaseSysCache(HeapTuple tuple)
HeapTuple SearchSysCacheLockedCopy1(int cacheId, Datum key1)
HeapTuple SearchSysCache1(int cacheId, Datum key1)
HeapTuple SearchSysCache3(int cacheId, Datum key1, Datum key2, Datum key3)
HeapTuple SearchSysCacheAttName(Oid relid, const char *attname)
Datum SysCacheGetAttrNotNull(int cacheId, HeapTuple tup, AttrNumber attributeNumber)
#define SearchSysCacheExists1(cacheId, key1)
Relation try_table_open(Oid relationId, LOCKMODE lockmode)
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
TableScanDesc table_beginscan_catalog(Relation relation, int nkeys, ScanKeyData *key)
static void table_endscan(TableScanDesc scan)
void CheckTableNotInUse(Relation rel, const char *stmt)
void SetRelationHasSubclass(Oid relationId, bool relhassubclass)
void RangeVarCallbackMaintainsTable(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg)
#define InvalidTransactionId
static FormData_pg_attribute * TupleDescAttr(TupleDesc tupdesc, int i)
void pull_varattnos(Node *node, Index varno, Bitmapset **varattnos)
void CommandCounterIncrement(void)
void PreventInTransactionBlock(bool isTopLevel, const char *stmtType)
void StartTransactionCommand(void)
void CommitTransactionCommand(void)