Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a segfault that occurs in the VACUUM command if run on an empty database with the EMPTY_RESULT_CALLBACKS pragma enabled. Ticket #427. (CVS 1073) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
3563e9cf9d6b20f09e92deb21fdda93b |
User & Date: | drh 2003-08-15 13:24:52.000 |
Context
2003-08-16
| ||
12:37 | Do not delete tables with the same name when dropping triggers. Ticket #430. (CVS 1074) (check-in: ef58f163b0 user: drh tags: trunk) | |
2003-08-15
| ||
13:24 | Fix a segfault that occurs in the VACUUM command if run on an empty database with the EMPTY_RESULT_CALLBACKS pragma enabled. Ticket #427. (CVS 1073) (check-in: 3563e9cf9d user: drh tags: trunk) | |
2003-08-13
| ||
11:29 | Update the NULL-handling chart with new information about Firebird. (CVS 1072) (check-in: 17bdfeb284 user: drh tags: trunk) | |
Changes
Changes to src/vacuum.c.
︙ | ︙ | |||
10 11 12 13 14 15 16 | ** ************************************************************************* ** This file contains code used to implement the VACUUM command. ** ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. ** | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ** ************************************************************************* ** This file contains code used to implement the VACUUM command. ** ** Most of the code in this file may be omitted by defining the ** SQLITE_OMIT_VACUUM macro. ** ** $Id: vacuum.c,v 1.8 2003/08/15 13:24:52 drh Exp $ */ #include "sqliteInt.h" #include "os.h" /* ** A structure for holding a dynamic string - a string that can grow ** without bound. |
︙ | ︙ | |||
107 108 109 110 111 112 113 114 115 116 117 118 119 120 | */ static int vacuumCallback2(void *pArg, int argc, char **argv, char **NotUsed){ vacuumStruct *p = (vacuumStruct*)pArg; int rc = 0; const char *zSep = "("; int i; p->s2.nUsed = 0; appendText(&p->s2, "INSERT INTO ", -1); appendQuoted(&p->s2, p->zTable); appendText(&p->s2, " VALUES", -1); for(i=0; i<argc; i++){ appendText(&p->s2, zSep, 1); zSep = ","; | > | 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | */ static int vacuumCallback2(void *pArg, int argc, char **argv, char **NotUsed){ vacuumStruct *p = (vacuumStruct*)pArg; int rc = 0; const char *zSep = "("; int i; if( argv==0 ) return 0; p->s2.nUsed = 0; appendText(&p->s2, "INSERT INTO ", -1); appendQuoted(&p->s2, p->zTable); appendText(&p->s2, " VALUES", -1); for(i=0; i<argc; i++){ appendText(&p->s2, zSep, 1); zSep = ","; |
︙ | ︙ | |||
137 138 139 140 141 142 143 144 145 146 147 148 149 150 | ** For tables, run a query to select all entries in that table and ** transfer them to the second-stage callback. */ static int vacuumCallback1(void *pArg, int argc, char **argv, char **NotUsed){ vacuumStruct *p = (vacuumStruct*)pArg; int rc = 0; assert( argc==3 ); assert( argv[0]!=0 ); assert( argv[1]!=0 ); assert( argv[2]!=0 ); rc = execsql(p->pParse, p->dbNew, argv[2]); if( rc==SQLITE_OK && strcmp(argv[0],"table")==0 ){ char *zErrMsg = 0; p->s1.nUsed = 0; | > | 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 | ** For tables, run a query to select all entries in that table and ** transfer them to the second-stage callback. */ static int vacuumCallback1(void *pArg, int argc, char **argv, char **NotUsed){ vacuumStruct *p = (vacuumStruct*)pArg; int rc = 0; assert( argc==3 ); if( argv==0 ) return 0; assert( argv[0]!=0 ); assert( argv[1]!=0 ); assert( argv[2]!=0 ); rc = execsql(p->pParse, p->dbNew, argv[2]); if( rc==SQLITE_OK && strcmp(argv[0],"table")==0 ){ char *zErrMsg = 0; p->s1.nUsed = 0; |
︙ | ︙ | |||
165 166 167 168 169 170 171 172 173 174 175 176 177 178 | ** identified by ((vacuumStruct*)pArg)->zPragma. */ static int vacuumCallback3(void *pArg, int argc, char **argv, char **NotUsed){ vacuumStruct *p = (vacuumStruct*)pArg; int rc = 0; char zBuf[200]; assert( argc==1 ); assert( argv[0]!=0 ); assert( strlen(p->zPragma)<100 ); assert( strlen(argv[0])<30 ); sprintf(zBuf,"PRAGMA %s=%s;", p->zPragma, argv[0]); rc = execsql(p->pParse, p->dbNew, zBuf); return rc; } | > | 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 | ** identified by ((vacuumStruct*)pArg)->zPragma. */ static int vacuumCallback3(void *pArg, int argc, char **argv, char **NotUsed){ vacuumStruct *p = (vacuumStruct*)pArg; int rc = 0; char zBuf[200]; assert( argc==1 ); if( argv==0 ) return 0; assert( argv[0]!=0 ); assert( strlen(p->zPragma)<100 ); assert( strlen(argv[0])<30 ); sprintf(zBuf,"PRAGMA %s=%s;", p->zPragma, argv[0]); rc = execsql(p->pParse, p->dbNew, zBuf); return rc; } |
︙ | ︙ |
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 | # 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.11 2003/08/15 13:24:53 drh Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl proc cksum {{db db}} { set txt [$db eval {SELECT name, type, sql FROM sqlite_master}]\n foreach tbl [$db eval {SELECT name FROM sqlite_master WHERE type='table'}] { |
︙ | ︙ | |||
116 117 118 119 120 121 122 123 124 125 126 | cksum } $cksum do_test vacuum-2.4 { catch {db2 eval {SELECT count(*) FROM sqlite_master}} cksum db2 } $cksum catch {db2 close} # finish_test | > > > > > > > > > > > > | 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 | cksum } $cksum do_test vacuum-2.4 { catch {db2 eval {SELECT count(*) FROM sqlite_master}} cksum db2 } $cksum # Ticket #427. Make sure VACUUM works when the EMPTY_RESULT_CALLBACKS # pragma is turned on. # do_test vacuum-3.1 { db close file delete test.db sqlite db test.db execsql { PRAGMA empty_result_callbacks=on; VACUUM; } } {} catch {db2 close} # finish_test |