/ Check-in [dbe41774]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Make REINDEX robust in the face of malloc() errors. (CVS 3990)
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA1: dbe417745d3d4ed875715ad7083d7345d1b6a56f
User & Date: drh 2007-05-12 15:00:15
Context
2007-05-14
11:34
Remove terms with operator TK_AS from the expression tree. Ticket #2356. (CVS 3991) check-in: 5627ff74 user: drh tags: trunk
2007-05-12
15:00
Make REINDEX robust in the face of malloc() errors. (CVS 3990) check-in: dbe41774 user: drh tags: trunk
12:08
Make the ANALYZE command robust in the face of malloc() failures. (CVS 3989) check-in: c08658e1 user: drh tags: trunk
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to src/build.c.

18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
....
3302
3303
3304
3305
3306
3307
3308

3309
3310
3311
3312
3313
3314
3315
**     CREATE INDEX
**     DROP INDEX
**     creating ID lists
**     BEGIN TRANSACTION
**     COMMIT
**     ROLLBACK
**
** $Id: build.c,v 1.429 2007/05/08 20:59:49 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>

/*
** This routine is called when a new SQL statement is beginning to
** be parsed.  Initialize the pParse structure as needed.
................................................................................
      }
      return;
    }
  }
  iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName);
  if( iDb<0 ) return;
  z = sqlite3NameFromToken(pObjName);

  zDb = db->aDb[iDb].zName;
  pTab = sqlite3FindTable(db, z, zDb);
  if( pTab ){
    reindexTable(pParse, pTab, 0);
    sqliteFree(z);
    return;
  }







|







 







>







18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
....
3302
3303
3304
3305
3306
3307
3308
3309
3310
3311
3312
3313
3314
3315
3316
**     CREATE INDEX
**     DROP INDEX
**     creating ID lists
**     BEGIN TRANSACTION
**     COMMIT
**     ROLLBACK
**
** $Id: build.c,v 1.430 2007/05/12 15:00:15 drh Exp $
*/
#include "sqliteInt.h"
#include <ctype.h>

/*
** This routine is called when a new SQL statement is beginning to
** be parsed.  Initialize the pParse structure as needed.
................................................................................
      }
      return;
    }
  }
  iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pObjName);
  if( iDb<0 ) return;
  z = sqlite3NameFromToken(pObjName);
  if( z==0 ) return;
  zDb = db->aDb[iDb].zName;
  pTab = sqlite3FindTable(db, z, zDb);
  if( pTab ){
    reindexTable(pParse, pTab, 0);
    sqliteFree(z);
    return;
  }

Changes to test/mallocA.test.

6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
114
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
140
141
142
143
144
145
146
#    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 contains additional out-of-memory checks (see malloc.tcl).
#
# $Id: mallocA.test,v 1.1 2007/05/12 12:08:51 drh Exp $

set testdir [file dirname $argv0]
source $testdir/tester.tcl

# Only run these tests if memory debugging is turned on.
#
if {[info command sqlite_malloc_stat]==""} {
................................................................................
  unset ::mallocopts
}

# Construct a test database
#
file delete -force test.db.bu
db eval {
  CREATE TABLE t1(a,b,c);
  INSERT INTO t1 VALUES(1,2,3);
  INSERT INTO t1 VALUES(1,2,4);
  INSERT INTO t1 VALUES(2,3,4);
  CREATE INDEX t1i1 ON t1(a);
  CREATE INDEX t1i2 ON t1(b,c);
  CREATE TABLE t2(x,y,z);
}
................................................................................
db close
file copy test.db test.db.bu
sqlite3 db test.db


do_malloc_test 1 -sqlbody {
  ANALYZE












}

# Ensure that no file descriptors were leaked.
do_test malloc-99.X {
  catch {db close}
  set sqlite_open_file_count
} {0}

file delete -force test.db.bu
sqlite_malloc_fail 0
finish_test







|







 







|







 







>
>
>
>
>
>
>
>
>
>
>
>











6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
...
114
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#    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 contains additional out-of-memory checks (see malloc.tcl).
#
# $Id: mallocA.test,v 1.2 2007/05/12 15:00:15 drh Exp $

set testdir [file dirname $argv0]
source $testdir/tester.tcl

# Only run these tests if memory debugging is turned on.
#
if {[info command sqlite_malloc_stat]==""} {
................................................................................
  unset ::mallocopts
}

# Construct a test database
#
file delete -force test.db.bu
db eval {
  CREATE TABLE t1(a COLLATE NOCASE,b,c);
  INSERT INTO t1 VALUES(1,2,3);
  INSERT INTO t1 VALUES(1,2,4);
  INSERT INTO t1 VALUES(2,3,4);
  CREATE INDEX t1i1 ON t1(a);
  CREATE INDEX t1i2 ON t1(b,c);
  CREATE TABLE t2(x,y,z);
}
................................................................................
db close
file copy test.db test.db.bu
sqlite3 db test.db


do_malloc_test 1 -sqlbody {
  ANALYZE
}
do_malloc_test 2 -sqlbody {
  REINDEX;
}
do_malloc_test 3 -sqlbody {
  REINDEX t1;
}
do_malloc_test 4 -sqlbody {
  REINDEX main.t1;
}
do_malloc_test 5 -sqlbody {
  REINDEX nocase;
}

# Ensure that no file descriptors were leaked.
do_test malloc-99.X {
  catch {db close}
  set sqlite_open_file_count
} {0}

file delete -force test.db.bu
sqlite_malloc_fail 0
finish_test