1# 2007 May 02 2# 3# The author disclaims copyright to this source code. In place of 4# a legal notice, here is a blessing: 5# 6# 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. 9# 10#*********************************************************************** 11# This file implements regression tests for SQLite library. The 12# focus of this file is testing that it is OK to create new tables 13# and indices while creating existing tables and indices. 14# 15# $Id: createtab.test,v 1.2 2007/05/04 14:36:22 drh Exp $ 16 17set testdir [file dirname $argv0] 18source $testdir/tester.tcl 19 20ifcapable autovacuum { 21 set upperBound 2 22} else { 23 set upperBound 0 24} 25 26# Run these tests for all possible values of autovacuum. 27# 28for {set av 0} {$av<=$upperBound} {incr av} { 29 db close 30 file delete -force test.db test.db-journal 31 sqlite3 db test.db 32 33 # Create a table that spans multiple pages. It is important 34 # that part of the database be in pages beyond the root page. 35 # 36 do_test createtab-$av.1 { 37 execsql "PRAGMA auto_vacuum=$av" 38 execsql { 39 PRAGMA page_size=1024; 40 CREATE TABLE t1(x INTEGER PRIMARY KEY, y); 41 INSERT INTO t1 VALUES(1, hex(randomblob(200))); 42 INSERT INTO t1 VALUES(2, hex(randomblob(200))); 43 INSERT INTO t1 VALUES(3, hex(randomblob(200))); 44 INSERT INTO t1 VALUES(4, hex(randomblob(200))); 45 SELECT count(*) FROM t1; 46 } 47 } {4} 48 do_test createtab-$av.2 { 49 file size test.db 50 } [expr {1024*(4+($av!=0)+([execsql {PRAGMA encoding}]!="UTF-8")*2)}] 51 52 # Start reading the table 53 # 54 do_test createtab-$av.3 { 55 set STMT [sqlite3_prepare db {SELECT x FROM t1} -1 TAIL] 56 sqlite3_step $STMT 57 } {SQLITE_ROW} 58 do_test createtab-$av.4 { 59 sqlite3_column_int $STMT 0 60 } {1} 61 62 # While still reading the table, create a new table. 63 # 64 do_test createtab-$av.5 { 65 execsql { 66 CREATE TABLE t2(a,b); 67 INSERT INTO t2 VALUES(1,2); 68 SELECT * FROM t2; 69 } 70 } {1 2} 71 72 # Continue reading the original table. 73 # 74 do_test createtab-$av.6 { 75 sqlite3_column_int $STMT 0 76 } {1} 77 do_test createtab-$av.7 { 78 sqlite3_step $STMT 79 } {SQLITE_ROW} 80 do_test createtab-$av.8 { 81 sqlite3_column_int $STMT 0 82 } {2} 83 84 # Do another cycle of creating a new database table while contining 85 # to read the original table. 86 # 87 do_test createtab-$av.11 { 88 execsql { 89 CREATE TABLE t3(a,b); 90 INSERT INTO t3 VALUES(4,5); 91 SELECT * FROM t3; 92 } 93 } {4 5} 94 do_test createtab-$av.12 { 95 sqlite3_column_int $STMT 0 96 } {2} 97 do_test createtab-$av.13 { 98 sqlite3_step $STMT 99 } {SQLITE_ROW} 100 do_test createtab-$av.14 { 101 sqlite3_column_int $STMT 0 102 } {3} 103 104 # One more cycle. 105 # 106 do_test createtab-$av.21 { 107 execsql { 108 CREATE TABLE t4(a,b); 109 INSERT INTO t4 VALUES('abc','xyz'); 110 SELECT * FROM t4; 111 } 112 } {abc xyz} 113 do_test createtab-$av.22 { 114 sqlite3_column_int $STMT 0 115 } {3} 116 do_test createtab-$av.23 { 117 sqlite3_step $STMT 118 } {SQLITE_ROW} 119 do_test createtab-$av.24 { 120 sqlite3_column_int $STMT 0 121 } {4} 122 123 # Finish reading. Do an integrity check on the database. 124 # 125 do_test createtab-$av.30 { 126 sqlite3_step $STMT 127 } {SQLITE_DONE} 128 do_test createtab-$av.31 { 129 sqlite3_finalize $STMT 130 } {SQLITE_OK} 131 do_test createtab-$av.32 { 132 execsql { 133 SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1 134 } 135 } {t1 t2 t3 t4} 136 integrity_check createtab-$av.40 137 138} 139 140finish_test 141