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*5ea2df91Sdrh# $Id: insert3.test,v 1.6 2007/04/16 17:07:55 drh 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# 143*5ea2df91Sdrhdo_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} 153*5ea2df91Sdrhdo_test insert3-3.6 { 154147d0cccSdrh execsql { 155147d0cccSdrh INSERT INTO t5 DEFAULT VALUES; 156147d0cccSdrh SELECT * FROM t5; 157147d0cccSdrh } 158147d0cccSdrh} {1 xyz 2 xyz} 159*5ea2df91Sdrhdo_test insert3-3.7 { 160147d0cccSdrh execsql { 161147d0cccSdrh CREATE TABLE t6(x,y DEFAULT 4.3, z DEFAULT x'6869'); 162147d0cccSdrh INSERT INTO t6 DEFAULT VALUES; 163147d0cccSdrh SELECT * FROM t6; 164147d0cccSdrh } 165147d0cccSdrh} {{} 4.3 hi} 166*5ea2df91Sdrhdb close 167147d0cccSdrh 168d6fe961eSdrhfinish_test 169