In sqlite 3.7.14 in debug mode it raises a constraint error that states that 
the first argument is an invalid mem struct at location 7 in the trigger 
subprogram

(gdb) print *pOp
$1 = {opcode = 75 'K', p4type = -4 '\374', opflags = 21 '\025', p5 = 107 'k', 
p1 = 4, p2 = 11, p3 = 5, p4 = {i = 352254408, p = 0x14fef9c8, z = 0x14fef9c8 
"@\372\376\024", pI64 = 0x14fef9c8, pReal = 0x14fef9c8, pFunc = 0x14fef9c8, 
pVdbeFunc = 0x14fef9c8, pColl = 0x14fef9c8, pMem = 0x14fef9c8, pVtab = 
0x14fef9c8, pKeyInfo = 0x14fef9c8, ai = 0x14fef9c8, pProgram = 0x14fef9c8, 
xAdvance = 0x14fef9c8}, zComment = 0x0}
(gdb) print aMem[4]
$2 = {db = 0x14fef698, z = 0x0, r = 0, u = {i = 0, nZero = 0, pDef = 0x0, 
pRowSet = 0x0, pFrame = 0x0}, n = 0, flags = 4224, type = 0 '\000', enc = 0 
'\000', pScopyFrom = 0x0, pFiller = 0x0, xDel = 0, zMalloc = 0x0}

asql> explain delete from ical;
addr  opcode         p1    p2    p3    p4             p5  comment
----  -------------  ----  ----  ----  -------------  --  -------------
0     Trace          0     0     0                    00  NULL
1     Goto           0     29    0                    00  NULL
2     Integer        0     1     0                    00  NULL
3     Null           0     2     0                    00  NULL
4     OpenRead       0     2     1     0              00  ical
5     Rewind         0     10    0                    00  NULL
6     Rowid          0     3     0                    00  NULL
7     RowSetAdd      2     3     0                    00  NULL
8     AddImm         1     1     0                    00  NULL
9     Next           0     6     0                    01  NULL
10    Close          0     0     0                    00  NULL
11    OpenWrite      0     2     1     3              00  ical
12    RowSetRead     2     26    3                    00  NULL
13    NotExists      0     25    3                    00  NULL
14    Copy           3     4     0                    00  NULL
15    NotExists      0     25    3                    00  NULL
16    OpenRead       1     3     1     2              00  icalentry
17    Rewind         1     22    0                    00  NULL
18    Column         1     1     8                    00  icalentry.calendar
19    Ne             4     21    8     collseq(BINARY)  6b  NULL
20    FkCounter      0     1     0                    00  NULL
21    Next           1     18    0                    01  NULL
22    Close          1     0     0                    00  NULL
23    Delete         0     1     0     ical           00  NULL
24    Program        4     0     10    program        00  Call: fkey.abort
25    Goto           0     12    0                    00  NULL
26    Close          0     0     0                    00  NULL
27    ResultRow      1     1     0                    00  NULL
28    Halt           0     0     0                    00  NULL
29    Transaction    1     1     0                    00  NULL
30    VerifyCookie   1     2     0                    00  NULL
31    TableLock      1     2     1     ical           00  NULL
32    TableLock      1     3     1     icalentry      00  NULL
33    Goto           0     2     0                    00  NULL
0     Trace          0     0     0     -- TRIGGER     00  Start: .abort (AFTER 
DELETE ON ical)
1     Integer        0     1     0                    00  NULL
2     Null           0     2     0                    00  NULL
3     Param          2     4     0                    00  old.oid -> $4
4     OpenRead       0     3     1     2              00  icalentry
5     Rewind         0     12    0                    00  NULL
6     Column         0     1     5                    00  icalentry.calendar
7     Ne             4     11    5     collseq(BINARY)  6b  NULL
8     Rowid          0     3     0                    00  NULL
9     RowSetAdd      2     3     0                    00  NULL
10    AddImm         1     1     0                    00  NULL
11    Next           0     6     0                    01  NULL
12    Close          0     0     0                    00  NULL
13    OpenWrite      0     3     1     3              00  icalentry
14    RowSetRead     2     30    3                    00  NULL
15    NotExists      0     29    3                    00  NULL
16    Copy           3     7     0                    00  NULL
17    Column         0     1     9                    00  icalentry.calendar
18    NotExists      0     29    3                    00  NULL
19    FkIfZero       0     27    0                    00  NULL
20    IsNull         9     27    0                    00  NULL
21    SCopy          9     5     0                    00  NULL
22    MustBeInt      5     26    0                    00  NULL
23    OpenRead       1     2     1     3              00  ical
24    NotExists      1     26    5                    00  NULL
25    Goto           0     27    0                    00  NULL
26    FkCounter      0     -1    0                    00  NULL
27    Close          1     0     0                    00  NULL
28    Delete         0     1     0     icalentry      00  NULL
29    Goto           0     14    0                    00  NULL
30    Close          0     0     0                    00  NULL
31    ResetCount     0     0     0                    00  NULL
32    Halt           0     0     0                    00  End: .abort

