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.3 2007/09/12 17:01:45 danielk1977 Exp $ 16 17 set testdir [file dirname $argv0] 18 source $testdir/tester.tcl 19 20 ifcapable autovacuum { 21 set upperBound 2 22 } else { 23 set upperBound 0 24 } 25 26 # Run these tests for all possible values of autovacuum. 27 # 28 for {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 49 set isUtf16 0 50 ifcapable utf16 { 51 set isUtf16 [expr {[execsql {PRAGMA encoding}] != "UTF-8"}] 52 } 53 54 do_test createtab-$av.2 { 55 file size test.db 56 } [expr {1024*(4+($av!=0)+(${isUtf16}*2))}] 57 58 # Start reading the table 59 # 60 do_test createtab-$av.3 { 61 set STMT [sqlite3_prepare db {SELECT x FROM t1} -1 TAIL] 62 sqlite3_step $STMT 63 } {SQLITE_ROW} 64 do_test createtab-$av.4 { 65 sqlite3_column_int $STMT 0 66 } {1} 67 68 # While still reading the table, create a new table. 69 # 70 do_test createtab-$av.5 { 71 execsql { 72 CREATE TABLE t2(a,b); 73 INSERT INTO t2 VALUES(1,2); 74 SELECT * FROM t2; 75 } 76 } {1 2} 77 78 # Continue reading the original table. 79 # 80 do_test createtab-$av.6 { 81 sqlite3_column_int $STMT 0 82 } {1} 83 do_test createtab-$av.7 { 84 sqlite3_step $STMT 85 } {SQLITE_ROW} 86 do_test createtab-$av.8 { 87 sqlite3_column_int $STMT 0 88 } {2} 89 90 # Do another cycle of creating a new database table while contining 91 # to read the original table. 92 # 93 do_test createtab-$av.11 { 94 execsql { 95 CREATE TABLE t3(a,b); 96 INSERT INTO t3 VALUES(4,5); 97 SELECT * FROM t3; 98 } 99 } {4 5} 100 do_test createtab-$av.12 { 101 sqlite3_column_int $STMT 0 102 } {2} 103 do_test createtab-$av.13 { 104 sqlite3_step $STMT 105 } {SQLITE_ROW} 106 do_test createtab-$av.14 { 107 sqlite3_column_int $STMT 0 108 } {3} 109 110 # One more cycle. 111 # 112 do_test createtab-$av.21 { 113 execsql { 114 CREATE TABLE t4(a,b); 115 INSERT INTO t4 VALUES('abc','xyz'); 116 SELECT * FROM t4; 117 } 118 } {abc xyz} 119 do_test createtab-$av.22 { 120 sqlite3_column_int $STMT 0 121 } {3} 122 do_test createtab-$av.23 { 123 sqlite3_step $STMT 124 } {SQLITE_ROW} 125 do_test createtab-$av.24 { 126 sqlite3_column_int $STMT 0 127 } {4} 128 129 # Finish reading. Do an integrity check on the database. 130 # 131 do_test createtab-$av.30 { 132 sqlite3_step $STMT 133 } {SQLITE_DONE} 134 do_test createtab-$av.31 { 135 sqlite3_finalize $STMT 136 } {SQLITE_OK} 137 do_test createtab-$av.32 { 138 execsql { 139 SELECT name FROM sqlite_master WHERE type='table' ORDER BY 1 140 } 141 } {t1 t2 t3 t4} 142 integrity_check createtab-$av.40 143 144 } 145 146 finish_test 147