Well, nextval() doesn't hold a lock for the duration of the transaction,
so it still increments.  It is a performance optimization.

---------------------------------------------------------------------------

Hugo Jonker wrote:
> Hi,
> 
> While using Postgres, I encountered some unexpected behaviour.
> 
> In short:
> ---------
> Upon doing a faulty INSERT which left a column with default value
> nextval('sequence') unspecified, the INSERT aborted due to an error.
> However, a call had been placed to nextval('sequence'), thus
> increasing the sequence, while this value never got used.
> 
> I certainly didn't expect this.
> 
> 
> 
> Detailed report:
> ----------------
> Table projectlist looks like:
> 
> wwf-projects=# \d projectlist
>                                      Table "projectlist"
>    Column    |         Type          |                       Modifiers
> 
>-------------+-----------------------+--------------------------------------------------------
>  id          | integer               | not null default 
>nextval('"projectlist_id_seq"'::text)
>  dbms_host   | character varying(30) | not null
>  dbms_port   | numeric(5,0)          | not null
>  dbms_type   | character varying(10) | not null
>  db_name     | character varying(20) | not null
>  admin_login | character varying(20) | not null
>  admin_pwd   | character varying(20) | not null
> Unique keys: projectlist_id_key
> 
> We have a SEQUENCE for id:
> 
> wwf-projects=# select currval('"projectlist_id_seq"'::text);
>  currval
> ---------
>        6
> (1 row)
> 
> Now if we try to perform a faulty INSERT, the INSERT aborts. However,
> the SEQUENCE is increased!:
> 
> wwf-projects=# insert into projectlist (dbms_host, dbms_port, dbms_type,
> db_name, admin_login, admin_pwd) values ('webadmict.tue.nl','5432',
> 'hugotest-2', 'test', 'test');
> ERROR:  ExecAppend: Fail to add null value in not null attribute admin_pwd
> 
> wwf-projects=# select currval('"projectlist_id_seq"'::text);
>  currval
> ---------
>        7
> (1 row)
> 
> 
> So 'currval' increased due to an INSERT that was aborted.
> (Yes, the insert is definately not in the table).
> 
> I'm not sure if one can call this a bug, but it is unexpected behaviour
> -- to me, at least.
> 
> 
> Regards,
> 
> 
> Hugo Jonker.
> PS: My apologies about not being on the list, but it was taking longer than
> expected to get on.
> 
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 2: you can get off all lists at once with the unregister command
>     (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])
> 

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026

---------------------------(end of broadcast)---------------------------
TIP 2: you can get off all lists at once with the unregister command
    (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])

Reply via email to