201 lines
4.9 KiB
Plaintext
201 lines
4.9 KiB
Plaintext
# 2001 September 15
|
|
#
|
|
# The author disclaims copyright to this source code. In place of
|
|
# a legal notice, here is a blessing:
|
|
#
|
|
# May you do good and not evil.
|
|
# May you find forgiveness for yourself and forgive others.
|
|
# May you share freely, never taking more than you give.
|
|
#
|
|
#***********************************************************************
|
|
# This file implements regression tests for SQLite library.
|
|
#
|
|
# $Id:
|
|
|
|
|
|
set testdir [file dirname $argv0]
|
|
source $testdir/tester.tcl
|
|
|
|
#
|
|
# Test cases are organized as follows:
|
|
#
|
|
# types-1.*: Insert some records with integers of various sizes, checking
|
|
# that the integers are stored correctly and can be retrieved.
|
|
# types-2.*: Insert and retrieve some records with reals.
|
|
# types-3.*: Insert and retrieve some records with NULLs.
|
|
# types-4.*: Insert and retrieve some records with strings of various sizes.
|
|
# types-5.*: Some tests inserting and retrieving records with several
|
|
# fields each.
|
|
#
|
|
|
|
# Open the table with root-page $rootpage at the btree
|
|
# level. Return a list that is the length of each record
|
|
# in the table, in the tables default scanning order.
|
|
proc record_sizes {rootpage} {
|
|
set bt [btree_open test.db 10 0]
|
|
set c [btree_cursor $bt $rootpage 0]
|
|
btree_first $c
|
|
while 1 {
|
|
lappend res [btree_payload_size $c]
|
|
if {[btree_next $c]} break
|
|
}
|
|
btree_close_cursor $c
|
|
btree_close $bt
|
|
set res
|
|
}
|
|
|
|
|
|
# Create a table and insert some 1-byte integers. Make sure they
|
|
# can be read back OK. These should be 3 byte records.
|
|
do_test types-1.1 {
|
|
execsql {
|
|
CREATE TABLE t1(a integer);
|
|
INSERT INTO t1 VALUES(0);
|
|
INSERT INTO t1 VALUES(120);
|
|
INSERT INTO t1 VALUES(-120);
|
|
}
|
|
} {}
|
|
do_test types-1.2 {
|
|
execsql {
|
|
SELECT a FROM t1;
|
|
}
|
|
} {0 120 -120}
|
|
|
|
# Try some 2-byte integers (4 byte records)
|
|
do_test types-1.3 {
|
|
execsql {
|
|
INSERT INTO t1 VALUES(30000);
|
|
INSERT INTO t1 VALUES(-30000);
|
|
}
|
|
} {}
|
|
do_test types-1.4 {
|
|
execsql {
|
|
SELECT a FROM t1;
|
|
}
|
|
} {0 120 -120 30000 -30000}
|
|
|
|
# 4-byte integers (6 byte records)
|
|
do_test types-1.5 {
|
|
execsql {
|
|
INSERT INTO t1 VALUES(2100000000);
|
|
INSERT INTO t1 VALUES(-2100000000);
|
|
}
|
|
} {}
|
|
do_test types-1.6 {
|
|
execsql {
|
|
SELECT a FROM t1;
|
|
}
|
|
} {0 120 -120 30000 -30000 2100000000 -2100000000}
|
|
|
|
# 8-byte integers (10 byte records)
|
|
do_test types-1.7 {
|
|
execsql {
|
|
INSERT INTO t1 VALUES(9000000*1000000*1000000);
|
|
INSERT INTO t1 VALUES(-9000000*1000000*1000000);
|
|
}
|
|
} {}
|
|
do_test types-1.8 {
|
|
execsql {
|
|
SELECT a FROM t1;
|
|
}
|
|
} [list 0 120 -120 30000 -30000 2100000000 -2100000000 \
|
|
9000000000000000000 -9000000000000000000]
|
|
|
|
# Check that all the record sizes are as we expected.
|
|
do_test types-1.9 {
|
|
set root [db eval {select rootpage from sqlite_master where name = 't1'}]
|
|
record_sizes $root
|
|
} {3 3 3 4 4 6 6 10 10}
|
|
|
|
# Insert some reals. These should be 10 byte records.
|
|
do_test types-2.1 {
|
|
execsql {
|
|
CREATE TABLE t2(a float);
|
|
INSERT INTO t2 VALUES(0.0 + 0.0);
|
|
INSERT INTO t2 VALUES(12345.678 + 0.0);
|
|
INSERT INTO t2 VALUES(-12345.678 + 0.0);
|
|
}
|
|
} {}
|
|
do_test types-2.2 {
|
|
execsql {
|
|
SELECT a FROM t2;
|
|
}
|
|
} {0 12345.678 -12345.678}
|
|
|
|
# Check that all the record sizes are as we expected.
|
|
do_test types-2.3 {
|
|
set root [db eval {select rootpage from sqlite_master where name = 't2'}]
|
|
record_sizes $root
|
|
} {10 10 10}
|
|
|
|
# Insert a NULL. This should be a two byte record.
|
|
do_test types-3.1 {
|
|
execsql {
|
|
CREATE TABLE t3(a nullvalue);
|
|
INSERT INTO t3 VALUES(NULL);
|
|
}
|
|
} {}
|
|
do_test types-3.2 {
|
|
execsql {
|
|
SELECT a ISNULL FROM t3;
|
|
}
|
|
} {1}
|
|
|
|
# Check that all the record sizes are as we expected.
|
|
do_test types-3.3 {
|
|
set root [db eval {select rootpage from sqlite_master where name = 't3'}]
|
|
record_sizes $root
|
|
} {2}
|
|
|
|
# Insert a couple of strings.
|
|
do_test types-4.1 {
|
|
set string10 abcdefghij
|
|
set string500 [string repeat $string10 50]
|
|
set string500000 [string repeat $string10 50000]
|
|
|
|
execsql "
|
|
CREATE TABLE t4(a string);
|
|
INSERT INTO t4 VALUES('$string10');
|
|
INSERT INTO t4 VALUES('$string500');
|
|
INSERT INTO t4 VALUES('$string500000');
|
|
"
|
|
} {}
|
|
do_test types-4.2 {
|
|
execsql {
|
|
SELECT a FROM t4;
|
|
}
|
|
} [list $string10 $string500 $string500000]
|
|
|
|
# Check that all the record sizes are as we expected.
|
|
do_test types-4.3 {
|
|
set root [db eval {select rootpage from sqlite_master where name = 't4'}]
|
|
record_sizes $root
|
|
} {13 504 500005}
|
|
|
|
do_test types-5.1 {
|
|
execsql {
|
|
DROP TABLE t1;
|
|
DROP TABLE t2;
|
|
DROP TABLE t3;
|
|
DROP TABLE t4;
|
|
CREATE TABLE t1(a, b, c);
|
|
}
|
|
} {}
|
|
do_test types-5.2 {
|
|
set string10 abcdefghij
|
|
set string500 [string repeat $string10 50]
|
|
set string500000 [string repeat $string10 50000]
|
|
|
|
execsql "INSERT INTO t1 VALUES(NULL, '$string10', 4000);"
|
|
execsql "INSERT INTO t1 VALUES('$string500', 4000, NULL);"
|
|
execsql "INSERT INTO t1 VALUES(4000, NULL, '$string500000');"
|
|
} {}
|
|
do_test types-5.3 {
|
|
execsql {
|
|
SELECT * FROM t1;
|
|
}
|
|
} [list {} $string10 4000 $string500 4000 {} 4000 {} $string500000]
|
|
|
|
|
|
finish_test
|