More bug fixes in the ON CONFLICT enhancement. (CVS 357)
FossilOrigin-Name: 8229b5f6a348a56432a4a609ee125520c5831973
This commit is contained in:
parent
0ca3e24b2e
commit
bb37fdc782
15
manifest
15
manifest
@ -1,5 +1,5 @@
|
|||||||
C The\snew\sON\sCONFLICT\slogic\sis\sin\sand\spasses\sthe\slegacy\stests.\s\sBut\sthe\nnew\scapabilities\shave\snot\sbeen\stested\sand\sare\slikely\sbroken.\s(CVS\s356)
|
C More\sbug\sfixes\sin\sthe\sON\sCONFLICT\senhancement.\s(CVS\s357)
|
||||||
D 2002-01-29T23:07:02
|
D 2002-01-30T00:54:56
|
||||||
F Makefile.in 9fa4277413bf1d9cf91365f07d4108d7d87ed2af
|
F Makefile.in 9fa4277413bf1d9cf91365f07d4108d7d87ed2af
|
||||||
F Makefile.template 3e26a3b9e7aee1b811deaf673e8d8973bdb3f22d
|
F Makefile.template 3e26a3b9e7aee1b811deaf673e8d8973bdb3f22d
|
||||||
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
|
F README a4c0ba11354ef6ba0776b400d057c59da47a4cc0
|
||||||
@ -26,7 +26,7 @@ F src/delete.c 4cdb6d2e94e2eb1b1aa79eefafd4669d43c249d6
|
|||||||
F src/expr.c 4cae8bf44d5732182e5e8c25b4552c05ea55593e
|
F src/expr.c 4cae8bf44d5732182e5e8c25b4552c05ea55593e
|
||||||
F src/hash.c 8f7c740ef2eaaa8decfa8751f2be30680b123e46
|
F src/hash.c 8f7c740ef2eaaa8decfa8751f2be30680b123e46
|
||||||
F src/hash.h a5f5b3ce2d086a172c5879b0b06a27a82eac9fac
|
F src/hash.h a5f5b3ce2d086a172c5879b0b06a27a82eac9fac
|
||||||
F src/insert.c 35c3e17bf5f8ef3a9cdd95f7cfdbf3d94cd598c2
|
F src/insert.c b942f99e4f4c0464f51ad171b6edbc1439fac893
|
||||||
F src/main.c 0205771a6c31a9858ff131fc1e797b589afb76bf
|
F src/main.c 0205771a6c31a9858ff131fc1e797b589afb76bf
|
||||||
F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c
|
F src/md5.c 52f677bfc590e09f71d07d7e327bd59da738d07c
|
||||||
F src/os.c c615faa4d23e742e0650e0751a6ad2a18438ad53
|
F src/os.c c615faa4d23e742e0650e0751a6ad2a18438ad53
|
||||||
@ -49,7 +49,7 @@ F src/test3.c d6775f95fd91f5b3cf0e2382a28e5aaeb68f745b
|
|||||||
F src/tokenize.c 1199b96a82d5c41509b5e24fc9faa1852b7f3135
|
F src/tokenize.c 1199b96a82d5c41509b5e24fc9faa1852b7f3135
|
||||||
F src/update.c 5ffd4bbd380f1fa99da184f28416e6dcf8b5508e
|
F src/update.c 5ffd4bbd380f1fa99da184f28416e6dcf8b5508e
|
||||||
F src/util.c 8f8973dd55a6ec63be9632fc5de86965c99d6327
|
F src/util.c 8f8973dd55a6ec63be9632fc5de86965c99d6327
|
||||||
F src/vdbe.c abd60d37361eaaa3b94d016cd2a9f31bd8d57620
|
F src/vdbe.c 893fa634870a5ea67c30ba61b7881b537f5c2723
|
||||||
F src/vdbe.h 5b1bd518126fc5a30e6ea13fe11de931b32c4b59
|
F src/vdbe.h 5b1bd518126fc5a30e6ea13fe11de931b32c4b59
|
||||||
F src/where.c 2dda39367f193194e4c7d2e0dcab31527d9d8aba
|
F src/where.c 2dda39367f193194e4c7d2e0dcab31527d9d8aba
|
||||||
F test/all.test 2a51e5395ac7c2c539689b123b9782a05e3837fe
|
F test/all.test 2a51e5395ac7c2c539689b123b9782a05e3837fe
|
||||||
@ -57,6 +57,7 @@ F test/bigrow.test 8ab252dba108f12ad64e337b0f2ff31a807ac578
|
|||||||
F test/btree.test 6ab4dc5f595905a276ef588fad3c9236dc07a47b
|
F test/btree.test 6ab4dc5f595905a276ef588fad3c9236dc07a47b
|
||||||
F test/btree2.test 08e9485619265cbaf5d11bd71f357cdc26bb87e0
|
F test/btree2.test 08e9485619265cbaf5d11bd71f357cdc26bb87e0
|
||||||
F test/btree3.test 9caa9e22491dd8cd8aa36d7ac3b48b089817c895
|
F test/btree3.test 9caa9e22491dd8cd8aa36d7ac3b48b089817c895
|
||||||
|
F test/conflict.test b1115520b32fe682dfd161754ed634352ab476af
|
||||||
F test/copy.test 768e6f1701a07d08090e1ca7f7dcce0a7a72b43e
|
F test/copy.test 768e6f1701a07d08090e1ca7f7dcce0a7a72b43e
|
||||||
F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8
|
F test/delete.test c904a62129fe102b314a96111a8417f10249e4d8
|
||||||
F test/expr.test c8a495050dcec3f9e68538c3ef466726933302c1
|
F test/expr.test c8a495050dcec3f9e68538c3ef466726933302c1
|
||||||
@ -119,7 +120,7 @@ F www/speed.tcl 83457b2bf6bb430900bd48ca3dd98264d9a916a5
|
|||||||
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
|
F www/sqlite.tcl 8b5884354cb615049aed83039f8dfe1552a44279
|
||||||
F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49
|
F www/tclsqlite.tcl 829b393d1ab187fd7a5e978631b3429318885c49
|
||||||
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
F www/vdbe.tcl 2013852c27a02a091d39a766bc87cff329f21218
|
||||||
P e00a9ff8f99dd58f7cb19a6195fac21f4c8b4af9
|
P ac8a4189e2a0c41161ee359db25de94435420368
|
||||||
R 1ca39242f5cf0f094b73bd233e3fcc93
|
R d0474e87b43c8e56cdd7c7f610ed8044
|
||||||
U drh
|
U drh
|
||||||
Z 0835a3278f559e60402c3a41f932d0d4
|
Z 06e7e93dabc09d9be0f533183ed3ad0f
|
||||||
|
@ -1 +1 @@
|
|||||||
ac8a4189e2a0c41161ee359db25de94435420368
|
8229b5f6a348a56432a4a609ee125520c5831973
|
@ -12,7 +12,7 @@
|
|||||||
** This file contains C code routines that are called by the parser
|
** This file contains C code routines that are called by the parser
|
||||||
** to handle INSERT statements in SQLite.
|
** to handle INSERT statements in SQLite.
|
||||||
**
|
**
|
||||||
** $Id: insert.c,v 1.35 2002/01/29 23:07:02 drh Exp $
|
** $Id: insert.c,v 1.36 2002/01/30 00:54:56 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
|
|
||||||
@ -482,7 +482,7 @@ void sqliteGenerateConstraintChecks(
|
|||||||
if( overrideError!=OE_Default ){
|
if( overrideError!=OE_Default ){
|
||||||
onError = overrideError;
|
onError = overrideError;
|
||||||
}
|
}
|
||||||
sqliteVdbeAddOp(v, OP_Dup, extra+nCol+2, 1);
|
sqliteVdbeAddOp(v, OP_Dup, extra+nCol+1+recnoChng, 1);
|
||||||
jumpInst = sqliteVdbeAddOp(v, OP_IsUnique, base+iCur+1, 0);
|
jumpInst = sqliteVdbeAddOp(v, OP_IsUnique, base+iCur+1, 0);
|
||||||
switch( onError ){
|
switch( onError ){
|
||||||
case OE_Abort: {
|
case OE_Abort: {
|
||||||
@ -496,7 +496,6 @@ void sqliteGenerateConstraintChecks(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OE_Replace: {
|
case OE_Replace: {
|
||||||
sqliteVdbeAddOp(v, OP_MoveTo, base, 0);
|
|
||||||
sqliteGenerateRowDelete(v, pTab, base);
|
sqliteGenerateRowDelete(v, pTab, base);
|
||||||
if( isUpdate ){
|
if( isUpdate ){
|
||||||
sqliteVdbeAddOp(v, OP_Dup, nCol+extra+recnoChng, 1);
|
sqliteVdbeAddOp(v, OP_Dup, nCol+extra+recnoChng, 1);
|
||||||
|
@ -30,7 +30,7 @@
|
|||||||
** But other routines are also provided to help in building up
|
** But other routines are also provided to help in building up
|
||||||
** a program instruction by instruction.
|
** a program instruction by instruction.
|
||||||
**
|
**
|
||||||
** $Id: vdbe.c,v 1.110 2002/01/29 23:07:02 drh Exp $
|
** $Id: vdbe.c,v 1.111 2002/01/30 00:54:56 drh Exp $
|
||||||
*/
|
*/
|
||||||
#include "sqliteInt.h"
|
#include "sqliteInt.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
@ -1211,6 +1211,7 @@ case OP_String: {
|
|||||||
** P1 elements are popped off of the top of stack and discarded.
|
** P1 elements are popped off of the top of stack and discarded.
|
||||||
*/
|
*/
|
||||||
case OP_Pop: {
|
case OP_Pop: {
|
||||||
|
assert( p->tos+1>=pOp->p1 );
|
||||||
PopStack(p, pOp->p1);
|
PopStack(p, pOp->p1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
148
test/conflict.test
Normal file
148
test/conflict.test
Normal file
@ -0,0 +1,148 @@
|
|||||||
|
# 2002 January 29
|
||||||
|
#
|
||||||
|
# The author disclaims copyright to this source code. In place of
|
||||||
|
# a legal notice, here is a blessing:
|
||||||
|
#
|
||||||
|
# May you do good and not evil.
|
||||||
|
# May you find forgiveness for yourself and forgive others.
|
||||||
|
# May you share freely, never taking more than you give.
|
||||||
|
#
|
||||||
|
#***********************************************************************
|
||||||
|
# This file implements regression tests for SQLite library.
|
||||||
|
#
|
||||||
|
# This file implements tests for the conflict resolution extension
|
||||||
|
# to SQLite.
|
||||||
|
#
|
||||||
|
# $Id: conflict.test,v 1.1 2002/01/30 00:54:57 drh Exp $
|
||||||
|
|
||||||
|
set testdir [file dirname $argv0]
|
||||||
|
source $testdir/tester.tcl
|
||||||
|
|
||||||
|
# Create a table with three fields, two of which must be
|
||||||
|
# UNIQUE.
|
||||||
|
#
|
||||||
|
do_test conflict-1.1 {
|
||||||
|
execsql {
|
||||||
|
CREATE TABLE t1(a, b, c, UNIQUE(a,b));
|
||||||
|
INSERT INTO t1 VALUES(1,2,3);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {3}
|
||||||
|
do_test conflict-1.2 {
|
||||||
|
catchsql {
|
||||||
|
INSERT INTO t1 VALUES(1,2,4);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {1 {constraint failed}}
|
||||||
|
do_test conflict-1.3 {
|
||||||
|
catchsql {
|
||||||
|
INSERT ON CONFLICT IGNORE INTO t1 VALUES(1,2,4);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 3}
|
||||||
|
do_test conflict-1.4 {
|
||||||
|
catchsql {
|
||||||
|
INSERT ON CONFLICT REPLACE INTO t1 VALUES(1,2,4);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 4}
|
||||||
|
do_test conflict-1.5 {
|
||||||
|
catchsql {
|
||||||
|
INSERT ON CONFLICT ABORT INTO t1 VALUES(1,2,5);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {1 {constraint failed}}
|
||||||
|
do_test conflict-1.6 {
|
||||||
|
catchsql {
|
||||||
|
INSERT IGNORE INTO t1 VALUES(1,2,5);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 4}
|
||||||
|
do_test conflict-1.7 {
|
||||||
|
catchsql {
|
||||||
|
INSERT REPLACE INTO t1 VALUES(1,2,5);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 5}
|
||||||
|
do_test conflict-1.8 {
|
||||||
|
catchsql {
|
||||||
|
INSERT ON CONFLICT ABORT INTO t1 VALUES(1,2,6);
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {1 {constraint failed}}
|
||||||
|
|
||||||
|
do_test conflict-1.9 {
|
||||||
|
execsql {
|
||||||
|
BEGIN;
|
||||||
|
CREATE TABLE t2(a,b,c);
|
||||||
|
INSERT INTO t2 VALUES(1,2,11);
|
||||||
|
INSERT INTO t2 VALUES(1,2,12);
|
||||||
|
INSERT INTO t2 VALUES(1,2,13);
|
||||||
|
INSERT INTO t2 VALUES(1,2,14);
|
||||||
|
INSERT INTO t2 VALUES(1,3,21);
|
||||||
|
INSERT INTO t2 VALUES(1,3,22);
|
||||||
|
INSERT INTO t2 VALUES(1,3,23);
|
||||||
|
INSERT INTO t2 VALUES(1,3,24);
|
||||||
|
COMMIT;
|
||||||
|
SELECT count(*) FROM t2;
|
||||||
|
}
|
||||||
|
} 8
|
||||||
|
do_test conflict-1.10 {
|
||||||
|
catchsql {
|
||||||
|
INSERT IGNORE INTO t1 SELECT a,b,c FROM t2 ORDER BY c;
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 {5 21}}
|
||||||
|
do_test conflict-1.11 {
|
||||||
|
catchsql {
|
||||||
|
INSERT REPLACE INTO t1 SELECT a,b,c FROM t2 ORDER BY c;
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 {14 24}}
|
||||||
|
|
||||||
|
###### Fix me!
|
||||||
|
do_test conflict-1.12 {
|
||||||
|
catchsql {
|
||||||
|
INSERT REPLACE INTO t1 SELECT a,b,c FROM t2 ORDER BY c DESC;
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 {14 24}}
|
||||||
|
|
||||||
|
do_test conflict-1.13 {
|
||||||
|
execsql {
|
||||||
|
BEGIN;
|
||||||
|
DELETE FROM t1;
|
||||||
|
INSERT INTO t1 VALUES(1,2,3);
|
||||||
|
INSERT INTO t1 VALUES(1,3,4);
|
||||||
|
INSERT INTO t1 VALUES(2,3,5);
|
||||||
|
COMMIT;
|
||||||
|
SELECT * FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {1 2 3 1 3 4 2 3 5}
|
||||||
|
do_test conflict-1.14 {
|
||||||
|
catchsql {
|
||||||
|
UPDATE ON CONFLICT ABORT t1 SET b=3 WHERE b=2;
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {1 {constraint failed}};
|
||||||
|
do_test conflict-1.15 {
|
||||||
|
catchsql {
|
||||||
|
UPDATE t1 SET b=3 WHERE b=2;
|
||||||
|
SELECT c FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {1 {constraint failed}};
|
||||||
|
do_test conflict-1.16 {
|
||||||
|
catchsql {
|
||||||
|
UPDATE ON CONFLICT IGNORE t1 SET b=3 WHERE b=2;
|
||||||
|
SELECT * FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 {1 2 3 1 3 4 2 3 5}}
|
||||||
|
do_test conflict-1.17 {
|
||||||
|
catchsql {
|
||||||
|
UPDATE ON CONFLICT REPLACE t1 SET b=3 WHERE b=2;
|
||||||
|
SELECT * FROM t1 ORDER BY c;
|
||||||
|
}
|
||||||
|
} {0 {1 3 3 2 3 5}}
|
||||||
|
|
||||||
|
|
||||||
|
finish_test
|
Loading…
Reference in New Issue
Block a user