Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Make sure there is no ephemeral data on the stack before returning from an sqlite3_step() call. Otherwise, if the statement is in READ UNCOMMITTED mode then the data might be deleted or changed out from under us. (CVS 2884) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
19f71a6d1982e986f5436bff71ef38b1 |
User & Date: | drh 2006-01-07 18:10:33.000 |
Context
2006-01-07
| ||
18:14 | Continued progress toward a working wince backend. (CVS 2885) (check-in: 15fda14ee0 user: drh tags: trunk) | |
18:10 | Make sure there is no ephemeral data on the stack before returning from an sqlite3_step() call. Otherwise, if the statement is in READ UNCOMMITTED mode then the data might be deleted or changed out from under us. (CVS 2884) (check-in: 19f71a6d19 user: drh tags: trunk) | |
16:06 | Enable redefinable I/O if the SQLITE_ENABLE_REDEF_IO macro exists. (CVS 2883) (check-in: e170e15766 user: drh tags: trunk) | |
Changes
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.515 2006/01/07 18:10:33 drh Exp $ */ #include "sqliteInt.h" #include "os.h" #include <ctype.h> #include "vdbeInt.h" /* |
︙ | ︙ | |||
851 852 853 854 855 856 857 | sqlite3VdbeMemMove(pTo, pTos); pTos--; break; } /* Opcode: Callback P1 * * ** | | > > > | > | | > > > > > > > | > > > | > > > > > | | > > > | 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 | sqlite3VdbeMemMove(pTo, pTos); pTos--; break; } /* Opcode: Callback P1 * * ** ** The top P1 values on the stack represent a single result row from ** a query. This opcode causes the sqlite3_step() call to terminate ** with an SQLITE_ROW return code and it sets up the sqlite3_stmt ** structure to provide access to the top P1 values as the result ** row. When the sqlite3_step() function is run again, the top P1 ** values will be automatically popped from the stack before the next ** instruction executes. */ case OP_Callback: { /* no-push */ Mem *pMem; Mem *pFirstColumn; assert( p->nResColumn==pOp->p1 ); /* Data in the pager might be moved or changed out from under us ** in between the return from this sqlite3_step() call and the ** next call to sqlite3_step(). So deephermeralize everything on ** the stack. Note that ephemeral data is never stored in memory ** cells so we do not have to worry about them. */ pFirstColumn = &pTos[0-pOp->p1]; for(pMem = p->aStack; pMem<pFirstColumn; pMem++){ Deephemeralize(pMem); } /* Make sure the results of the current row are \000 terminated ** and have an assigned type. The results are deephemeralized as ** as side effect. */ for(; pMem<=pTos; pMem++ ){ sqlite3VdbeMemNulTerminate(pMem); storeTypeInfo(pMem, db->enc); } /* Set up the statement structure so that it will pop the current ** results from the stack when the statement returns. */ p->resOnStack = 1; p->nCallback++; p->popStack = pOp->p1; p->pc = pc + 1; p->pTos = pTos; return SQLITE_ROW; } |
︙ | ︙ |