aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser/analyze.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser/analyze.c')
-rw-r--r--src/backend/parser/analyze.c61
1 files changed, 27 insertions, 34 deletions
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index dbd8faf319b..8e23170ac8a 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -6,7 +6,7 @@
* Portions Copyright (c) 1996-2000, PostgreSQL, Inc
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: analyze.c,v 1.147 2000/06/12 19:40:40 momjian Exp $
+ * $Id: analyze.c,v 1.148 2000/06/17 21:48:40 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -27,6 +27,8 @@
#include "parser/parse_type.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
+#include "utils/relcache.h"
+#include "utils/syscache.h"
void CheckSelectForUpdate(Query *qry); /* no points for style... */
@@ -2003,13 +2005,9 @@ transformFkeyGetPrimaryKey(FkConstraint *fkconstraint)
{
Relation pkrel;
Form_pg_attribute *pkrel_attrs;
- Relation indexRd;
- HeapScanDesc indexSd;
- ScanKeyData key;
- HeapTuple indexTup;
+ List *indexoidlist,
+ *indexoidscan;
Form_pg_index indexStruct = NULL;
- Ident *pkattr;
- int pkattno;
int i;
/* ----------
@@ -2023,37 +2021,37 @@ transformFkeyGetPrimaryKey(FkConstraint *fkconstraint)
pkrel_attrs = pkrel->rd_att->attrs;
/* ----------
- * Open pg_index and begin a scan for all indices defined on
- * the referenced table
+ * Get the list of index OIDs for the table from the relcache,
+ * and look up each one in the pg_index syscache until we find one
+ * marked primary key (hopefully there isn't more than one such).
* ----------
*/
- indexRd = heap_openr(IndexRelationName, AccessShareLock);
- ScanKeyEntryInitialize(&key, 0, Anum_pg_index_indrelid,
- F_OIDEQ,
- ObjectIdGetDatum(pkrel->rd_id));
- indexSd = heap_beginscan(indexRd, /* scan desc */
- false, /* scan backward flag */
- SnapshotNow, /* NOW snapshot */
- 1, /* number scan keys */
- &key); /* scan keys */
+ indexoidlist = RelationGetIndexList(pkrel);
- /* ----------
- * Fetch the index with indisprimary == true
- * ----------
- */
- while (HeapTupleIsValid(indexTup = heap_getnext(indexSd, 0)))
+ foreach(indexoidscan, indexoidlist)
{
- indexStruct = (Form_pg_index) GETSTRUCT(indexTup);
-
+ Oid indexoid = lfirsti(indexoidscan);
+ HeapTuple indexTuple;
+
+ indexTuple = SearchSysCacheTuple(INDEXRELID,
+ ObjectIdGetDatum(indexoid),
+ 0, 0, 0);
+ if (!HeapTupleIsValid(indexTuple))
+ elog(ERROR, "transformFkeyGetPrimaryKey: index %u not found",
+ indexoid);
+ indexStruct = (Form_pg_index) GETSTRUCT(indexTuple);
if (indexStruct->indisprimary)
break;
+ indexStruct = NULL;
}
+ freeList(indexoidlist);
+
/* ----------
* Check that we found it
* ----------
*/
- if (!HeapTupleIsValid(indexTup))
+ if (indexStruct == NULL)
elog(ERROR, "PRIMARY KEY for referenced table \"%s\" not found",
fkconstraint->pktable_name);
@@ -2064,8 +2062,9 @@ transformFkeyGetPrimaryKey(FkConstraint *fkconstraint)
*/
for (i = 0; i < INDEX_MAX_KEYS && indexStruct->indkey[i] != 0; i++)
{
- pkattno = indexStruct->indkey[i];
- pkattr = (Ident *) makeNode(Ident);
+ int pkattno = indexStruct->indkey[i];
+ Ident *pkattr = makeNode(Ident);
+
pkattr->name = nameout(&(pkrel_attrs[pkattno - 1]->attname));
pkattr->indirection = NIL;
pkattr->isRel = false;
@@ -2073,12 +2072,6 @@ transformFkeyGetPrimaryKey(FkConstraint *fkconstraint)
fkconstraint->pk_attrs = lappend(fkconstraint->pk_attrs, pkattr);
}
- /* ----------
- * End index scan and close relations
- * ----------
- */
- heap_endscan(indexSd);
- heap_close(indexRd, AccessShareLock);
heap_close(pkrel, AccessShareLock);
}