blob: 3db1a4422549de424236a67d793710d8d028d962 [file] [log] [blame]
drhb19a2bc2001-09-16 00:13:26 +00001# 2001 September 15
drh62c68192000-05-30 00:51:26 +00002#
drhb19a2bc2001-09-16 00:13:26 +00003# The author disclaims copyright to this source code. In place of
4# a legal notice, here is a blessing:
drh62c68192000-05-30 00:51:26 +00005#
drhb19a2bc2001-09-16 00:13:26 +00006# May you do good and not evil.
7# May you find forgiveness for yourself and forgive others.
8# May you share freely, never taking more than you give.
drh62c68192000-05-30 00:51:26 +00009#
10#***********************************************************************
11# This file implements regression tests for SQLite library. The
12# focus of this file is testing the INSERT statement.
13#
drh24e97df2002-02-03 19:06:02 +000014# $Id: insert.test,v 1.7 2002/02/03 19:06:03 drh Exp $
drh62c68192000-05-30 00:51:26 +000015
16set testdir [file dirname $argv0]
17source $testdir/tester.tcl
18
19# Try to insert into a non-existant table.
20#
21do_test insert-1.1 {
22 set v [catch {execsql {INSERT INTO test1 VALUES(1,2,3)}} msg]
23 lappend v $msg
drh1d37e282000-05-30 03:12:21 +000024} {1 {no such table: test1}}
drh62c68192000-05-30 00:51:26 +000025
26# Try to insert into sqlite_master
27#
28do_test insert-1.2 {
29 set v [catch {execsql {INSERT INTO sqlite_master VALUES(1,2,3,4)}} msg]
30 lappend v $msg
drh1d37e282000-05-30 03:12:21 +000031} {1 {table sqlite_master may not be modified}}
drh62c68192000-05-30 00:51:26 +000032
33# Try to insert the wrong number of entries.
34#
35do_test insert-1.3 {
36 execsql {CREATE TABLE test1(one int, two int, three int)}
37 set v [catch {execsql {INSERT INTO test1 VALUES(1,2)}} msg]
38 lappend v $msg
39} {1 {table test1 has 3 columns but 2 values were supplied}}
40do_test insert-1.3b {
41 set v [catch {execsql {INSERT INTO test1 VALUES(1,2,3,4)}} msg]
42 lappend v $msg
43} {1 {table test1 has 3 columns but 4 values were supplied}}
44do_test insert-1.3c {
45 set v [catch {execsql {INSERT INTO test1(one,two) VALUES(1,2,3,4)}} msg]
46 lappend v $msg
47} {1 {4 values for 2 columns}}
48do_test insert-1.3d {
49 set v [catch {execsql {INSERT INTO test1(one,two) VALUES(1)}} msg]
50 lappend v $msg
51} {1 {1 values for 2 columns}}
52
53# Try to insert into a non-existant column of a table.
54#
55do_test insert-1.4 {
56 set v [catch {execsql {INSERT INTO test1(one,four) VALUES(1,2)}} msg]
57 lappend v $msg
58} {1 {table test1 has no column named four}}
59
60# Make sure the inserts actually happen
61#
62do_test insert-1.5 {
63 execsql {INSERT INTO test1 VALUES(1,2,3)}
64 execsql {SELECT * FROM test1}
65} {1 2 3}
66do_test insert-1.5b {
67 execsql {INSERT INTO test1 VALUES(4,5,6)}
68 execsql {SELECT * FROM test1 ORDER BY one}
69} {1 2 3 4 5 6}
70do_test insert-1.5c {
71 execsql {INSERT INTO test1 VALUES(7,8,9)}
72 execsql {SELECT * FROM test1 ORDER BY one}
73} {1 2 3 4 5 6 7 8 9}
74
75do_test insert-1.6 {
76 execsql {DELETE FROM test1}
77 execsql {INSERT INTO test1(one,two) VALUES(1,2)}
78 execsql {SELECT * FROM test1 ORDER BY one}
79} {1 2 {}}
80do_test insert-1.6b {
81 execsql {INSERT INTO test1(two,three) VALUES(5,6)}
82 execsql {SELECT * FROM test1 ORDER BY one}
83} {{} 5 6 1 2 {}}
84do_test insert-1.6c {
85 execsql {INSERT INTO test1(three,one) VALUES(7,8)}
86 execsql {SELECT * FROM test1 ORDER BY one}
87} {{} 5 6 1 2 {} 8 {} 7}
88
drh7020f652000-06-03 18:06:52 +000089# A table to use for testing default values
90#
drh7020f652000-06-03 18:06:52 +000091do_test insert-2.1 {
drhc4a3c772001-04-04 11:48:57 +000092 execsql {
93 CREATE TABLE test2(
94 f1 int default -111,
95 f2 real default +4.32,
96 f3 int default +222,
97 f4 int default 7.89
98 )
99 }
drh7020f652000-06-03 18:06:52 +0000100 execsql {SELECT * from test2}
101} {}
102do_test insert-2.2 {
drhc4a3c772001-04-04 11:48:57 +0000103 execsql {INSERT INTO test2(f1,f3) VALUES(+10,-10)}
104 execsql {SELECT * FROM test2}
105} {10 4.32 -10 7.89}
106do_test insert-2.3 {
107 execsql {INSERT INTO test2(f2,f4) VALUES(1.23,-3.45)}
108 execsql {SELECT * FROM test2 WHERE f1==-111}
109} {-111 1.23 222 -3.45}
110do_test insert-2.4 {
111 execsql {INSERT INTO test2(f1,f2,f4) VALUES(77,+1.23,3.45)}
112 execsql {SELECT * FROM test2 WHERE f1==77}
113} {77 1.23 222 3.45}
114do_test insert-2.10 {
115 execsql {
116 DROP TABLE test2;
117 CREATE TABLE test2(
118 f1 int default 111,
119 f2 real default -4.32,
120 f3 text default hi,
121 f4 text default 'abc-123',
122 f5 varchar(10)
123 )
124 }
125 execsql {SELECT * from test2}
126} {}
127do_test insert-2.11 {
drh7020f652000-06-03 18:06:52 +0000128 execsql {INSERT INTO test2(f2,f4) VALUES(-2.22,'hi!')}
129 execsql {SELECT * FROM test2}
130} {111 -2.22 hi hi! {}}
drhc4a3c772001-04-04 11:48:57 +0000131do_test insert-2.12 {
drh7020f652000-06-03 18:06:52 +0000132 execsql {INSERT INTO test2(f1,f5) VALUES(1,'xyzzy')}
133 execsql {SELECT * FROM test2 ORDER BY f1}
134} {1 -4.32 hi abc-123 xyzzy 111 -2.22 hi hi! {}}
135
136# Do additional inserts with default values, but this time
137# on a table that has indices. In particular we want to verify
138# that the correct default values are inserted into the indices.
139#
drh7020f652000-06-03 18:06:52 +0000140do_test insert-3.1 {
drh5974a302000-06-07 14:42:26 +0000141 execsql {
142 DELETE FROM test2;
143 CREATE INDEX index9 ON test2(f1,f2);
144 CREATE INDEX indext ON test2(f4,f5);
145 SELECT * from test2;
146 }
drh7020f652000-06-03 18:06:52 +0000147} {}
148do_test insert-3.2 {
149 execsql {INSERT INTO test2(f2,f4) VALUES(-3.33,'hum')}
150 execsql {SELECT * FROM test2 WHERE f1=111 AND f2=-3.33}
151} {111 -3.33 hi hum {}}
152do_test insert-3.3 {
153 execsql {INSERT INTO test2(f1,f2,f5) VALUES(22,-4.44,'wham')}
154 execsql {SELECT * FROM test2 WHERE f1=111 AND f2=-3.33}
155} {111 -3.33 hi hum {}}
156do_test insert-3.4 {
157 execsql {SELECT * FROM test2 WHERE f1=22 AND f2=-4.44}
158} {22 -4.44 hi abc-123 wham}
drh24e97df2002-02-03 19:06:02 +0000159do_test insert-3.5 {
160 set x [execsql {PRAGMA sanity_check}]
161 if {$x==""} {set x ok}
162 set x
163} {ok}
164
drh7020f652000-06-03 18:06:52 +0000165
drh62c68192000-05-30 00:51:26 +0000166finish_test