aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/sequence.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/commands/sequence.c')
-rw-r--r--src/backend/commands/sequence.c62
1 files changed, 31 insertions, 31 deletions
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index 228aaba7990..ad81df23167 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -388,57 +388,57 @@ static SeqTable
init_sequence(char *caller, char *name)
{
SeqTable elm,
- priv = (SeqTable) NULL;
- SeqTable temp;
+ prev = (SeqTable) NULL;
+ Relation seqrel;
- for (elm = seqtab; elm != (SeqTable) NULL;)
+ /* Look to see if we already have a seqtable entry for name */
+ for (elm = seqtab; elm != (SeqTable) NULL; elm = elm->next)
{
if (strcmp(elm->name, name) == 0)
break;
- priv = elm;
- elm = elm->next;
+ prev = elm;
}
- if (elm == (SeqTable) NULL) /* not found */
- {
- temp = (SeqTable) malloc(sizeof(SeqTableData));
- temp->name = malloc(strlen(name) + 1);
- strcpy(temp->name, name);
- temp->rel = (Relation) NULL;
- temp->cached = temp->last = temp->increment = 0;
- temp->next = (SeqTable) NULL;
- }
- else
-/* found */
- {
- if (elm->rel != (Relation) NULL) /* already opened */
- return elm;
- temp = elm;
- }
+ /* If so, and if it's already been opened in this xact, just return it */
+ if (elm != (SeqTable) NULL && elm->rel != (Relation) NULL)
+ return elm;
- temp->rel = heap_openr(name, AccessShareLock);
-
- if (temp->rel->rd_rel->relkind != RELKIND_SEQUENCE)
+ /* Else open and check it */
+ seqrel = heap_openr(name, AccessShareLock);
+ if (seqrel->rd_rel->relkind != RELKIND_SEQUENCE)
elog(ERROR, "%s.%s: %s is not sequence !", name, caller, name);
- if (elm != (SeqTable) NULL) /* we opened sequence from our */
- { /* SeqTable - check relid ! */
- if (RelationGetRelid(elm->rel) != elm->relid)
+ if (elm != (SeqTable) NULL)
+ {
+ /* We are using a seqtable entry left over from a previous xact;
+ * must check for relid change.
+ */
+ elm->rel = seqrel;
+ if (RelationGetRelid(seqrel) != elm->relid)
{
elog(NOTICE, "%s.%s: sequence was re-created",
name, caller, name);
+ elm->relid = RelationGetRelid(seqrel);
elm->cached = elm->last = elm->increment = 0;
- elm->relid = RelationGetRelid(elm->rel);
}
}
else
{
- elm = temp;
- elm->relid = RelationGetRelid(elm->rel);
+ /* Time to make a new seqtable entry. These entries live as long
+ * as the backend does, so we use plain malloc for them.
+ */
+ elm = (SeqTable) malloc(sizeof(SeqTableData));
+ elm->name = malloc(strlen(name) + 1);
+ strcpy(elm->name, name);
+ elm->rel = seqrel;
+ elm->relid = RelationGetRelid(seqrel);
+ elm->cached = elm->last = elm->increment = 0;
+ elm->next = (SeqTable) NULL;
+
if (seqtab == (SeqTable) NULL)
seqtab = elm;
else
- priv->next = elm;
+ prev->next = elm;
}
return elm;