Rolled back transaction produces unexpected results leading to duplicate values 
in PRIMARY KEY field
----------------------------------------------------------------------------------------------------

                 Key: CORE-6343
                 URL: http://tracker.firebirdsql.org/browse/CORE-6343
             Project: Firebird Core
          Issue Type: Bug
          Components: Engine
    Affects Versions: 3.0.5
         Environment: Linux, Windows, Classic Server
            Reporter: Tomasz J
            Priority: Critical


Recently we have noticed duplicate entries in primary key field. How to 
reproduce the issue:

Database:

CREATE GLOBAL TEMPORARY TABLE GTT_TABLE (
    ID  INTEGER NOT NULL
) ON COMMIT DELETE ROWS;

CREATE TABLE TEST_TABLE (
    ID  INTEGER NOT NULL PRIMARY KEY
);

CREATE OR ALTER PROCEDURE TEST_PROC
RETURNS (
    ID1 INTEGER)
AS
DECLARE VARIABLE ID2 INTEGER;
BEGIN
   INSERT INTO GTT_TABLE VALUES(1);
   INSERT INTO GTT_TABLE VALUES(2);
   INSERT INTO GTT_TABLE VALUES(3);
   FOR SELECT ID FROM GTT_TABLE
   INTO :ID1 DO
              BEGIN
                    INSERT INTO TEST_TABLE (ID) VALUES (:ID1);

                    FOR SELECT 1 FROM RDB$DATABASE INTO :ID2 DO
                       IF (:ID1=3) THEN ID1 = 1/0;  --in production there is 
EXCEPTION EX_NAME instead
                   
                    SUSPEND;

                    DELETE FROM TEST_TABLE;
               END
END

Now using ISQL (reproduced also using other tools) execute:

1) 
SQL> select * from test_proc;

         ID1
============
           1
           2
Statement failed, SQLSTATE = 22012
arithmetic exception, numeric overflow, or string truncation
-Integer divide by zero.  The code attempted to divide an integer value by an 
integer divisor of zero.
-At procedure 'TEST_PROC' line: 16, col: 38

Result as expected.

2) 
SQL> ROLLBACK;

3) 
SQL> SELECT * FROM TEST_TABLE;

          ID
============
           2
           3

Expected result: empty dataset.

Now repeat steps 1), 2), 3)  effects of 1) and 2) are the same ( 1) should 
already raise primary key violation) , but the final result is:

SQL> SELECT * FROM TEST_TABLE;

          ID
============
           2
           3
           2
           3

I have reproduced the above in 3.0.5 Linux, 3.0.4 Windows, 3.0.3 Linux (all 
Classic).

I hope I have included enough details (this is my first ticket).

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://tracker.firebirdsql.org/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


Firebird-Devel mailing list, web interface at 
https://lists.sourceforge.net/lists/listinfo/firebird-devel

Reply via email to