Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Tweaks to vdbe.c to further reduce stack space requirements. (CVS 6706) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: | 6f2aab3f7be12710b703eda22b1d5c0e |
User & Date: | drh 2009-06-02 16:06:04 |
Context
2009-06-02
| ||
21:31 | Further reductions in the amount of stack space required. (CVS 6707) check-in: 04bad9eb user: drh tags: trunk | |
16:06 | Tweaks to vdbe.c to further reduce stack space requirements. (CVS 6706) check-in: 6f2aab3f user: drh tags: trunk | |
15:47 | Add a test case for ticket #3893 and ticket #3894. (CVS 6705) check-in: 2472f6db user: drh tags: trunk | |
Changes
Changes to src/vdbe.c.
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 .... 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 .... 2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 .... 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 .... 4878 4879 4880 4881 4882 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 .... 5274 5275 5276 5277 5278 5279 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 |
** ** 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.844 2009/06/02 15:21:42 drh Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" /* ** The following global variable is incremented every time a cursor ** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test ................................................................................ /* Opcode: IsNull P1 P2 P3 * * ** ** Jump to P2 if the value in register P1 is NULL. If P3 is greater ** than zero, then check all values reg(P1), reg(P1+1), ** reg(P1+2), ..., reg(P1+P3-1). */ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ int n = pOp->p3; assert( pOp->p3==0 || pOp->p1>0 ); do{ if( (pIn1->flags & MEM_Null)!=0 ){ pc = pOp->p2 - 1; break; } pIn1++; ................................................................................ ** ** Store the number of entries (an integer value) in the table or index ** opened by cursor P1 in register P2 */ #ifndef SQLITE_OMIT_BTREECOUNT case OP_Count: { /* out2-prerelease */ i64 nEntry; BtCursor *pCrsr = p->apCsr[pOp->p1]->pCursor; if( pCrsr ){ rc = sqlite3BtreeCount(pCrsr, &nEntry); }else{ nEntry = 0; } pOut->flags = MEM_Int; pOut->u.i = nEntry; ................................................................................ /* Opcode: Close P1 * * * * ** ** Close a cursor previously opened as P1. If P1 is not ** currently open, this instruction is a no-op. */ case OP_Close: { int i = pOp->p1; assert( i>=0 && i<p->nCursor ); sqlite3VdbeFreeCursor(p, p->apCsr[i]); p->apCsr[i] = 0; break; } /* Opcode: SeekGe P1 P2 P3 P4 * ................................................................................ ** ** The P5 arguments are taken from register P2 and its ** successors. */ case OP_AggStep: { int n; int i; Mem *pMem, *pRec; sqlite3_context ctx; sqlite3_value **apVal; n = pOp->p5; assert( n>=0 ); pRec = &p->aMem[pOp->p2]; apVal = p->apArg; ................................................................................ ** Advance virtual table P1 to the next row in its result set and ** jump to instruction P2. Or, if the virtual table has reached ** the end of its result set, then fall through to the next instruction. */ case OP_VNext: { /* jump */ sqlite3_vtab *pVtab; const sqlite3_module *pModule; int res = 0; VdbeCursor *pCur; pCur = p->apCsr[pOp->p1]; assert( pCur->pVtabCursor ); if( pCur->nullRow ){ break; } pVtab = pCur->pVtabCursor->pVtab; pModule = pVtab->pModule; |
| > > | > > | > | | > | > |
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 .... 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 .... 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 .... 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 .... 4883 4884 4885 4886 4887 4888 4889 4890 4891 4892 4893 4894 4895 4896 4897 4898 .... 5280 5281 5282 5283 5284 5285 5286 5287 5288 5289 5290 5291 5292 5293 5294 5295 5296 5297 |
** ** 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.845 2009/06/02 16:06:04 drh Exp $ */ #include "sqliteInt.h" #include "vdbeInt.h" /* ** The following global variable is incremented every time a cursor ** moves, either by the OP_SeekXX, OP_Next, or OP_Prev opcodes. The test ................................................................................ /* Opcode: IsNull P1 P2 P3 * * ** ** Jump to P2 if the value in register P1 is NULL. If P3 is greater ** than zero, then check all values reg(P1), reg(P1+1), ** reg(P1+2), ..., reg(P1+P3-1). */ case OP_IsNull: { /* same as TK_ISNULL, jump, in1 */ int n; n = pOp->p3; assert( pOp->p3==0 || pOp->p1>0 ); do{ if( (pIn1->flags & MEM_Null)!=0 ){ pc = pOp->p2 - 1; break; } pIn1++; ................................................................................ ** ** Store the number of entries (an integer value) in the table or index ** opened by cursor P1 in register P2 */ #ifndef SQLITE_OMIT_BTREECOUNT case OP_Count: { /* out2-prerelease */ i64 nEntry; BtCursor *pCrsr; pCrsr = p->apCsr[pOp->p1]->pCursor; if( pCrsr ){ rc = sqlite3BtreeCount(pCrsr, &nEntry); }else{ nEntry = 0; } pOut->flags = MEM_Int; pOut->u.i = nEntry; ................................................................................ /* Opcode: Close P1 * * * * ** ** Close a cursor previously opened as P1. If P1 is not ** currently open, this instruction is a no-op. */ case OP_Close: { int i; i = pOp->p1; assert( i>=0 && i<p->nCursor ); sqlite3VdbeFreeCursor(p, p->apCsr[i]); p->apCsr[i] = 0; break; } /* Opcode: SeekGe P1 P2 P3 P4 * ................................................................................ ** ** The P5 arguments are taken from register P2 and its ** successors. */ case OP_AggStep: { int n; int i; Mem *pMem; Mem *pRec; sqlite3_context ctx; sqlite3_value **apVal; n = pOp->p5; assert( n>=0 ); pRec = &p->aMem[pOp->p2]; apVal = p->apArg; ................................................................................ ** Advance virtual table P1 to the next row in its result set and ** jump to instruction P2. Or, if the virtual table has reached ** the end of its result set, then fall through to the next instruction. */ case OP_VNext: { /* jump */ sqlite3_vtab *pVtab; const sqlite3_module *pModule; int res; VdbeCursor *pCur; res = 0; pCur = p->apCsr[pOp->p1]; assert( pCur->pVtabCursor ); if( pCur->nullRow ){ break; } pVtab = pCur->pVtabCursor->pVtab; pModule = pVtab->pModule; |
Changes to tool/vdbe-compress.tcl.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
while {![eof stdin]} {
set line [gets stdin]
if {[regexp "^case (OP_\\w+): \173" $line all operator]} {
append afterUnion $line\n
set vlist {}
while {![eof stdin]} {
set line [gets stdin]
if {[regexp {^ +(const )?\w+ \*?(\w+)(\[.*\])?;} $line \
all constKeyword vname notused1]} {
if {!$seenDecl} {
set sname {}
append sname [string index $namechars [expr {$sCtr/$nnc}]]
append sname [string index $namechars [expr {$sCtr%$nnc}]]
incr sCtr
append unionDef " struct ${operator}_stack_vars \173\n"
|
| |
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
while {![eof stdin]} {
set line [gets stdin]
if {[regexp "^case (OP_\\w+): \173" $line all operator]} {
append afterUnion $line\n
set vlist {}
while {![eof stdin]} {
set line [gets stdin]
if {[regexp {^ +(const )?\w+ \**(\w+)(\[.*\])?;} $line \
all constKeyword vname notused1]} {
if {!$seenDecl} {
set sname {}
append sname [string index $namechars [expr {$sCtr/$nnc}]]
append sname [string index $namechars [expr {$sCtr%$nnc}]]
incr sCtr
append unionDef " struct ${operator}_stack_vars \173\n"
|