1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-30 19:03:16 +03:00

Add tests to e_createtable.test.

FossilOrigin-Name: 38bec827f1a0603ad36d1dc1bc83430ae370df38
This commit is contained in:
dan
2010-10-08 16:09:43 +00:00
parent 14f7e16bc6
commit a975b59f94
4 changed files with 316 additions and 19 deletions

View File

@ -1,8 +1,5 @@
-----BEGIN PGP SIGNED MESSAGE----- C Add\stests\sto\se_createtable.test.
Hash: SHA1 D 2010-10-08T16:09:44
C Version\s3.7.3
D 2010-10-08T02:34:02
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in b01fdfcfecf8a0716c29867a67959f6148b79961 F Makefile.in b01fdfcfecf8a0716c29867a67959f6148b79961
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@ -351,7 +348,7 @@ F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d
F test/descidx3.test fe720e8b37d59f4cef808b0bf4e1b391c2e56b6f F test/descidx3.test fe720e8b37d59f4cef808b0bf4e1b391c2e56b6f
F test/diskfull.test 0cede7ef9d8f415d9d3944005c76be7589bb5ebb F test/diskfull.test 0cede7ef9d8f415d9d3944005c76be7589bb5ebb
F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376
F test/e_createtable.test 9c7921d3e422215fa674ff864b985ffa503e2e33 F test/e_createtable.test 049dcbd95e66bc3255338db30b375b825d894f7a
F test/e_delete.test 55d868b647acc091c261a10b9b0cb0ab660a6acb F test/e_delete.test 55d868b647acc091c261a10b9b0cb0ab660a6acb
F test/e_expr.test 0fdf503f955389aec497eb27983385cb540fb307 F test/e_expr.test 0fdf503f955389aec497eb27983385cb540fb307
F test/e_fkey.test 6721a741c6499b3ab7e5385923233343c8f1ad05 F test/e_fkey.test 6721a741c6499b3ab7e5385923233343c8f1ad05
@ -647,7 +644,7 @@ F test/tclsqlite.test 8c154101e704170c2be10f137a5499ac2c6da8d3
F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c F test/tempdb.test 19d0f66e2e3eeffd68661a11c83ba5e6ace9128c
F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a F test/temptable.test f42121a0d29a62f00f93274464164177ab1cc24a
F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05 F test/temptrigger.test b0273db072ce5f37cf19140ceb1f0d524bbe9f05
F test/tester.tcl 6d862da591d5d5e4b2e22bb1e8a7c4ed95580b45 F test/tester.tcl 0c6264937643072fdc3cfa893b10e3cc61b27e3b
F test/thread001.test a3e6a7254d1cb057836cb3145b60c10bf5b7e60f F test/thread001.test a3e6a7254d1cb057836cb3145b60c10bf5b7e60f
F test/thread002.test afd20095e6e845b405df4f2c920cb93301ca69db F test/thread002.test afd20095e6e845b405df4f2c920cb93301ca69db
F test/thread003.test b824d4f52b870ae39fc5bae4d8070eca73085dca F test/thread003.test b824d4f52b870ae39fc5bae4d8070eca73085dca
@ -876,14 +873,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
P e55ada89246d4cc5f476891c70572dc7c1c3643e P 2677848087c9c090efb17c1893e77d6136a9111d
R 7723ac384e1a6db8f40224b6d9a06216 R 6e044b7c4a85e0cb47fea90114e6a2e3
U drh U dan
Z 51dc28c4109ceec51426d10a132773ef Z dc00dd7a16b0fb33265130607425eef7
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
iD8DBQFMroMeoxKgR168RlERAjO4AJ0RDmJuB/957mPhqJrJ5ow+pN1wpQCfRtD2
PJGHl2bflDougAfG//UuBKc=
=dYof
-----END PGP SIGNATURE-----

View File

@ -1 +1 @@
2677848087c9c090efb17c1893e77d6136a9111d 38bec827f1a0603ad36d1dc1bc83430ae370df38

View File

