From d6fe961ef43325040bd98e2a85f02b4669a5e2c4 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 14 Jan 2005 01:22:00 +0000 Subject: [PATCH] Improved test coverage on insert.c. (CVS 2210) FossilOrigin-Name: c772f75166d55192132e732e8a0ddda5926f00f2 --- manifest | 13 ++++--- manifest.uuid | 2 +- src/insert.c | 8 ++-- test/insert3.test | 97 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 108 insertions(+), 12 deletions(-) create mode 100644 test/insert3.test diff --git a/manifest b/manifest index 99633a6253..0c00b8c4ac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -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 @@ -39,7 +39,7 @@ F src/expr.c ecfc8fd972e73650708e1109f97b1c5a785e0a0e 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 @@ -136,6 +136,7 @@ F test/index.test 1294997b4743007af57f8148c63ba14f07ad31ab 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 @@ -268,7 +269,7 @@ F www/tclsqlite.tcl e73f8f8e5f20e8277619433f7970060ab01088fc 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 diff --git a/manifest.uuid b/manifest.uuid index d4ca7f8e2b..64846c6ed1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e905270a933fd4c99f6db6707ed79166f6484ee \ No newline at end of file +c772f75166d55192132e732e8a0ddda5926f00f2 \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index ebc51e2e03..156973162e 100644 --- a/src/insert.c +++ b/src/insert.c @@ -12,7 +12,7 @@ ** 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" @@ -496,9 +496,8 @@ void sqlite3Insert( 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); @@ -520,9 +519,8 @@ void sqlite3Insert( 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); } } diff --git a/test/insert3.test b/test/insert3.test new file mode 100644 index 0000000000..7e6153af9c --- /dev/null +++ b/test/insert3.test @@ -0,0 +1,97 @@ +# 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