Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Memory leak fixes for tests in file select1.test. (CVS 1599) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
59db58ebd30cd7c79c32f5a725620e74 |
User & Date: | danielk1977 2004-06-15 13:36:30 |
Context
2004-06-15
| ||
16:51 | Assorted memory leak fixes. (CVS 1600) check-in: 07b90f36 user: danielk1977 tags: trunk | |
13:36 | Memory leak fixes for tests in file select1.test. (CVS 1599) check-in: 59db58eb user: danielk1977 tags: trunk | |
11:40 | Minor bugfixes and test case adjustments for version 2 test cases to work with version 3. (CVS 1598) check-in: e21a1813 user: danielk1977 tags: trunk | |
Changes
Changes to src/func.c.
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
...
927
928
929
930
931
932
933
934
935
936
937
938
939
940
|
** This file contains the C functions that implement various SQL ** functions of SQLite. ** ** There is only one exported symbol in this file - the function ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** ** $Id: func.c,v 1.68 2004/06/12 09:25:14 danielk1977 Exp $ */ #include <ctype.h> #include <math.h> #include <stdlib.h> #include <assert.h> #include "sqliteInt.h" #include "vdbeInt.h" ................................................................................ } static void minMaxFinalize(sqlite3_context *context){ sqlite3_value *pRes; pRes = (sqlite3_value *)sqlite3_aggregate_context(context, sizeof(Mem)); if( pRes->flags ){ sqlite3_result_value(context, pRes); } } /* ** This function registered all of the above C functions as SQL ** functions. This should be the only routine in this file with ** external linkage. */ |
|
>
|
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
...
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
|
** This file contains the C functions that implement various SQL ** functions of SQLite. ** ** There is only one exported symbol in this file - the function ** sqliteRegisterBuildinFunctions() found at the bottom of the file. ** All other code has file scope. ** ** $Id: func.c,v 1.69 2004/06/15 13:36:30 danielk1977 Exp $ */ #include <ctype.h> #include <math.h> #include <stdlib.h> #include <assert.h> #include "sqliteInt.h" #include "vdbeInt.h" ................................................................................ } static void minMaxFinalize(sqlite3_context *context){ sqlite3_value *pRes; pRes = (sqlite3_value *)sqlite3_aggregate_context(context, sizeof(Mem)); if( pRes->flags ){ sqlite3_result_value(context, pRes); } sqlite3VdbeMemRelease(pRes); } /* ** This function registered all of the above C functions as SQL ** functions. This should be the only routine in this file with ** external linkage. */ |
Changes to src/main.c.
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
....
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
|
** ************************************************************************* ** Main file for the SQLite library. The routines in this file ** implement the programmer interface to the library. Routines in ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** ** $Id: main.c,v 1.220 2004/06/14 09:35:17 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" #include <ctype.h> /* ** A pointer to this structure is used to communicate information ................................................................................ prepare_out: if( sqlite3SafetyOff(db) ){ rc = SQLITE_MISUSE; } if( zErrMsg ){ sqlite3Error(db, rc, "%s", zErrMsg); }else{ sqlite3Error(db, rc, 0); } return rc; } /* |
|
>
|
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
....
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
|
** ************************************************************************* ** Main file for the SQLite library. The routines in this file ** implement the programmer interface to the library. Routines in ** other files are for internal use by SQLite and should not be ** accessed by users of the library. ** ** $Id: main.c,v 1.221 2004/06/15 13:36:31 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" #include <ctype.h> /* ** A pointer to this structure is used to communicate information ................................................................................ prepare_out: if( sqlite3SafetyOff(db) ){ rc = SQLITE_MISUSE; } if( zErrMsg ){ sqlite3Error(db, rc, "%s", zErrMsg); sqliteFree(zErrMsg); }else{ sqlite3Error(db, rc, 0); } return rc; } /* |
Changes to src/vdbe.c.
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
...
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
|
** ** 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.373 2004/06/15 11:40:09 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" #include <ctype.h> #include "vdbeInt.h" /* ................................................................................ assert( pTo->z==pTos->zShort ); pTo->z = pTo->zShort; } pTos--; break; } /* Opcode: ColumnName P1 P2 P3 ** ** P3 becomes the P1-th column name (first is 0). An array of pointers ** to all column names is passed as the 4th parameter to the callback. ** If P2==1 then this is the last column in the result set and thus the ** number of columns in the result set will be P1. There must be at least ** one OP_ColumnName with a P2==1 before invoking OP_Callback and the ** number of columns specified in OP_Callback must one more than the P1 ** value of the OP_ColumnName that has P2==1. */ case OP_ColumnName: { assert(0); assert( pOp->p1>=0 && pOp->p1<p->nOp ); p->azColName[pOp->p1] = pOp->p3; p->nCallback = 0; assert( !pOp->p2 || p->nResColumn==(pOp->p1+1) ); /* if( pOp->p2 ) p->nResColumn = pOp->p1+1; */ break; } /* Opcode: Callback P1 * * ** ** Pop P1 values off the stack and form them into an array. Then ** invoke the callback function using the newly formed array as the ** 3rd parameter. */ case OP_Callback: { |
|
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
<
|
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
...
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
|
** ** 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.374 2004/06/15 13:36:37 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" #include <ctype.h> #include "vdbeInt.h" /* ................................................................................ assert( pTo->z==pTos->zShort ); pTo->z = pTo->zShort; } pTos--; break; } /* Opcode: Callback P1 * * ** ** Pop P1 values off the stack and form them into an array. Then ** invoke the callback function using the newly formed array as the ** 3rd parameter. */ case OP_Callback: { |
Changes to src/vdbeInt.h.
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 |
int nLabel; /* Number of labels used */ int nLabelAlloc; /* Number of slots allocated in aLabel[] */ int *aLabel; /* Space to hold the labels */ Mem *aStack; /* The operand stack, except string values */ Mem *pTos; /* Top entry in the operand stack */ Mem **apArg; /* Arguments to currently executing user function */ Mem *aColName; /* Column names to return */ char **azColName; /* Becomes the 4th parameter to callbacks */ void **azColName16; /* UTF-16 encoded equivalent of azColName */ int nCursor; /* Number of slots in apCsr[] */ Cursor **apCsr; /* One element of this array for each open cursor */ Sorter *pSort; /* A linked list of objects to be sorted */ FILE *pFile; /* At most one open file handler */ int nField; /* Number of file fields */ char **azField; /* Data for each file field */ int nVar; /* Number of entries in apVar[] */ |
< < |
299 300 301 302 303 304 305 306 307 308 309 310 311 312 |
int nLabel; /* Number of labels used */ int nLabelAlloc; /* Number of slots allocated in aLabel[] */ int *aLabel; /* Space to hold the labels */ Mem *aStack; /* The operand stack, except string values */ Mem *pTos; /* Top entry in the operand stack */ Mem **apArg; /* Arguments to currently executing user function */ Mem *aColName; /* Column names to return */ int nCursor; /* Number of slots in apCsr[] */ Cursor **apCsr; /* One element of this array for each open cursor */ Sorter *pSort; /* A linked list of objects to be sorted */ FILE *pFile; /* At most one open file handler */ int nField; /* Number of file fields */ char **azField; /* Data for each file field */ int nVar; /* Number of entries in apVar[] */ |
Changes to src/vdbeaux.c.
526 527 528 529 530 531 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 ... 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 .... 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 |
*/ int sqlite3VdbeList( Vdbe *p /* The VDBE */ ){ sqlite *db = p->db; int i; int rc = SQLITE_OK; static char *azColumnNames[] = { "addr", "opcode", "p1", "p2", "p3", "int", "text", "int", "int", "text", 0 }; assert( p->explain ); /* Even though this opcode does not put dynamic strings onto the ** the stack, they may become dynamic if the user calls ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. */ if( p->pTos==&p->aStack[4] ){ for(i=0; i<5; i++){ sqlite3VdbeMemRelease(&p->aStack[i]); p->aStack[i].flags = 0; } } p->azColName = azColumnNames; p->resOnStack = 0; i = p->pc++; if( i>=p->nOp ){ p->rc = SQLITE_OK; rc = SQLITE_DONE; }else if( db->flags & SQLITE_Interrupt ){ ................................................................................ ** Allocation all the stack space we will ever need. */ if( p->aStack==0 ){ p->nVar = nVar; assert( nVar>=0 ); n = isExplain ? 10 : p->nOp; p->aStack = sqliteMalloc( n*(sizeof(p->aStack[0])+sizeof(Mem*)+sizeof(char*)) /* aStack, apArg */ + p->nVar*sizeof(Mem) /* apVar */ ); p->apArg = (Mem **)&p->aStack[n]; p->azColName = (char**)&p->apArg[n]; p->apVar = (Mem *)&p->azColName[n]; for(n=0; n<p->nVar; n++){ p->apVar[n].flags = MEM_Null; } } #ifdef SQLITE_DEBUG if( (p->db->flags & SQLITE_VdbeListing)!=0 ................................................................................ #ifndef NDEBUG sqliteFree(pOp->zComment); #endif } for(i=0; i<p->nVar; i++){ sqlite3VdbeMemRelease(&p->apVar[i]); } if( p->azColName16 ){ for(i=0; i<p->nResColumn; i++){ if( p->azColName16[i] ) sqliteFree(p->azColName16[i]); } sqliteFree(p->azColName16); } sqliteFree(p->aOp); sqliteFree(p->aLabel); sqliteFree(p->aStack); p->magic = VDBE_MAGIC_DEAD; sqliteFree(p); } /* ** If a MoveTo operation is pending on the given cursor, then do that ** MoveTo now. Return an error code. If no MoveTo is pending, this |
< < < < < < < | < | < < < < < < > > > > > > |
526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 ... 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 .... 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 |
*/ int sqlite3VdbeList( Vdbe *p /* The VDBE */ ){ sqlite *db = p->db; int i; int rc = SQLITE_OK; assert( p->explain ); /* Even though this opcode does not put dynamic strings onto the ** the stack, they may become dynamic if the user calls ** sqlite3_column_text16(), causing a translation to UTF-16 encoding. */ if( p->pTos==&p->aStack[4] ){ for(i=0; i<5; i++){ sqlite3VdbeMemRelease(&p->aStack[i]); p->aStack[i].flags = 0; } } p->resOnStack = 0; i = p->pc++; if( i>=p->nOp ){ p->rc = SQLITE_OK; rc = SQLITE_DONE; }else if( db->flags & SQLITE_Interrupt ){ ................................................................................ ** Allocation all the stack space we will ever need. */ if( p->aStack==0 ){ p->nVar = nVar; assert( nVar>=0 ); n = isExplain ? 10 : p->nOp; p->aStack = sqliteMalloc( n*(sizeof(p->aStack[0])+sizeof(Mem*)) /* aStack, apArg */ + p->nVar*sizeof(Mem) /* apVar */ ); p->apArg = (Mem **)&p->aStack[n]; p->apVar = (Mem *)&p->apArg[n]; for(n=0; n<p->nVar; n++){ p->apVar[n].flags = MEM_Null; } } #ifdef SQLITE_DEBUG if( (p->db->flags & SQLITE_VdbeListing)!=0 ................................................................................ #ifndef NDEBUG sqliteFree(pOp->zComment); #endif } for(i=0; i<p->nVar; i++){ sqlite3VdbeMemRelease(&p->apVar[i]); } sqliteFree(p->aOp); sqliteFree(p->aLabel); sqliteFree(p->aStack); if( p->aColName ){ for(i=0; i<(p->nResColumn)*2; i++){ sqlite3VdbeMemRelease(&(p->aColName[i])); } sqliteFree(p->aColName); } p->magic = VDBE_MAGIC_DEAD; sqliteFree(p); } /* ** If a MoveTo operation is pending on the given cursor, then do that ** MoveTo now. Return an error code. If no MoveTo is pending, this |