@ -1633,4 +1633,298 @@ do_catchsql_test 4.19.3 { INSERT INTO t5 VALUES('not null', NULL) } \
{1 {t5.b may not be NULL}} {1 {t5.b may not be NULL}}
do_execsql_test 4.19.4 { SELECT * FROM t5 } {} do_execsql_test 4.19.4 { SELECT * FROM t5 } {}
#------------------------------------------------------------------------
# Tests for INTEGER PRIMARY KEY and rowid related statements.
#
# EVIDENCE-OF: R-52584-04009 The rowid value can be accessed using one
# of the special case-independent names "rowid", "oid", or "_rowid_" in
# place of a column name.
#
drop_all_tables
do_execsql_test 5.1.0 {
CREATE TABLE t1(x, y);
INSERT INTO t1 VALUES('one', 'first');
INSERT INTO t1 VALUES('two', 'second');
INSERT INTO t1 VALUES('three', 'third');
}
do_createtable_tests 5.1 {
1 "SELECT rowid FROM t1" {1 2 3}
2 "SELECT oid FROM t1" {1 2 3}
3 "SELECT _rowid_ FROM t1" {1 2 3}
4 "SELECT ROWID FROM t1" {1 2 3}
5 "SELECT OID FROM t1" {1 2 3}
6 "SELECT _ROWID_ FROM t1" {1 2 3}
7 "SELECT RoWiD FROM t1" {1 2 3}
8 "SELECT OiD FROM t1" {1 2 3}
9 "SELECT _RoWiD_ FROM t1" {1 2 3}
}
# EVIDENCE-OF: R-26501-17306 If a table contains a user defined column
# named "rowid", "oid" or "_rowid_", then that name always refers the
# explicitly declared column and cannot be used to retrieve the integer
# rowid value.
#
do_execsql_test 5.2.0 {
CREATE TABLE t2(oid, b);
CREATE TABLE t3(a, _rowid_);
CREATE TABLE t4(a, b, rowid);
INSERT INTO t2 VALUES('one', 'two');
INSERT INTO t2 VALUES('three', 'four');
INSERT INTO t3 VALUES('five', 'six');
INSERT INTO t3 VALUES('seven', 'eight');
INSERT INTO t4 VALUES('nine', 'ten', 'eleven');
INSERT INTO t4 VALUES('twelve', 'thirteen', 'fourteen');
}
do_createtable_tests 5.2 {
1 "SELECT oid, rowid, _rowid_ FROM t2" {one 1 1 three 2 2}
2 "SELECT oid, rowid, _rowid_ FROM t3" {1 1 six 2 2 eight}
3 "SELECT oid, rowid, _rowid_ FROM t4" {1 eleven 1 2 fourteen 2}
}
# Argument $tbl is the name of a table in the database. Argument $col is
# the name of one of the tables columns. Return 1 if $col is an alias for
# the rowid, or 0 otherwise.
#
proc is_integer_primary_key {tbl col} {
lindex [db eval [subst {
DELETE FROM $tbl;
INSERT INTO $tbl ($col) VALUES(0);
SELECT (rowid==$col) FROM $tbl;
DELETE FROM $tbl;
}]] 0
}
# EVIDENCE-OF: R-53738-31673 With one exception, if a table has a
# primary key that consists of a single column, and the declared type of
# that column is "INTEGER" in any mixture of upper and lower case, then
# the column becomes an alias for the rowid.
#
# EVIDENCE-OF: R-45951-08347 if the declaration of a column with
# declared type "INTEGER" includes an "PRIMARY KEY DESC" clause, it does
# not become an alias for the rowid and is not classified as an integer
# primary key.
#
do_createtable_tests 5.3 -tclquery {
is_integer_primary_key t5 pk
} -repair {
catchsql { DROP TABLE t5 }
} {
1 "CREATE TABLE t5(pk integer primary key)" 1
2 "CREATE TABLE t5(pk integer, primary key(pk))" 1
3 "CREATE TABLE t5(pk integer, v integer, primary key(pk))" 1
4 "CREATE TABLE t5(pk integer, v integer, primary key(pk, v))" 0
5 "CREATE TABLE t5(pk int, v integer, primary key(pk, v))" 0
6 "CREATE TABLE t5(pk int, v integer, primary key(pk))" 0
7 "CREATE TABLE t5(pk int primary key, v integer)" 0
8 "CREATE TABLE t5(pk inTEger primary key)" 1
9 "CREATE TABLE t5(pk inteGEr, primary key(pk))" 1
10 "CREATE TABLE t5(pk INTEGER, v integer, primary key(pk))" 1
}
# EVIDENCE-OF: R-41444-49665 Other integer type names like "INT" or
# "BIGINT" or "SHORT INTEGER" or "UNSIGNED INTEGER" causes the primary
# key column to behave as an ordinary table column with integer affinity
# and a unique index, not as an alias for the rowid.
#
do_execsql_test 5.4.1 {
CREATE TABLE t6(pk INT primary key);
CREATE TABLE t7(pk BIGINT primary key);
CREATE TABLE t8(pk SHORT INTEGER primary key);
CREATE TABLE t9(pk UNSIGNED INTEGER primary key);
}
do_test e_createtable-5.4.2.1 { is_integer_primary_key t6 pk } 0
do_test e_createtable-5.4.2.2 { is_integer_primary_key t7 pk } 0
do_test e_createtable-5.4.2.3 { is_integer_primary_key t8 pk } 0
do_test e_createtable-5.4.2.4 { is_integer_primary_key t9 pk } 0
do_execsql_test 5.4.3 {
INSERT INTO t6 VALUES('2.0');
INSERT INTO t7 VALUES('2.0');
INSERT INTO t8 VALUES('2.0');
INSERT INTO t9 VALUES('2.0');
SELECT typeof(pk), pk FROM t6;
SELECT typeof(pk), pk FROM t7;
SELECT typeof(pk), pk FROM t8;
SELECT typeof(pk), pk FROM t9;
} {integer 2 integer 2 integer 2 integer 2}
do_catchsql_test 5.4.4.1 {
INSERT INTO t6 VALUES(2)
} {1 {column pk is not unique}}
do_catchsql_test 5.4.4.2 {
INSERT INTO t7 VALUES(2)
} {1 {column pk is not unique}}
do_catchsql_test 5.4.4.3 {
INSERT INTO t8 VALUES(2)
} {1 {column pk is not unique}}
do_catchsql_test 5.4.4.4 {
INSERT INTO t9 VALUES(2)
} {1 {column pk is not unique}}
# EVIDENCE-OF: R-56094-57830 the following three table declarations all
# cause the column "x" to be an alias for the rowid (an integer primary
# key): CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z); CREATE TABLE
# t(x INTEGER, y, z, PRIMARY KEY(x ASC)); CREATE TABLE t(x INTEGER, y,
# z, PRIMARY KEY(x DESC));
#
# EVIDENCE-OF: R-20149-25884 the following declaration does not result
# in "x" being an alias for the rowid: CREATE TABLE t(x INTEGER PRIMARY
# KEY DESC, y, z);
#
do_createtable_tests 5 -tclquery {
is_integer_primary_key t x
} -repair {
catchsql { DROP TABLE t }
} {
5.1 "CREATE TABLE t(x INTEGER PRIMARY KEY ASC, y, z)" 1
5.2 "CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x ASC))" 1
5.3 "CREATE TABLE t(x INTEGER, y, z, PRIMARY KEY(x DESC))" 1
6.1 "CREATE TABLE t(x INTEGER PRIMARY KEY DESC, y, z)" 0
}
# EVIDENCE-OF: R-03733-29734 Rowid values may be modified using an
# UPDATE statement in the same way as any other column value can, either
# using one of the built-in aliases ("rowid", "oid" or "_rowid_") or by
# using an alias created by an integer primary key.
#
do_execsql_test 5.7.0 {
CREATE TABLE t10(a, b);
INSERT INTO t10 VALUES('ten', 10);
CREATE TABLE t11(a, b INTEGER PRIMARY KEY);
INSERT INTO t11 VALUES('ten', 10);
}
do_createtable_tests 5.7.1 -query {
SELECT rowid, _rowid_, oid FROM t10;
} {
1 "UPDATE t10 SET rowid = 5" {5 5 5}
2 "UPDATE t10 SET _rowid_ = 6" {6 6 6}
3 "UPDATE t10 SET oid = 7" {7 7 7}
}
do_createtable_tests 5.7.2 -query {
SELECT rowid, _rowid_, oid, b FROM t11;
} {
1 "UPDATE t11 SET rowid = 5" {5 5 5 5}
2 "UPDATE t11 SET _rowid_ = 6" {6 6 6 6}
3 "UPDATE t11 SET oid = 7" {7 7 7 7}
4 "UPDATE t11 SET b = 8" {8 8 8 8}
}
# EVIDENCE-OF: R-58706-14229 Similarly, an INSERT statement may provide
# a value to use as the rowid for each row inserted.
#
do_createtable_tests 5.8.1 -query {
SELECT rowid, _rowid_, oid FROM t10;
} -repair {
execsql { DELETE FROM t10 }
} {
1 "INSERT INTO t10(oid) VALUES(15)" {15 15 15}
2 "INSERT INTO t10(rowid) VALUES(16)" {16 16 16}
3 "INSERT INTO t10(_rowid_) VALUES(17)" {17 17 17}
4 "INSERT INTO t10(a, b, oid) VALUES(1,2,3)" {3 3 3}
}
do_createtable_tests 5.8.2 -query {
SELECT rowid, _rowid_, oid, b FROM t11;
} -repair {
execsql { DELETE FROM t11 }
} {
1 "INSERT INTO t11(oid) VALUES(15)" {15 15 15 15}
2 "INSERT INTO t11(rowid) VALUES(16)" {16 16 16 16}
3 "INSERT INTO t11(_rowid_) VALUES(17)" {17 17 17 17}
4 "INSERT INTO t11(a, b) VALUES(1,2)" {2 2 2 2}
}
# EVIDENCE-OF: R-32326-44592 Unlike normal SQLite columns, an integer
# primary key or rowid column must contain integer values. Integer
# primary key or rowid columns are not able to hold floating point
# values, strings, BLOBs, or NULLs.
#
# This is considered by the tests for the following 3 statements,
# which show that:
#
# 1. Attempts to UPDATE a rowid column to a non-integer value fail,
# 2. Attempts to INSERT a real, string or blob value into a rowid
# column fail, and
# 3. Attempting to INSERT a NULL value into a rowid column causes the
# system to automatically select an integer value to use.
#
# EVIDENCE-OF: R-64224-62578 If an UPDATE statement attempts to set an
# integer primary key or rowid column to a NULL or blob value, or to a
# string or real value that cannot be losslessly converted to an
# integer, a "datatype mismatch" error occurs and the statement is
# aborted.
#
drop_all_tables
do_execsql_test 5.9.0 {
CREATE TABLE t12(x INTEGER PRIMARY KEY, y);
INSERT INTO t12 VALUES(5, 'five');
}
do_createtable_tests 5.9.1 -query { SELECT typeof(x), x FROM t12 } {
1 "UPDATE t12 SET x = 4" {integer 4}
2 "UPDATE t12 SET x = 10.0" {integer 10}
3 "UPDATE t12 SET x = '12.0'" {integer 12}
4 "UPDATE t12 SET x = '-15.0'" {integer -15}
}
do_createtable_tests 5.9.2 -error {
datatype mismatch
} {
1 "UPDATE t12 SET x = 4.1" {}
2 "UPDATE t12 SET x = 'hello'" {}
3 "UPDATE t12 SET x = NULL" {}
4 "UPDATE t12 SET x = X'ABCD'" {}
5 "UPDATE t12 SET x = X'3900'" {}
6 "UPDATE t12 SET x = X'39'" {}
}
# EVIDENCE-OF: R-05734-13629 If an INSERT statement attempts to insert a
# blob value, or a string or real value that cannot be losslessly
# converted to an integer into an integer primary key or rowid column, a
# "datatype mismatch" error occurs and the statement is aborted.
#
do_execsql_test 5.10.0 { DELETE FROM t12 }
do_createtable_tests 5.10.1 -error {
datatype mismatch
} {
1 "INSERT INTO t12(x) VALUES(4.1)" {}
2 "INSERT INTO t12(x) VALUES('hello')" {}
3 "INSERT INTO t12(x) VALUES(X'ABCD')" {}
4 "INSERT INTO t12(x) VALUES(X'3900')" {}
5 "INSERT INTO t12(x) VALUES(X'39')" {}
}
do_createtable_tests 5.10.2 -query {
SELECT typeof(x), x FROM t12
} -repair {
execsql { DELETE FROM t12 }
} {
1 "INSERT INTO t12(x) VALUES(4)" {integer 4}
2 "INSERT INTO t12(x) VALUES(10.0)" {integer 10}
3 "INSERT INTO t12(x) VALUES('12.0')" {integer 12}
4 "INSERT INTO t12(x) VALUES('4e3')" {integer 4000}
5 "INSERT INTO t12(x) VALUES('-14.0')" {integer -14}
}
# EVIDENCE-OF: R-07986-46024 If an INSERT statement attempts to insert a
# NULL value into a rowid or integer primary key column, the system
# chooses an integer value to use as the rowid automatically.
#
do_execsql_test 5.11.0 { DELETE FROM t12 }
do_createtable_tests 5.11 -query {
SELECT typeof(x), x FROM t12 WHERE y IS (SELECT max(y) FROM t12)
} {
1 "INSERT INTO t12 DEFAULT VALUES" {integer 1}
2 "INSERT INTO t12(y) VALUES(5)" {integer 2}
3 "INSERT INTO t12(x,y) VALUES(NULL, 10)" {integer 3}
4 "INSERT INTO t12(x,y) SELECT NULL, 15 FROM t12"
{integer 4 integer 5 integer 6}
5 "INSERT INTO t12(y) SELECT 20 FROM t12 LIMIT 3"
{integer 7 integer 8 integer 9}
}
finish_test finish_test

