Yuriy Kaminskiy wrote: > Yuriy Kaminskiy wrote: >> David wrote: >>> Simon L wrote 2011-10-25 06:20: >>>> To reproduce this problem, enter the following 5 SQL statements at the >>>> SQLite command line. >>>> >>>> create table X(id INTEGER primary key ON CONFLICT REPLACE); >>>> create table Y(id INTEGER primary key ON CONFLICT REPLACE); >>>> insert into X values (1); >>>> insert into Y select * from X; >>>> insert into Y select * from X; >>>> >>>> >>>> When I tried to run the last SQL statement twice, SQLite produced the >>>> following error message. >>>> Error: PRIMARY KEY must be unique >>>> >>>> >>>> Is this a bug? Please advise. Thank you. > >>> This certainly looks like a bug. I got a constraint failure when I tried >>> it in sqlite 3.7.8. >>> >>> But it works fine when you state the column name explicitly in the >>> select clause. >>> >>> Like this: >>> >>> create table X(id INTEGER primary key ON CONFLICT REPLACE); >>> create table Y(id INTEGER primary key ON CONFLICT REPLACE); >>> insert into X values (1); >>> insert into Y select id from X; >>> insert into Y select id from X; >>> >>> I recall the "INSERT INTO ... SELECT * ..." had a bug related to foreign >>> key checks, >>> which was reported on the mailing list earlier this year: >>> >>> http://www.sqlite.org/src/tktview?name=6284df89de >>> >>> Hopefully, a member of the sqlite dev team will acknowledge this bug soon. >> Thanks for pointer; root cause, indeed, transfer optimization (it ignores >> table >> INTEGER PRIMARY KEY's ON CONFLICT clause, fix was easy, patch below (use >> table's >> ON CONFLICT clause by default; falls back to regular transfer if destination >> table is not empty and we cannot handle ON CONFLICT resolution); >> >> Index: sqlite3-3.7.8/src/insert.c >> =================================================================== >> --- sqlite3-3.7.8.orig/src/insert.c 2011-10-25 15:20:26.000000000 +0400 >> +++ sqlite3-3.7.8/src/insert.c 2011-10-25 15:54:54.000000000 +0400 > > Ping.
Okey, I've noticed http://www.sqlite.org/src/info/6f9898db7f Won't that result in performance regression in VACUUM? [only on tables with INTEGER PRIMARY KEY ON REPLACE xxx, obviously; so not *terrible* big deal - but still] When we insert into empty table, ON CONFLICT will never trigger, so we can safely use optimized xfer. _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users