-----Urspr?ngliche Nachricht-----
Von: R.Smith [mailto:rsmith at rsweb.co.za]
Gesendet: Donnerstag, 09. April 2015 20:52
An: sqlite-users at mailinglists.sqlite.org
Betreff: Re: [sqlite] possible Bug



On 2015-04-09 07:57 PM, Simon Slavin wrote:
> On 9 Apr 2015, at 6:04pm, Gustav Melno <knarks at online.de> wrote:
>
>> Thanks for the help. Adding a trailing underscore helped also. I'm still 
>> wondering why insertion worked at all because defining oid as column name 
>> with the type VARCHAR should result in an error on execution.
> The three names for the integer primary key column (oid, rowid, _rowid_) work 
> only if the table doesn't have a defined column of that name.  This allows 
> compatibility with people who didn't know that they were had special meanings 
> for SQLite.  Clever, isn't it ?

Except it clearly did not work like that in the OP's case.  He had defined 
"oid" in his table, but then when he inserted into column oid, the value either 
went to the rowid column or somehow messed up the rowid enough to cause a 
constraint failure.  I'm starting to think this might be a bug.

I've checked it like this (Copy paste this to a file and feed to an sqlite 
parser):

   -- 2015-04-09 20:34:18.791  |  [Info]       Script Initialized,
Started executing...
   --
================================================================================================

CREATE TABLE idTest(      -- Table with every row id reference
   id INTEGER PRIMARY KEY,
   col1 TEXT,
   oid INTEGER,
   rowid INTEGER,
   _rowid_ INTEGER
);

CREATE TABLE fkTest(       -- table to test the Foreign Key
   id INTEGER PRIMARY KEY,
   Data TEXT,
   FOREIGN KEY (id) REFERENCES idTest(id)
     ON UPDATE CASCADE
     ON DELETE CASCADE -- changes and deletes must cascade );

INSERT INTO idTest (col1, oid, rowid, _rowid_) VALUES
   ('TestA', 10, 100, 1000),
   ('TestA', 20, 200, 2000),
   ('TestA', 30, 300, 3000)
;

INSERT INTO idTest (col1, oid) VALUES ('TestB', 'aaa');

INSERT INTO fkTest (id, Data)  VALUES (last_insert_rowid(), 'FK 1');

INSERT INTO idTest (col1, oid) VALUES ('TestC', 20);

INSERT INTO fkTest (id, Data)  VALUES (last_insert_rowid(), 'FK 2');

-- So far all happens as expected and works perfectly...

SELECT * FROM idTest;


   --      id      | col1    |  oid  | rowid | _rowid_
   -- ------------ | ------- | ----- | ----- | -------
   --       1      | TestA   |   10  |  100  |   1000
   --       2      | TestA   |   20  |  200  |   2000
   --       3      | TestA   |   30  |  300  |   3000
   --       4      | TestB   |  aaa  |       |
   --       5      | TestC   |   20  |       |


SELECT F.*, I.*
   FROM fkTest AS F
   LEFT JOIN idTest AS I ON F.id=I.id;


   --      id      | Data   |      id      | col1    |  oid | rowid |
_rowid_
   -- ------------ | ------ | ------------ | ------- | ----- | ----- |
-------
   --       4      | FK 1   |       4      | TestB   |  aaa |       |
   --       5      | FK 2   |       5      | TestC   |   20 |       |


-- Here the problem happens. this statement should in SQL terms succeed
and update the fkTest
-- table - here I am NOT using oid as the OP did, I am using the correct
reference but it still fails.
-- And - it works if I remove the rowid references from the first table
create.

UPDATE idTest SET id = 40 WHERE id = 4;

   -- 2015-04-09 20:34:18.807  |  [ERROR]      FOREIGN KEY constraint failed
   --   Script Stats: Total Script Execution Time:     0d 00h 00m and
00.029s
   --                 Total Script Query Time:         0d 00h 00m and
00.005s
   --                 Total Database Rows Changed:     8
   --                 Total Virtual-Machine Steps:     396
   --                 Last executed Item Index:        12
   --                 Last Script Error: Script Failed in Item 11:
FOREIGN KEY constraint failed
   --
------------------------------------------------------------------------------------------------


I won't add more test script outputs, but it fails for a DELETE request
too. I think including rowid / oid / _rowid_ in a table works normally
since the correct values ended up in the correct columns, but somehow
including those aliases confuses the FK check mechanism.


_______________________________________________
sqlite-users mailing list
sqlite-users at mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users


___________________________________________
 Gunter Hick
Software Engineer
Scientific Games International GmbH
FN 157284 a, HG Wien
Klitschgasse 2-4, A-1130 Vienna, Austria
Tel: +43 1 80100 0
E-Mail: hick at scigames.at

This communication (including any attachments) is intended for the use of the 
intended recipient(s) only and may contain information that is confidential, 
privileged or legally protected. Any unauthorized use or dissemination of this 
communication is strictly prohibited. If you have received this communication 
in error, please immediately notify the sender by return e-mail message and 
delete all copies of the original communication. Thank you for your cooperation.


Reply via email to