aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils')
-rw-r--r--src/backend/utils/cache/relcache.c78
1 files changed, 37 insertions, 41 deletions
diff --git a/src/backend/utils/cache/relcache.c b/src/backend/utils/cache/relcache.c
index 686fcc8416b..983055ef783 100644
--- a/src/backend/utils/cache/relcache.c
+++ b/src/backend/utils/cache/relcache.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.161 2002/04/18 20:01:09 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/cache/relcache.c,v 1.162 2002/04/19 16:36:08 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -635,10 +635,10 @@ RelationBuildRuleLock(Relation relation)
{
MemoryContext rulescxt;
MemoryContext oldcxt;
- HeapTuple pg_rewrite_tuple;
- Relation pg_rewrite_desc;
- TupleDesc pg_rewrite_tupdesc;
- SysScanDesc pg_rewrite_scan;
+ HeapTuple rewrite_tuple;
+ Relation rewrite_desc;
+ TupleDesc rewrite_tupdesc;
+ SysScanDesc rewrite_scan;
ScanKeyData key;
RuleLock *rulelock;
int numlocks;
@@ -657,7 +657,7 @@ RelationBuildRuleLock(Relation relation)
relation->rd_rulescxt = rulescxt;
/*
- * form an array to hold the rewrite rules (the array is extended if
+ * allocate an array to hold the rewrite rules (the array is extended if
* necessary)
*/
maxlocks = 4;
@@ -675,18 +675,22 @@ RelationBuildRuleLock(Relation relation)
/*
* open pg_rewrite and begin a scan
- */
- pg_rewrite_desc = heap_openr(RewriteRelationName, AccessShareLock);
- pg_rewrite_tupdesc = RelationGetDescr(pg_rewrite_desc);
- pg_rewrite_scan = systable_beginscan(pg_rewrite_desc,
- RewriteRelRulenameIndex,
- criticalRelcachesBuilt,
- SnapshotNow,
- 1, &key);
-
- while (HeapTupleIsValid(pg_rewrite_tuple = systable_getnext(pg_rewrite_scan)))
+ *
+ * Note: since we scan the rules using RewriteRelRulenameIndex,
+ * we will be reading the rules in name order, except possibly
+ * during emergency-recovery operations (ie, IsIgnoringSystemIndexes).
+ * This in turn ensures that rules will be fired in name order.
+ */
+ rewrite_desc = heap_openr(RewriteRelationName, AccessShareLock);
+ rewrite_tupdesc = RelationGetDescr(rewrite_desc);
+ rewrite_scan = systable_beginscan(rewrite_desc,
+ RewriteRelRulenameIndex,
+ true, SnapshotNow,
+ 1, &key);
+
+ while (HeapTupleIsValid(rewrite_tuple = systable_getnext(rewrite_scan)))
{
- Form_pg_rewrite rewrite_form = (Form_pg_rewrite) GETSTRUCT(pg_rewrite_tuple);
+ Form_pg_rewrite rewrite_form = (Form_pg_rewrite) GETSTRUCT(rewrite_tuple);
bool isnull;
Datum ruleaction;
Datum rule_evqual;
@@ -697,7 +701,7 @@ RelationBuildRuleLock(Relation relation)
rule = (RewriteRule *) MemoryContextAlloc(rulescxt,
sizeof(RewriteRule));
- rule->ruleId = pg_rewrite_tuple->t_data->t_oid;
+ rule->ruleId = rewrite_tuple->t_data->t_oid;
rule->event = rewrite_form->ev_type - '0';
rule->attrno = rewrite_form->ev_attr;
@@ -705,9 +709,9 @@ RelationBuildRuleLock(Relation relation)
/* Must use heap_getattr to fetch ev_qual and ev_action */
- ruleaction = heap_getattr(pg_rewrite_tuple,
+ ruleaction = heap_getattr(rewrite_tuple,
Anum_pg_rewrite_ev_action,
- pg_rewrite_tupdesc,
+ rewrite_tupdesc,
&isnull);
Assert(!isnull);
ruleaction_str = DatumGetCString(DirectFunctionCall1(textout,
@@ -717,13 +721,13 @@ RelationBuildRuleLock(Relation relation)
MemoryContextSwitchTo(oldcxt);
pfree(ruleaction_str);
- rule_evqual = heap_getattr(pg_rewrite_tuple,
+ rule_evqual = heap_getattr(rewrite_tuple,
Anum_pg_rewrite_ev_qual,
- pg_rewrite_tupdesc,
+ rewrite_tupdesc,
&isnull);
Assert(!isnull);
rule_evqual_str = DatumGetCString(DirectFunctionCall1(textout,
- rule_evqual));
+ rule_evqual));
oldcxt = MemoryContextSwitchTo(rulescxt);
rule->qual = (Node *) stringToNode(rule_evqual_str);
MemoryContextSwitchTo(oldcxt);
@@ -741,8 +745,8 @@ RelationBuildRuleLock(Relation relation)
/*
* end the scan and close the attribute relation
*/
- systable_endscan(pg_rewrite_scan);
- heap_close(pg_rewrite_desc, AccessShareLock);
+ systable_endscan(rewrite_scan);
+ heap_close(rewrite_desc, AccessShareLock);
/*
* form a RuleLock and insert into relation
@@ -764,9 +768,13 @@ RelationBuildRuleLock(Relation relation)
static bool
equalRuleLocks(RuleLock *rlock1, RuleLock *rlock2)
{
- int i,
- j;
+ int i;
+ /*
+ * As of 7.3 we assume the rule ordering is repeatable,
+ * because RelationBuildRuleLock should read 'em in a
+ * consistent order. So just compare corresponding slots.
+ */
if (rlock1 != NULL)
{
if (rlock2 == NULL)
@@ -776,21 +784,9 @@ equalRuleLocks(RuleLock *rlock1, RuleLock *rlock2)
for (i = 0; i < rlock1->numLocks; i++)
{
RewriteRule *rule1 = rlock1->rules[i];
- RewriteRule *rule2 = NULL;
+ RewriteRule *rule2 = rlock2->rules[i];
- /*
- * We can't assume that the rules are always read from
- * pg_rewrite in the same order; so use the rule OIDs to
- * identify the rules to compare. (We assume here that the
- * same OID won't appear twice in either ruleset.)
- */
- for (j = 0; j < rlock2->numLocks; j++)
- {
- rule2 = rlock2->rules[j];
- if (rule1->ruleId == rule2->ruleId)
- break;
- }
- if (j >= rlock2->numLocks)
+ if (rule1->ruleId != rule2->ruleId)
return false;
if (rule1->event != rule2->event)
return false;