currval.patch
text/x-patch
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/access/transam/gtm.c | 26 | 3 |
| src/backend/commands/sequence.c | 19 | 2 |
| src/include/access/gtm.h | 3 | 0 |
diff --git a/src/backend/access/transam/gtm.c b/src/backend/access/transam/gtm.c
index c3cb72b..3be8d20 100644
--- a/src/backend/access/transam/gtm.c
+++ b/src/backend/access/transam/gtm.c
@@ -172,7 +172,7 @@ GetSnapshotGTM(GlobalTransactionId gxid, bool canbe_grouped)
}
-/**
+/*
* Create a sequence on the GTM.
*
*
@@ -189,7 +189,30 @@ CreateSequenceGTM(char *seqname, GTM_Sequence increment, GTM_Sequence minval,
return conn ? open_sequence(conn, &seqkey, increment, minval, maxval, startval, cycle) : 0;
}
-/**
+/*
+ * get the current sequence value
+ */
+
+GTM_Sequence
+GetCurrentValGTM(char *seqname)
+{
+ GTM_Sequence ret = -1;
+ GTM_SequenceKeyData seqkey;
+ CheckConnection();
+ seqkey.gsk_keylen = strlen(seqname);
+ seqkey.gsk_key = seqname;
+
+ if (conn)
+ ret = get_current(conn, &seqkey);
+ if (ret < 0)
+ {
+ CloseGTM();
+ InitGTM();
+ }
+ return ret;
+}
+
+/*
* Get the next sequence value
*/
GTM_Sequence
@@ -211,7 +234,7 @@ GetNextValGTM(char *seqname)
return ret;
}
-/**
+/*
* Drop the sequence
*/
int
diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c
index ba9a932..5df50a3 100644
--- a/src/backend/commands/sequence.c
+++ b/src/backend/commands/sequence.c
@@ -533,8 +533,8 @@ nextval_internal(Oid relid)
result = (int64) GetNextValGTM(RelationGetRelationName(seqrel));
if (result < 0)
ereport(ERROR,
- (errcode(ERRCODE_CONNECTION_FAILURE),
- errmsg("GTM error, could not obtain sequence value")));
+ (errcode(ERRCODE_CONNECTION_FAILURE),
+ errmsg("GTM error, could not obtain sequence value")));
} else
{
#endif
@@ -714,6 +714,19 @@ currval_oid(PG_FUNCTION_ARGS)
/* open and AccessShareLock sequence */
init_sequence(relid, &elm, &seqrel);
+#ifdef PGXC
+ if (IS_PGXC_COORDINATOR)
+ {
+ result = (int64) GetCurrentValGTM(RelationGetRelationName(seqrel));
+ if (result < 0)
+ ereport(ERROR,
+ (errcode(ERRCODE_CONNECTION_FAILURE),
+ errmsg("GTM error, could not obtain sequence value")));
+ }
+ else
+ {
+#endif
+
if (pg_class_aclcheck(elm->relid, GetUserId(), ACL_SELECT) != ACLCHECK_OK &&
pg_class_aclcheck(elm->relid, GetUserId(), ACL_USAGE) != ACLCHECK_OK)
ereport(ERROR,
@@ -729,6 +742,10 @@ currval_oid(PG_FUNCTION_ARGS)
result = elm->last;
+#ifdef PGXC
+ }
+#endif
+
relation_close(seqrel, NoLock);
PG_RETURN_INT64(result);
diff --git a/src/include/access/gtm.h b/src/include/access/gtm.h
index 66ca3f1..88de4d8 100644
--- a/src/include/access/gtm.h
+++ b/src/include/access/gtm.h
@@ -25,6 +25,9 @@ extern GlobalTransactionId BeginTranAutovacuumGTM(void);
extern int CommitTranGTM(GlobalTransactionId gxid);
extern int RollbackTranGTM(GlobalTransactionId gxid);
extern GTM_Snapshot GetSnapshotGTM(GlobalTransactionId gxid, bool canbe_grouped);
+
+/* Sequence interface APIs with GTM */
+extern GTM_Sequence GetCurrentValGTM(char *seqname);
extern GTM_Sequence GetNextValGTM(char *seqname);
extern int CreateSequenceGTM(char *seqname, GTM_Sequence increment,
GTM_Sequence minval, GTM_Sequence maxval, GTM_Sequence startval,