-C Need\sSQLITE_MEMDEBUG\sinstead\sof\sSQLITE_DEBUG\sin\stclsqlite.c.\s(CVS\s2209)
-D 2005-01-13T23:54:32
+C Improved\stest\scoverage\son\sinsert.c.\s(CVS\s2210)
+D 2005-01-14T01:22:01
F Makefile.in 6ce51dde6a8fe82fc12f20dec750572f6a19f56a
F Makefile.linux-gcc a9e5a0d309fa7c38e7c14d3ecf7690879d3a5457
F README a01693e454a00cc117967e3f9fdab2d4d52e9bc1
F src/func.c dc188d862d7276ea897655b248e2cb17022686e3
F src/hash.c a97721a55440b7bea31ffe471bb2f6b4123cddd5
F src/hash.h 1b0c445e1c89ff2aaad9b4605ba61375af001e84
-F src/insert.c f6b69e40e8938f63a2368cbcb5087a56098cf632
+F src/insert.c 2a8fadfd7494881632fcae453f115d42a7a58dee
F src/legacy.c d58ea507bce885298a2c8c3cbb0f4bff5d47830b
F src/main.c cbe5a05baabad9fabb733065d0fb00c0b36f6ef1
F src/md5.c 7ae1c39044b95de2f62e066f47bb1deb880a1070
F test/index2.test ed2409af110aa06ec0c9fedfa050031887c38707
F test/insert.test 56f9c20c9adc8d707490c4ffa5d4daa94826ea03
F test/insert2.test 0bb50ff999e35a21549d8ee5dc44db8ac24d31a7
+F test/insert3.test 421f6017ad268fcdba0b8ab56a2dff7265d3cf23
F test/interrupt.test 5b4d8389e6cf2d01b94f87cfd02d9df1073bfb2d
F test/intpkey.test b57cf5236fde1bd8cbc1388fa0c91908f6fd9194
F test/ioerr.test 259bef101273a8e7b16d004018ee5a7873a26889
F www/vdbe.tcl 095f106d93875c94b47367384ebc870517431618
F www/version3.tcl 092a01f5ef430d2c4acc0ae558d74c4bb89638a0
F www/whentouse.tcl c3b50d3ac31c54be2a1af9b488a89d22f1e6e746
-P 7113b5ed8d51718356ce1cc51896a3070875a7e2
-R 97b9862e7f5be337d69e7b8a5cce7fca
+P 6e905270a933fd4c99f6db6707ed79166f6484ee
+R b0f921b0cc4246465f13a208b372d988
U drh
-Z 48311deeb016a5dd529c213b5f492974
+Z 0f466f7cb587c20134aa5d2e4fe7cd6a
-6e905270a933fd4c99f6db6707ed79166f6484ee
\ No newline at end of file
+c772f75166d55192132e732e8a0ddda5926f00f2
\ No newline at end of file
** This file contains C code routines that are called by the parser
** to handle INSERT statements in SQLite.
**
-** $Id: insert.c,v 1.129 2005/01/10 02:48:49 danielk1977 Exp $
+** $Id: insert.c,v 1.130 2005/01/14 01:22:01 drh Exp $
*/
#include "sqliteInt.h"
sqlite3VdbeAddOp(v, OP_Integer, -1, 0);
}else if( useTempTable ){
sqlite3VdbeAddOp(v, OP_Column, srcTab, keyColumn);
- }else if( pSelect ){
- sqlite3VdbeAddOp(v, OP_Dup, nColumn - keyColumn - 1, 1);
}else{
+ assert( pSelect==0 ); /* Otherwise useTempTable is true */
sqlite3ExprCode(pParse, pList->a[keyColumn].pExpr);
sqlite3VdbeAddOp(v, OP_NotNull, -1, sqlite3VdbeCurrentAddr(v)+3);
sqlite3VdbeAddOp(v, OP_Pop, 1, 0);
sqlite3ExprCode(pParse, pTab->aCol[i].pDflt);
}else if( useTempTable ){
sqlite3VdbeAddOp(v, OP_Column, srcTab, j);
- }else if( pSelect ){
- sqlite3VdbeAddOp(v, OP_Dup, nColumn-j-1, 1);
}else{
+ assert( pSelect==0 ); /* Otherwise useTempTable is true */
sqlite3ExprCodeAndCache(pParse, pList->a[j].pExpr);
}
}
--- /dev/null
+# 2005 January 13
+#
+# 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. The
+# focus of this file is testing corner cases of the INSERT statement.
+#
+# $Id: insert3.test,v 1.1 2005/01/14 01:22:01 drh Exp $
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+# Create a table and a corresponding insert trigger. Do a self-insert
+# into the table.
+#
+do_test insert3-1.0 {
+ execsql {
+ CREATE TABLE t1(a,b);
+ CREATE TABLE log(x UNIQUE, y);
+ CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN
+ UPDATE log SET y=y+1 WHERE x=new.a;
+ INSERT OR IGNORE INTO log VALUES(new.a, 1);
+ END;
+ INSERT INTO t1 VALUES('hello','world');
+ INSERT INTO t1 VALUES(5,10);
+ SELECT * FROM log ORDER BY x;
+ }
+} {5 1 hello 1}
+do_test insert3-1.1 {
+ execsql {
+ INSERT INTO t1 SELECT a, b+10 FROM t1;
+ SELECT * FROM log ORDER BY x;
+ }
+} {5 2 hello 2}
+do_test insert3-1.2 {
+ execsql {
+ CREATE TABLE log2(x PRIMARY KEY,y);
+ CREATE TRIGGER r2 BEFORE INSERT ON t1 BEGIN
+ UPDATE log2 SET y=y+1 WHERE x=new.b;
+ INSERT OR IGNORE INTO log2 VALUES(new.b,1);
+ END;
+ INSERT INTO t1 VALUES(453,'hi');
+ SELECT * FROM log ORDER BY x;
+ }
+} {5 2 453 1 hello 2}
+do_test insert3-1.3 {
+ execsql {
+ SELECT * FROM log2 ORDER BY x;
+ }
+} {hi 1}
+do_test insert3-1.4 {
+ execsql {
+ INSERT INTO t1 SELECT * FROM t1;
+ SELECT 'a:', x, y FROM log UNION ALL SELECT 'b:', x, y FROM log2 ORDER BY x;
+ }
+} {a: 5 4 b: 10 2 b: 20 1 a: 453 2 a: hello 4 b: hi 2 b: world 1}
+do_test insert3-1.5 {
+ execsql {
+ INSERT INTO t1(a) VALUES('xyz');
+ SELECT * FROM log ORDER BY x;
+ }
+} {5 4 453 2 hello 4 xyz 1}
+
+do_test insert3-2.1 {
+ execsql {
+ CREATE TABLE t2(
+ a INTEGER PRIMARY KEY,
+ b DEFAULT 'b',
+ c DEFAULT 'c'
+ );
+ CREATE TABLE t2dup(a,b,c);
+ CREATE TRIGGER t2r1 BEFORE INSERT ON t2 BEGIN
+ INSERT INTO t2dup(a,b,c) VALUES(new.a,new.b,new.c);
+ END;
+ INSERT INTO t2(a) VALUES(123);
+ INSERT INTO t2(b) VALUES(234);
+ INSERT INTO t2(c) VALUES(345);
+ SELECT * FROM t2dup;
+ }
+} {123 b c -1 234 c -1 b 345}
+do_test insert3-2.2 {
+ execsql {
+ DELETE FROM t2dup;
+ INSERT INTO t2(a) SELECT 1 FROM t1 LIMIT 1;
+ INSERT INTO t2(b) SELECT 987 FROM t1 LIMIT 1;
+ INSERT INTO t2(c) SELECT 876 FROM t1 LIMIT 1;
+ SELECT * FROM t2dup;
+ }
+} {1 b c -1 987 c -1 b 876}
+
+finish_test