diff options
| author | Michael Paquier | 2012-05-29 07:03:15 +0000 |
|---|---|---|
| committer | Michael Paquier | 2012-05-29 07:07:21 +0000 |
| commit | 41e78f38c0caf6ce41f148bc853e1869e06301b0 (patch) | |
| tree | 63b5e1e0958760d8014dbec1a6e8027857711b08 /src | |
| parent | 1e42775468b013c840a3c170108fd439716c9c04 (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.c | 16 | ||||
| -rw-r--r-- | src/gtm/main/gtm_seq.c | 24 |
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 */ |
