blob: 7c70056185efaed897243aa299eacd6821883f8f [file] [log] [blame]
drh348784e2000-05-29 20:41:49 +00001# Copyright (c) 1999, 2000 D. Richard Hipp
2#
3# This program is free software; you can redistribute it and/or
4# modify it under the terms of the GNU General Public
5# License as published by the Free Software Foundation; either
6# version 2 of the License, or (at your option) any later version.
7#
8# This program is distributed in the hope that it will be useful,
9# but WITHOUT ANY WARRANTY; without even the implied warranty of
10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11# General Public License for more details.
12#
13# You should have received a copy of the GNU General Public
14# License along with this library; if not, write to the
15# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16# Boston, MA 02111-1307, USA.
17#
18# Author contact information:
19# drh@hwaci.com
20# http://www.hwaci.com/drh/
21#
22#***********************************************************************
23# This file implements regression tests for SQLite library. The
24# focus of this file is testing the CREATE TABLE statement.
25#
drhb24fcbe2000-05-29 23:30:50 +000026# $Id: crttbl.test,v 1.2 2000/05/29 23:30:51 drh Exp $
drh348784e2000-05-29 20:41:49 +000027
28set testdir [file dirname $argv0]
29source $testdir/tester.tcl
30
31# Create a basic table and verify it is added to sqlite_master
32#
33do_test crttbl-1.1 {
34 execsql {
35 CREATE TABLE test1 (
36 one varchar(10),
37 two text
38 )
39 }
40 execsql {
41 SELECT sql FROM sqlite_master
42 }
43} {{CREATE TABLE test1 (
44 one varchar(10),
45 two text
46 )}}
47
48# Verify that both table files exists in the database directory
49#
50do_test crttbl-1.2 {
51 execsql {INSERT INTO test1 VALUES('hi', 'y''all')}
52 lsort [glob -nocomplain testdb/*.tbl]
53} {testdb/sqlite_master.tbl testdb/test1.tbl}
54
55# Verify the other fields of the sqlite_master file.
56#
57do_test crttbl-1.3 {
58 execsql {SELECT name, tbl_name, type FROM sqlite_master}
59} {test1 test1 table}
60
61# Close and reopen the database. Verify that everything is
62# still the same.
63#
64do_test crttbl-1.4 {
65 db close
66 sqlite db testdb
67 execsql {SELECT name, tbl_name, type from sqlite_master}
68} {test1 test1 table}
69
70# Drop the database and make sure it disappears.
71#
72do_test crttbl-1.5 {
73 execsql {DROP TABLE test1}
74 execsql {SELECT * FROM sqlite_master}
75} {}
76
77# Verify that the file associated with the database is gone.
78#
79do_test crttbl-1.5 {
80 lsort [glob -nocomplain testdb/*.tbl]
81} {testdb/sqlite_master.tbl}
82
83# Close and reopen the database. Verify that the table is
84# still gone.
85#
86do_test crttbl-1.6 {
87 db close
88 sqlite db testdb
89 execsql {SELECT name FROM sqlite_master}
90} {}
91
drhb24fcbe2000-05-29 23:30:50 +000092
93# Verify that we cannot make two tables with the same name
94#
95do_test crttbl-2.1 {
96 execsql {CREATE TABLE test2(one text)}
97 set v [catch {execsql {CREATE TABLE test2(two text)}} msg]
98 lappend v $msg
99} {1 {table "test2" already exists}}
100do_test crttbl-2.1b {
101 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
102 lappend v $msg
103} {1 {table "sqlite_master" already exists}}
104do_test crttbl-2.1c {
105 db close
106 sqlite db testdb
107 set v [catch {execsql {CREATE TABLE sqlite_master(two text)}} msg]
108 lappend v $msg
109} {1 {table "sqlite_master" already exists}}
110do_test crttbl-2.1d {
111 execsql {DROP TABLE test2; SELECT name FROM sqlite_master}
112} {}
113
114# Verify that we cannot make a table with the same name as an index
115#
116do_test crttbl-2.2 {
117 execsql {CREATE TABLE test2(one text); CREATE INDEX test3 ON test2(one)}
118 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
119 lappend v $msg
120} {1 {there is already an index named "test3"}}
121do_test crttbl-2.2b {
122 db close
123 sqlite db testdb
124 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
125 lappend v $msg
126} {1 {there is already an index named "test3"}}
127do_test crttbl-2.2c {
128 execsql {DROP INDEX test3}
129 set v [catch {execsql {CREATE TABLE test3(two text)}} msg]
130 lappend v $msg
131} {0 {}}
132do_test crttbl-2.2d {
133 execsql {SELECT name FROM sqlite_master ORDER BY name}
134} {test2 test3}
135do_test crttbl-2.2e {
136 execsql {DROP TABLE test2; DROP TABLE test3}
137 execsql {SELECT name FROM sqlite_master ORDER BY name}
138} {}
139
140# Create a table with many field names
141#
142set big_table \
143{CREATE TABLE big(
144 f1 varchar(20),
145 f2 char(10),
146 f3 varchar(30),
147 f4 text,
148 f5 text,
149 f6 text,
150 f7 text,
151 f8 text,
152 f9 text,
153 f10 text,
154 f11 text,
155 f12 text,
156 f13 text,
157 f14 text,
158 f15 text,
159 f16 text,
160 f17 text,
161 f18 text,
162 f19 text,
163 f20 text
164)}
165do_test crttbl-3.1 {
166 execsql $big_table
167 execsql {SELECT sql FROM sqlite_master}
168} \{$big_table\}
169do_test crttbl-3.2 {
170 set v [catch {execsql {CREATE TABLE BIG(xyz foo)}} msg]
171 lappend v $msg
172} {1 {table "BIG" already exists}}
173do_test crttbl-3.3 {
174 set v [catch {execsql {CREATE TABLE biG(xyz foo)}} msg]
175 lappend v $msg
176} {1 {table "biG" already exists}}
177do_test crttbl-3.4 {
178 set v [catch {execsql {CREATE TABLE bIg(xyz foo)}} msg]
179 lappend v $msg
180} {1 {table "bIg" already exists}}
181do_test crttbl-3.5 {
182 db close
183 sqlite db testdb
184 set v [catch {execsql {CREATE TABLE Big(xyz foo)}} msg]
185 lappend v $msg
186} {1 {table "Big" already exists}}
187do_test crttbl-3.6 {
188 execsql {DROP TABLE big}
189 execsql {SELECT name FROM sqlite_master}
190} {}
191
192# Try creating large numbers of tables
193#
194set r {}
195for {set i 1} {$i<=100} {incr i} {
196 lappend r test$i
197}
198do_test crttbl-4.1 {
199 for {set i 1} {$i<=100} {incr i} {
200 set sql "CREATE TABLE test$i ("
201 for {set k 1} {$k<$i} {incr k} {
202 append sql "field$k text,"
203 }
204 append sql "last_field text)"
205 execsql $sql
206 }
207 execsql {SELECT name FROM sqlite_master ORDER BY name}
208} $r
209do_test crttbl-4.1b {
210 db close
211 sqlite db testdb
212 execsql {SELECT name FROM sqlite_master ORDER BY name}
213} $r
214
215# Drop the even number tables
216#
217set r {}
218for {set i 1} {$i<=100} {incr i 2} {
219 lappend r test$i
220}
221do_test crttbl-4.2 {
222 for {set i 2} {$i<=100} {incr i 2} {
223 set sql "DROP TABLE TEST$i"
224 execsql $sql
225 }
226 execsql {SELECT name FROM sqlite_master ORDER BY name}
227} $r
228
229# Drop the odd number tables
230#
231do_test crttbl-4.3 {
232 for {set i 1} {$i<=100} {incr i 2} {
233 set sql "DROP TABLE test$i"
234 execsql $sql
235 }
236 execsql {SELECT name FROM sqlite_master ORDER BY name}
237} {}
238
drh348784e2000-05-29 20:41:49 +0000239finish_test