Change get_constraint_index() to use pg_constraint.conindid
It was still using a scan of pg_depend instead of using the conindid column that has been added since. Since it is now just a catalog lookup wrapper and not related to pg_depend, move from pg_depend.c to lsyscache.c. Reviewed-by: Matthias van de Meent <boekewurm+postgres@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://www.postgresql.org/message-id/flat/4688d55c-9a2e-9a5a-d166-5f24fe0bf8db%40enterprisedb.com
This commit is contained in:
parent
16c302f512
commit
8b069ef5dc
|
@ -968,75 +968,6 @@ getIdentitySequence(Oid relid, AttrNumber attnum, bool missing_ok)
|
|||
return linitial_oid(seqlist);
|
||||
}
|
||||
|
||||
/*
|
||||
* get_constraint_index
|
||||
* Given the OID of a unique, primary-key, or exclusion constraint,
|
||||
* return the OID of the underlying index.
|
||||
*
|
||||
* Return InvalidOid if the index couldn't be found; this suggests the
|
||||
* given OID is bogus, but we leave it to caller to decide what to do.
|
||||
*/
|
||||
Oid
|
||||
get_constraint_index(Oid constraintId)
|
||||
{
|
||||
Oid indexId = InvalidOid;
|
||||
Relation depRel;
|
||||
ScanKeyData key[3];
|
||||
SysScanDesc scan;
|
||||
HeapTuple tup;
|
||||
|
||||
/* Search the dependency table for the dependent index */
|
||||
depRel = table_open(DependRelationId, AccessShareLock);
|
||||
|
||||
ScanKeyInit(&key[0],
|
||||
Anum_pg_depend_refclassid,
|
||||
BTEqualStrategyNumber, F_OIDEQ,
|
||||
ObjectIdGetDatum(ConstraintRelationId));
|
||||
ScanKeyInit(&key[1],
|
||||
Anum_pg_depend_refobjid,
|
||||
BTEqualStrategyNumber, F_OIDEQ,
|
||||
ObjectIdGetDatum(constraintId));
|
||||
ScanKeyInit(&key[2],
|
||||
Anum_pg_depend_refobjsubid,
|
||||
BTEqualStrategyNumber, F_INT4EQ,
|
||||
Int32GetDatum(0));
|
||||
|
||||
scan = systable_beginscan(depRel, DependReferenceIndexId, true,
|
||||
NULL, 3, key);
|
||||
|
||||
while (HeapTupleIsValid(tup = systable_getnext(scan)))
|
||||
{
|
||||
Form_pg_depend deprec = (Form_pg_depend) GETSTRUCT(tup);
|
||||
|
||||
/*
|
||||
* We assume any internal dependency of an index on the constraint
|
||||
* must be what we are looking for.
|
||||
*/
|
||||
if (deprec->classid == RelationRelationId &&
|
||||
deprec->objsubid == 0 &&
|
||||
deprec->deptype == DEPENDENCY_INTERNAL)
|
||||
{
|
||||
char relkind = get_rel_relkind(deprec->objid);
|
||||
|
||||
/*
|
||||
* This is pure paranoia; there shouldn't be any other relkinds
|
||||
* dependent on a constraint.
|
||||
*/
|
||||
if (relkind != RELKIND_INDEX &&
|
||||
relkind != RELKIND_PARTITIONED_INDEX)
|
||||
continue;
|
||||
|
||||
indexId = deprec->objid;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
systable_endscan(scan);
|
||||
table_close(depRel, AccessShareLock);
|
||||
|
||||
return indexId;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_index_constraint
|
||||
* Given the OID of an index, return the OID of the owning unique,
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include "access/xact.h"
|
||||
#include "access/xlog.h"
|
||||
#include "catalog/catalog.h"
|
||||
#include "catalog/dependency.h"
|
||||
#include "catalog/heap.h"
|
||||
#include "catalog/index.h"
|
||||
#include "catalog/namespace.h"
|
||||
|
|
|
@ -26,7 +26,6 @@
|
|||
#include "access/transam.h"
|
||||
#include "access/xlog.h"
|
||||
#include "catalog/catalog.h"
|
||||
#include "catalog/dependency.h"
|
||||
#include "catalog/heap.h"
|
||||
#include "catalog/index.h"
|
||||
#include "catalog/pg_am.h"
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include "access/relation.h"
|
||||
#include "access/sysattr.h"
|
||||
#include "access/table.h"
|
||||
#include "catalog/dependency.h"
|
||||
#include "catalog/pg_aggregate.h"
|
||||
#include "catalog/pg_am.h"
|
||||
#include "catalog/pg_authid.h"
|
||||
|
@ -2140,7 +2139,7 @@ pg_get_constraintdef_worker(Oid constraintId, bool fullCommand,
|
|||
|
||||
appendStringInfoChar(&buf, ')');
|
||||
|
||||
indexId = get_constraint_index(constraintId);
|
||||
indexId = conForm->conindid;
|
||||
|
||||
/* Build including column list (from pg_index.indkeys) */
|
||||
indtup = SearchSysCache1(INDEXRELID, ObjectIdGetDatum(indexId));
|
||||
|
|
|
@ -1094,6 +1094,33 @@ get_constraint_name(Oid conoid)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* get_constraint_index
|
||||
* Given the OID of a unique, primary-key, or exclusion constraint,
|
||||
* return the OID of the underlying index.
|
||||
*
|
||||
* Return InvalidOid if the index couldn't be found; this suggests the
|
||||
* given OID is bogus, but we leave it to caller to decide what to do.
|
||||
*/
|
||||
Oid
|
||||
get_constraint_index(Oid conoid)
|
||||
{
|
||||
HeapTuple tp;
|
||||
|
||||
tp = SearchSysCache1(CONSTROID, ObjectIdGetDatum(conoid));
|
||||
if (HeapTupleIsValid(tp))
|
||||
{
|
||||
Form_pg_constraint contup = (Form_pg_constraint) GETSTRUCT(tp);
|
||||
Oid result;
|
||||
|
||||
result = contup->conindid;
|
||||
ReleaseSysCache(tp);
|
||||
return result;
|
||||
}
|
||||
else
|
||||
return InvalidOid;
|
||||
}
|
||||
|
||||
/* ---------- LANGUAGE CACHE ---------- */
|
||||
|
||||
char *
|
||||
|
|
|
@ -235,8 +235,6 @@ extern bool sequenceIsOwned(Oid seqId, char deptype, Oid *tableId, int32 *colId)
|
|||
extern List *getOwnedSequences(Oid relid);
|
||||
extern Oid getIdentitySequence(Oid relid, AttrNumber attnum, bool missing_ok);
|
||||
|
||||
extern Oid get_constraint_index(Oid constraintId);
|
||||
|
||||
extern Oid get_index_constraint(Oid indexId);
|
||||
|
||||
extern List *get_index_ref_constraints(Oid indexId);
|
||||
|
|
|
@ -96,6 +96,7 @@ extern Oid get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);
|
|||
extern char *get_collation_name(Oid colloid);
|
||||
extern bool get_collation_isdeterministic(Oid colloid);
|
||||
extern char *get_constraint_name(Oid conoid);
|
||||
extern Oid get_constraint_index(Oid conoid);
|
||||
extern char *get_language_name(Oid langoid, bool missing_ok);
|
||||
extern Oid get_opclass_family(Oid opclass);
|
||||
extern Oid get_opclass_input_type(Oid opclass);
|
||||
|
|
Loading…
Reference in New Issue