Here is a trimmed-down test case for my issue:
CREATE TABLE d (
id INTEGER NOT NULL PRIMARY KEY
);
CREATE TRIGGER
bi_d
BEFORE INSERT ON
d
FOR EACH ROW
BEGIN
select 1;
END;
INSERT INTO
d
VALUES(
udf(1)
);
VDBE Program Listing:
0 Init 0 20 0 00 Start at 20
1 OpenWrite 0 2 0 1 00 root=2 iDb=0; d
2 Function0 1 5 3 udf(1) 01 r[3]=func(r[5])
3 NotNull 3 5 0 00 if r[3]!=NULL goto 5
4 Integer -1 3 0 00 r[3]=-1
5 MustBeInt 3 0 0 00
6 Function0 1 6 4 udf(1) 01 r[4]=func(r[6])
7 Copy 4 7 0 00 r[7]=r[4]
8 Affinity 4 1 0 D 00 affinity(r[4])
9 Program 1 19 8 program 00 Call: bi_d.default
10 Copy 7 1 0 00 r[1]=r[7]
11 NotNull 1 13 0 00 if r[1]!=NULL goto 13
12 NewRowid 0 1 0 00 r[1]=rowid
13 MustBeInt 1 0 0 00
14 SoftNull 2 0 0 00 r[2]=NULL
15 NotExists 0 17 1 00 intkey=r[1]
16 Halt 1555 2 0 d.id 02
17 MakeRecord 2 1 9 D 00 r[9]=mkrec(r[2])
18 Insert 0 9 1 d 31 intkey=r[1] data=r[9]
19 Halt 0 0 0 00
20 Transaction 0 1 2 0 01 usesStmtJournal=1
21 TableLock 0 2 1 d 00 iDb=0 root=2 write=1
22 Integer 1 5 0 00 r[5]=1
23 Integer 1 6 0 00 r[6]=1
24 Goto 0 1 0 00
Note the two calls to Function0 in the above. If you create a udf()
function that prints a message you will see that it does in fact get
called twice.
I only see this happening when all three of the following statements
are true:
- The UDF is used in a VALUES() statement
- The destination table "d" has a PRIMARY KEY
- There is a BEFORE INSERT trigger on "d"
--
Mark Lawrence
_______________________________________________
sqlite-users mailing list
[email protected]
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users