summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Paquier2012-05-29 07:03:15 +0000
committerMichael Paquier2012-05-29 07:07:21 +0000
commit41e78f38c0caf6ce41f148bc853e1869e06301b0 (patch)
tree63b5e1e0958760d8014dbec1a6e8027857711b08 /src
parent1e42775468b013c840a3c170108fd439716c9c04 (diff)
Reinforce ALTER SEQUENCE handling on GTM for START/RESTART
Successive ALTER SEQUENCE with START/RESTART requests was messing the start value of sequences involved. Handling of sequence key string is reinforced to take into account the last "\0" when this data is sent from client. This was causing GTM to deal with sequence names with incorrect last characters, resulting in strange logs. Per report from Hitoshi Hemmi
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/gtm.c16
-rw-r--r--src/gtm/main/gtm_seq.c24
2 files changed, 21 insertions, 19 deletions
diff --git a/src/backend/access/transam/gtm.c b/src/backend/access/transam/gtm.c
index 27acfb202d..7e9593aa1a 100644
--- a/src/backend/access/transam/gtm.c
+++ b/src/backend/access/transam/gtm.c
@@ -343,7 +343,7 @@ CreateSequenceGTM(char *seqname, GTM_Sequence increment, GTM_Sequence minval,
{
GTM_SequenceKeyData seqkey;
CheckConnection();
- seqkey.gsk_keylen = strlen(seqname);
+ seqkey.gsk_keylen = strlen(seqname) + 1;
seqkey.gsk_key = seqname;
return conn ? open_sequence(conn, &seqkey, increment, minval, maxval, startval, cycle) : 0;
@@ -358,7 +358,7 @@ AlterSequenceGTM(char *seqname, GTM_Sequence increment, GTM_Sequence minval,
{
GTM_SequenceKeyData seqkey;
CheckConnection();
- seqkey.gsk_keylen = strlen(seqname);
+ seqkey.gsk_keylen = strlen(seqname) + 1;
seqkey.gsk_key = seqname;
return conn ? alter_sequence(conn, &seqkey, increment, minval, maxval, startval, lastval, cycle, is_restart) : 0;
@@ -374,7 +374,7 @@ GetCurrentValGTM(char *seqname)
GTM_Sequence ret = -1;
GTM_SequenceKeyData seqkey;
CheckConnection();
- seqkey.gsk_keylen = strlen(seqname);
+ seqkey.gsk_keylen = strlen(seqname) + 1;
seqkey.gsk_key = seqname;
if (conn)
@@ -396,7 +396,7 @@ GetNextValGTM(char *seqname)
GTM_Sequence ret = -1;
GTM_SequenceKeyData seqkey;
CheckConnection();
- seqkey.gsk_keylen = strlen(seqname);
+ seqkey.gsk_keylen = strlen(seqname) + 1;
seqkey.gsk_key = seqname;
if (conn)
@@ -417,7 +417,7 @@ SetValGTM(char *seqname, GTM_Sequence nextval, bool iscalled)
{
GTM_SequenceKeyData seqkey;
CheckConnection();
- seqkey.gsk_keylen = strlen(seqname);
+ seqkey.gsk_keylen = strlen(seqname) + 1;
seqkey.gsk_key = seqname;
return conn ? set_val(conn, &seqkey, nextval, iscalled) : -1;
@@ -435,7 +435,7 @@ DropSequenceGTM(char *name, GTM_SequenceKeyType type)
{
GTM_SequenceKeyData seqkey;
CheckConnection();
- seqkey.gsk_keylen = strlen(name);
+ seqkey.gsk_keylen = strlen(name) + 1;
seqkey.gsk_key = name;
seqkey.gsk_type = type;
@@ -450,9 +450,9 @@ RenameSequenceGTM(char *seqname, const char *newseqname)
{
GTM_SequenceKeyData seqkey, newseqkey;
CheckConnection();
- seqkey.gsk_keylen = strlen(seqname);
+ seqkey.gsk_keylen = strlen(seqname) + 1;
seqkey.gsk_key = seqname;
- newseqkey.gsk_keylen = strlen(newseqname);
+ newseqkey.gsk_keylen = strlen(newseqname) + 1;
newseqkey.gsk_key = (char *) newseqname;
return conn ? rename_sequence(conn, &seqkey, &newseqkey) : -1;
diff --git a/src/gtm/main/gtm_seq.c b/src/gtm/main/gtm_seq.c
index 98f9431546..b6a84b865b 100644
--- a/src/gtm/main/gtm_seq.c
+++ b/src/gtm/main/gtm_seq.c
@@ -371,7 +371,6 @@ int GTM_SeqAlter(GTM_SequenceKey seqkey,
GTM_RWLockAcquire(&seqinfo->gs_lock, GTM_LOCKMODE_WRITE);
/* Modify the data if necessary */
-
if (seqinfo->gs_cycle != cycle)
seqinfo->gs_cycle = cycle;
if (seqinfo->gs_min_value != minval)
@@ -381,19 +380,22 @@ int GTM_SeqAlter(GTM_SequenceKey seqkey,
if (seqinfo->gs_increment_by != increment_by)
seqinfo->gs_increment_by = increment_by;
- /* Here Restart has been used with a value, reinitialize last_value to a new value */
- if (seqinfo->gs_last_value != lastval)
- seqinfo->gs_last_value = lastval;
-
- /* Start has been used, reinitialize init value */
- if (seqinfo->gs_init_value != startval)
- seqinfo->gs_last_value = seqinfo->gs_init_value = startval;
-
- /* Restart command has been used, reset the sequence */
+ /*
+ * Check start/restart processes.
+ * Check first if restart is necessary and reset sequence in that case.
+ * If not, check if a simple start is necessary and update sequence.
+ */
if (is_restart)
{
+ /* Restart command has been used, reset the sequence */
seqinfo->gs_called = false;
- seqinfo->gs_init_value = seqinfo->gs_last_value;
+ seqinfo->gs_init_value = seqinfo->gs_last_value = lastval;
+ }
+ else
+ {
+ /* Start has been used, reinitialize init value */
+ if (seqinfo->gs_init_value != startval)
+ seqinfo->gs_init_value = seqinfo->gs_last_value = startval;
}
/* Remove the old key with the old name */