View File

@ -444,6 +444,7 @@ proc speed_trial {name numstmt units sql} {
puts [format {%12d uS %s %s} $tm $rate $u2] puts [format {%12d uS %s %s} $tm $rate $u2]
global total_time global total_time
set total_time [expr {$total_time+$tm}] set total_time [expr {$total_time+$tm}]
lappend ::speed_trial_times $name $tm
} }
proc speed_trial_tcl {name numstmt units script} { proc speed_trial_tcl {name numstmt units script} {
puts -nonewline [format {%-21.21s } $name...] puts -nonewline [format {%-21.21s } $name...]
@ -459,10 +460,12 @@ proc speed_trial_tcl {name numstmt units script} {
puts [format {%12d uS %s %s} $tm $rate $u2] puts [format {%12d uS %s %s} $tm $rate $u2]
global total_time global total_time
set total_time [expr {$total_time+$tm}] set total_time [expr {$total_time+$tm}]
lappend ::speed_trial_times $name $tm
} }
proc speed_trial_init {name} { proc speed_trial_init {name} {
global total_time global total_time
set total_time 0 set total_time 0
set ::speed_trial_times [list]
sqlite3 versdb :memory: sqlite3 versdb :memory:
set vers [versdb one {SELECT sqlite_source_id()}] set vers [versdb one {SELECT sqlite_source_id()}]
versdb close versdb close
@ -471,6 +474,16 @@ proc speed_trial_init {name} {
proc speed_trial_summary {name} { proc speed_trial_summary {name} {
global total_time global total_time
puts [format {%-21.21s %12d uS TOTAL} $name $total_time] puts [format {%-21.21s %12d uS TOTAL} $name $total_time]
if { 0 } {
sqlite3 versdb :memory:
set vers [lindex [versdb one {SELECT sqlite_source_id()}] 0]
versdb close
puts "CREATE TABLE IF NOT EXISTS time(version, script, test, us);"
foreach {test us} $::speed_trial_times {
puts "INSERT INTO time VALUES('$vers', '$name', '$test', $us);"
}
}
} }
# Run this routine last # Run this routine last