Strange behavior of incremented_by - Mailing list pgsql-bugs
From | skirsten@gmx.net |
---|---|
Subject | Strange behavior of incremented_by |
Date | |
Msg-id | 20060908173854.19280@gmx.net Whole thread Raw |
List | pgsql-bugs |
Hello, I have created a table with a serial value. There is a rule watching to that table and reporting changes to a another table. If I make a insert to the table the serial value is incremented by the double value of the incremented_by value form the _id_seq sequence table. Environment: SELECT version(); version -------------------------------------------------------------------------------------------------------------- PostgreSQL 8.1.4 on i486-pc-linux-gnu, compiled by GCC cc (GCC) 4.1.2 20060708 (prerelease) (Debian 4.1.1-8) (1 Zeile) The problem is recreatable on a suse 9.1 and debian 3.1 system. Here I have writen down step by step statements for you to create the problem by self. 1) Create the primary table: create table test (id serial,val int); HINWEIS: CREATE TABLE erstellt implizit eine Sequenz »test_id_seq« für die »serial«-Spalte »test.id« CREATE TABLE 2) Create the second table: create table log (id int); CREATE TABLE 3) Create the rule create or replace rule ruler as on insert to test do insert into log (id) values (new.id); CREATE RULE 4) Look into the sequence table: select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 1 | 1 | 9223372036854775807 | 1 | 1 | 1 | f | f (1 Zeile) 5) Make the first insert insert into test (val) values (0); INSERT 0 1 6) Look again select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 2 | 1 | 9223372036854775807 | 1 | 1 | 32 | f | t (1 Zeile) 7) Insert again insert into test (val) values (0); INSERT 0 1 8) Look again select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 4 | 1 | 9223372036854775807 | 1 | 1 | 31 | f | t (1 Zeile) --> The last_value is skip to 4 ! Not the expected 3. 9) Insert again insert into test (val) values (0); INSERT 0 1 10) Loock again select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 6 | 1 | 9223372036854775807 | 1 | 1 | 29 | f | t (1 Zeile) -> The last_value is skip to 6, not to 5. 11) Now change the increment_by value: alter sequence test_id_seq increment by 2; ALTER SEQUENCE 12) Insert again insert into test (val) values (0); INSERT 0 1 13) Look select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 10 | 2 | 9223372036854775807 | 1 | 1 | 27 | f | t (1 Zeile) -> Wow, there is a 10, 6 + 2 = 10 ? 14) Insert again insert into test (val) values (0); INSERT 0 1 15) Look again select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 14 | 2 | 9223372036854775807 | 1 | 1 | 25 | f | t (1 Zeile) -> There is a 14 16) Okay, last alter the seqence alter sequence test_id_seq increment by 3; ALTER SEQUENCE 17) Insert again insert into test (val) values (0); INSERT 0 1 18) Look again select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 20 | 3 | 9223372036854775807 | 1 | 1 | 23 | f | t (1 Zeile) -> Wow, 14 + 3 = 20 ? Not 17 ? 19) Insert the last one insert into test (val) values (0); INSERT 0 1 20) Look the last one select * from test_id_seq; sequence_name | last_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called ---------------+------------+--------------+---------------------+-----------+-------------+---------+-----------+----------- test_id_seq | 26 | 3 | 9223372036854775807 | 1 | 1 | 21 | f | t (1 Zeile) -> The last_value is incremented by 6 not by the expected 3. ----------- Is that a bug or a feature ? greetings Sven Kirsten -- Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen! Ideal für Modem und ISDN: http://www.gmx.net/de/go/smartsurfer
pgsql-bugs by date: