Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Assorted memory leak fixes. (CVS 1600) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
07b90f3690768e852384fbbde0ba59e6 |
User & Date: | danielk1977 2004-06-15 16:51:01.000 |
Context
2004-06-16
| ||
03:02 | Documentation updates and changes the publish.sh script. (CVS 1602) (check-in: e9a77f8972 user: drh tags: trunk) | |
2004-06-15
| ||
16:51 | Assorted memory leak fixes. (CVS 1600) (check-in: 07b90f3690 user: danielk1977 tags: trunk) | |
13:36 | Memory leak fixes for tests in file select1.test. (CVS 1599) (check-in: 59db58ebd3 user: danielk1977 tags: trunk) | |
Changes
Changes to src/build.c.
︙ | ︙ | |||
19 20 21 22 23 24 25 | ** DROP INDEX ** creating ID lists ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK ** PRAGMA ** | | | 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | ** DROP INDEX ** creating ID lists ** BEGIN TRANSACTION ** COMMIT ** ROLLBACK ** PRAGMA ** ** $Id: build.c,v 1.219 2004/06/15 16:51:01 danielk1977 Exp $ */ #include "sqliteInt.h" #include <ctype.h> /* ** This routine is called when a new SQL statement is beginning to ** be parsed. Check to see if the schema for the database needs |
︙ | ︙ | |||
552 553 554 555 556 557 558 559 560 561 | pParse->nErr++; return; } if( isTemp ) iDb = 1; pParse->sNameToken = *pName; zName = sqlite3TableNameFromToken(pName); if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ return; } | > > < | 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 | pParse->nErr++; return; } if( isTemp ) iDb = 1; pParse->sNameToken = *pName; zName = sqlite3TableNameFromToken(pName); if( zName==0 ) return; if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ sqliteFree(zName); return; } if( db->init.iDb==1 ) isTemp = 1; #ifndef SQLITE_OMIT_AUTHORIZATION assert( (isTemp & 1)==isTemp ); { int code; char *zDb = db->aDb[iDb].zName; if( sqlite3AuthCheck(pParse, SQLITE_INSERT, SCHEMA_TABLE(isTemp), 0, zDb) ){ |
︙ | ︙ | |||
595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 | */ if( isTemp && db->aDb[1].pBt==0 && !pParse->explain ){ int rc = sqlite3BtreeFactory(db, 0, 0, MAX_PAGES, &db->aDb[1].pBt); if( rc!=SQLITE_OK ){ sqlite3ErrorMsg(pParse, "unable to open a temporary database " "file for storing temporary tables"); pParse->nErr++; return; } if( db->flags & !db->autoCommit ){ rc = sqlite3BtreeBeginTrans(db->aDb[1].pBt, 1, 0); if( rc!=SQLITE_OK ){ sqlite3ErrorMsg(pParse, "unable to get a write lock on " "the temporary database file"); return; } } } /* Make sure the new table name does not collide with an existing ** index or table name in the same database. Issue an error message if | > > | 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 | */ if( isTemp && db->aDb[1].pBt==0 && !pParse->explain ){ int rc = sqlite3BtreeFactory(db, 0, 0, MAX_PAGES, &db->aDb[1].pBt); if( rc!=SQLITE_OK ){ sqlite3ErrorMsg(pParse, "unable to open a temporary database " "file for storing temporary tables"); pParse->nErr++; sqliteFree(zName); return; } if( db->flags & !db->autoCommit ){ rc = sqlite3BtreeBeginTrans(db->aDb[1].pBt, 1, 0); if( rc!=SQLITE_OK ){ sqlite3ErrorMsg(pParse, "unable to get a write lock on " "the temporary database file"); sqliteFree(zName); return; } } } /* Make sure the new table name does not collide with an existing ** index or table name in the same database. Issue an error message if |
︙ | ︙ | |||
625 626 627 628 629 630 631 632 633 634 635 636 637 638 | (pIdx->iDb==0 || !db->init.busy) ){ sqlite3ErrorMsg(pParse, "there is already an index named %s", zName); sqliteFree(zName); return; } pTable = sqliteMalloc( sizeof(Table) ); if( pTable==0 ){ sqliteFree(zName); return; } pTable->zName = zName; pTable->nCol = 0; pTable->aCol = 0; pTable->iPKey = -1; | > > | 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 | (pIdx->iDb==0 || !db->init.busy) ){ sqlite3ErrorMsg(pParse, "there is already an index named %s", zName); sqliteFree(zName); return; } pTable = sqliteMalloc( sizeof(Table) ); if( pTable==0 ){ pParse->rc = SQLITE_NOMEM; pParse->nErr++; sqliteFree(zName); return; } pTable->zName = zName; pTable->nCol = 0; pTable->aCol = 0; pTable->iPKey = -1; |
︙ | ︙ | |||
2205 2206 2207 2208 2209 2210 2211 | } pIndex = 0; /* Clean up before exiting */ exit_create_index: if( pIndex ) sqliteFree(pIndex); sqlite3ExprListDelete(pList); | | | 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 | } pIndex = 0; /* Clean up before exiting */ exit_create_index: if( pIndex ) sqliteFree(pIndex); sqlite3ExprListDelete(pList); sqlite3SrcListDelete(pTblName); sqliteFree(zName); return; } /* ** This routine will drop an existing named index. This routine ** implements the DROP INDEX statement. |
︙ | ︙ |
Changes to src/expr.c.
︙ | ︙ | |||
8 9 10 11 12 13 14 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** | | | 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | ** May you find forgiveness for yourself and forgive others. ** May you share freely, never taking more than you give. ** ************************************************************************* ** This file contains routines used for analyzing expressions and ** for generating VDBE code that evaluates expressions in SQLite. ** ** $Id: expr.c,v 1.142 2004/06/15 16:51:01 danielk1977 Exp $ */ #include "sqliteInt.h" #include <ctype.h> char const *sqlite3AffinityString(char affinity){ switch( affinity ){ case SQLITE_AFF_INTEGER: return "i"; |
︙ | ︙ | |||
303 304 305 306 307 308 309 | struct ExprList_item *pItem; int i; if( p==0 ) return 0; pNew = sqliteMalloc( sizeof(*pNew) ); if( pNew==0 ) return 0; pNew->nExpr = pNew->nAlloc = p->nExpr; pNew->a = pItem = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); | | > > > | 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 | struct ExprList_item *pItem; int i; if( p==0 ) return 0; pNew = sqliteMalloc( sizeof(*pNew) ); if( pNew==0 ) return 0; pNew->nExpr = pNew->nAlloc = p->nExpr; pNew->a = pItem = sqliteMalloc( p->nExpr*sizeof(p->a[0]) ); if( pItem==0 ){ sqliteFree(pNew); return 0; } for(i=0; i<p->nExpr; i++, pItem++){ Expr *pNewExpr, *pOldExpr; pItem->pExpr = pNewExpr = sqlite3ExprDup(pOldExpr = p->a[i].pExpr); if( pOldExpr->span.z!=0 && pNewExpr ){ /* Always make a copy of the span for top-level expressions in the ** expression list. The logic in SELECT processing that determines ** the names of columns in the result set needs this information */ |
︙ | ︙ |
Changes to src/main.c.
︙ | ︙ | |||
10 11 12 13 14 15 16 | ** ************************************************************************* ** 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. ** | | | 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | ** ************************************************************************* ** 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.222 2004/06/15 16:51:01 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" #include <ctype.h> /* ** A pointer to this structure is used to communicate information |
︙ | ︙ | |||
468 469 470 471 472 473 474 | /* ** Close an existing SQLite database */ void sqlite3_close(sqlite *db){ HashElem *i; int j; db->want_to_close = 1; | > > > > > > > | > | 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 | /* ** Close an existing SQLite database */ void sqlite3_close(sqlite *db){ HashElem *i; int j; db->want_to_close = 1; /* FIX ME: db->magic may be set to SQLITE_MAGIC_CLOSED if the database ** cannot be opened for some reason. So this routine needs to run in ** that case. But maybe there should be an extra magic value for the ** "failed to open" state. */ if( db->magic!=SQLITE_MAGIC_CLOSED && (sqlite3SafetyCheck(db) || sqlite3SafetyOn(db)) ){ /* printf("DID NOT CLOSE\n"); fflush(stdout); */ return; } db->magic = SQLITE_MAGIC_CLOSED; for(j=0; j<db->nDb; j++){ struct Db *pDb = &db->aDb[j]; if( pDb->pBt ){ sqlite3BtreeClose(pDb->pBt); pDb->pBt = 0; } |
︙ | ︙ | |||
1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 | ** equivalent pointer into the UTF-16 string by counting the unicode ** characters between zSql8 and zTail8, and then returning a pointer ** the same number of characters into the UTF-16 string. */ int chars_parsed = sqlite3utf8CharLen(zSql8, zTail8-zSql8); *pzTail = (u8 *)zSql + sqlite3utf16ByteLen(zSql, chars_parsed); } return rc; } /* ** This routine does the work of opening a database on behalf of ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" | > | 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 | ** equivalent pointer into the UTF-16 string by counting the unicode ** characters between zSql8 and zTail8, and then returning a pointer ** the same number of characters into the UTF-16 string. */ int chars_parsed = sqlite3utf8CharLen(zSql8, zTail8-zSql8); *pzTail = (u8 *)zSql + sqlite3utf16ByteLen(zSql, chars_parsed); } sqliteFree(zSql8); return rc; } /* ** This routine does the work of opening a database on behalf of ** sqlite3_open() and sqlite3_open16(). The database filename "zFilename" |
︙ | ︙ |
Changes to src/pragma.c.
1 2 3 4 5 6 7 8 9 10 11 12 13 | /* ** 2003 April 6 ** ** 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 contains code used to implement the PRAGMA command. ** | | | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | /* ** 2003 April 6 ** ** 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 contains code used to implement the PRAGMA command. ** ** $Id: pragma.c,v 1.44 2004/06/15 16:51:01 danielk1977 Exp $ */ #include "sqliteInt.h" #include <ctype.h> #ifdef SQLITE_DEBUG # include "pager.h" # include "btree.h" |
︙ | ︙ | |||
174 175 176 177 178 179 180 | zRight = 0; sqlite3SetNString(&zRight, "-", 1, pRight->z, pRight->n, 0); }else{ zRight = sqliteStrNDup(pRight->z, pRight->n); sqlite3Dequote(zRight); } if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, 0) ){ | | < < | 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 | zRight = 0; sqlite3SetNString(&zRight, "-", 1, pRight->z, pRight->n, 0); }else{ zRight = sqliteStrNDup(pRight->z, pRight->n); sqlite3Dequote(zRight); } if( sqlite3AuthCheck(pParse, SQLITE_PRAGMA, zLeft, zRight, 0) ){ goto pragma_out; } /* ** PRAGMA default_cache_size ** PRAGMA default_cache_size=N ** ** The first form reports the current persistent setting for the |
︙ | ︙ | |||
208 209 210 211 212 213 214 | { OP_Ne, 0, 6, 0}, { OP_Integer, 0, 0, 0}, /* 5 */ { OP_Callback, 1, 0, 0}, }; int addr; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 | { OP_Ne, 0, 6, 0}, { OP_Integer, 0, 0, 0}, /* 5 */ { OP_Callback, 1, 0, 0}, }; int addr; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } if( pRight->z==pLeft->z ){ sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "cache_size", P3_STATIC); addr = sqlite3VdbeAddOpList(v, ArraySize(getCacheSize), getCacheSize); sqlite3VdbeChangeP1(v, addr+5, MAX_PAGES); }else{ |
︙ | ︙ | |||
251 252 253 254 255 256 257 | */ if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ static VdbeOpList getCacheSize[] = { { OP_Callback, 1, 0, 0}, }; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | */ if( sqlite3StrICmp(zLeft,"cache_size")==0 ){ static VdbeOpList getCacheSize[] = { { OP_Callback, 1, 0, 0}, }; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } if( pRight->z==pLeft->z ){ int size = db->cache_size;; if( size<0 ) size = -size; sqlite3VdbeAddOp(v, OP_Integer, size, 0); sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "cache_size", P3_STATIC); |
︙ | ︙ | |||
305 306 307 308 309 310 311 | { OP_Halt, 0, 0, 0}, { OP_AddImm, -1, 0, 0}, /* 9 */ { OP_Callback, 1, 0, 0} }; int addr; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 | { OP_Halt, 0, 0, 0}, { OP_AddImm, -1, 0, 0}, /* 9 */ { OP_Callback, 1, 0, 0} }; int addr; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } if( pRight->z==pLeft->z ){ sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "synchronous", P3_STATIC); addr = sqlite3VdbeAddOpList(v, ArraySize(getSync), getSync); sqlite3VdbeChangeP2(v, addr+2, addr+9); }else{ |
︙ | ︙ | |||
352 353 354 355 356 357 358 | */ if( sqlite3StrICmp(zLeft,"synchronous")==0 ){ static VdbeOpList getSync[] = { { OP_Callback, 1, 0, 0}, }; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 | */ if( sqlite3StrICmp(zLeft,"synchronous")==0 ){ static VdbeOpList getSync[] = { { OP_Callback, 1, 0, 0}, }; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } if( pRight->z==pLeft->z ){ sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "synchronous", P3_STATIC); sqlite3VdbeAddOp(v, OP_Integer, db->safety_level-1, 0); sqlite3VdbeAddOpList(v, ArraySize(getSync), getSync); }else{ |
︙ | ︙ | |||
388 389 390 391 392 393 394 | /* The flagPragma() call also generates any necessary code */ }else if( sqlite3StrICmp(zLeft, "table_info")==0 ){ Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 | /* The flagPragma() call also generates any necessary code */ }else if( sqlite3StrICmp(zLeft, "table_info")==0 ){ Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } pTab = sqlite3FindTable(db, zRight, 0); if( pTab ){ int i; sqlite3VdbeSetNumCols(v, 6); sqlite3VdbeSetColName(v, 0, "cid", P3_STATIC); sqlite3VdbeSetColName(v, 1, "name", P3_STATIC); |
︙ | ︙ | |||
420 421 422 423 424 425 426 | }else if( sqlite3StrICmp(zLeft, "index_info")==0 ){ Index *pIdx; Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 | }else if( sqlite3StrICmp(zLeft, "index_info")==0 ){ Index *pIdx; Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } pIdx = sqlite3FindIndex(db, zRight, 0); if( pIdx ){ int i; pTab = pIdx->pTable; sqlite3VdbeSetNumCols(v, 3); sqlite3VdbeSetColName(v, 0, "seqno", P3_STATIC); |
︙ | ︙ | |||
446 447 448 449 450 451 452 | }else if( sqlite3StrICmp(zLeft, "index_list")==0 ){ Index *pIdx; Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 | }else if( sqlite3StrICmp(zLeft, "index_list")==0 ){ Index *pIdx; Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } pTab = sqlite3FindTable(db, zRight, 0); if( pTab ){ v = sqlite3GetVdbe(pParse); pIdx = pTab->pIndex; } if( pTab && pIdx ){ |
︙ | ︙ | |||
475 476 477 478 479 480 481 | }else if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 ){ FKey *pFK; Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 | }else if( sqlite3StrICmp(zLeft, "foreign_key_list")==0 ){ FKey *pFK; Table *pTab; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } pTab = sqlite3FindTable(db, zRight, 0); if( pTab ){ v = sqlite3GetVdbe(pParse); pFK = pTab->pFKey; } if( pTab && pFK ){ |
︙ | ︙ | |||
511 512 513 514 515 516 517 | } }else if( sqlite3StrICmp(zLeft, "database_list")==0 ){ int i; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 | } }else if( sqlite3StrICmp(zLeft, "database_list")==0 ){ int i; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } sqlite3VdbeSetNumCols(v, 3); sqlite3VdbeSetColName(v, 0, "seq", P3_STATIC); sqlite3VdbeSetColName(v, 1, "name", P3_STATIC); sqlite3VdbeSetColName(v, 2, "file", P3_STATIC); for(i=0; i<db->nDb; i++){ if( db->aDb[i].pBt==0 ) continue; |
︙ | ︙ | |||
546 547 548 549 550 551 552 | */ if( sqlite3StrICmp(zLeft, "temp_store")==0 ){ static VdbeOpList getTmpDbLoc[] = { { OP_Callback, 1, 0, 0}, }; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 | */ if( sqlite3StrICmp(zLeft, "temp_store")==0 ){ static VdbeOpList getTmpDbLoc[] = { { OP_Callback, 1, 0, 0}, }; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } if( pRight->z==pLeft->z ){ sqlite3VdbeAddOp(v, OP_Integer, db->temp_store, 0); sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "temp_store", P3_STATIC); sqlite3VdbeAddOpList(v, ArraySize(getTmpDbLoc), getTmpDbLoc); }else{ |
︙ | ︙ | |||
575 576 577 578 579 580 581 | */ if( sqlite3StrICmp(zLeft, "default_temp_store")==0 ){ static VdbeOpList getTmpDbLoc[] = { { OP_ReadCookie, 0, 5, 0}, { OP_Callback, 1, 0, 0}}; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | | 573 574 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 | */ if( sqlite3StrICmp(zLeft, "default_temp_store")==0 ){ static VdbeOpList getTmpDbLoc[] = { { OP_ReadCookie, 0, 5, 0}, { OP_Callback, 1, 0, 0}}; if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } if( pRight->z==pLeft->z ){ sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "temp_store", P3_STATIC); sqlite3VdbeAddOpList(v, ArraySize(getTmpDbLoc), getTmpDbLoc); }else{ sqlite3BeginWriteOperation(pParse, 0, 0); sqlite3VdbeAddOp(v, OP_Integer, getTempStore(zRight), 0); sqlite3VdbeAddOp(v, OP_SetCookie, 0, 5); sqlite3EndWriteOperation(pParse); } }else #ifndef NDEBUG if( sqlite3StrICmp(zLeft, "parser_trace")==0 ){ extern void sqlite3ParserTrace(FILE*, char *); if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } if( getBoolean(zRight) ){ sqlite3ParserTrace(stdout, "parser: "); }else{ sqlite3ParserTrace(0, 0); } }else |
︙ | ︙ | |||
630 631 632 633 634 635 636 | { OP_String8, 0, 0, "ok"}, { OP_Callback, 1, 0, 0}, }; /* Initialize the VDBE program */ if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | | 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 | { OP_String8, 0, 0, "ok"}, { OP_Callback, 1, 0, 0}, }; /* Initialize the VDBE program */ if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "integrity_check", P3_STATIC); sqlite3VdbeAddOpList(v, ArraySize(initCode), initCode); /* Do an integrity check on each database file */ for(i=0; i<db->nDb; i++){ HashElem *x; int cnt = 0; sqlite3CodeVerifySchema(pParse, i); /* Do an integrity check of the B-Tree */ for(x=sqliteHashFirst(&db->aDb[i].tblHash); x; x=sqliteHashNext(x)){ Table *pTab = sqliteHashData(x); Index *pIdx; sqlite3VdbeAddOp(v, OP_Integer, pTab->tnum, 0); cnt++; for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){ if( sqlite3CheckIndexCollSeq(pParse, pIdx) ) goto pragma_out; sqlite3VdbeAddOp(v, OP_Integer, pIdx->tnum, 0); cnt++; } } sqlite3VdbeAddOp(v, OP_IntegrityCk, cnt, i); sqlite3VdbeAddOp(v, OP_Dup, 0, 1); addr = sqlite3VdbeOp3(v, OP_String8, 0, 0, "ok", P3_STATIC); |
︙ | ︙ | |||
779 780 781 782 783 784 785 | { "UTF16", SQLITE_UTF16NATIVE }, { 0, 0 } }; struct EncName *pEnc; if( pRight->z==pLeft->z ){ /* "PRAGMA encoding" */ if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; | | | 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 | { "UTF16", SQLITE_UTF16NATIVE }, { 0, 0 } }; struct EncName *pEnc; if( pRight->z==pLeft->z ){ /* "PRAGMA encoding" */ if( SQLITE_OK!=sqlite3ReadSchema(pParse->db, &pParse->zErrMsg) ){ pParse->nErr++; goto pragma_out; } sqlite3VdbeSetNumCols(v, 1); sqlite3VdbeSetColName(v, 0, "encoding", P3_STATIC); sqlite3VdbeAddOp(v, OP_String8, 0, 0); for(pEnc=&encnames[0]; pEnc->zName; pEnc++){ if( pEnc->enc==pParse->db->enc ){ sqlite3VdbeChangeP3(v, -1, pEnc->zName, P3_STATIC); |
︙ | ︙ | |||
844 845 846 847 848 849 850 851 852 853 | } sqlite3VdbeAddOp(v, OP_Callback, 2, 0); } }else #endif {} sqliteFree(zLeft); sqliteFree(zRight); } | > | 842 843 844 845 846 847 848 849 850 851 852 | } sqlite3VdbeAddOp(v, OP_Callback, 2, 0); } }else #endif {} pragma_out: sqliteFree(zLeft); sqliteFree(zRight); } |
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.375 2004/06/15 16:51:01 danielk1977 Exp $ */ #include "sqliteInt.h" #include "os.h" #include <ctype.h> #include "vdbeInt.h" /* |
︙ | ︙ | |||
730 731 732 733 734 735 736 737 | ** P3 points to a nul terminated UTF-8 string. This opcode is transformed ** into an OP_String before it is executed for the first time. */ case OP_String8: { pOp->opcode = OP_String; if( db->enc!=SQLITE_UTF8 && pOp->p3 ){ if( db->enc==SQLITE_UTF16LE ){ | > | | > > > > | 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 | ** P3 points to a nul terminated UTF-8 string. This opcode is transformed ** into an OP_String before it is executed for the first time. */ case OP_String8: { pOp->opcode = OP_String; if( db->enc!=SQLITE_UTF8 && pOp->p3 ){ char *z = pOp->p3; if( db->enc==SQLITE_UTF16LE ){ pOp->p3 = sqlite3utf8to16le(z, -1); }else{ pOp->p3 = sqlite3utf8to16be(z, -1); } if( pOp->p3type==P3_DYNAMIC ){ sqliteFree(z); } pOp->p3type = P3_DYNAMIC; if( !pOp->p3 ) goto no_mem; } /* Fall through to the next case, OP_String */ } /* Opcode: String * * P3 |
︙ | ︙ | |||
784 785 786 787 788 789 790 791 792 793 794 795 796 797 | if( !zBlob ) goto no_mem; if( pOp->p3type==P3_DYNAMIC ){ sqliteFree(pOp->p3); } pOp->p3 = zBlob; pOp->p3type = P3_DYNAMIC; }else{ pOp->p3type = P3_STATIC; pOp->p3 = ""; } /* Fall through to the next case, OP_Blob. */ } | > > > | 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 | if( !zBlob ) goto no_mem; if( pOp->p3type==P3_DYNAMIC ){ sqliteFree(pOp->p3); } pOp->p3 = zBlob; pOp->p3type = P3_DYNAMIC; }else{ if( pOp->p3type==P3_DYNAMIC ){ sqliteFree(pOp->p3); } pOp->p3type = P3_STATIC; pOp->p3 = ""; } /* Fall through to the next case, OP_Blob. */ } |
︙ | ︙ | |||
4538 4539 4540 4541 4542 4543 4544 | for(i=0; i<p->agg.nMem; i++){ int freeCtx; if( p->agg.apFunc[i]==0 ) continue; if( p->agg.apFunc[i]->xFinalize==0 ) continue; ctx.s.flags = MEM_Null; ctx.s.z = aMem[i].zShort; ctx.pAgg = (void*)aMem[i].z; | < > > | 4546 4547 4548 4549 4550 4551 4552 4553 4554 4555 4556 4557 4558 4559 4560 4561 4562 4563 4564 4565 | for(i=0; i<p->agg.nMem; i++){ int freeCtx; if( p->agg.apFunc[i]==0 ) continue; if( p->agg.apFunc[i]->xFinalize==0 ) continue; ctx.s.flags = MEM_Null; ctx.s.z = aMem[i].zShort; ctx.pAgg = (void*)aMem[i].z; ctx.cnt = aMem[i].i; ctx.isStep = 0; ctx.pFunc = p->agg.apFunc[i]; (*p->agg.apFunc[i]->xFinalize)(&ctx); aMem[i].z = ctx.pAgg; freeCtx = aMem[i].z && aMem[i].z!=aMem[i].zShort; if( freeCtx ){ sqliteFree( aMem[i].z ); } aMem[i] = ctx.s; if( aMem[i].flags & MEM_Short ){ aMem[i].z = aMem[i].zShort; } |
︙ | ︙ |
Changes to src/vdbeaux.c.
︙ | ︙ | |||
741 742 743 744 745 746 747 748 749 750 751 752 753 754 | ctx.pFunc = pAgg->apFunc[i]; ctx.s.flags = MEM_Null; ctx.pAgg = pMem->z; ctx.cnt = pMem->i; ctx.isStep = 0; ctx.isError = 0; (*pAgg->apFunc[i]->xFinalize)(&ctx); if( pMem->z!=0 && pMem->z!=pMem->z ){ sqliteFree(pMem->z); } }else{ sqlite3VdbeMemRelease(pMem); } } | > | 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 | ctx.pFunc = pAgg->apFunc[i]; ctx.s.flags = MEM_Null; ctx.pAgg = pMem->z; ctx.cnt = pMem->i; ctx.isStep = 0; ctx.isError = 0; (*pAgg->apFunc[i]->xFinalize)(&ctx); pMem->z = ctx.pAgg; if( pMem->z!=0 && pMem->z!=pMem->z ){ sqliteFree(pMem->z); } }else{ sqlite3VdbeMemRelease(pMem); } } |
︙ | ︙ |