Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Get all tests running without memory leaks. (CVS 4714) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
5807921f5a6e2e08f2c9e79aa91d8c58 |
User & Date: | drh 2008-01-16 17:46:38.000 |
Context
2008-01-16
| ||
18:20 | Use 1<<$x instead of pow(2,$x) in the test suite code. (CVS 4715) (check-in: 3a289b6d28 user: danielk1977 tags: trunk) | |
17:46 | Get all tests running without memory leaks. (CVS 4714) (check-in: 5807921f5a user: drh tags: trunk) | |
08:24 | Work around using (regexp) in the (ifcapable) function of the test suite. So that simpler versions of tcl can call it. (CVS 4713) (check-in: 3aa5606bd4 user: danielk1977 tags: trunk) | |
Changes
Changes to main.mk.
︙ | ︙ | |||
225 226 227 228 229 230 231 | #TESTSRC += $(TOP)/ext/fts3/fts3_tokenizer.c TESTSRC2 = \ $(TOP)/src/attach.c $(TOP)/src/btree.c $(TOP)/src/build.c $(TOP)/src/date.c \ $(TOP)/src/expr.c $(TOP)/src/func.c $(TOP)/src/insert.c $(TOP)/src/os.c \ $(TOP)/src/os_os2.c $(TOP)/src/os_unix.c $(TOP)/src/os_win.c \ $(TOP)/src/pager.c $(TOP)/src/pragma.c $(TOP)/src/prepare.c \ | > | | 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 | #TESTSRC += $(TOP)/ext/fts3/fts3_tokenizer.c TESTSRC2 = \ $(TOP)/src/attach.c $(TOP)/src/btree.c $(TOP)/src/build.c $(TOP)/src/date.c \ $(TOP)/src/expr.c $(TOP)/src/func.c $(TOP)/src/insert.c $(TOP)/src/os.c \ $(TOP)/src/os_os2.c $(TOP)/src/os_unix.c $(TOP)/src/os_win.c \ $(TOP)/src/pager.c $(TOP)/src/pragma.c $(TOP)/src/prepare.c \ $(TOP)/src/printf.c $(TOP)/src/random.c \ $(TOP)/src/select.c $(TOP)/src/tokenize.c \ $(TOP)/src/utf.c $(TOP)/src/util.c $(TOP)/src/vdbeapi.c $(TOP)/src/vdbeaux.c \ $(TOP)/src/vdbe.c $(TOP)/src/vdbemem.c $(TOP)/src/where.c parse.c # Header files used by all library source files. # HDR = \ $(TOP)/src/btree.h \ |
︙ | ︙ |
Changes to src/os_unix.c.
︙ | ︙ | |||
1028 1029 1030 1031 1032 1033 1034 1035 | /* ** Truncate an open file to a specified size */ static int unixTruncate(sqlite3_file *id, i64 nByte){ int rc; assert( id ); rc = ftruncate(((unixFile*)id)->h, (off_t)nByte); | > < | 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 | /* ** Truncate an open file to a specified size */ static int unixTruncate(sqlite3_file *id, i64 nByte){ int rc; assert( id ); SimulateIOError( return SQLITE_IOERR_TRUNCATE ); rc = ftruncate(((unixFile*)id)->h, (off_t)nByte); if( rc ){ return SQLITE_IOERR_TRUNCATE; }else{ return SQLITE_OK; } } |
︙ | ︙ |
Changes to src/random.c.
︙ | ︙ | |||
11 12 13 14 15 16 17 | ************************************************************************* ** This file contains code to implement a pseudo-random number ** generator (PRNG) for SQLite. ** ** Random numbers are used by some of the database backends in order ** to generate random integer keys for tables or random filenames. ** | | > > > > > > > > > < < < < < < < < | | | | | | | | | | | | | | | | > > > > > > > > > > > > > > > > > | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | ************************************************************************* ** This file contains code to implement a pseudo-random number ** generator (PRNG) for SQLite. ** ** Random numbers are used by some of the database backends in order ** to generate random integer keys for tables or random filenames. ** ** $Id: random.c,v 1.21 2008/01/16 17:46:38 drh Exp $ */ #include "sqliteInt.h" /* All threads share a single random number generator. ** This structure is the current state of the generator. */ static struct sqlite3PrngType { unsigned char isInit; /* True if initialized */ unsigned char i, j; /* State variables */ unsigned char s[256]; /* State variables */ } sqlite3Prng; /* ** Get a single 8-bit random value from the RC4 PRNG. The Mutex ** must be held while executing this routine. ** ** Why not just use a library random generator like lrand48() for this? ** Because the OP_NewRowid opcode in the VDBE depends on having a very ** good source of random numbers. The lrand48() library function may ** well be good enough. But maybe not. Or maybe lrand48() has some ** subtle problems on some systems that could cause problems. It is hard ** to know. To minimize the risk of problems due to bad lrand48() ** implementations, SQLite uses this random number generator based ** on RC4, which we know works very well. ** ** (Later): Actually, OP_NewRowid does not depend on a good source of ** randomness any more. But we will leave this code in all the same. */ static int randomByte(void){ unsigned char t; /* Initialize the state of the random number generator once, ** the first time this routine is called. The seed value does ** not need to contain a lot of randomness since we are not ** trying to do secure encryption or anything like that... ** ** Nothing in this file or anywhere else in SQLite does any kind of ** encryption. The RC4 algorithm is being used as a PRNG (pseudo-random ** number generator) not as an encryption device. */ if( !sqlite3Prng.isInit ){ int i; char k[256]; sqlite3Prng.j = 0; sqlite3Prng.i = 0; sqlite3OsRandomness(sqlite3_vfs_find(0), 256, k); for(i=0; i<256; i++){ sqlite3Prng.s[i] = i; } for(i=0; i<256; i++){ sqlite3Prng.j += sqlite3Prng.s[i] + k[i]; t = sqlite3Prng.s[sqlite3Prng.j]; sqlite3Prng.s[sqlite3Prng.j] = sqlite3Prng.s[i]; sqlite3Prng.s[i] = t; } sqlite3Prng.isInit = 1; } /* Generate and return single random byte */ sqlite3Prng.i++; t = sqlite3Prng.s[sqlite3Prng.i]; sqlite3Prng.j += t; sqlite3Prng.s[sqlite3Prng.i] = sqlite3Prng.s[sqlite3Prng.j]; sqlite3Prng.s[sqlite3Prng.j] = t; t += sqlite3Prng.s[sqlite3Prng.i]; return sqlite3Prng.s[t]; } /* ** Return N random bytes. */ void sqlite3Randomness(int N, void *pBuf){ unsigned char *zBuf = pBuf; static sqlite3_mutex *mutex = 0; if( mutex==0 ){ mutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_PRNG); } sqlite3_mutex_enter(mutex); while( N-- ){ *(zBuf++) = randomByte(); } sqlite3_mutex_leave(mutex); } #ifdef SQLITE_TEST /* ** For testing purposes, we sometimes want to preserve the state of ** PRNG and restore the PRNG to its saved state at a later time. */ static struct sqlite3PrngType sqlite3SavedPrng; void sqlite3SavePrngState(void){ memcpy(&sqlite3SavedPrng, &sqlite3Prng, sizeof(sqlite3Prng)); } void sqlite3RestorePrngState(void){ memcpy(&sqlite3Prng, &sqlite3SavedPrng, sizeof(sqlite3Prng)); } void sqlite3ResetPrngState(void){ sqlite3Prng.isInit = 0; } #endif /* SQLITE_TEST */ |
Changes to src/test1.c.
︙ | ︙ | |||
9 10 11 12 13 14 15 | ** May you share freely, never taking more than you give. ** ************************************************************************* ** Code for testing all sorts of SQLite interfaces. This code ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | ** May you share freely, never taking more than you give. ** ************************************************************************* ** Code for testing all sorts of SQLite interfaces. This code ** is not included in the SQLite library. It is used for automated ** testing of the SQLite library. ** ** $Id: test1.c,v 1.282 2008/01/16 17:46:38 drh Exp $ */ #include "sqliteInt.h" #include "tcl.h" #include <stdlib.h> #include <string.h> /* |
︙ | ︙ | |||
4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 | assert( apVfs[i]==sqlite3_vfs_find(0) ); assert( apVfs[i]==sqlite3_vfs_find(apVfs[i]->zName) ); } } return TCL_OK; } /* ** Register commands with the TCL interpreter. */ int Sqlitetest1_Init(Tcl_Interp *interp){ extern int sqlite3_search_count; extern int sqlite3_interrupt_count; | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 4237 4238 4239 4240 4241 4242 4243 4244 4245 4246 4247 4248 4249 4250 4251 4252 4253 4254 4255 4256 4257 4258 4259 4260 4261 4262 4263 4264 4265 4266 4267 4268 4269 4270 4271 4272 4273 4274 4275 4276 4277 4278 4279 4280 4281 4282 4283 4284 4285 4286 4287 4288 4289 4290 | assert( apVfs[i]==sqlite3_vfs_find(0) ); assert( apVfs[i]==sqlite3_vfs_find(apVfs[i]->zName) ); } } return TCL_OK; } /* ** tclcmd: save_prng_state */ static int save_prng_state( ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ int objc, /* Number of arguments */ Tcl_Obj *CONST objv[] /* Command arguments */ ){ extern void sqlite3SavePrngState(void); sqlite3SavePrngState(); return TCL_OK; } /* ** tclcmd: restore_prng_state */ static int restore_prng_state( ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ int objc, /* Number of arguments */ Tcl_Obj *CONST objv[] /* Command arguments */ ){ extern void sqlite3RestorePrngState(void); sqlite3RestorePrngState(); return TCL_OK; } /* ** tclcmd: reset_prng_state */ static int reset_prng_state( ClientData clientData, /* Pointer to sqlite3_enable_XXX function */ Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ int objc, /* Number of arguments */ Tcl_Obj *CONST objv[] /* Command arguments */ ){ extern void sqlite3ResetPrngState(void); sqlite3ResetPrngState(); return TCL_OK; } /* ** Register commands with the TCL interpreter. */ int Sqlitetest1_Init(Tcl_Interp *interp){ extern int sqlite3_search_count; extern int sqlite3_interrupt_count; |
︙ | ︙ | |||
4338 4339 4340 4341 4342 4343 4344 4345 4346 4347 4348 4349 4350 4351 | { "sqlite3_tsd_release", test_tsd_release, 0}, { "sqlite3_thread_cleanup", test_thread_cleanup, 0}, { "sqlite3_pager_refcounts", test_pager_refcounts, 0}, { "sqlite3_load_extension", test_load_extension, 0}, { "sqlite3_enable_load_extension", test_enable_load, 0}, { "sqlite3_extended_result_codes", test_extended_result_codes, 0}, /* sqlite3_column_*() API */ { "sqlite3_column_count", test_column_count ,0 }, { "sqlite3_data_count", test_data_count ,0 }, { "sqlite3_column_type", test_column_type ,0 }, { "sqlite3_column_blob", test_column_blob ,0 }, { "sqlite3_column_double", test_column_double ,0 }, | > > > > | 4378 4379 4380 4381 4382 4383 4384 4385 4386 4387 4388 4389 4390 4391 4392 4393 4394 4395 | { "sqlite3_tsd_release", test_tsd_release, 0}, { "sqlite3_thread_cleanup", test_thread_cleanup, 0}, { "sqlite3_pager_refcounts", test_pager_refcounts, 0}, { "sqlite3_load_extension", test_load_extension, 0}, { "sqlite3_enable_load_extension", test_enable_load, 0}, { "sqlite3_extended_result_codes", test_extended_result_codes, 0}, { "save_prng_state", save_prng_state, 0 }, { "restore_prng_state", restore_prng_state, 0 }, { "reset_prng_state", reset_prng_state, 0 }, /* sqlite3_column_*() API */ { "sqlite3_column_count", test_column_count ,0 }, { "sqlite3_data_count", test_data_count ,0 }, { "sqlite3_column_type", test_column_type ,0 }, { "sqlite3_column_blob", test_column_blob ,0 }, { "sqlite3_column_double", test_column_double ,0 }, |
︙ | ︙ |
Changes to src/vdbe.c.
︙ | ︙ | |||
39 40 41 42 43 44 45 | ** ** Various scripts scan this source file in order to generate HTML ** documentation, headers files, or other derived files. The formatting ** of the code in this file is, therefore, important. See other comments ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** | | | 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | ** ** Various scripts scan this source file in order to generate HTML ** documentation, headers files, or other derived files. The formatting ** of the code in this file is, therefore, important. See other comments ** in this file for details. If in doubt, do not deviate from existing ** commenting and indentation practices when changing or adding code. ** ** $Id: vdbe.c,v 1.696 2008/01/16 17:46:38 drh Exp $ */ #include "sqliteInt.h" #include <ctype.h> #include "vdbeInt.h" /* ** The following global variable is incremented every time a cursor |
︙ | ︙ | |||
3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 | ** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set, ** then rowid is stored for subsequent return by the ** sqlite3_last_insert_rowid() function (otherwise it is unmodified). ** ** Parameter P4 may point to a string containing the table-name, or ** may be NULL. If it is not NULL, then the update-hook ** (sqlite3.xUpdateCallback) is invoked following a successful insert. ** ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ case OP_Insert: { /* no-push */ Mem *pData = &p->aMem[pOp->p2]; Mem *pKey = &p->aMem[pOp->p3]; | > > > > > > | 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 | ** incremented (otherwise not). If the OPFLAG_LASTROWID flag of P5 is set, ** then rowid is stored for subsequent return by the ** sqlite3_last_insert_rowid() function (otherwise it is unmodified). ** ** Parameter P4 may point to a string containing the table-name, or ** may be NULL. If it is not NULL, then the update-hook ** (sqlite3.xUpdateCallback) is invoked following a successful insert. ** ** (WARNING/TODO: If P1 is a pseudo-cursor and P2 is dynamically ** allocated, then ownership of P2 is transferred to the pseudo-cursor ** and register P2 becomes ephemeral. If the cursor is changed, the ** value of register P2 will then change. Make sure this does not ** cause any problems.) ** ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ case OP_Insert: { /* no-push */ Mem *pData = &p->aMem[pOp->p2]; Mem *pKey = &p->aMem[pOp->p3]; |
︙ | ︙ | |||
3581 3582 3583 3584 3585 3586 3587 | } if( pC->pseudoTable ){ sqlite3_free(pC->pData); pC->iKey = iKey; pC->nData = pData->n; if( pData->flags & MEM_Dyn ){ pC->pData = pData->z; | | > | 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 | } if( pC->pseudoTable ){ sqlite3_free(pC->pData); pC->iKey = iKey; pC->nData = pData->n; if( pData->flags & MEM_Dyn ){ pC->pData = pData->z; pData->flags &= ~MEM_Dyn; pData->flags |= MEM_Ephem; }else{ pC->pData = sqlite3_malloc( pC->nData+2 ); if( !pC->pData ) goto no_mem; memcpy(pC->pData, pData->z, pC->nData); pC->pData[pC->nData] = 0; pC->pData[pC->nData+1] = 0; } |
︙ | ︙ |
Changes to test/capi2.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2003 January 29 # # 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. The # focus of this script testing the callback-free C/C++ API. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 2003 January 29 # # 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. The # focus of this script testing the callback-free C/C++ API. # # $Id: capi2.test,v 1.35 2008/01/16 17:46:38 drh Exp $ # set testdir [file dirname $argv0] source $testdir/tester.tcl # Return the text values from the current row pointed at by STMT as a list. proc get_row_values {STMT} { |
︙ | ︙ | |||
614 615 616 617 618 619 620 | } {4} do_test capi2-7.11a { execsql {SELECT count(*) FROM t1} } {4} ifcapable {explain} { do_test capi2-7.12 { | < | 614 615 616 617 618 619 620 621 622 623 624 625 626 627 | } {4} do_test capi2-7.11a { execsql {SELECT count(*) FROM t1} } {4} ifcapable {explain} { do_test capi2-7.12 { set x [stepsql $DB {EXPLAIN SELECT * FROM t1}] lindex $x 0 } {0} } # Ticket #261 - make sure we can finalize before the end of a query. # |
︙ | ︙ | |||
746 747 748 749 750 751 752 | # This view will thwart the flattening optimization. do_test capi2-13.1 { execsql { CREATE VIEW view2 AS SELECT * FROM tab1 limit 10 offset 10; } } {} | < | 745 746 747 748 749 750 751 752 753 754 755 756 757 758 | # This view will thwart the flattening optimization. do_test capi2-13.1 { execsql { CREATE VIEW view2 AS SELECT * FROM tab1 limit 10 offset 10; } } {} do_test capi2-13.2 { check_origins {SELECT col2, col1 FROM view2} } [list {main tab1 col2} {main tab1 col1}] do_test capi2-13.3 { check_origins {SELECT col2 AS hello, col1 AS world FROM view2} } [list {main tab1 col2} {main tab1 col1}] do_test capi2-13.4 { |
︙ | ︙ |
Changes to test/crash4.test.
︙ | ︙ | |||
8 9 10 11 12 13 14 | # May you share freely, never taking more than you give. # #*********************************************************************** # # This file contains additional tests to verify that SQLite database # file survive a power loss or OS crash. # | | < < < < < < < < < < < < < < < < < < < < < < < < < < | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | # May you share freely, never taking more than you give. # #*********************************************************************** # # This file contains additional tests to verify that SQLite database # file survive a power loss or OS crash. # # $Id: crash4.test,v 1.3 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl ifcapable !crashtest { finish_test return } # A sequence of SQL commands: # set sql_cmd_list { {CREATE TABLE a(id INTEGER, name CHAR(50))} {INSERT INTO a(id,name) VALUES(1,'one')} {INSERT INTO a(id,name) VALUES(2,'two')} |
︙ | ︙ | |||
68 69 70 71 72 73 74 | # Assume that a database is created by evaluating the SQL statements # in $sql_cmd_list. Compute a set of checksums that capture the state # of the database after each statement. Also include a checksum for # the state of the database prior to any of these statements. # set crash4_cksum_set {} | | | | 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | # Assume that a database is created by evaluating the SQL statements # in $sql_cmd_list. Compute a set of checksums that capture the state # of the database after each statement. Also include a checksum for # the state of the database prior to any of these statements. # set crash4_cksum_set {} lappend crash4_cksum_set [allcksum db] foreach cmd $sql_cmd_list { db eval $cmd lappend crash4_cksum_set [allcksum db] } # Run the sequence of SQL statements shown above repeatedly. # Close and reopen the database right before the UPDATE statement. # On each repetition, introduce database corruption typical of # what might be seen in a power loss or OS crash. # |
︙ | ︙ | |||
116 117 118 119 120 121 122 | set c [list 1 {child process exited abnormally}] } set c } {1 {child process exited abnormally}} sqlite3 db test.db integrity_check crash4-1.$cnt.2 do_test crash4-1.$cnt.3 { | | | 90 91 92 93 94 95 96 97 98 99 100 101 102 | set c [list 1 {child process exited abnormally}] } set c } {1 {child process exited abnormally}} sqlite3 db test.db integrity_check crash4-1.$cnt.2 do_test crash4-1.$cnt.3 { set x [lsearch $::crash4_cksum_set [allcksum db]] expr {$x>=0} } {1} } finish_test |
Changes to test/interrupt.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2004 Feb 8 # # 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. The # focus of this script is the sqlite_interrupt() API. # | | < < < < < < < < < < < < < < < | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 2004 Feb 8 # # 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. The # focus of this script is the sqlite_interrupt() API. # # $Id: interrupt.test,v 1.16 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl set DB [sqlite3_connection_pointer db] # This routine attempts to execute the sql in $sql. It triggers an # interrupt at progressively later and later points during the processing # and checks to make sure SQLITE_INTERRUPT is returned. Eventually, # the routine completes successfully. # proc interrupt_test {testid sql result {initcnt 0}} { set orig_sum [cksum] |
︙ | ︙ |
Changes to test/ioerr.test.
︙ | ︙ | |||
11 12 13 14 15 16 17 | # This file implements regression tests for SQLite library. The # focus of this file is testing for correct handling of I/O errors # such as writes failing because the disk is full. # # The tests in this file use special facilities that are only # available in the SQLite test fixture. # | | | 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # This file implements regression tests for SQLite library. The # focus of this file is testing for correct handling of I/O errors # such as writes failing because the disk is full. # # The tests in this file use special facilities that are only # available in the SQLite test fixture. # # $Id: ioerr.test,v 1.34 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # If SQLITE_DEFAULT_AUTOVACUUM is set to true, then a simulated IO error # on the 8th IO operation in the SQL script below doesn't report an error. |
︙ | ︙ | |||
163 164 165 166 167 168 169 | # Test handling of IO errors that occur while rolling back hot journal # files. # # These tests can't be run on windows because the windows version of # SQLite holds a mandatory exclusive lock on journal files it has open. # | < | 163 164 165 166 167 168 169 170 171 172 173 174 175 176 | # Test handling of IO errors that occur while rolling back hot journal # files. # # These tests can't be run on windows because the windows version of # SQLite holds a mandatory exclusive lock on journal files it has open. # if {$tcl_platform(platform)!="windows"} { do_ioerr_test ioerr-7 -tclprep { db close sqlite3 db2 test2.db db2 eval { PRAGMA synchronous = 0; CREATE TABLE t1(a, b); |
︙ | ︙ |
Changes to test/malloc.test.
︙ | ︙ | |||
12 13 14 15 16 17 18 | # This file attempts to check the behavior of the SQLite library in # an out-of-memory situation. When compiled with -DSQLITE_DEBUG=1, # the SQLite library accepts a special command (sqlite3_memdebug_fail N C) # which causes the N-th malloc to fail. This special feature is used # to see what happens in the library if a malloc were to really fail # due to an out-of-memory situation. # | | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | # This file attempts to check the behavior of the SQLite library in # an out-of-memory situation. When compiled with -DSQLITE_DEBUG=1, # the SQLite library accepts a special command (sqlite3_memdebug_fail N C) # which causes the N-th malloc to fail. This special feature is used # to see what happens in the library if a malloc were to really fail # due to an out-of-memory situation. # # $Id: malloc.test,v 1.54 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Only run these tests if memory debugging is turned on. # ifcapable !memdebug { |
︙ | ︙ | |||
240 241 242 243 244 245 246 247 248 249 250 251 252 253 | } } } # This block tests that malloc() failures that occur whilst commiting # a multi-file transaction are handled correctly. # do_malloc_test 9 -sqlprep { ATTACH 'test2.db' as test2; CREATE TABLE abc1(a, b, c); CREATE TABLE test2.abc2(a, b, c); } -sqlbody { BEGIN; INSERT INTO abc1 VALUES(1, 2, 3); | > | 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 | } } } # This block tests that malloc() failures that occur whilst commiting # a multi-file transaction are handled correctly. # breakpoint do_malloc_test 9 -sqlprep { ATTACH 'test2.db' as test2; CREATE TABLE abc1(a, b, c); CREATE TABLE test2.abc2(a, b, c); } -sqlbody { BEGIN; INSERT INTO abc1 VALUES(1, 2, 3); |
︙ | ︙ | |||
266 267 268 269 270 271 272 | db eval {CREATE TABLE abc(a, b, c)} } -tclbody { db close sqlite3 db2 test.db sqlite3_extended_result_codes db2 1 db2 eval {SELECT * FROM sqlite_master} db2 close | | | 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 | db eval {CREATE TABLE abc(a, b, c)} } -tclbody { db close sqlite3 db2 test.db sqlite3_extended_result_codes db2 1 db2 eval {SELECT * FROM sqlite_master} db2 close } # This block tests malloc() failures that occur within calls to # sqlite3_create_function(). do_malloc_test 11 -tclbody { set rc [sqlite3_create_function db] if {[string match $rc SQLITE_OK]} { set rc [sqlite3_create_aggregate db] |
︙ | ︙ |
Changes to test/malloc2.test.
︙ | ︙ | |||
12 13 14 15 16 17 18 | # This file attempts to check that the library can recover from a malloc() # failure when sqlite3_global_recover() is invoked. # # (Later:) The sqlite3_global_recover() interface is now a no-op. # Recovery from malloc() failures is automatic. But we keep these # tests around because you can never have too many test cases. # | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | # This file attempts to check that the library can recover from a malloc() # failure when sqlite3_global_recover() is invoked. # # (Later:) The sqlite3_global_recover() interface is now a no-op. # Recovery from malloc() failures is automatic. But we keep these # tests around because you can never have too many test cases. # # $Id: malloc2.test,v 1.10 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Only run these tests if memory debugging is turned on. # ifcapable !memdebug { puts "Skipping malloc tests: not compiled with -DSQLITE_MEMDEBUG..." finish_test return } sqlite3_extended_result_codes db 1 proc do_malloc2_test {tn args} { array set ::mallocopts $args set sum [allcksum db] for {set ::n 1} {true} {incr ::n} { # Run the SQL. Malloc number $::n is set to fail. A malloc() failure # may or may not be reported. sqlite3_memdebug_fail $::n -repeat 1 do_test malloc2-$tn.$::n.2 { |
︙ | ︙ | |||
112 113 114 115 116 117 118 | } } expr 0 } {0} # Checksum the database. do_test malloc2-$tn.$::n.5 { | | | 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | } } expr 0 } {0} # Checksum the database. do_test malloc2-$tn.$::n.5 { allcksum db } $sum integrity_check malloc2-$tn.$::n.6 if {$::nErr>1} return } unset ::mallocopts } |
︙ | ︙ |
Changes to test/malloc3.test.
︙ | ︙ | |||
9 10 11 12 13 14 15 | # #*********************************************************************** # # This file contains tests to ensure that the library handles malloc() failures # correctly. The emphasis of these tests are the _prepare(), _step() and # _finalize() calls. # | | | 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | # #*********************************************************************** # # This file contains tests to ensure that the library handles malloc() failures # correctly. The emphasis of these tests are the _prepare(), _step() and # _finalize() calls. # # $Id: malloc3.test,v 1.19 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Only run these tests if memory debugging is turned on. # ifcapable !memdebug { |
︙ | ︙ | |||
145 146 147 148 149 150 151 152 153 154 155 156 157 158 | # These procs are used to build up a "program" in global variable # ::run_test_script. At the end of this file, the proc [run_test] is used # to execute the program (and all test cases contained therein). # set ::run_test_script [list] proc TEST {id t} {lappend ::run_test_script -test [list $id $t]} proc PREP {p} {lappend ::run_test_script -prep [string trim $p]} # SQL -- # # SQL ?-norollback? <sql-text> # # Add an 'SQL' primitive to the program (see notes above). If the -norollback # switch is present, then the statement is not allowed to automatically roll | > | 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 | # These procs are used to build up a "program" in global variable # ::run_test_script. At the end of this file, the proc [run_test] is used # to execute the program (and all test cases contained therein). # set ::run_test_script [list] proc TEST {id t} {lappend ::run_test_script -test [list $id $t]} proc PREP {p} {lappend ::run_test_script -prep [string trim $p]} proc DEBUG {s} {lappend ::run_test_script -debug $s} # SQL -- # # SQL ?-norollback? <sql-text> # # Add an 'SQL' primitive to the program (see notes above). If the -norollback # switch is present, then the statement is not allowed to automatically roll |
︙ | ︙ | |||
252 253 254 255 256 257 258 | } } {abc abc abc_i abc abc_t abc abc_v abc_v 1 2 3} } set sql { BEGIN;DELETE FROM abc; } | | | 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | } } {abc abc abc_i abc abc_t abc abc_v abc_v 1 2 3} } set sql { BEGIN;DELETE FROM abc; } for {set i 1} {$i < 15} {incr i} { set a $i set b "String value $i" set c [string repeat X $i] append sql "INSERT INTO abc VALUES ($a, '$b', '$c');" } append sql {COMMIT;} PREP $sql |
︙ | ︙ | |||
541 542 543 544 545 546 547 | db rollback_hook [list incr ::rollback_hook_count] set iFail $iFailStart set pc $pcstart while {$pc*2 < [llength $arglist]} { # Id of this iteration: | < > < < | 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 | db rollback_hook [list incr ::rollback_hook_count] set iFail $iFailStart set pc $pcstart while {$pc*2 < [llength $arglist]} { # Id of this iteration: set k [lindex $arglist [expr 2 * $pc]] set iterid "pc=$pc.iFail=$iFail$k" set v [lindex $arglist [expr 2 * $pc + 1]] switch -- $k { -test { foreach {id script} $v {} incr pc } -sql { set ::rollback_hook_count 0 set ac [sqlite3_get_autocommit $::DB] ;# Auto-Commit |
︙ | ︙ | |||
627 628 629 630 631 632 633 634 635 636 637 638 639 640 | } } -prep { db eval $v incr pc } default { error "Unknown switch: $k" } } } } # Turn of the Tcl interface's prepared statement caching facility. Then | > > > > > | 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 | } } -prep { db eval $v incr pc } -debug { eval $v incr pc } default { error "Unknown switch: $k" } } } } # Turn of the Tcl interface's prepared statement caching facility. Then |
︙ | ︙ |
Changes to test/mallocC.test.
︙ | ︙ | |||
8 9 10 11 12 13 14 | # May you share freely, never taking more than you give. # #*********************************************************************** # # This file tests aspects of the malloc failure while parsing # CREATE TABLE statements in auto_vacuum mode. # | | < < < < < < < < < < < < < < < < < < < < < < < < < < < < | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | # May you share freely, never taking more than you give. # #*********************************************************************** # # This file tests aspects of the malloc failure while parsing # CREATE TABLE statements in auto_vacuum mode. # # $Id: mallocC.test,v 1.8 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Only run these tests if memory debugging is turned on. # ifcapable !memdebug||!compound { puts "Skipping mallocC tests: not compiled with -DSQLITE_MEMDEBUG..." finish_test return } proc do_mallocC_test {tn args} { array set ::mallocopts $args #set sum [allcksum db] for {set ::n 1} {true} {incr ::n} { # Run the SQL. Malloc number $::n is set to fail. A malloc() failure # may or may not be reported. sqlite3_memdebug_fail $::n -repeat 1 do_test mallocC-$tn.$::n.1 { |
︙ | ︙ | |||
95 96 97 98 99 100 101 | } } expr 0 } {0} # Checksum the database. #do_test mallocC-$tn.$::n.3 { | | | 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | } } expr 0 } {0} # Checksum the database. #do_test mallocC-$tn.$::n.3 { # allcksum db #} $sum #integrity_check mallocC-$tn.$::n.4 if {$::nErr>1} return } unset ::mallocopts } |
︙ | ︙ |
Changes to test/malloc_common.tcl.
︙ | ︙ | |||
8 9 10 11 12 13 14 | # May you share freely, never taking more than you give. # #*********************************************************************** # # This file contains common code used by many different malloc tests # within the test suite. # | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # May you share freely, never taking more than you give. # #*********************************************************************** # # This file contains common code used by many different malloc tests # within the test suite. # # $Id: malloc_common.tcl,v 1.10 2008/01/16 17:46:38 drh Exp $ # If we did not compile with malloc testing enabled, then do nothing. # ifcapable !memdebug { return 0 } |
︙ | ︙ | |||
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | set tn malloc-$tn } if {[info exists ::mallocopts(-start)]} { set start $::mallocopts(-start) } else { set start 0 } foreach ::iRepeat {0 1} { set ::go 1 for {set ::n $start} {$::go && $::n < 50000} {incr ::n} { # If $::iRepeat is 0, then the malloc() failure is transient - it # fails and then subsequent calls succeed. If $::iRepeat is 1, # then the failure is persistent - once malloc() fails it keeps # failing. # set zRepeat "transient" if {$::iRepeat} {set zRepeat "persistent"} do_test ${tn}.${zRepeat}.${::n} { # Remove all traces of database files test.db and test2.db # from the file-system. Then open (empty database) "test.db" # with the handle [db]. # | > > > | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | set tn malloc-$tn } if {[info exists ::mallocopts(-start)]} { set start $::mallocopts(-start) } else { set start 0 } save_prng_state foreach ::iRepeat {0 1} { set ::go 1 for {set ::n $start} {$::go && $::n < 50000} {incr ::n} { # If $::iRepeat is 0, then the malloc() failure is transient - it # fails and then subsequent calls succeed. If $::iRepeat is 1, # then the failure is persistent - once malloc() fails it keeps # failing. # set zRepeat "transient" if {$::iRepeat} {set zRepeat "persistent"} restore_prng_state foreach file [glob -nocomplain test.db-mj*] {file delete -force $file} do_test ${tn}.${zRepeat}.${::n} { # Remove all traces of database files test.db and test2.db # from the file-system. Then open (empty database) "test.db" # with the handle [db]. # |
︙ | ︙ |
Changes to test/tester.tcl.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 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 some common TCL routines used for regression # testing the SQLite library # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 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 some common TCL routines used for regression # testing the SQLite library # # $Id: tester.tcl,v 1.100 2008/01/16 17:46:38 drh Exp $ set tcl_precision 15 set sqlite_pending_byte 0x0010000 # # Check the command-line arguments for a default soft-heap-limit. |
︙ | ︙ | |||
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | set ::ioerropts(-cksum) 0 set ::ioerropts(-erc) 0 set ::ioerropts(-count) 100000000 set ::ioerropts(-persist) 1 array set ::ioerropts $args set ::go 1 for {set n $::ioerropts(-start)} {$::go} {incr n} { set ::TN $n incr ::ioerropts(-count) -1 if {$::ioerropts(-count)<0} break # Skip this IO error if it was specified with the "-exclude" option. if {[info exists ::ioerropts(-exclude)]} { if {[lsearch $::ioerropts(-exclude) $n]!=-1} continue } # Delete the files test.db and test2.db, then execute the TCL and # SQL (in that order) to prepare for the test case. do_test $testname.$n.1 { set ::sqlite_io_error_pending 0 catch {db close} catch {file delete -force test.db} | > > > | 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 | set ::ioerropts(-cksum) 0 set ::ioerropts(-erc) 0 set ::ioerropts(-count) 100000000 set ::ioerropts(-persist) 1 array set ::ioerropts $args set ::go 1 #reset_prng_state save_prng_state for {set n $::ioerropts(-start)} {$::go} {incr n} { set ::TN $n incr ::ioerropts(-count) -1 if {$::ioerropts(-count)<0} break # Skip this IO error if it was specified with the "-exclude" option. if {[info exists ::ioerropts(-exclude)]} { if {[lsearch $::ioerropts(-exclude) $n]!=-1} continue } restore_prng_state # Delete the files test.db and test2.db, then execute the TCL and # SQL (in that order) to prepare for the test case. do_test $testname.$n.1 { set ::sqlite_io_error_pending 0 catch {db close} catch {file delete -force test.db} |
︙ | ︙ | |||
490 491 492 493 494 495 496 | expr 0 } {0} # Read the 'checksum' of the database. if {$::ioerropts(-cksum)} { set checksum [cksum] } | | | 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 | expr 0 } {0} # Read the 'checksum' of the database. if {$::ioerropts(-cksum)} { set checksum [cksum] } # Set the Nth IO error to fail. do_test $testname.$n.2 [subst { set ::sqlite_io_error_persist $::ioerropts(-persist) set ::sqlite_io_error_pending $n }] $n # Create a single TCL script from the TCL and SQL specified |
︙ | ︙ | |||
529 530 531 532 533 534 535 | } else { # If we are not in extended result code mode, make sure no # extended error codes are returned. if {[regexp {\+\d} $rc]} { return $rc } } | | > > > > | > > > > > > > | | 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 | } else { # If we are not in extended result code mode, make sure no # extended error codes are returned. if {[regexp {\+\d} $rc]} { return $rc } } # The test repeats as long as $::go is non-zero. $::go starts out # as 1. When a test runs to completion without hitting an I/O # error, that means there is no point in continuing with this test # case so set $::go to zero. # if {$::sqlite_io_error_pending>0} { set ::go 0 set q 0 set ::sqlite_io_error_pending 0 } else { set q 1 } set s [expr $::sqlite_io_error_hit==0] set ::sqlite_io_error_hit 0 # One of two things must have happened. either # 1. We never hit the IO error and the SQL returned OK # 2. An IO error was hit and the SQL failed # expr { ($s && !$r && !$q) || (!$s && $r && $q) } } {1} # If an IO error occured, then the checksum of the database should # be the same as before the script that caused the IO error was run. if {$::go && $::ioerropts(-cksum)} { do_test $testname.$n.4 { catch {db close} |
︙ | ︙ | |||
561 562 563 564 565 566 567 | } } set ::sqlite_io_error_pending 0 set ::sqlite_io_error_persist 0 unset ::ioerropts } | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 | } } set ::sqlite_io_error_pending 0 set ::sqlite_io_error_persist 0 unset ::ioerropts } # Return a checksum based on the contents of the main database associated # with connection $db # proc cksum {{db db}} { set txt [$db eval { SELECT name, type, sql FROM sqlite_master order by name }]\n foreach tbl [$db eval { SELECT name FROM sqlite_master WHERE type='table' order by name }] { append txt [$db eval "SELECT * FROM $tbl"]\n } foreach prag {default_synchronous default_cache_size} { append txt $prag-[$db eval "PRAGMA $prag"]\n } set cksum [string length $txt]-[md5 $txt] # puts $cksum-[file size test.db] return $cksum } # Generate a checksum based on the contents of the main and temp tables # database $db. If the checksum of two databases is the same, and the # integrity-check passes for both, the two databases are identical. # proc allcksum {db} { set ret [list] ifcapable tempdb { set sql { SELECT name FROM sqlite_master WHERE type = 'table' UNION SELECT name FROM sqlite_temp_master WHERE type = 'table' UNION SELECT 'sqlite_master' UNION SELECT 'sqlite_temp_master' ORDER BY 1 } } else { set sql { SELECT name FROM sqlite_master WHERE type = 'table' UNION SELECT 'sqlite_master' ORDER BY 1 } } set tbllist [$db eval $sql] set txt {} foreach tbl $tbllist { append txt [$db eval "SELECT * FROM $tbl"] } foreach prag {default_cache_size} { append txt $prag-[$db eval "PRAGMA $prag"]\n } # puts txt=$txt return [md5 $txt] } # Copy file $from into $to. This is used because some versions of # TCL for windows (notably the 8.4.1 binary package shipped with the # current mingw release) have a broken "file copy" command. # proc copy_file {from to} { if {$::tcl_platform(platform)=="unix"} { |
︙ | ︙ |
Changes to test/vacuum.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 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. The # focus of this file is testing the VACUUM statement. # | | < < < < < < < < < < < < < < < < < < < < < | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | # 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. The # focus of this file is testing the VACUUM statement. # # $Id: vacuum.test,v 1.39 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # If the VACUUM statement is disabled in the current build, skip all # the tests in this file. # ifcapable {!vacuum} { finish_test return } if $AUTOVACUUM { finish_test return } set fcnt 1 do_test vacuum-1.1 { execsql { BEGIN; CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c); INSERT INTO t1 VALUES(NULL,randstr(10,100),randstr(5,50)); INSERT INTO t1 VALUES(123456,randstr(10,100),randstr(5,50)); INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1; INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1; INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1; INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1; INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1; INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1; INSERT INTO t1 SELECT NULL, b||'-'||rowid, c||'-'||rowid FROM t1; CREATE INDEX i1 ON t1(b,c); CREATE UNIQUE INDEX i2 ON t1(c,a); CREATE TABLE t2 AS SELECT * FROM t1; COMMIT; DROP TABLE t2; } set ::size1 [file size test.db] set ::cksum [allcksum] expr {$::cksum!=""} } {1} do_test vacuum-1.2 { execsql { VACUUM; } allcksum } $cksum ifcapable vacuum { do_test vacuum-1.3 { expr {[file size test.db]<$::size1} } {1} } do_test vacuum-1.4 { |
︙ | ︙ | |||
101 102 103 104 105 106 107 | regsub {CREATE VIEW} $sql_script {-- CREATE VIEW} sql_script } ifcapable !trigger { regsub {CREATE TRIGGER} $sql_script {-- CREATE TRIGGER} sql_script } execsql $sql_script set ::size1 [file size test.db] | | | | 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | regsub {CREATE VIEW} $sql_script {-- CREATE VIEW} sql_script } ifcapable !trigger { regsub {CREATE TRIGGER} $sql_script {-- CREATE TRIGGER} sql_script } execsql $sql_script set ::size1 [file size test.db] set ::cksum [allcksum] expr {$::cksum!=""} } {1} do_test vacuum-1.5 { execsql { VACUUM; } allcksum } $cksum ifcapable vacuum { do_test vacuum-1.6 { expr {[file size test.db]<$::size1} } {1} } |
︙ | ︙ | |||
136 137 138 139 140 141 142 | BEGIN; CREATE TABLE t4 AS SELECT * FROM t1; CREATE TABLE t5 AS SELECT * FROM t1; COMMIT; DROP TABLE t4; DROP TABLE t5; } db2 | | | | | 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | BEGIN; CREATE TABLE t4 AS SELECT * FROM t1; CREATE TABLE t5 AS SELECT * FROM t1; COMMIT; DROP TABLE t4; DROP TABLE t5; } db2 set ::cksum [allcksum db2] catchsql { VACUUM } } {0 {}} do_test vacuum-2.3 { allcksum } $cksum do_test vacuum-2.4 { catch {db2 eval {SELECT count(*) FROM sqlite_master}} allcksum db2 } $cksum # Make sure the schema cookie is incremented by vacuum. # do_test vacuum-2.5 { execsql { BEGIN; |
︙ | ︙ | |||
325 326 327 328 329 330 331 | execsql { DROP TABLE 'abc abc'; CREATE TABLE autoinc(a INTEGER PRIMARY KEY AUTOINCREMENT, b); INSERT INTO autoinc(b) VALUES('hi'); INSERT INTO autoinc(b) VALUES('there'); DELETE FROM autoinc; } | | | | | | 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 | execsql { DROP TABLE 'abc abc'; CREATE TABLE autoinc(a INTEGER PRIMARY KEY AUTOINCREMENT, b); INSERT INTO autoinc(b) VALUES('hi'); INSERT INTO autoinc(b) VALUES('there'); DELETE FROM autoinc; } set ::cksum [allcksum] expr {$::cksum!=""} } {1} do_test vacuum-9.2 { execsql { VACUUM; } allcksum } $::cksum do_test vacuum-9.3 { execsql { INSERT INTO autoinc(b) VALUES('one'); INSERT INTO autoinc(b) VALUES('two'); } set ::cksum [allcksum] expr {$::cksum!=""} } {1} do_test vacuum-9.4 { execsql { VACUUM; } allcksum } $::cksum } file delete -force {a'z.db} finish_test |
Changes to test/vacuum2.test.
1 2 3 4 5 6 7 8 9 10 11 12 13 | # 2005 February 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. The # focus of this file is testing the VACUUM statement. # | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | # 2005 February 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. The # focus of this file is testing the VACUUM statement. # # $Id: vacuum2.test,v 1.6 2008/01/16 17:46:38 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # If the VACUUM statement is disabled in the current build, skip all # the tests in this file. # |
︙ | ︙ | |||
62 63 64 65 66 67 68 | # autovacuum setting, do a VACUUM, and the new setting takes effect. # Make sure this happens correctly even if there are multiple open # connections to the same database file. # sqlite3 db2 test.db set pageSize [db eval {pragma page_size}] | < < < < < < < < < < < < < < < < | | | | | | | 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | # autovacuum setting, do a VACUUM, and the new setting takes effect. # Make sure this happens correctly even if there are multiple open # connections to the same database file. # sqlite3 db2 test.db set pageSize [db eval {pragma page_size}] # We are currently not autovacuuming so the database should be 3 pages # in size. 1 page for each of sqlite_master, t1, and t2. # do_test vacuum2-3.1 { execsql { INSERT INTO t1 VALUES('hello'); INSERT INTO t2 VALUES('out there'); } expr {[file size test.db]/$pageSize} } {3} set cksum [allcksum] do_test vacuum2-3.2 { allcksum db2 } $cksum # Convert the database to an autovacuumed database. do_test vacuum2-3.3 { execsql { PRAGMA auto_vacuum=FULL; VACUUM; } expr {[file size test.db]/$pageSize} } {4} do_test vacuum2-3.4 { allcksum db2 } $cksum do_test vacuum2-3.5 { allcksum } $cksum do_test vacuum2-3.6 { execsql {PRAGMA integrity_check} db2 } {ok} do_test vacuum2-3.7 { execsql {PRAGMA integrity_check} db } {ok} # Convert the database back to a non-autovacuumed database. do_test vacuum2-3.13 { execsql { PRAGMA auto_vacuum=NONE; VACUUM; } expr {[file size test.db]/$pageSize} } {3} do_test vacuum2-3.14 { allcksum db2 } $cksum do_test vacuum2-3.15 { allcksum } $cksum do_test vacuum2-3.16 { execsql {PRAGMA integrity_check} db2 } {ok} do_test vacuum2-3.17 { execsql {PRAGMA integrity_check} db } {ok} db2 close finish_test |