1*c5c4113dSnw141292 2*c5c4113dSnw141292#pragma ident "%Z%%M% %I% %E% SMI" 3*c5c4113dSnw141292 4*c5c4113dSnw141292# 2001 September 15 5*c5c4113dSnw141292# 6*c5c4113dSnw141292# The author disclaims copyright to this source code. In place of 7*c5c4113dSnw141292# a legal notice, here is a blessing: 8*c5c4113dSnw141292# 9*c5c4113dSnw141292# May you do good and not evil. 10*c5c4113dSnw141292# May you find forgiveness for yourself and forgive others. 11*c5c4113dSnw141292# May you share freely, never taking more than you give. 12*c5c4113dSnw141292# 13*c5c4113dSnw141292#*********************************************************************** 14*c5c4113dSnw141292# This file implements regression tests for SQLite library. The 15*c5c4113dSnw141292# focus of this file is testing the INSERT statement. 16*c5c4113dSnw141292# 17*c5c4113dSnw141292# $Id: insert.test,v 1.15 2003/06/15 23:42:25 drh Exp $ 18*c5c4113dSnw141292 19*c5c4113dSnw141292set testdir [file dirname $argv0] 20*c5c4113dSnw141292source $testdir/tester.tcl 21*c5c4113dSnw141292 22*c5c4113dSnw141292# Try to insert into a non-existant table. 23*c5c4113dSnw141292# 24*c5c4113dSnw141292do_test insert-1.1 { 25*c5c4113dSnw141292 set v [catch {execsql {INSERT INTO test1 VALUES(1,2,3)}} msg] 26*c5c4113dSnw141292 lappend v $msg 27*c5c4113dSnw141292} {1 {no such table: test1}} 28*c5c4113dSnw141292 29*c5c4113dSnw141292# Try to insert into sqlite_master 30*c5c4113dSnw141292# 31*c5c4113dSnw141292do_test insert-1.2 { 32*c5c4113dSnw141292 set v [catch {execsql {INSERT INTO sqlite_master VALUES(1,2,3,4)}} msg] 33*c5c4113dSnw141292 lappend v $msg 34*c5c4113dSnw141292} {1 {table sqlite_master may not be modified}} 35*c5c4113dSnw141292 36*c5c4113dSnw141292# Try to insert the wrong number of entries. 37*c5c4113dSnw141292# 38*c5c4113dSnw141292do_test insert-1.3 { 39*c5c4113dSnw141292 execsql {CREATE TABLE test1(one int, two int, three int)} 40*c5c4113dSnw141292 set v [catch {execsql {INSERT INTO test1 VALUES(1,2)}} msg] 41*c5c4113dSnw141292 lappend v $msg 42*c5c4113dSnw141292} {1 {table test1 has 3 columns but 2 values were supplied}} 43*c5c4113dSnw141292do_test insert-1.3b { 44*c5c4113dSnw141292 set v [catch {execsql {INSERT INTO test1 VALUES(1,2,3,4)}} msg] 45*c5c4113dSnw141292 lappend v $msg 46*c5c4113dSnw141292} {1 {table test1 has 3 columns but 4 values were supplied}} 47*c5c4113dSnw141292do_test insert-1.3c { 48*c5c4113dSnw141292 set v [catch {execsql {INSERT INTO test1(one,two) VALUES(1,2,3,4)}} msg] 49*c5c4113dSnw141292 lappend v $msg 50*c5c4113dSnw141292} {1 {4 values for 2 columns}} 51*c5c4113dSnw141292do_test insert-1.3d { 52*c5c4113dSnw141292 set v [catch {execsql {INSERT INTO test1(one,two) VALUES(1)}} msg] 53*c5c4113dSnw141292 lappend v $msg 54*c5c4113dSnw141292} {1 {1 values for 2 columns}} 55*c5c4113dSnw141292 56*c5c4113dSnw141292# Try to insert into a non-existant column of a table. 57*c5c4113dSnw141292# 58*c5c4113dSnw141292do_test insert-1.4 { 59*c5c4113dSnw141292 set v [catch {execsql {INSERT INTO test1(one,four) VALUES(1,2)}} msg] 60*c5c4113dSnw141292 lappend v $msg 61*c5c4113dSnw141292} {1 {table test1 has no column named four}} 62*c5c4113dSnw141292 63*c5c4113dSnw141292# Make sure the inserts actually happen 64*c5c4113dSnw141292# 65*c5c4113dSnw141292do_test insert-1.5 { 66*c5c4113dSnw141292 execsql {INSERT INTO test1 VALUES(1,2,3)} 67*c5c4113dSnw141292 execsql {SELECT * FROM test1} 68*c5c4113dSnw141292} {1 2 3} 69*c5c4113dSnw141292do_test insert-1.5b { 70*c5c4113dSnw141292 execsql {INSERT INTO test1 VALUES(4,5,6)} 71*c5c4113dSnw141292 execsql {SELECT * FROM test1 ORDER BY one} 72*c5c4113dSnw141292} {1 2 3 4 5 6} 73*c5c4113dSnw141292do_test insert-1.5c { 74*c5c4113dSnw141292 execsql {INSERT INTO test1 VALUES(7,8,9)} 75*c5c4113dSnw141292 execsql {SELECT * FROM test1 ORDER BY one} 76*c5c4113dSnw141292} {1 2 3 4 5 6 7 8 9} 77*c5c4113dSnw141292 78*c5c4113dSnw141292do_test insert-1.6 { 79*c5c4113dSnw141292 execsql {DELETE FROM test1} 80*c5c4113dSnw141292 execsql {INSERT INTO test1(one,two) VALUES(1,2)} 81*c5c4113dSnw141292 execsql {SELECT * FROM test1 ORDER BY one} 82*c5c4113dSnw141292} {1 2 {}} 83*c5c4113dSnw141292do_test insert-1.6b { 84*c5c4113dSnw141292 execsql {INSERT INTO test1(two,three) VALUES(5,6)} 85*c5c4113dSnw141292 execsql {SELECT * FROM test1 ORDER BY one} 86*c5c4113dSnw141292} {{} 5 6 1 2 {}} 87*c5c4113dSnw141292do_test insert-1.6c { 88*c5c4113dSnw141292 execsql {INSERT INTO test1(three,one) VALUES(7,8)} 89*c5c4113dSnw141292 execsql {SELECT * FROM test1 ORDER BY one} 90*c5c4113dSnw141292} {{} 5 6 1 2 {} 8 {} 7} 91*c5c4113dSnw141292 92*c5c4113dSnw141292# A table to use for testing default values 93*c5c4113dSnw141292# 94*c5c4113dSnw141292do_test insert-2.1 { 95*c5c4113dSnw141292 execsql { 96*c5c4113dSnw141292 CREATE TABLE test2( 97*c5c4113dSnw141292 f1 int default -111, 98*c5c4113dSnw141292 f2 real default +4.32, 99*c5c4113dSnw141292 f3 int default +222, 100*c5c4113dSnw141292 f4 int default 7.89 101*c5c4113dSnw141292 ) 102*c5c4113dSnw141292 } 103*c5c4113dSnw141292 execsql {SELECT * from test2} 104*c5c4113dSnw141292} {} 105*c5c4113dSnw141292do_test insert-2.2 { 106*c5c4113dSnw141292 execsql {INSERT INTO test2(f1,f3) VALUES(+10,-10)} 107*c5c4113dSnw141292 execsql {SELECT * FROM test2} 108*c5c4113dSnw141292} {10 4.32 -10 7.89} 109*c5c4113dSnw141292do_test insert-2.3 { 110*c5c4113dSnw141292 execsql {INSERT INTO test2(f2,f4) VALUES(1.23,-3.45)} 111*c5c4113dSnw141292 execsql {SELECT * FROM test2 WHERE f1==-111} 112*c5c4113dSnw141292} {-111 1.23 222 -3.45} 113*c5c4113dSnw141292do_test insert-2.4 { 114*c5c4113dSnw141292 execsql {INSERT INTO test2(f1,f2,f4) VALUES(77,+1.23,3.45)} 115*c5c4113dSnw141292 execsql {SELECT * FROM test2 WHERE f1==77} 116*c5c4113dSnw141292} {77 1.23 222 3.45} 117*c5c4113dSnw141292do_test insert-2.10 { 118*c5c4113dSnw141292 execsql { 119*c5c4113dSnw141292 DROP TABLE test2; 120*c5c4113dSnw141292 CREATE TABLE test2( 121*c5c4113dSnw141292 f1 int default 111, 122*c5c4113dSnw141292 f2 real default -4.32, 123*c5c4113dSnw141292 f3 text default hi, 124*c5c4113dSnw141292 f4 text default 'abc-123', 125*c5c4113dSnw141292 f5 varchar(10) 126*c5c4113dSnw141292 ) 127*c5c4113dSnw141292 } 128*c5c4113dSnw141292 execsql {SELECT * from test2} 129*c5c4113dSnw141292} {} 130*c5c4113dSnw141292do_test insert-2.11 { 131*c5c4113dSnw141292 execsql {INSERT INTO test2(f2,f4) VALUES(-2.22,'hi!')} 132*c5c4113dSnw141292 execsql {SELECT * FROM test2} 133*c5c4113dSnw141292} {111 -2.22 hi hi! {}} 134*c5c4113dSnw141292do_test insert-2.12 { 135*c5c4113dSnw141292 execsql {INSERT INTO test2(f1,f5) VALUES(1,'xyzzy')} 136*c5c4113dSnw141292 execsql {SELECT * FROM test2 ORDER BY f1} 137*c5c4113dSnw141292} {1 -4.32 hi abc-123 xyzzy 111 -2.22 hi hi! {}} 138*c5c4113dSnw141292 139*c5c4113dSnw141292# Do additional inserts with default values, but this time 140*c5c4113dSnw141292# on a table that has indices. In particular we want to verify 141*c5c4113dSnw141292# that the correct default values are inserted into the indices. 142*c5c4113dSnw141292# 143*c5c4113dSnw141292do_test insert-3.1 { 144*c5c4113dSnw141292 execsql { 145*c5c4113dSnw141292 DELETE FROM test2; 146*c5c4113dSnw141292 CREATE INDEX index9 ON test2(f1,f2); 147*c5c4113dSnw141292 CREATE INDEX indext ON test2(f4,f5); 148*c5c4113dSnw141292 SELECT * from test2; 149*c5c4113dSnw141292 } 150*c5c4113dSnw141292} {} 151*c5c4113dSnw141292do_test insert-3.2 { 152*c5c4113dSnw141292 execsql {INSERT INTO test2(f2,f4) VALUES(-3.33,'hum')} 153*c5c4113dSnw141292 execsql {SELECT * FROM test2 WHERE f1=111 AND f2=-3.33} 154*c5c4113dSnw141292} {111 -3.33 hi hum {}} 155*c5c4113dSnw141292do_test insert-3.3 { 156*c5c4113dSnw141292 execsql {INSERT INTO test2(f1,f2,f5) VALUES(22,-4.44,'wham')} 157*c5c4113dSnw141292 execsql {SELECT * FROM test2 WHERE f1=111 AND f2=-3.33} 158*c5c4113dSnw141292} {111 -3.33 hi hum {}} 159*c5c4113dSnw141292do_test insert-3.4 { 160*c5c4113dSnw141292 execsql {SELECT * FROM test2 WHERE f1=22 AND f2=-4.44} 161*c5c4113dSnw141292} {22 -4.44 hi abc-123 wham} 162*c5c4113dSnw141292integrity_check insert-3.5 163*c5c4113dSnw141292 164*c5c4113dSnw141292# Test of expressions in the VALUES clause 165*c5c4113dSnw141292# 166*c5c4113dSnw141292do_test insert-4.1 { 167*c5c4113dSnw141292 execsql { 168*c5c4113dSnw141292 CREATE TABLE t3(a,b,c); 169*c5c4113dSnw141292 INSERT INTO t3 VALUES(1+2+3,4,5); 170*c5c4113dSnw141292 SELECT * FROM t3; 171*c5c4113dSnw141292 } 172*c5c4113dSnw141292} {6 4 5} 173*c5c4113dSnw141292do_test insert-4.2 { 174*c5c4113dSnw141292 execsql { 175*c5c4113dSnw141292 INSERT INTO t3 VALUES((SELECT max(a) FROM t3)+1,5,6); 176*c5c4113dSnw141292 SELECT * FROM t3 ORDER BY a; 177*c5c4113dSnw141292 } 178*c5c4113dSnw141292} {6 4 5 7 5 6} 179*c5c4113dSnw141292do_test insert-4.3 { 180*c5c4113dSnw141292 catchsql { 181*c5c4113dSnw141292 INSERT INTO t3 VALUES((SELECT max(a) FROM t3)+1,t3.a,6); 182*c5c4113dSnw141292 SELECT * FROM t3 ORDER BY a; 183*c5c4113dSnw141292 } 184*c5c4113dSnw141292} {1 {no such column: t3.a}} 185*c5c4113dSnw141292do_test insert-4.4 { 186*c5c4113dSnw141292 execsql { 187*c5c4113dSnw141292 INSERT INTO t3 VALUES((SELECT b FROM t3 WHERE a=0),6,7); 188*c5c4113dSnw141292 SELECT * FROM t3 ORDER BY a; 189*c5c4113dSnw141292 } 190*c5c4113dSnw141292} {{} 6 7 6 4 5 7 5 6} 191*c5c4113dSnw141292do_test insert-4.5 { 192*c5c4113dSnw141292 execsql { 193*c5c4113dSnw141292 SELECT b,c FROM t3 WHERE a IS NULL; 194*c5c4113dSnw141292 } 195*c5c4113dSnw141292} {6 7} 196*c5c4113dSnw141292do_test insert-4.6 { 197*c5c4113dSnw141292 catchsql { 198*c5c4113dSnw141292 INSERT INTO t3 VALUES(notafunc(2,3),2,3); 199*c5c4113dSnw141292 } 200*c5c4113dSnw141292} {1 {no such function: notafunc}} 201*c5c4113dSnw141292do_test insert-4.7 { 202*c5c4113dSnw141292 execsql { 203*c5c4113dSnw141292 INSERT INTO t3 VALUES(min(1,2,3),max(1,2,3),99); 204*c5c4113dSnw141292 SELECT * FROM t3 WHERE c=99; 205*c5c4113dSnw141292 } 206*c5c4113dSnw141292} {1 3 99} 207*c5c4113dSnw141292 208*c5c4113dSnw141292# Test the ability to insert from a temporary table into itself. 209*c5c4113dSnw141292# Ticket #275. 210*c5c4113dSnw141292# 211*c5c4113dSnw141292do_test insert-5.1 { 212*c5c4113dSnw141292 execsql { 213*c5c4113dSnw141292 CREATE TEMP TABLE t4(x); 214*c5c4113dSnw141292 INSERT INTO t4 VALUES(1); 215*c5c4113dSnw141292 SELECT * FROM t4; 216*c5c4113dSnw141292 } 217*c5c4113dSnw141292} {1} 218*c5c4113dSnw141292do_test insert-5.2 { 219*c5c4113dSnw141292 execsql { 220*c5c4113dSnw141292 INSERT INTO t4 SELECT x+1 FROM t4; 221*c5c4113dSnw141292 SELECT * FROM t4; 222*c5c4113dSnw141292 } 223*c5c4113dSnw141292} {1 2} 224*c5c4113dSnw141292do_test insert-5.3 { 225*c5c4113dSnw141292 # verify that a temporary table is used to copy t4 to t4 226*c5c4113dSnw141292 set x [execsql { 227*c5c4113dSnw141292 EXPLAIN INSERT INTO t4 SELECT x+2 FROM t4; 228*c5c4113dSnw141292 }] 229*c5c4113dSnw141292 expr {[lsearch $x OpenTemp]>0} 230*c5c4113dSnw141292} {1} 231*c5c4113dSnw141292do_test insert-5.4 { 232*c5c4113dSnw141292 # Verify that table "test1" begins on page 3. This should be the same 233*c5c4113dSnw141292 # page number used by "t4" above. 234*c5c4113dSnw141292 execsql { 235*c5c4113dSnw141292 SELECT rootpage FROM sqlite_master WHERE name='test1'; 236*c5c4113dSnw141292 } 237*c5c4113dSnw141292} {3} 238*c5c4113dSnw141292do_test insert-5.5 { 239*c5c4113dSnw141292 # Verify that "t4" begins on page 3. 240*c5c4113dSnw141292 execsql { 241*c5c4113dSnw141292 SELECT rootpage FROM sqlite_temp_master WHERE name='t4'; 242*c5c4113dSnw141292 } 243*c5c4113dSnw141292} {3} 244*c5c4113dSnw141292do_test insert-5.6 { 245*c5c4113dSnw141292 # This should not use an intermediate temporary table. 246*c5c4113dSnw141292 execsql { 247*c5c4113dSnw141292 INSERT INTO t4 SELECT one FROM test1 WHERE three=7; 248*c5c4113dSnw141292 SELECT * FROM t4 249*c5c4113dSnw141292 } 250*c5c4113dSnw141292} {1 2 8} 251*c5c4113dSnw141292do_test insert-5.7 { 252*c5c4113dSnw141292 # verify that no temporary table is used to copy test1 to t4 253*c5c4113dSnw141292 set x [execsql { 254*c5c4113dSnw141292 EXPLAIN INSERT INTO t4 SELECT one FROM test1; 255*c5c4113dSnw141292 }] 256*c5c4113dSnw141292 expr {[lsearch $x OpenTemp]>0} 257*c5c4113dSnw141292} {0} 258*c5c4113dSnw141292 259*c5c4113dSnw141292# Ticket #334: REPLACE statement corrupting indices. 260*c5c4113dSnw141292# 261*c5c4113dSnw141292do_test insert-6.1 { 262*c5c4113dSnw141292 execsql { 263*c5c4113dSnw141292 CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE); 264*c5c4113dSnw141292 INSERT INTO t1 VALUES(1,2); 265*c5c4113dSnw141292 INSERT INTO t1 VALUES(2,3); 266*c5c4113dSnw141292 SELECT b FROM t1 WHERE b=2; 267*c5c4113dSnw141292 } 268*c5c4113dSnw141292} {2} 269*c5c4113dSnw141292do_test insert-6.2 { 270*c5c4113dSnw141292 execsql { 271*c5c4113dSnw141292 REPLACE INTO t1 VALUES(1,4); 272*c5c4113dSnw141292 SELECT b FROM t1 WHERE b=2; 273*c5c4113dSnw141292 } 274*c5c4113dSnw141292} {} 275*c5c4113dSnw141292do_test insert-6.3 { 276*c5c4113dSnw141292 execsql { 277*c5c4113dSnw141292 UPDATE OR REPLACE t1 SET a=2 WHERE b=4; 278*c5c4113dSnw141292 SELECT * FROM t1 WHERE b=4; 279*c5c4113dSnw141292 } 280*c5c4113dSnw141292} {2 4} 281*c5c4113dSnw141292do_test insert-6.4 { 282*c5c4113dSnw141292 execsql { 283*c5c4113dSnw141292 SELECT * FROM t1 WHERE b=3; 284*c5c4113dSnw141292 } 285*c5c4113dSnw141292} {} 286*c5c4113dSnw141292 287*c5c4113dSnw141292integrity_check insert-99.0 288*c5c4113dSnw141292 289*c5c4113dSnw141292finish_test 290