1d6fe961eSdrh# 2005 January 13 2d6fe961eSdrh# 3d6fe961eSdrh# The author disclaims copyright to this source code. In place of 4d6fe961eSdrh# a legal notice, here is a blessing: 5d6fe961eSdrh# 6d6fe961eSdrh# May you do good and not evil. 7d6fe961eSdrh# May you find forgiveness for yourself and forgive others. 8d6fe961eSdrh# May you share freely, never taking more than you give. 9d6fe961eSdrh# 10d6fe961eSdrh#*********************************************************************** 11d6fe961eSdrh# This file implements regression tests for SQLite library. The 12d6fe961eSdrh# focus of this file is testing corner cases of the INSERT statement. 13d6fe961eSdrh# 14*a3f06598Sdanielk1977# $Id: insert3.test,v 1.9 2009/04/23 14:58:40 danielk1977 Exp $ 15d6fe961eSdrh 16d6fe961eSdrhset testdir [file dirname $argv0] 17d6fe961eSdrhsource $testdir/tester.tcl 18d6fe961eSdrh 1939df51b2Sdrh# All the tests in this file require trigger support 2039df51b2Sdrh# 2139df51b2Sdrhifcapable {trigger} { 2239df51b2Sdrh 23d6fe961eSdrh# Create a table and a corresponding insert trigger. Do a self-insert 24d6fe961eSdrh# into the table. 25d6fe961eSdrh# 26d6fe961eSdrhdo_test insert3-1.0 { 27d6fe961eSdrh execsql { 28d6fe961eSdrh CREATE TABLE t1(a,b); 29d6fe961eSdrh CREATE TABLE log(x UNIQUE, y); 30d6fe961eSdrh CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN 31d6fe961eSdrh UPDATE log SET y=y+1 WHERE x=new.a; 32d6fe961eSdrh INSERT OR IGNORE INTO log VALUES(new.a, 1); 33d6fe961eSdrh END; 34d6fe961eSdrh INSERT INTO t1 VALUES('hello','world'); 35d6fe961eSdrh INSERT INTO t1 VALUES(5,10); 36d6fe961eSdrh SELECT * FROM log ORDER BY x; 37d6fe961eSdrh } 38d6fe961eSdrh} {5 1 hello 1} 39d6fe961eSdrhdo_test insert3-1.1 { 40d6fe961eSdrh execsql { 41d6fe961eSdrh INSERT INTO t1 SELECT a, b+10 FROM t1; 42d6fe961eSdrh SELECT * FROM log ORDER BY x; 43d6fe961eSdrh } 44d6fe961eSdrh} {5 2 hello 2} 45d6fe961eSdrhdo_test insert3-1.2 { 46d6fe961eSdrh execsql { 47d6fe961eSdrh CREATE TABLE log2(x PRIMARY KEY,y); 48d6fe961eSdrh CREATE TRIGGER r2 BEFORE INSERT ON t1 BEGIN 49d6fe961eSdrh UPDATE log2 SET y=y+1 WHERE x=new.b; 50d6fe961eSdrh INSERT OR IGNORE INTO log2 VALUES(new.b,1); 51d6fe961eSdrh END; 52d6fe961eSdrh INSERT INTO t1 VALUES(453,'hi'); 53d6fe961eSdrh SELECT * FROM log ORDER BY x; 54d6fe961eSdrh } 55d6fe961eSdrh} {5 2 453 1 hello 2} 56d6fe961eSdrhdo_test insert3-1.3 { 57d6fe961eSdrh execsql { 58d6fe961eSdrh SELECT * FROM log2 ORDER BY x; 59d6fe961eSdrh } 60d6fe961eSdrh} {hi 1} 61b3bce662Sdanielk1977ifcapable compound { 62a86a5b6cSdrh do_test insert3-1.4.1 { 63d6fe961eSdrh execsql { 64d6fe961eSdrh INSERT INTO t1 SELECT * FROM t1; 65b3bce662Sdanielk1977 SELECT 'a:', x, y FROM log UNION ALL 66b3bce662Sdanielk1977 SELECT 'b:', x, y FROM log2 ORDER BY x; 67d6fe961eSdrh } 68d6fe961eSdrh } {a: 5 4 b: 10 2 b: 20 1 a: 453 2 a: hello 4 b: hi 2 b: world 1} 69a86a5b6cSdrh do_test insert3-1.4.2 { 70a86a5b6cSdrh execsql { 71a86a5b6cSdrh SELECT 'a:', x, y FROM log UNION ALL 72a86a5b6cSdrh SELECT 'b:', x, y FROM log2 ORDER BY x, y; 73a86a5b6cSdrh } 74a86a5b6cSdrh } {a: 5 4 b: 10 2 b: 20 1 a: 453 2 a: hello 4 b: hi 2 b: world 1} 75d6fe961eSdrh do_test insert3-1.5 { 76d6fe961eSdrh execsql { 77d6fe961eSdrh INSERT INTO t1(a) VALUES('xyz'); 78d6fe961eSdrh SELECT * FROM log ORDER BY x; 79d6fe961eSdrh } 80d6fe961eSdrh } {5 4 453 2 hello 4 xyz 1} 81b3bce662Sdanielk1977} 82d6fe961eSdrh 83d6fe961eSdrhdo_test insert3-2.1 { 84d6fe961eSdrh execsql { 85d6fe961eSdrh CREATE TABLE t2( 86d6fe961eSdrh a INTEGER PRIMARY KEY, 87d6fe961eSdrh b DEFAULT 'b', 88d6fe961eSdrh c DEFAULT 'c' 89d6fe961eSdrh ); 90d6fe961eSdrh CREATE TABLE t2dup(a,b,c); 91d6fe961eSdrh CREATE TRIGGER t2r1 BEFORE INSERT ON t2 BEGIN 92d6fe961eSdrh INSERT INTO t2dup(a,b,c) VALUES(new.a,new.b,new.c); 93d6fe961eSdrh END; 94d6fe961eSdrh INSERT INTO t2(a) VALUES(123); 95d6fe961eSdrh INSERT INTO t2(b) VALUES(234); 96d6fe961eSdrh INSERT INTO t2(c) VALUES(345); 97d6fe961eSdrh SELECT * FROM t2dup; 98d6fe961eSdrh } 99d6fe961eSdrh} {123 b c -1 234 c -1 b 345} 100d6fe961eSdrhdo_test insert3-2.2 { 101d6fe961eSdrh execsql { 102d6fe961eSdrh DELETE FROM t2dup; 103d6fe961eSdrh INSERT INTO t2(a) SELECT 1 FROM t1 LIMIT 1; 104d6fe961eSdrh INSERT INTO t2(b) SELECT 987 FROM t1 LIMIT 1; 105d6fe961eSdrh INSERT INTO t2(c) SELECT 876 FROM t1 LIMIT 1; 106d6fe961eSdrh SELECT * FROM t2dup; 107d6fe961eSdrh } 108d6fe961eSdrh} {1 b c -1 987 c -1 b 876} 109d6fe961eSdrh 11039df51b2Sdrh# Test for proper detection of malformed WHEN clauses on INSERT triggers. 11139df51b2Sdrh# 11239df51b2Sdrhdo_test insert3-3.1 { 11339df51b2Sdrh execsql { 11439df51b2Sdrh CREATE TABLE t3(a,b,c); 11539df51b2Sdrh CREATE TRIGGER t3r1 BEFORE INSERT on t3 WHEN nosuchcol BEGIN 11639df51b2Sdrh SELECT 'illegal WHEN clause'; 11739df51b2Sdrh END; 11839df51b2Sdrh } 11939df51b2Sdrh} {} 12039df51b2Sdrhdo_test insert3-3.2 { 12139df51b2Sdrh catchsql { 12239df51b2Sdrh INSERT INTO t3 VALUES(1,2,3) 12339df51b2Sdrh } 12439df51b2Sdrh} {1 {no such column: nosuchcol}} 12539df51b2Sdrhdo_test insert3-3.3 { 12639df51b2Sdrh execsql { 12739df51b2Sdrh CREATE TABLE t4(a,b,c); 12839df51b2Sdrh CREATE TRIGGER t4r1 AFTER INSERT on t4 WHEN nosuchcol BEGIN 12939df51b2Sdrh SELECT 'illegal WHEN clause'; 13039df51b2Sdrh END; 13139df51b2Sdrh } 13239df51b2Sdrh} {} 13339df51b2Sdrhdo_test insert3-3.4 { 13439df51b2Sdrh catchsql { 13539df51b2Sdrh INSERT INTO t4 VALUES(1,2,3) 13639df51b2Sdrh } 13739df51b2Sdrh} {1 {no such column: nosuchcol}} 13839df51b2Sdrh 13939df51b2Sdrh} ;# ifcapable {trigger} 14039df51b2Sdrh 141147d0cccSdrh# Tests for the INSERT INTO ... DEFAULT VALUES construct 142147d0cccSdrh# 1435ea2df91Sdrhdo_test insert3-3.5 { 144147d0cccSdrh execsql { 145147d0cccSdrh CREATE TABLE t5( 146147d0cccSdrh a INTEGER PRIMARY KEY, 147147d0cccSdrh b DEFAULT 'xyz' 148147d0cccSdrh ); 149147d0cccSdrh INSERT INTO t5 DEFAULT VALUES; 150147d0cccSdrh SELECT * FROM t5; 151147d0cccSdrh } 152147d0cccSdrh} {1 xyz} 1535ea2df91Sdrhdo_test insert3-3.6 { 154147d0cccSdrh execsql { 155147d0cccSdrh INSERT INTO t5 DEFAULT VALUES; 156147d0cccSdrh SELECT * FROM t5; 157147d0cccSdrh } 158147d0cccSdrh} {1 xyz 2 xyz} 1594152e677Sdanielk1977 1604152e677Sdanielk1977ifcapable bloblit { 1615ea2df91Sdrh do_test insert3-3.7 { 162147d0cccSdrh execsql { 163147d0cccSdrh CREATE TABLE t6(x,y DEFAULT 4.3, z DEFAULT x'6869'); 164147d0cccSdrh INSERT INTO t6 DEFAULT VALUES; 165147d0cccSdrh SELECT * FROM t6; 166147d0cccSdrh } 167147d0cccSdrh } {{} 4.3 hi} 1684152e677Sdanielk1977} 169147d0cccSdrh 170*a3f06598Sdanielk1977foreach tab [db eval {SELECT name FROM sqlite_master WHERE type = 'table'}] { 171*a3f06598Sdanielk1977 db eval "DROP TABLE $tab" 172*a3f06598Sdanielk1977} 173*a3f06598Sdanielk1977db close 174a4124bdfSdanielk1977sqlite3 db test.db 175a4124bdfSdanielk1977 176a4124bdfSdanielk1977#------------------------------------------------------------------------- 177a4124bdfSdanielk1977# While developing tests for a different feature (savepoint) the following 178a4124bdfSdanielk1977# sequence was found to cause an assert() in btree.c to fail. These 179a4124bdfSdanielk1977# tests are included to ensure that that bug is fixed. 180a4124bdfSdanielk1977# 181a4124bdfSdanielk1977do_test insert3-4.1 { 182a4124bdfSdanielk1977 execsql { 183a4124bdfSdanielk1977 CREATE TABLE t1(a, b, c); 184a4124bdfSdanielk1977 CREATE INDEX i1 ON t1(a, b); 185a4124bdfSdanielk1977 BEGIN; 186a4124bdfSdanielk1977 INSERT INTO t1 VALUES(randstr(10,400),randstr(10,400),randstr(10,400)); 187a4124bdfSdanielk1977 } 188a4124bdfSdanielk1977 set r "randstr(10,400)" 189a4124bdfSdanielk1977 for {set ii 0} {$ii < 10} {incr ii} { 190a4124bdfSdanielk1977 execsql "INSERT INTO t1 SELECT $r, $r, $r FROM t1" 191a4124bdfSdanielk1977 } 192a4124bdfSdanielk1977 execsql { COMMIT } 193a4124bdfSdanielk1977} {} 194a4124bdfSdanielk1977do_test insert3-4.2 { 195a4124bdfSdanielk1977 execsql { 196a4124bdfSdanielk1977 PRAGMA cache_size = 10; 197a4124bdfSdanielk1977 BEGIN; 198a4124bdfSdanielk1977 UPDATE t1 SET a = randstr(10,10) WHERE (rowid%4)==0; 199a4124bdfSdanielk1977 DELETE FROM t1 WHERE rowid%2; 200a4124bdfSdanielk1977 INSERT INTO t1 SELECT randstr(10,400), randstr(10,400), c FROM t1; 201a4124bdfSdanielk1977 COMMIT; 202a4124bdfSdanielk1977 } 203a4124bdfSdanielk1977} {} 204a4124bdfSdanielk1977 205d6fe961eSdrhfinish_test 206