0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65 /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 ing:.**.** Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 d not evil..**
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 ive others..**
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69 used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20 ng, destroying,
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20 * a VDBE (or an
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61 "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72 the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 ld.) Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77 all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 ce file..** But
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65 that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74 s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 6f 73 2e 68 22 0a 23 69 6e 63 lude "os.h".#inc
02d0: 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 lude <ctype.h>.#
02e0: 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e 74 include "vdbeInt
02f0: 2e 68 22 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e .h".../*.** When
0300: 20 64 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 debugging the c
0310: 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e ode generator in
0320: 20 61 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 a symbolic debu
0330: 67 67 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a gger, one can.**
0340: 20 73 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 set the sqlite3
0350: 5f 76 64 62 65 5f 61 64 64 6f 70 5f 74 72 61 63 _vdbe_addop_trac
0360: 65 20 74 6f 20 31 20 61 6e 64 20 61 6c 6c 20 6f e to 1 and all o
0370: 70 63 6f 64 65 73 20 77 69 6c 6c 20 62 65 20 70 pcodes will be p
0380: 72 69 6e 74 65 64 0a 2a 2a 20 61 73 20 74 68 65 rinted.** as the
0390: 79 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 y are added to t
03a0: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 73 he instruction s
03b0: 74 72 65 61 6d 2e 0a 2a 2f 0a 23 69 66 6e 64 65 tream..*/.#ifnde
03c0: 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71 6c f NDEBUG.int sql
03d0: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f ite3_vdbe_addop_
03e0: 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 trace = 0;.#endi
03f0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 f.../*.** Create
0400: 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 a new virtual d
0410: 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a atabase engine..
0420: 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 */.Vdbe *sqlite3
0430: 56 64 62 65 43 72 65 61 74 65 28 73 71 6c 69 74 VdbeCreate(sqlit
0440: 65 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a e *db){. Vdbe *
0450: 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 4d p;. p = sqliteM
0460: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 56 64 alloc( sizeof(Vd
0470: 62 65 29 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d be) );. if( p==
0480: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 0 ) return 0;.
0490: 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 20 69 66 p->db = db;. if
04a0: 28 20 64 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 ( db->pVdbe ){.
04b0: 20 20 20 64 62 2d 3e 70 56 64 62 65 2d 3e 70 50 db->pVdbe->pP
04c0: 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 70 rev = p;. }. p
04d0: 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 70 56 ->pNext = db->pV
04e0: 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 65 76 20 dbe;. p->pPrev
04f0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 64 62 65 = 0;. db->pVdbe
0500: 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 = p;. p->magic
0510: 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e = VDBE_MAGIC_IN
0520: 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a IT;. return p;.
0530: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 }../*.** Turn tr
0540: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a acing on or off.
0550: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
0560: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 dbeTrace(Vdbe *p
0570: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a , FILE *trace){.
0580: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 p->trace = tra
0590: 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 ce;.}../*.** Add
05a0: 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 a new instructi
05b0: 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f on to the list o
05c0: 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 63 f instructions c
05d0: 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a 2a 2a urrent in the.**
05e0: 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e 20 74 VDBE. Return t
05f0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 he address of th
0600: 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f e new instructio
0610: 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 n..**.** Paramet
0620: 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 ers:.**.** p
0630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f Po
0640: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 44 42 inter to the VDB
0650: 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 20 20 E.**.** op
0660: 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 6f The o
0670: 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 20 69 pcode for this i
0680: 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a nstruction.**.**
0690: 20 20 20 20 70 31 2c 20 70 32 20 20 20 20 20 20 p1, p2
06a0: 20 20 20 20 46 69 72 73 74 20 74 77 6f 20 6f 66 First two of
06b0: 20 74 68 65 20 74 68 72 65 65 20 70 6f 73 73 69 the three possi
06c0: 62 6c 65 20 6f 70 65 72 61 6e 64 73 2e 0a 2a 2a ble operands..**
06d0: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 .** Use the sqli
06e0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 te3VdbeResolveLa
06f0: 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 bel() function t
0700: 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 73 o fix an address
0710: 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c 69 and.** the sqli
0720: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 te3VdbeChangeP3(
0730: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 68 ) function to ch
0740: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f ange the value o
0750: 66 20 74 68 65 20 50 33 0a 2a 2a 20 6f 70 65 72 f the P3.** oper
0760: 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 and..*/.int sqli
0770: 74 65 33 56 64 62 65 41 64 64 4f 70 28 56 64 62 te3VdbeAddOp(Vdb
0780: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e e *p, int op, in
0790: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 t p1, int p2){.
07a0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 int i;. VdbeOp
07b0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d *pOp;.. i = p-
07c0: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 6e 4f 70 2b 2b >nOp;. p->nOp++
07d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d ;. assert( p->m
07e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 agic==VDBE_MAGIC
07f0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 69 _INIT );. if( i
0800: 3e 3d 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b >=p->nOpAlloc ){
0810: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 . int oldSize
0820: 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a = p->nOpAlloc;.
0830: 20 20 20 20 4f 70 20 2a 61 4e 65 77 3b 0a 20 20 Op *aNew;.
0840: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 p->nOpAlloc =
0850: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b 20 p->nOpAlloc*2 +
0860: 31 30 30 3b 0a 20 20 20 20 61 4e 65 77 20 3d 20 100;. aNew =
0870: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 2d sqliteRealloc(p-
0880: 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 41 6c 6c 6f >aOp, p->nOpAllo
0890: 63 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 c*sizeof(Op));.
08a0: 20 20 20 69 66 28 20 61 4e 65 77 3d 3d 30 20 29 if( aNew==0 )
08b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4f 70 41 6c {. p->nOpAl
08c0: 6c 6f 63 20 3d 20 6f 6c 64 53 69 7a 65 3b 0a 20 loc = oldSize;.
08d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 return 0;.
08e0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 4f 70 20 }. p->aOp
08f0: 3d 20 61 4e 65 77 3b 0a 20 20 20 20 6d 65 6d 73 = aNew;. mems
0900: 65 74 28 26 70 2d 3e 61 4f 70 5b 6f 6c 64 53 69 et(&p->aOp[oldSi
0910: 7a 65 5d 2c 20 30 2c 20 28 70 2d 3e 6e 4f 70 41 ze], 0, (p->nOpA
0920: 6c 6c 6f 63 2d 6f 6c 64 53 69 7a 65 29 2a 73 69 lloc-oldSize)*si
0930: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 7d 0a 20 zeof(Op));. }.
0940: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 pOp = &p->aOp[i
0950: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 ];. pOp->opcode
0960: 20 3d 20 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 31 = op;. pOp->p1
0970: 20 3d 20 70 31 3b 0a 20 20 69 66 28 20 70 32 3c = p1;. if( p2<
0980: 30 20 26 26 20 28 2d 31 2d 70 32 29 3c 70 2d 3e 0 && (-1-p2)<p->
0990: 6e 4c 61 62 65 6c 20 26 26 20 70 2d 3e 61 4c 61 nLabel && p->aLa
09a0: 62 65 6c 5b 2d 31 2d 70 32 5d 3e 3d 30 20 29 7b bel[-1-p2]>=0 ){
09b0: 0a 20 20 20 20 70 32 20 3d 20 70 2d 3e 61 4c 61 . p2 = p->aLa
09c0: 62 65 6c 5b 2d 31 2d 70 32 5d 3b 0a 20 20 7d 0a bel[-1-p2];. }.
09d0: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a pOp->p2 = p2;.
09e0: 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 pOp->p3 = 0;.
09f0: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 pOp->p3type = P
0a00: 33 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64 3_NOTUSED;.#ifnd
0a10: 65 66 20 4e 44 45 42 55 47 0a 20 20 70 4f 70 2d ef NDEBUG. pOp-
0a20: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 >zComment = 0;.
0a30: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 64 62 if( sqlite3_vdb
0a40: 65 5f 61 64 64 6f 70 5f 74 72 61 63 65 20 29 20 e_addop_trace )
0a50: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 sqlite3VdbePrint
0a60: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 Op(0, i, &p->aOp
0a70: 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 [i]);.#endif. r
0a80: 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn i;.}../*.*
0a90: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 * Add an opcode
0aa0: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 that includes th
0ab0: 65 20 70 33 20 76 61 6c 75 65 2e 0a 2a 2f 0a 69 e p3 value..*/.i
0ac0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 nt sqlite3VdbeOp
0ad0: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 3(Vdbe *p, int o
0ae0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 p, int p1, int p
0af0: 32 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2, const char *z
0b00: 50 33 2c 69 6e 74 20 70 33 74 79 70 65 29 7b 0a P3,int p3type){.
0b10: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c int addr = sql
0b20: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 70 2c ite3VdbeAddOp(p,
0b30: 20 6f 70 2c 20 70 31 2c 20 70 32 29 3b 0a 20 20 op, p1, p2);.
0b40: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
0b50: 65 50 33 28 70 2c 20 61 64 64 72 2c 20 7a 50 33 eP3(p, addr, zP3
0b60: 2c 20 70 33 74 79 70 65 29 3b 0a 20 20 72 65 74 , p3type);. ret
0b70: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a urn addr;.}../*.
0b80: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 ** Create a new
0b90: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66 symbolic label f
0ba0: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f or an instructio
0bb0: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 n that has yet t
0bc0: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 o be.** coded.
0bd0: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 The symbolic lab
0be0: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 el is really jus
0bf0: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d t a negative num
0c00: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62 ber. The.** lab
0c10: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 el can be used a
0c20: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f s the P2 value o
0c30: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20 f an operation.
0c40: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 Later, when.**
0c50: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73 the label is res
0c60: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69 olved to a speci
0c70: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65 fic address, the
0c80: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a VDBE will scan.
0c90: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f ** through its o
0ca0: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e peration list an
0cb0: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c d change all val
0cc0: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20 ues of P2 which
0cd0: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62 match.** the lab
0ce0: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f el into the reso
0cf0: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a lved address..**
0d00: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f .** The VDBE kno
0d10: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c ws that a P2 val
0d20: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65 ue is a label be
0d30: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65 cause labels are
0d40: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74 .** always negat
0d50: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65 ive and P2 value
0d60: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f s are suppose to
0d70: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 be non-negative
0d80: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65 ..** Hence, a ne
0d90: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 gative P2 value
0da0: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20 is a label that
0db0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65 has yet to be re
0dc0: 73 6f 6c 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 solved..*/.int s
0dd0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 qlite3VdbeMakeLa
0de0: 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 bel(Vdbe *p){.
0df0: 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 2d 3e int i;. i = p->
0e00: 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 nLabel++;. asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b BE_MAGIC_INIT );
0e30: 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e 4c 61 . if( i>=p->nLa
0e40: 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 belAlloc ){.
0e50: 69 6e 74 20 2a 61 4e 65 77 3b 0a 20 20 20 20 70 int *aNew;. p
0e60: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 ->nLabelAlloc =
0e70: 70 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 2a 32 p->nLabelAlloc*2
0e80: 20 2b 20 31 30 3b 0a 20 20 20 20 61 4e 65 77 20 + 10;. aNew
0e90: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 = sqliteRealloc(
0ea0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 70 2d 3e 6e p->aLabel, p->n
0eb0: 4c 61 62 65 6c 41 6c 6c 6f 63 2a 73 69 7a 65 6f LabelAlloc*sizeo
0ec0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 f(p->aLabel[0]))
0ed0: 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 3d 3d ;. if( aNew==
0ee0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 0 ){. sqlit
0ef0: 65 46 72 65 65 28 70 2d 3e 61 4c 61 62 65 6c 29 eFree(p->aLabel)
0f00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 61 ;. }. p->a
0f10: 4c 61 62 65 6c 20 3d 20 61 4e 65 77 3b 0a 20 20 Label = aNew;.
0f20: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 }. if( p->aLabe
0f30: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e l==0 ){. p->n
0f40: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 20 20 70 Label = 0;. p
0f50: 2d 3e 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 ->nLabelAlloc =
0f60: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0;. return 0;
0f70: 0a 20 20 7d 0a 20 20 70 2d 3e 61 4c 61 62 65 6c . }. p->aLabel
0f80: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 [i] = -1;. retu
0f90: 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a 0a 2a rn -1-i;.}../*.*
0fa0: 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 * Resolve label
0fb0: 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 "x" to be the ad
0fc0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 dress of the nex
0fd0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f t instruction to
0fe0: 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e .** be inserted.
0ff0: 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 The parameter
1000: 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 "x" must have be
1010: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d en obtained from
1020: 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c .** a prior call
1030: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d to sqlite3VdbeM
1040: 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 akeLabel()..*/.v
1050: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 oid sqlite3VdbeR
1060: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 esolveLabel(Vdbe
1070: 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 20 69 *p, int x){. i
1080: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20 nt j;. assert(
1090: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
10a0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 AGIC_INIT );. i
10b0: 66 28 20 78 3c 30 20 26 26 20 28 2d 78 29 3c 3d f( x<0 && (-x)<=
10c0: 70 2d 3e 6e 4c 61 62 65 6c 20 26 26 20 70 2d 3e p->nLabel && p->
10d0: 61 4f 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 aOp ){. if( p
10e0: 2d 3e 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d 3d 3d ->aLabel[-1-x]==
10f0: 70 2d 3e 6e 4f 70 20 29 20 72 65 74 75 72 6e 3b p->nOp ) return;
1100: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e . assert( p->
1110: 61 4c 61 62 65 6c 5b 2d 31 2d 78 5d 3c 30 20 29 aLabel[-1-x]<0 )
1120: 3b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b ;. p->aLabel[
1130: 2d 31 2d 78 5d 20 3d 20 70 2d 3e 6e 4f 70 3b 0a -1-x] = p->nOp;.
1140: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 for(j=0; j<p
1150: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 ->nOp; j++){.
1160: 20 20 20 69 66 28 20 70 2d 3e 61 4f 70 5b 6a 5d if( p->aOp[j]
1170: 2e 70 32 3d 3d 78 20 29 20 70 2d 3e 61 4f 70 5b .p2==x ) p->aOp[
1180: 6a 5d 2e 70 32 20 3d 20 70 2d 3e 6e 4f 70 3b 0a j].p2 = p->nOp;.
1190: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a }. }.}../*.
11a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 ** Return the ad
11b0: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 dress of the nex
11c0: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f t instruction to
11d0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f be inserted..*/
11e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
11f0: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 CurrentAddr(Vdbe
1200: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 *p){. assert(
1210: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
1220: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 AGIC_INIT );. r
1230: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a eturn p->nOp;.}.
1240: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f ./*.** Add a who
1250: 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 le list of opera
1260: 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 tions to the ope
1270: 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 ration stack. R
1280: 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 eturn the.** add
1290: 72 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 ress of the firs
12a0: 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 t operation adde
12b0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 d..*/.int sqlite
12c0: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 3VdbeAddOpList(V
12d0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c dbe *p, int nOp,
12e0: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 VdbeOpList cons
12f0: 74 20 2a 61 4f 70 29 7b 0a 20 20 69 6e 74 20 61 t *aOp){. int a
1300: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 ddr;. assert( p
1310: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
1320: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 GIC_INIT );. if
1330: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e ( p->nOp + nOp >
1340: 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 7b = p->nOpAlloc ){
1350: 0a 20 20 20 20 69 6e 74 20 6f 6c 64 53 69 7a 65 . int oldSize
1360: 20 3d 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3b 0a = p->nOpAlloc;.
1370: 20 20 20 20 4f 70 20 2a 61 4e 65 77 3b 0a 20 20 Op *aNew;.
1380: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 p->nOpAlloc =
1390: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 2b 20 p->nOpAlloc*2 +
13a0: 6e 4f 70 20 2b 20 31 30 3b 0a 20 20 20 20 61 4e nOp + 10;. aN
13b0: 65 77 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c ew = sqliteReall
13c0: 6f 63 28 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f oc(p->aOp, p->nO
13d0: 70 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 4f 70 pAlloc*sizeof(Op
13e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 4e 65 77 ));. if( aNew
13f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e ==0 ){. p->
1400: 6e 4f 70 41 6c 6c 6f 63 20 3d 20 6f 6c 64 53 69 nOpAlloc = oldSi
1410: 7a 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ze;. return
1420: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 0;. }. p-
1430: 3e 61 4f 70 20 3d 20 61 4e 65 77 3b 0a 20 20 20 >aOp = aNew;.
1440: 20 6d 65 6d 73 65 74 28 26 70 2d 3e 61 4f 70 5b memset(&p->aOp[
1450: 6f 6c 64 53 69 7a 65 5d 2c 20 30 2c 20 28 70 2d oldSize], 0, (p-
1460: 3e 6e 4f 70 41 6c 6c 6f 63 2d 6f 6c 64 53 69 7a >nOpAlloc-oldSiz
1470: 65 29 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a e)*sizeof(Op));.
1480: 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e }. addr = p->
1490: 6e 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3e 30 nOp;. if( nOp>0
14a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
14b0: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f VdbeOpList co
14c0: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a nst *pIn = aOp;.
14d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e for(i=0; i<n
14e0: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b Op; i++, pIn++){
14f0: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 . int p2 =
1500: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 pIn->p2;. V
1510: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 dbeOp *pOut = &p
1520: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 ->aOp[i+addr];.
1530: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 pOut->opcod
1540: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b e = pIn->opcode;
1550: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 . pOut->p1
1560: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 = pIn->p1;.
1570: 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3c 30 pOut->p2 = p2<0
1580: 20 3f 20 61 64 64 72 20 2b 20 41 44 44 52 28 70 ? addr + ADDR(p
1590: 32 29 20 3a 20 70 32 3b 0a 20 20 20 20 20 20 70 2) : p2;. p
15a0: 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 Out->p3 = pIn->p
15b0: 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 3;. pOut->p
15c0: 33 74 79 70 65 20 3d 20 70 49 6e 2d 3e 70 33 20 3type = pIn->p3
15d0: 3f 20 50 33 5f 53 54 41 54 49 43 20 3a 20 50 33 ? P3_STATIC : P3
15e0: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 6e 64 65 _NOTUSED;.#ifnde
15f0: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 70 f NDEBUG. p
1600: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 Out->zComment =
1610: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 0;. if( sql
1620: 69 74 65 33 5f 76 64 62 65 5f 61 64 64 6f 70 5f ite3_vdbe_addop_
1630: 74 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 trace ){.
1640: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e sqlite3VdbePrin
1650: 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 tOp(0, i+addr, &
1660: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b p->aOp[i+addr]);
1670: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a . }.#endif.
1680: 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 }. p->nOp
1690: 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 += nOp;. }. r
16a0: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f eturn addr;.}../
16b0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 *.** Change the
16c0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31 20 value of the P1
16d0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 operand for a sp
16e0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 ecific instructi
16f0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 on..** This rout
1700: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 ine is useful wh
1710: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 en a large progr
1720: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f am is loaded fro
1730: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 m a.** static ar
1740: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 ray using sqlite
1750: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 3VdbeAddOpList b
1760: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 ut we want to ma
1770: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f ke a.** few mino
1780: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 r changes to the
1790: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 program..*/.voi
17a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 d sqlite3VdbeCha
17b0: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 69 ngeP1(Vdbe *p, i
17c0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c nt addr, int val
17d0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e ){. assert( p->
17e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
17f0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 C_INIT );. if(
1800: 70 20 26 26 20 61 64 64 72 3e 3d 30 20 26 26 20 p && addr>=0 &&
1810: 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 26 26 20 70 p->nOp>addr && p
1820: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 70 2d 3e ->aOp ){. p->
1830: 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 aOp[addr].p1 = v
1840: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a al;. }.}../*.**
1850: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 Change the valu
1860: 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 e of the P2 oper
1870: 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 and for a specif
1880: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a ic instruction..
1890: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
18a0: 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 is useful for se
18b0: 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 tting a jump des
18c0: 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 tination..*/.voi
18d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 d sqlite3VdbeCha
18e0: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 69 ngeP2(Vdbe *p, i
18f0: 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c nt addr, int val
1900: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 76 61 6c ){. assert( val
1910: 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 >=0 );. assert(
1920: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
1930: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 MAGIC_INIT );.
1940: 69 66 28 20 70 20 26 26 20 61 64 64 72 3e 3d 30 if( p && addr>=0
1950: 20 26 26 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 && p->nOp>addr
1960: 26 26 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 && p->aOp ){.
1970: 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 p->aOp[addr].p2
1980: 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f = val;. }.}../
1990: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 *.** Change the
19a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 value of the P3
19b0: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 operand for a sp
19c0: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 ecific instructi
19d0: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 on..** This rout
19e0: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 ine is useful wh
19f0: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 en a large progr
1a00: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f am is loaded fro
1a10: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 m a.** static ar
1a20: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 ray using sqlite
1a30: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 3VdbeAddOpList b
1a40: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 ut we want to ma
1a50: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f ke a.** few mino
1a60: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 r changes to the
1a70: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 program..**.**
1a80: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 If n>=0 then the
1a90: 20 50 33 20 6f 70 65 72 61 6e 64 20 69 73 20 64 P3 operand is d
1aa0: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 ynamic, meaning
1ab0: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a that a copy of.*
1ac0: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 * the string is
1ad0: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 made into memory
1ae0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 obtained from s
1af0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 0a 2a qliteMalloc()..*
1b00: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d * A value of n==
1b10: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 0 means copy byt
1b20: 65 73 20 6f 66 20 7a 50 33 20 75 70 20 74 6f 20 es of zP3 up to
1b30: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 and including th
1b40: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 e.** first null
1b50: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 byte. If n>0 th
1b60: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 en copy n+1 byte
1b70: 73 20 6f 66 20 7a 50 33 2e 0a 2a 2a 0a 2a 2a 20 s of zP3..**.**
1b80: 49 66 20 6e 3d 3d 50 33 5f 53 54 41 54 49 43 20 If n==P3_STATIC
1b90: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a it means that z
1ba0: 50 33 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 P3 is a pointer
1bb0: 74 6f 20 61 20 63 6f 6e 73 74 61 6e 74 20 73 74 to a constant st
1bc0: 61 74 69 63 0a 2a 2a 20 73 74 72 69 6e 67 20 61 atic.** string a
1bd0: 6e 64 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 nd we can just c
1be0: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e opy the pointer.
1bf0: 20 20 6e 3d 3d 50 33 5f 50 4f 49 4e 54 45 52 20 n==P3_POINTER
1c00: 6d 65 61 6e 73 20 7a 50 33 20 69 73 0a 2a 2a 20 means zP3 is.**
1c10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 73 6f 6d a pointer to som
1c20: 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 e object other t
1c30: 68 61 6e 20 61 20 73 74 72 69 6e 67 2e 20 20 6e han a string. n
1c40: 3d 3d 50 33 5f 43 4f 4c 4c 53 45 51 20 61 6e 64 ==P3_COLLSEQ and
1c50: 0a 2a 2a 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 .** n==P3_KEYINF
1c60: 4f 20 6d 65 61 6e 20 74 68 61 74 20 7a 50 33 20 O mean that zP3
1c70: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 is a pointer to
1c80: 61 20 43 6f 6c 6c 53 65 71 20 6f 72 20 4b 65 79 a CollSeq or Key
1c90: 49 6e 66 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 Info.** structur
1ca0: 65 2e 20 20 41 20 63 6f 70 79 20 69 73 20 6d 61 e. A copy is ma
1cb0: 64 65 20 6f 66 20 4b 65 79 49 6e 66 6f 20 73 74 de of KeyInfo st
1cc0: 72 75 63 74 75 72 65 73 20 69 6e 74 6f 20 6d 65 ructures into me
1cd0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a mory obtained.**
1ce0: 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c from sqliteMall
1cf0: 6f 63 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 oc..**.** If add
1d00: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 r<0 then change
1d10: 50 33 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 P3 on the most r
1d20: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 ecently inserted
1d30: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f instruction..*/
1d40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
1d50: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a eChangeP3(Vdbe *
1d60: 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e p, int addr, con
1d70: 73 74 20 63 68 61 72 20 2a 7a 50 33 2c 20 69 6e st char *zP3, in
1d80: 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b t n){. Op *pOp;
1d90: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 . assert( p->ma
1da0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
1db0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 3d INIT );. if( p=
1dc0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 =0 || p->aOp==0
1dd0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 ) return;. if(
1de0: 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e 3d addr<0 || addr>=
1df0: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 64 p->nOp ){. ad
1e00: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b dr = p->nOp - 1;
1e10: 0a 20 20 20 20 69 66 28 20 61 64 64 72 3c 30 20 . if( addr<0
1e20: 29 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 ) return;. }.
1e30: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 pOp = &p->aOp[ad
1e40: 64 72 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e dr];. if( pOp->
1e50: 70 33 20 26 26 20 70 4f 70 2d 3e 70 33 74 79 70 p3 && pOp->p3typ
1e60: 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b e==P3_DYNAMIC ){
1e70: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 . sqliteFree(
1e80: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 70 4f pOp->p3);. pO
1e90: 70 2d 3e 70 33 20 3d 20 30 3b 0a 20 20 7d 0a 20 p->p3 = 0;. }.
1ea0: 20 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a 20 if( zP3==0 ){.
1eb0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 30 3b 0a pOp->p3 = 0;.
1ec0: 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 pOp->p3type
1ed0: 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 = P3_NOTUSED;.
1ee0: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 33 5f }else if( n==P3_
1ef0: 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b KEYINFO ){. K
1f00: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
1f10: 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 ;. int nField
1f20: 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 6e 46 69 , nByte;. nFi
1f30: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a eld = ((KeyInfo*
1f40: 29 7a 50 33 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 )zP3)->nField;.
1f50: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f nByte = sizeo
1f60: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 f(*pKeyInfo) + (
1f70: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 nField-1)*sizeof
1f80: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c (pKeyInfo->aColl
1f90: 5b 30 5d 29 3b 0a 20 20 20 20 70 4b 65 79 49 6e [0]);. pKeyIn
1fa0: 66 6f 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f fo = sqliteMallo
1fb0: 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 cRaw( nByte );.
1fc0: 20 20 20 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 pOp->p3 = (ch
1fd0: 61 72 2a 29 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 ar*)pKeyInfo;.
1fe0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 if( pKeyInfo )
1ff0: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 {. memcpy(p
2000: 4b 65 79 49 6e 66 6f 2c 20 7a 50 33 2c 20 6e 42 KeyInfo, zP3, nB
2010: 79 74 65 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d yte);. pOp-
2020: 3e 70 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 >p3type = P3_KEY
2030: 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b INFO;. }else{
2040: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 . pOp->p3ty
2050: 70 65 20 3d 20 50 33 5f 4e 4f 54 55 53 45 44 3b pe = P3_NOTUSED;
2060: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 . }. }else i
2070: 66 28 20 6e 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f f( n==P3_KEYINFO
2080: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 _HANDOFF ){.
2090: 70 4f 70 2d 3e 70 33 20 3d 20 28 63 68 61 72 2a pOp->p3 = (char*
20a0: 29 7a 50 33 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 )zP3;. pOp->p
20b0: 33 74 79 70 65 20 3d 20 50 33 5f 4b 45 59 49 4e 3type = P3_KEYIN
20c0: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 FO;. }else if(
20d0: 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e n<0 ){. pOp->
20e0: 70 33 20 3d 20 28 63 68 61 72 2a 29 7a 50 33 3b p3 = (char*)zP3;
20f0: 0a 20 20 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 . pOp->p3type
2100: 20 3d 20 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = n;. }else{.
2110: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74 sqlite3SetNSt
2120: 72 69 6e 67 28 26 70 4f 70 2d 3e 70 33 2c 20 7a ring(&pOp->p3, z
2130: 50 33 2c 20 6e 2c 20 30 29 3b 0a 20 20 20 20 70 P3, n, 0);. p
2140: 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 33 5f Op->p3type = P3_
2150: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a DYNAMIC;. }.}..
2160: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 33 20 /*.** If the P3
2170: 6f 70 65 72 61 6e 64 20 74 6f 20 74 68 65 20 73 operand to the s
2180: 70 65 63 69 66 69 65 64 20 69 6e 73 74 72 75 63 pecified instruc
2190: 74 69 6f 6e 20 61 70 70 65 61 72 73 0a 2a 2a 20 tion appears.**
21a0: 74 6f 20 62 65 20 61 20 71 75 6f 74 65 64 20 73 to be a quoted s
21b0: 74 72 69 6e 67 20 74 6f 6b 65 6e 2c 20 74 68 65 tring token, the
21c0: 6e 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 n this procedure
21d0: 20 72 65 6d 6f 76 65 73 20 0a 2a 2a 20 74 68 65 removes .** the
21e0: 20 71 75 6f 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 quotes..**.** T
21f0: 68 65 20 71 75 6f 74 69 6e 67 20 6f 70 65 72 61 he quoting opera
2200: 74 6f 72 20 63 61 6e 20 62 65 20 65 69 74 68 65 tor can be eithe
2210: 72 20 61 20 67 72 61 76 65 20 61 73 63 65 6e 74 r a grave ascent
2220: 20 28 41 53 43 49 49 20 30 78 32 37 29 0a 2a 2a (ASCII 0x27).**
2230: 20 6f 72 20 61 20 64 6f 75 62 6c 65 20 71 75 6f or a double quo
2240: 74 65 20 63 68 61 72 61 63 74 65 72 20 28 41 53 te character (AS
2250: 43 49 49 20 30 78 32 32 29 2e 20 20 54 77 6f 20 CII 0x22). Two
2260: 71 75 6f 74 65 73 20 69 6e 20 61 20 72 6f 77 0a quotes in a row.
2270: 2a 2a 20 72 65 73 6f 6c 76 65 20 74 6f 20 62 65 ** resolve to be
2280: 20 61 20 73 69 6e 67 6c 65 20 61 63 74 75 61 6c a single actual
2290: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72 quote character
22a0: 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 72 69 within the stri
22b0: 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ng..*/.void sqli
22c0: 74 65 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 te3VdbeDequoteP3
22d0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 (Vdbe *p, int ad
22e0: 64 72 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a dr){. Op *pOp;.
22f0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 assert( p->mag
2300: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 ic==VDBE_MAGIC_I
2310: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e NIT );. if( p->
2320: 61 4f 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b aOp==0 ) return;
2330: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 7c 7c . if( addr<0 ||
2340: 20 61 64 64 72 3e 3d 70 2d 3e 6e 4f 70 20 29 7b addr>=p->nOp ){
2350: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e . addr = p->n
2360: 4f 70 20 2d 20 31 3b 0a 20 20 20 20 69 66 28 20 Op - 1;. if(
2370: 61 64 64 72 3c 30 20 29 20 72 65 74 75 72 6e 3b addr<0 ) return;
2380: 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d . }. pOp = &p-
2390: 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 >aOp[addr];. if
23a0: 28 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 7c 7c 20 ( pOp->p3==0 ||
23b0: 70 4f 70 2d 3e 70 33 5b 30 5d 3d 3d 30 20 29 20 pOp->p3[0]==0 )
23c0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 4f return;. if( pO
23d0: 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 53 54 p->p3type==P3_ST
23e0: 41 54 49 43 20 29 7b 0a 20 20 20 20 70 4f 70 2d ATIC ){. pOp-
23f0: 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 44 >p3 = sqliteStrD
2400: 75 70 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 up(pOp->p3);.
2410: 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 50 pOp->p3type = P
2420: 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 20 3_DYNAMIC;. }.
2430: 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 33 assert( pOp->p3
2440: 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 type==P3_DYNAMIC
2450: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 71 );. sqlite3Deq
2460: 75 6f 74 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 7d uote(pOp->p3);.}
2470: 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 74 68 65 20 50 ../*.** On the P
2480: 33 20 61 72 67 75 6d 65 6e 74 20 6f 66 20 74 68 3 argument of th
2490: 65 20 67 69 76 65 6e 20 69 6e 73 74 72 75 63 74 e given instruct
24a0: 69 6f 6e 2c 20 63 68 61 6e 67 65 20 61 6c 6c 0a ion, change all.
24b0: 2a 2a 20 73 74 72 69 6e 67 73 20 6f 66 20 77 68 ** strings of wh
24c0: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74 itespace charact
24d0: 65 72 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 6c ers into a singl
24e0: 65 20 73 70 61 63 65 20 61 6e 64 0a 2a 2a 20 64 e space and.** d
24f0: 65 6c 65 74 65 20 6c 65 61 64 69 6e 67 20 61 6e elete leading an
2500: 64 20 74 72 61 69 6c 69 6e 67 20 77 68 69 74 65 d trailing white
2510: 73 70 61 63 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 space..*/.void s
2520: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 70 72 65 qlite3VdbeCompre
2530: 73 73 53 70 61 63 65 28 56 64 62 65 20 2a 70 2c ssSpace(Vdbe *p,
2540: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 75 6e int addr){. un
2550: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a signed char *z;.
2560: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 4f 70 int i, j;. Op
2570: 20 2a 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 *pOp;. assert(
2580: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
2590: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 MAGIC_INIT );.
25a0: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c if( p->aOp==0 ||
25b0: 20 61 64 64 72 3c 30 20 7c 7c 20 61 64 64 72 3e addr<0 || addr>
25c0: 3d 70 2d 3e 6e 4f 70 20 29 20 72 65 74 75 72 6e =p->nOp ) return
25d0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f ;. pOp = &p->aO
25e0: 70 5b 61 64 64 72 5d 3b 0a 20 20 69 66 28 20 70 p[addr];. if( p
25f0: 4f 70 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 53 Op->p3type==P3_S
2600: 54 41 54 49 43 20 29 7b 0a 20 20 20 20 70 4f 70 TATIC ){. pOp
2610: 2d 3e 70 33 20 3d 20 73 71 6c 69 74 65 53 74 72 ->p3 = sqliteStr
2620: 44 75 70 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 Dup(pOp->p3);.
2630: 20 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 3d 20 pOp->p3type =
2640: 50 33 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a P3_DYNAMIC;. }.
2650: 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 assert( pOp->p
2660: 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 3type==P3_DYNAMI
2670: 43 20 29 3b 0a 20 20 7a 20 3d 20 28 75 6e 73 69 C );. z = (unsi
2680: 67 6e 65 64 20 63 68 61 72 2a 29 70 4f 70 2d 3e gned char*)pOp->
2690: 70 33 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 p3;. if( z==0 )
26a0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 20 3d 20 6a return;. i = j
26b0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 = 0;. while( i
26c0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 20 sspace(z[i]) ){
26d0: 69 2b 2b 3b 20 7d 0a 20 20 77 68 69 6c 65 28 20 i++; }. while(
26e0: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 z[i] ){. if(
26f0: 69 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b isspace(z[i]) ){
2700: 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 . z[j++] =
2710: 27 20 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 ' ';. while
2720: 28 20 69 73 73 70 61 63 65 28 7a 5b 2b 2b 69 5d ( isspace(z[++i]
2730: 29 20 29 7b 7d 0a 20 20 20 20 7d 65 6c 73 65 7b ) ){}. }else{
2740: 0a 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 . z[j++] =
2750: 7a 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 z[i++];. }.
2760: 7d 0a 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 }. while( j>0 &
2770: 26 20 69 73 73 70 61 63 65 28 7a 5b 6a 2d 31 5d & isspace(z[j-1]
2780: 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 7a 5b ) ){ j--; }. z[
2790: 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 j] = 0;.}..#ifnd
27a0: 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 ef NDEBUG./*.**
27b0: 41 64 64 20 63 6f 6d 6d 65 6e 74 20 74 65 78 74 Add comment text
27c0: 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 to the most rec
27d0: 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f ently inserted o
27e0: 70 63 6f 64 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 pcode.*/.void sq
27f0: 6c 69 74 65 33 56 64 62 65 41 64 64 43 6f 6d 6d lite3VdbeAddComm
2800: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e ent(Vdbe *p, con
2810: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 st char *zFormat
2820: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 , ...){. va_lis
2830: 74 20 61 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a t ap;. VdbeOp *
2840: 70 4f 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 65 pOp;. char *zTe
2850: 78 74 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 xt;. va_start(a
2860: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a p, zFormat);. z
2870: 54 65 78 74 20 3d 20 73 71 6c 69 74 65 33 5f 76 Text = sqlite3_v
2880: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c mprintf(zFormat,
2890: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 ap);. va_end(a
28a0: 70 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e p);. pOp = &p->
28b0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 aOp[p->nOp-1];.
28c0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4f 70 2d sqliteFree(pOp-
28d0: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 70 4f >zComment);. pO
28e0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 7a 54 p->zComment = zT
28f0: 65 78 74 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f ext;.}.#endif../
2900: 2a 0a 2a 2a 20 53 65 61 72 63 68 20 74 68 65 20 *.** Search the
2910: 63 75 72 72 65 6e 74 20 70 72 6f 67 72 61 6d 20 current program
2920: 73 74 61 72 74 69 6e 67 20 61 74 20 69 6e 73 74 starting at inst
2930: 72 75 63 74 69 6f 6e 20 61 64 64 72 20 66 6f 72 ruction addr for
2940: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 6f 70 the given.** op
2950: 63 6f 64 65 20 61 6e 64 20 50 32 20 76 61 6c 75 code and P2 valu
2960: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 e. Return the a
2970: 64 64 72 65 73 73 20 70 6c 75 73 20 31 20 69 66 ddress plus 1 if
2980: 20 66 6f 75 6e 64 20 61 6e 64 20 30 20 69 66 20 found and 0 if
2990: 6e 6f 74 0a 2a 2a 20 66 6f 75 6e 64 2e 0a 2a 2f not.** found..*/
29a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
29b0: 46 69 6e 64 4f 70 28 56 64 62 65 20 2a 70 2c 20 FindOp(Vdbe *p,
29c0: 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 6f 70 int addr, int op
29d0: 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 69 6e 74 , int p2){. int
29e0: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d i;. assert( p-
29f0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
2a00: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 66 6f 72 IC_INIT );. for
2a10: 28 69 3d 61 64 64 72 3b 20 69 3c 70 2d 3e 6e 4f (i=addr; i<p->nO
2a20: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 p; i++){. if(
2a30: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 p->aOp[i].opcod
2a40: 65 3d 3d 6f 70 20 26 26 20 70 2d 3e 61 4f 70 5b e==op && p->aOp[
2a50: 69 5d 2e 70 32 3d 3d 70 32 20 29 20 72 65 74 75 i].p2==p2 ) retu
2a60: 72 6e 20 69 2b 31 3b 0a 20 20 7d 0a 20 20 72 65 rn i+1;. }. re
2a70: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn 0;.}../*.**
2a80: 20 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f Return the opco
2a90: 64 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 de for a given a
2aa0: 64 64 72 65 73 73 2e 0a 2a 2f 0a 56 64 62 65 4f ddress..*/.VdbeO
2ab0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 p *sqlite3VdbeGe
2ac0: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 tOp(Vdbe *p, int
2ad0: 20 61 64 64 72 29 7b 0a 20 20 61 73 73 65 72 74 addr){. assert
2ae0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
2af0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
2b00: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 assert( addr>=0
2b10: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 && addr<p->nOp
2b20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 26 70 2d 3e );. return &p->
2b30: 61 4f 70 5b 61 64 64 72 5d 3b 0a 7d 0a 0a 2f 2a aOp[addr];.}../*
2b40: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 .** Compute a st
2b50: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 ring that descri
2b60: 62 65 73 20 74 68 65 20 50 33 20 70 61 72 61 6d bes the P3 param
2b70: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f eter for an opco
2b80: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 de..** Use zTemp
2b90: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 for any require
2ba0: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 d temporary buff
2bb0: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 er space..*/.sta
2bc0: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 tic char *displa
2bd0: 79 50 33 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 yP3(Op *pOp, cha
2be0: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 r *zTemp, int nT
2bf0: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 emp){. char *zP
2c00: 33 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 3;. assert( nTe
2c10: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 mp>=20 );. swit
2c20: 63 68 28 20 70 4f 70 2d 3e 70 33 74 79 70 65 20 ch( pOp->p3type
2c30: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 33 5f 50 ){. case P3_P
2c40: 4f 49 4e 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 OINTER: {.
2c50: 73 70 72 69 6e 74 66 28 7a 54 65 6d 70 2c 20 22 sprintf(zTemp, "
2c60: 70 74 72 28 25 23 78 29 22 2c 20 28 69 6e 74 29 ptr(%#x)", (int)
2c70: 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 20 20 pOp->p3);.
2c80: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 zP3 = zTemp;.
2c90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
2ca0: 20 20 20 20 63 61 73 65 20 50 33 5f 4b 45 59 49 case P3_KEYI
2cb0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 NFO: {. int
2cc0: 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 i, j;. Key
2cd0: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d Info *pKeyInfo =
2ce0: 20 28 4b 65 79 49 6e 66 6f 2a 29 70 4f 70 2d 3e (KeyInfo*)pOp->
2cf0: 70 33 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 p3;. sprint
2d00: 66 28 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 f(zTemp, "keyinf
2d10: 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d o(%d", pKeyInfo-
2d20: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 >nField);.
2d30: 69 20 3d 20 73 74 72 6c 65 6e 28 7a 54 65 6d 70 i = strlen(zTemp
2d40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 );. for(j=0
2d50: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 ; j<pKeyInfo->nF
2d60: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 ield; j++){.
2d70: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f CollSeq *pCo
2d80: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 ll = pKeyInfo->a
2d90: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 Coll[j];.
2da0: 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 if( pColl ){.
2db0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 int n =
2dc0: 73 74 72 6c 65 6e 28 70 43 6f 6c 6c 2d 3e 7a 4e strlen(pColl->zN
2dd0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ame);.
2de0: 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 if( i+n>nTemp-6
2df0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 ){. s
2e00: 74 72 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c trcpy(&zTemp[i],
2e10: 22 2c 2e 2e 2e 22 29 3b 0a 20 20 20 20 20 20 20 ",...");.
2e20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
2e30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
2e40: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 zTemp[i++] = '
2e50: 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 ,';. if
2e60: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 ( pKeyInfo->aSor
2e70: 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 6e tOrder && pKeyIn
2e80: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a fo->aSortOrder[j
2e90: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 ] ){.
2ea0: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d zTemp[i++] = '-
2eb0: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 ';. }.
2ec0: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28 strcpy(
2ed0: 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c 6c &zTemp[i], pColl
2ee0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 ->zName);.
2ef0: 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 i += n;.
2f00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 2b }else if( i+
2f10: 34 3c 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 4<nTemp-6 ){.
2f20: 20 20 20 20 20 20 20 73 74 72 63 70 79 28 26 7a strcpy(&z
2f30: 54 65 6d 70 5b 69 5d 2c 22 2c 6e 69 6c 22 29 3b Temp[i],",nil");
2f40: 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 . i +=
2f50: 34 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 4;. }.
2f60: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 }. zTemp
2f70: 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 [i++] = ')';.
2f80: 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b zTemp[i] = 0;
2f90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 . assert( i
2fa0: 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 <nTemp );.
2fb0: 7a 50 33 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 zP3 = zTemp;.
2fc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
2fd0: 20 20 20 20 63 61 73 65 20 50 33 5f 43 4f 4c 4c case P3_COLL
2fe0: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c SEQ: {. Col
2ff0: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 lSeq *pColl = (C
3000: 6f 6c 6c 53 65 71 2a 29 70 4f 70 2d 3e 70 33 3b ollSeq*)pOp->p3;
3010: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a . sprintf(z
3020: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 Temp, "collseq(%
3030: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a .20s)", pColl->z
3040: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7a 50 33 Name);. zP3
3050: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20 = zTemp;.
3060: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
3070: 20 63 61 73 65 20 50 33 5f 46 55 4e 43 44 45 46 case P3_FUNCDEF
3080: 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 : {. FuncDe
3090: 66 20 2a 70 44 65 66 20 3d 20 28 46 75 6e 63 44 f *pDef = (FuncD
30a0: 65 66 2a 29 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 ef*)pOp->p3;.
30b0: 20 20 20 63 68 61 72 20 7a 4e 75 6d 5b 33 30 5d char zNum[30]
30c0: 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 ;. sprintf(
30d0: 7a 54 65 6d 70 2c 20 22 25 2e 2a 73 22 2c 20 6e zTemp, "%.*s", n
30e0: 54 65 6d 70 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d Temp, pDef->zNam
30f0: 65 29 3b 0a 20 20 20 20 20 20 73 70 72 69 6e 74 e);. sprint
3100: 66 28 7a 4e 75 6d 2c 22 28 25 64 29 22 2c 20 70 f(zNum,"(%d)", p
3110: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 Def->nArg);.
3120: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 54 65 if( strlen(zTe
3130: 6d 70 29 2b 73 74 72 6c 65 6e 28 7a 4e 75 6d 29 mp)+strlen(zNum)
3140: 2b 31 3c 3d 6e 54 65 6d 70 20 29 7b 0a 20 20 20 +1<=nTemp ){.
3150: 20 20 20 20 20 73 74 72 63 61 74 28 7a 54 65 6d strcat(zTem
3160: 70 2c 20 7a 4e 75 6d 29 3b 0a 20 20 20 20 20 20 p, zNum);.
3170: 7d 0a 20 20 20 20 20 20 7a 50 33 20 3d 20 7a 54 }. zP3 = zT
3180: 65 6d 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b emp;. break
3190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 ;. }. defa
31a0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 33 ult: {. zP3
31b0: 20 3d 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 = pOp->p3;.
31c0: 20 20 69 66 28 20 7a 50 33 3d 3d 30 20 29 7b 0a if( zP3==0 ){.
31d0: 20 20 20 20 20 20 20 20 7a 50 33 20 3d 20 22 22 zP3 = ""
31e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
31f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 50 33 }. return zP3
3200: 3b 0a 7d 0a 0a 0a 23 69 66 20 21 64 65 66 69 6e ;.}...#if !defin
3210: 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 ed(NDEBUG) || de
3220: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 fined(VDBE_PROFI
3230: 4c 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 LE)./*.** Print
3240: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e a single opcode.
3250: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 This routine i
3260: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67 s used for debug
3270: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f ging only..*/.vo
3280: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 id sqlite3VdbePr
3290: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 intOp(FILE *pOut
32a0: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f , int pc, Op *pO
32b0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 33 3b p){. char *zP3;
32c0: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d . char zPtr[50]
32d0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 ;. static const
32e0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 char *zFormat1
32f0: 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 = "%4d %-13s %4d
3300: 20 25 34 64 20 25 73 5c 6e 22 3b 0a 20 20 73 74 %4d %s\n";. st
3310: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
3320: 2a 7a 46 6f 72 6d 61 74 32 20 3d 20 22 25 34 64 *zFormat2 = "%4d
3330: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 %-13s %4d %4d %
3340: 2d 32 30 73 20 2d 2d 20 25 73 5c 6e 22 3b 0a 20 -20s -- %s\n";.
3350: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 if( pOut==0 ) p
3360: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 Out = stdout;.
3370: 7a 50 33 20 3d 20 64 69 73 70 6c 61 79 50 33 28 zP3 = displayP3(
3380: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f pOp, zPtr, sizeo
3390: 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 f(zPtr));.#ifdef
33a0: 20 4e 44 45 42 55 47 0a 20 20 66 70 72 69 6e 74 NDEBUG. fprint
33b0: 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 f(pOut, zFormat1
33c0: 2c 0a 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69 ,. pc, sqli
33d0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 te3OpcodeNames[p
33e0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 Op->opcode], pOp
33f0: 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a ->p1, pOp->p2, z
3400: 50 33 29 3b 0a 23 65 6c 73 65 0a 20 20 66 70 72 P3);.#else. fpr
3410: 69 6e 74 66 28 70 4f 75 74 2c 20 70 4f 70 2d 3e intf(pOut, pOp->
3420: 7a 43 6f 6d 6d 65 6e 74 20 3f 20 7a 46 6f 72 6d zComment ? zForm
3430: 61 74 32 20 3a 20 7a 46 6f 72 6d 61 74 31 2c 0a at2 : zFormat1,.
3440: 20 20 20 20 20 20 70 63 2c 20 73 71 6c 69 74 65 pc, sqlite
3450: 33 4f 70 63 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 3OpcodeNames[pOp
3460: 2d 3e 6f 70 63 6f 64 65 5d 2c 20 70 4f 70 2d 3e ->opcode], pOp->
3470: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 7a 50 33 p1, pOp->p2, zP3
3480: 2c 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b ,pOp->zComment);
3490: 0a 23 65 6e 64 69 66 0a 20 20 66 66 6c 75 73 68 .#endif. fflush
34a0: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 (pOut);.}.#endif
34b0: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c ../*.** Give a l
34c0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 isting of the pr
34d0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 ogram in the vir
34e0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a tual machine..**
34f0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 .** The interfac
3500: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 e is the same as
3510: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 sqlite3VdbeExec
3520: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 (). But instead
3530: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 of.** running t
3540: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f he code, it invo
3550: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b kes the callback
3560: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 once for each i
3570: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 nstruction..** T
3580: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 his feature is u
3590: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 sed to implement
35a0: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2f 0a 69 "EXPLAIN"..*/.i
35b0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 nt sqlite3VdbeLi
35c0: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 st(. Vdbe *p
35d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
35e0: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 /* The VDBE */.)
35f0: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d {. sqlite *db =
3600: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b p->db;. int i;
3610: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
3620: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 TE_OK;.. assert
3630: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a ( p->explain );.
3640: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 . /* Even thoug
3650: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f h this opcode do
3660: 65 73 20 6e 6f 74 20 70 75 74 20 64 79 6e 61 6d es not put dynam
3670: 69 63 20 73 74 72 69 6e 67 73 20 6f 6e 74 6f 20 ic strings onto
3680: 74 68 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 61 the. ** the sta
3690: 63 6b 2c 20 74 68 65 79 20 6d 61 79 20 62 65 63 ck, they may bec
36a0: 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 ome dynamic if t
36b0: 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 he user calls.
36c0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d ** sqlite3_colum
36d0: 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 n_text16(), caus
36e0: 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f ing a translatio
36f0: 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f n to UTF-16 enco
3700: 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 ding.. */. if(
3710: 20 70 2d 3e 70 54 6f 73 3d 3d 26 70 2d 3e 61 53 p->pTos==&p->aS
3720: 74 61 63 6b 5b 34 5d 20 29 7b 0a 20 20 20 20 66 tack[4] ){. f
3730: 6f 72 28 69 3d 30 3b 20 69 3c 35 3b 20 69 2b 2b or(i=0; i<5; i++
3740: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
3750: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 VdbeMemRelease(&
3760: 70 2d 3e 61 53 74 61 63 6b 5b 69 5d 29 3b 0a 20 p->aStack[i]);.
3770: 20 20 20 20 20 70 2d 3e 61 53 74 61 63 6b 5b 69 p->aStack[i
3780: 5d 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 ].flags = 0;.
3790: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 72 65 73 4f }. }. p->resO
37a0: 6e 53 74 61 63 6b 20 3d 20 30 3b 0a 0a 20 20 69 nStack = 0;.. i
37b0: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 69 66 = p->pc++;. if
37c0: 28 20 69 3e 3d 70 2d 3e 6e 4f 70 20 29 7b 0a 20 ( i>=p->nOp ){.
37d0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 p->rc = SQLIT
37e0: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 E_OK;. rc = S
37f0: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 QLITE_DONE;. }e
3800: 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 lse if( db->flag
3810: 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 s & SQLITE_Inter
3820: 72 75 70 74 20 29 7b 0a 20 20 20 20 64 62 2d 3e rupt ){. db->
3830: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 flags &= ~SQLITE
3840: 5f 49 6e 74 65 72 72 75 70 74 3b 0a 20 20 20 20 _Interrupt;.
3850: 69 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 if( db->magic!=S
3860: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 QLITE_MAGIC_BUSY
3870: 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 ){. p->rc
3880: 3d 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b = SQLITE_MISUSE;
3890: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
38a0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 p->rc = SQLITE
38b0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 _INTERRUPT;.
38c0: 7d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 }. rc = SQLIT
38d0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c E_ERROR;. sql
38e0: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 ite3SetString(&p
38f0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 ->zErrMsg, sqlit
3900: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 2c e3ErrStr(p->rc),
3910: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 65 (char*)0);. }e
3920: 6c 73 65 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 lse{. Op *pOp
3930: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 = &p->aOp[i];.
3940: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 Mem *pMem = p
3950: 2d 3e 61 53 74 61 63 6b 3b 0a 20 20 20 20 70 4d ->aStack;. pM
3960: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
3970: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 Int;. pMem->t
3980: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 ype = SQLITE_INT
3990: 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e EGER;. pMem->
39a0: 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 i = i;
39b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
39c0: 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d /* Program
39d0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 counter */.
39e0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 pMem++;.. pMe
39f0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 m->flags = MEM_S
3a00: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 tatic|MEM_Str|ME
3a10: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 70 4d 65 6d M_Term;. pMem
3a20: 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 ->z = sqlite3Opc
3a30: 6f 64 65 4e 61 6d 65 73 5b 70 4f 70 2d 3e 6f 70 odeNames[pOp->op
3a40: 63 6f 64 65 5d 3b 20 20 2f 2a 20 4f 70 63 6f 64 code]; /* Opcod
3a50: 65 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e e */. pMem->n
3a60: 20 3d 20 73 74 72 6c 65 6e 28 70 4d 65 6d 2d 3e = strlen(pMem->
3a70: 7a 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 z);. pMem->ty
3a80: 70 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 pe = SQLITE_TEXT
3a90: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 ;. pMem->enc
3aa0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 = SQLITE_UTF8;.
3ab0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 pMem++;..
3ac0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
3ad0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d M_Int;. pMem-
3ae0: 3e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 >i = pOp->p1;
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3b00: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a /* P1 */.
3b10: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d pMem->type =
3b20: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b SQLITE_INTEGER;
3b30: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 . pMem++;..
3b40: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
3b50: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 MEM_Int;. pMe
3b60: 6d 2d 3e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 m->i = pOp->p2;
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a /* P2 *
3b90: 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 /. pMem->type
3ba0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 = SQLITE_INTEGE
3bb0: 52 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a R;. pMem++;..
3bc0: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
3bd0: 3d 20 4d 45 4d 5f 53 68 6f 72 74 7c 4d 45 4d 5f = MEM_Short|MEM_
3be0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 20 20 20 Str|MEM_Term;
3bf0: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 /* P3 */. pMe
3c00: 6d 2d 3e 7a 20 3d 20 64 69 73 70 6c 61 79 50 33 m->z = displayP3
3c10: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 53 68 6f (pOp, pMem->zSho
3c20: 72 74 2c 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d rt, sizeof(pMem-
3c30: 3e 7a 53 68 6f 72 74 29 29 3b 0a 20 20 20 20 70 >zShort));. p
3c40: 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 Mem->type = SQLI
3c50: 54 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 TE_TEXT;. pMe
3c60: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f m->enc = SQLITE_
3c70: 55 54 46 38 3b 0a 0a 20 20 20 20 70 2d 3e 6e 52 UTF8;.. p->nR
3c80: 65 73 43 6f 6c 75 6d 6e 20 3d 20 35 3b 0a 20 20 esColumn = 5;.
3c90: 20 20 70 2d 3e 70 54 6f 73 20 3d 20 70 4d 65 6d p->pTos = pMem
3ca0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 ;. p->rc = SQ
3cb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 2d 3e LITE_OK;. p->
3cc0: 72 65 73 4f 6e 53 74 61 63 6b 20 3d 20 31 3b 0a resOnStack = 1;.
3cd0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
3ce0: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 ROW;. }. retur
3cf0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 n rc;.}../*.** P
3d00: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c repare a virtual
3d10: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 machine for exe
3d20: 63 75 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e cution. This in
3d30: 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 volves things su
3d40: 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 ch.** as allocat
3d50: 69 6e 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 ing stack space
3d60: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 and initializing
3d70: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 the program cou
3d80: 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 nter..** After t
3d90: 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 he VDBE has be p
3da0: 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 repped, it can b
3db0: 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e e executed by on
3dc0: 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c e or more.** cal
3dd0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 ls to sqlite3Vdb
3de0: 65 45 78 65 63 28 29 2e 20 20 0a 2a 2f 0a 76 6f eExec(). .*/.vo
3df0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 id sqlite3VdbeMa
3e00: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 keReady(. Vdbe
3e10: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 *p,
3e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
3e30: 20 56 44 42 45 20 2a 2f 0a 20 20 69 6e 74 20 6e VDBE */. int n
3e40: 56 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 Var,
3e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
3e60: 62 65 72 20 6f 66 20 27 3f 27 20 73 65 65 20 69 ber of '?' see i
3e70: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d n the SQL statem
3e80: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 ent */. int isE
3e90: 78 70 6c 61 69 6e 20 20 20 20 20 20 20 20 20 20 xplain
3ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
3eb0: 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 6b if the EXPLAIN k
3ec0: 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 65 eywords is prese
3ed0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e nt */.){. int n
3ee0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d ;.. assert( p!=
3ef0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
3f00: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
3f10: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f GIC_INIT );.. /
3f20: 2a 20 41 64 64 20 61 20 48 41 4c 54 20 69 6e 73 * Add a HALT ins
3f30: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 truction to the
3f40: 76 65 72 79 20 65 6e 64 20 6f 66 20 74 68 65 20 very end of the
3f50: 70 72 6f 67 72 61 6d 2e 0a 20 20 2a 2f 0a 20 20 program.. */.
3f60: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 7c 7c if( p->nOp==0 ||
3f70: 20 28 70 2d 3e 61 4f 70 20 26 26 20 70 2d 3e 61 (p->aOp && p->a
3f80: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 Op[p->nOp-1].opc
3f90: 6f 64 65 21 3d 4f 50 5f 48 61 6c 74 29 20 29 7b ode!=OP_Halt) ){
3fa0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
3fb0: 41 64 64 4f 70 28 70 2c 20 4f 50 5f 48 61 6c 74 AddOp(p, OP_Halt
3fc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 , 0, 0);. }..
3fd0: 2f 2a 20 4e 6f 20 69 6e 73 74 72 75 63 74 69 6f /* No instructio
3fe0: 6e 20 65 76 65 72 20 70 75 73 68 65 73 20 6d 6f n ever pushes mo
3ff0: 72 65 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 re than a single
4000: 20 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 20 74 68 element onto th
4010: 65 0a 20 20 2a 2a 20 73 74 61 63 6b 2e 20 20 41 e. ** stack. A
4020: 6e 64 20 74 68 65 20 73 74 61 63 6b 20 6e 65 76 nd the stack nev
4030: 65 72 20 67 72 6f 77 73 20 6f 6e 20 73 75 63 63 er grows on succ
4040: 65 73 73 69 76 65 20 65 78 65 63 75 74 69 6f 6e essive execution
4050: 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 73 61 s of the. ** sa
4060: 6d 65 20 6c 6f 6f 70 2e 20 20 53 6f 20 74 68 65 me loop. So the
4070: 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 total number of
4080: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 69 73 instructions is
4090: 20 61 6e 20 75 70 70 65 72 20 62 6f 75 6e 64 0a an upper bound.
40a0: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6d 61 78 69 ** on the maxi
40b0: 6d 75 6d 20 73 74 61 63 6b 20 64 65 70 74 68 20 mum stack depth
40c0: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 required.. **.
40d0: 20 2a 2a 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 61 ** Allocation a
40e0: 6c 6c 20 74 68 65 20 73 74 61 63 6b 20 73 70 61 ll the stack spa
40f0: 63 65 20 77 65 20 77 69 6c 6c 20 65 76 65 72 20 ce we will ever
4100: 6e 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 need.. */. if(
4110: 20 70 2d 3e 61 53 74 61 63 6b 3d 3d 30 20 29 7b p->aStack==0 ){
4120: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 6e . p->nVar = n
4130: 56 61 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 Var;. assert(
4140: 20 6e 56 61 72 3e 3d 30 20 29 3b 0a 20 20 20 20 nVar>=0 );.
4150: 6e 20 3d 20 69 73 45 78 70 6c 61 69 6e 20 3f 20 n = isExplain ?
4160: 31 30 20 3a 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 10 : p->nOp;.
4170: 20 70 2d 3e 61 53 74 61 63 6b 20 3d 20 73 71 6c p->aStack = sql
4180: 69 74 65 4d 61 6c 6c 6f 63 28 0a 20 20 20 20 20 iteMalloc(.
4190: 20 6e 2a 28 73 69 7a 65 6f 66 28 70 2d 3e 61 53 n*(sizeof(p->aS
41a0: 74 61 63 6b 5b 30 5d 29 2b 73 69 7a 65 6f 66 28 tack[0])+sizeof(
41b0: 4d 65 6d 2a 29 29 20 20 20 20 20 20 20 20 20 20 Mem*))
41c0: 2f 2a 20 61 53 74 61 63 6b 2c 20 61 70 41 72 67 /* aStack, apArg
41d0: 20 2a 2f 0a 20 20 20 20 20 20 2b 20 70 2d 3e 6e */. + p->n
41e0: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 20 Var*sizeof(Mem)
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4200: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70 56 61 /* apVa
4210: 72 20 2a 2f 0a 20 20 20 20 29 3b 0a 20 20 20 20 r */. );.
4220: 70 2d 3e 61 70 41 72 67 20 3d 20 28 4d 65 6d 20 p->apArg = (Mem
4230: 2a 2a 29 26 70 2d 3e 61 53 74 61 63 6b 5b 6e 5d **)&p->aStack[n]
4240: 3b 0a 20 20 20 20 70 2d 3e 61 70 56 61 72 20 3d ;. p->apVar =
4250: 20 28 4d 65 6d 20 2a 29 26 70 2d 3e 61 70 41 72 (Mem *)&p->apAr
4260: 67 5b 6e 5d 3b 0a 20 20 20 20 66 6f 72 28 6e 3d g[n];. for(n=
4270: 30 3b 20 6e 3c 70 2d 3e 6e 56 61 72 3b 20 6e 2b 0; n<p->nVar; n+
4280: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 70 56 +){. p->apV
4290: 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 ar[n].flags = ME
42a0: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 M_Null;. }.
42b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }..#ifdef SQLITE
42c0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 28 70 2d _DEBUG. if( (p-
42d0: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c >db->flags & SQL
42e0: 49 54 45 5f 56 64 62 65 4c 69 73 74 69 6e 67 29 ITE_VdbeListing)
42f0: 21 3d 30 0a 20 20 20 20 7c 7c 20 73 71 6c 69 74 !=0. || sqlit
4300: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 22 e3OsFileExists("
4310: 76 64 62 65 5f 65 78 70 6c 61 69 6e 22 29 0a 20 vdbe_explain").
4320: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
4330: 20 20 20 70 72 69 6e 74 66 28 22 56 44 42 45 20 printf("VDBE
4340: 50 72 6f 67 72 61 6d 20 4c 69 73 74 69 6e 67 3a Program Listing:
4350: 5c 6e 22 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d \n");. for(i=
4360: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 0; i<p->nOp; i++
4370: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
4380: 56 64 62 65 50 72 69 6e 74 4f 70 28 73 74 64 6f VdbePrintOp(stdo
4390: 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 ut, i, &p->aOp[i
43a0: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 ]);. }. }.
43b0: 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c if( sqlite3OsFil
43c0: 65 45 78 69 73 74 73 28 22 76 64 62 65 5f 74 72 eExists("vdbe_tr
43d0: 61 63 65 22 29 20 29 7b 0a 20 20 20 20 70 72 69 ace") ){. pri
43e0: 6e 74 66 28 22 56 44 42 45 20 45 78 65 63 75 74 ntf("VDBE Execut
43f0: 69 6f 6e 20 54 72 61 63 65 3a 5c 6e 22 29 3b 0a ion Trace:\n");.
4400: 20 20 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 73 p->trace = s
4410: 74 64 6f 75 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 tdout;. }.#endi
4420: 66 0a 20 20 70 2d 3e 70 54 6f 73 20 3d 20 26 70 f. p->pTos = &p
4430: 2d 3e 61 53 74 61 63 6b 5b 2d 31 5d 3b 0a 20 20 ->aStack[-1];.
4440: 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d p->pc = -1;. p-
4450: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b >rc = SQLITE_OK;
4460: 0a 20 20 70 2d 3e 75 6e 69 71 75 65 43 6e 74 20 . p->uniqueCnt
4470: 3d 20 30 3b 0a 20 20 70 2d 3e 72 65 74 75 72 6e = 0;. p->return
4480: 44 65 70 74 68 20 3d 20 30 3b 0a 20 20 70 2d 3e Depth = 0;. p->
4490: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 errorAction = OE
44a0: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 70 6f 70 _Abort;. p->pop
44b0: 53 74 61 63 6b 20 3d 20 20 30 3b 0a 20 20 70 2d Stack = 0;. p-
44c0: 3e 65 78 70 6c 61 69 6e 20 7c 3d 20 69 73 45 78 >explain |= isEx
44d0: 70 6c 61 69 6e 3b 0a 20 20 70 2d 3e 6d 61 67 69 plain;. p->magi
44e0: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 c = VDBE_MAGIC_R
44f0: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 UN;. p->nChange
4500: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 = 0;.#ifdef VDB
4510: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 E_PROFILE. {.
4520: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 int i;. for
4530: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 (i=0; i<p->nOp;
4540: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 i++){. p->a
4550: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 Op[i].cnt = 0;.
4560: 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 p->aOp[i].c
4570: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 20 20 7d ycles = 0;. }
4580: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a . }.#endif.}...
4590: 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 79 /*.** Remove any
45a0: 20 65 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 72 elements that r
45b0: 65 6d 61 69 6e 20 6f 6e 20 74 68 65 20 73 6f 72 emain on the sor
45c0: 74 65 72 20 66 6f 72 20 74 68 65 20 56 44 42 45 ter for the VDBE
45d0: 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 given..*/.void
45e0: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 sqlite3VdbeSorte
45f0: 72 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b rReset(Vdbe *p){
4600: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 53 6f . while( p->pSo
4610: 72 74 20 29 7b 0a 20 20 20 20 53 6f 72 74 65 72 rt ){. Sorter
4620: 20 2a 70 53 6f 72 74 65 72 20 3d 20 70 2d 3e 70 *pSorter = p->p
4630: 53 6f 72 74 3b 0a 20 20 20 20 70 2d 3e 70 53 6f Sort;. p->pSo
4640: 72 74 20 3d 20 70 53 6f 72 74 65 72 2d 3e 70 4e rt = pSorter->pN
4650: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 ext;. sqliteF
4660: 72 65 65 28 70 53 6f 72 74 65 72 2d 3e 7a 4b 65 ree(pSorter->zKe
4670: 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 y);. sqlite3V
4680: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 dbeMemRelease(&p
4690: 53 6f 72 74 65 72 2d 3e 64 61 74 61 29 3b 0a 20 Sorter->data);.
46a0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 53 sqliteFree(pS
46b0: 6f 72 74 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f orter);. }.}../
46c0: 2a 0a 2a 2a 20 52 65 73 65 74 20 61 6e 20 41 67 *.** Reset an Ag
46d0: 67 20 73 74 72 75 63 74 75 72 65 2e 20 20 44 65 g structure. De
46e0: 6c 65 74 65 20 61 6c 6c 20 69 74 73 20 63 6f 6e lete all its con
46f0: 74 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 tents..**.** For
4700: 20 69 6e 73 74 61 6c 6c 61 62 6c 65 20 61 67 67 installable agg
4710: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 regate functions
4720: 2c 20 69 66 20 74 68 65 20 73 74 65 70 20 66 75 , if the step fu
4730: 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a nction has been.
4740: 2a 2a 20 63 61 6c 6c 65 64 2c 20 6d 61 6b 65 20 ** called, make
4750: 73 75 72 65 20 74 68 65 20 66 69 6e 61 6c 69 7a sure the finaliz
4760: 65 72 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 er function has
4770: 61 6c 73 6f 20 62 65 65 6e 20 63 61 6c 6c 65 64 also been called
4780: 2e 20 20 54 68 65 0a 2a 2a 20 66 69 6e 61 6c 69 . The.** finali
4790: 7a 65 72 20 6d 69 67 68 74 20 6e 65 65 64 20 74 zer might need t
47a0: 6f 20 66 72 65 65 20 6d 65 6d 6f 72 79 20 74 68 o free memory th
47b0: 61 74 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64 at was allocated
47c0: 20 61 73 20 70 61 72 74 20 6f 66 20 69 74 73 0a as part of its.
47d0: 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 6e 74 65 ** private conte
47e0: 78 74 2e 20 20 49 66 20 74 68 65 20 66 69 6e 61 xt. If the fina
47f0: 6c 69 7a 65 72 20 68 61 73 20 6e 6f 74 20 62 65 lizer has not be
4800: 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2c 20 63 en called yet, c
4810: 61 6c 6c 20 69 74 0a 2a 2a 20 6e 6f 77 2e 0a 2a all it.** now..*
4820: 2a 0a 2a 2a 20 49 66 20 64 62 20 69 73 20 4e 55 *.** If db is NU
4830: 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 LL, then this is
4840: 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 being called fr
4850: 6f 6d 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 om sqliteVdbeRes
4860: 65 74 28 29 2e 20 49 6e 0a 2a 2a 20 74 68 69 73 et(). In.** this
4870: 20 63 61 73 65 20 63 6c 65 61 6e 20 75 70 20 61 case clean up a
4880: 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f ll references to
4890: 20 74 68 65 20 74 65 6d 70 2d 74 61 62 6c 65 20 the temp-table
48a0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 61 67 67 72 used for.** aggr
48b0: 65 67 61 74 65 73 20 28 69 66 20 69 74 20 77 61 egates (if it wa
48c0: 73 20 65 76 65 72 20 6f 70 65 6e 65 64 29 2e 0a s ever opened)..
48d0: 2a 2a 0a 2a 2a 20 49 66 20 64 62 20 69 73 20 6e **.** If db is n
48e0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 ot NULL, then th
48f0: 69 73 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c is is being call
4900: 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 6e 20 ed from with an
4910: 4f 50 5f 41 67 67 52 65 73 65 74 0a 2a 2a 20 6f OP_AggReset.** o
4920: 70 63 6f 64 65 2e 20 4f 70 65 6e 20 74 68 65 20 pcode. Open the
4930: 74 65 6d 70 2d 74 61 62 6c 65 2c 20 69 66 20 69 temp-table, if i
4940: 74 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 t has not alread
4950: 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 61 6e y been opened an
4960: 64 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 d.** delete the
4970: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
4980: 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20 61 table used for a
4990: 67 67 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 ggregate informa
49a0: 74 69 6f 6e 2c 20 72 65 61 64 79 0a 2a 2a 20 66 tion, ready.** f
49b0: 6f 72 20 74 68 65 20 6e 65 78 74 20 72 6f 75 6e or the next roun
49c0: 64 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 70 d of aggregate p
49d0: 72 6f 63 65 73 73 69 6e 67 2e 0a 2a 2f 0a 69 6e rocessing..*/.in
49e0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 t sqlite3VdbeAgg
49f0: 52 65 73 65 74 28 73 71 6c 69 74 65 20 2a 64 62 Reset(sqlite *db
4a00: 2c 20 41 67 67 20 2a 70 41 67 67 2c 20 4b 65 79 , Agg *pAgg, Key
4a10: 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 29 7b Info *pKeyInfo){
4a20: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 . int i;. int
4a30: 72 63 20 3d 20 30 3b 0a 20 20 42 74 43 75 72 73 rc = 0;. BtCurs
4a40: 6f 72 20 2a 70 43 73 72 20 3d 20 70 41 67 67 2d or *pCsr = pAgg-
4a50: 3e 70 43 73 72 3b 0a 0a 20 20 61 73 73 65 72 74 >pCsr;.. assert
4a60: 28 20 28 70 43 73 72 20 26 26 20 70 41 67 67 2d ( (pCsr && pAgg-
4a70: 3e 6e 54 61 62 3e 30 29 20 7c 7c 20 28 21 70 43 >nTab>0) || (!pC
4a80: 73 72 20 26 26 20 70 41 67 67 2d 3e 6e 54 61 62 sr && pAgg->nTab
4a90: 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 7c 7c ==0). ||
4aa0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f sqlite3_malloc_
4ab0: 66 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 failed );.. /*
4ac0: 49 66 20 70 43 73 72 20 69 73 20 6e 6f 74 20 4e If pCsr is not N
4ad0: 55 4c 4c 2c 20 74 68 65 6e 20 74 68 65 20 74 61 ULL, then the ta
4ae0: 62 6c 65 20 75 73 65 64 20 66 6f 72 20 61 67 67 ble used for agg
4af0: 72 65 67 61 74 65 20 69 6e 66 6f 72 6d 61 74 69 regate informati
4b00: 6f 6e 0a 20 20 2a 2a 20 69 73 20 6f 70 65 6e 2e on. ** is open.
4b10: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 69 74 Loop through it
4b20: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 41 67 and free the Ag
4b30: 67 45 6c 65 6d 2a 20 73 74 72 75 63 74 75 72 65 gElem* structure
4b40: 20 70 6f 69 6e 74 65 64 20 61 74 0a 20 20 2a 2a pointed at. **
4b50: 20 62 79 20 65 61 63 68 20 65 6e 74 72 79 2e 20 by each entry.
4b60: 49 66 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 If the finalizer
4b70: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 61 has not been ca
4b80: 6c 6c 65 64 20 66 6f 72 20 61 6e 20 41 67 67 45 lled for an AggE
4b90: 6c 65 6d 2c 0a 20 20 2a 2a 20 64 6f 20 74 68 61 lem,. ** do tha
4ba0: 74 20 74 6f 6f 2e 20 46 69 6e 61 6c 6c 79 2c 20 t too. Finally,
4bb0: 63 6c 65 61 72 20 74 68 65 20 62 74 72 65 65 20 clear the btree
4bc0: 74 61 62 6c 65 20 69 74 73 65 6c 66 2e 0a 20 20 table itself..
4bd0: 2a 2f 0a 20 20 69 66 28 20 70 43 73 72 20 29 7b */. if( pCsr ){
4be0: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 . int res;.
4bf0: 20 20 61 73 73 65 72 74 28 20 70 41 67 67 2d 3e assert( pAgg->
4c00: 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 61 73 pBtree );. as
4c10: 73 65 72 74 28 20 70 41 67 67 2d 3e 6e 54 61 62 sert( pAgg->nTab
4c20: 3e 30 20 29 3b 0a 0a 20 20 20 20 72 63 3d 73 71 >0 );.. rc=sq
4c30: 6c 69 74 65 33 42 74 72 65 65 46 69 72 73 74 28 lite3BtreeFirst(
4c40: 70 43 73 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 pCsr, &res);.
4c50: 20 77 68 69 6c 65 28 20 72 65 73 3d 3d 30 20 26 while( res==0 &
4c60: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 & rc==SQLITE_OK
4c70: 29 7b 0a 20 20 20 20 20 20 41 67 67 45 6c 65 6d ){. AggElem
4c80: 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20 20 20 72 *pElem;. r
4c90: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 c = sqlite3Btree
4ca0: 44 61 74 61 28 70 43 73 72 2c 20 30 2c 20 73 69 Data(pCsr, 0, si
4cb0: 7a 65 6f 66 28 41 67 67 45 6c 65 6d 2a 29 2c 20 zeof(AggElem*),
4cc0: 28 63 68 61 72 20 2a 29 26 70 45 6c 65 6d 29 3b (char *)&pElem);
4cd0: 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 21 3d . if( res!=
4ce0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
4cf0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
4d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 }. as
4d10: 73 65 72 74 28 20 70 41 67 67 2d 3e 61 70 46 75 sert( pAgg->apFu
4d20: 6e 63 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 nc!=0 );. f
4d30: 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 67 2d 3e or(i=0; i<pAgg->
4d40: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 nMem; i++){.
4d50: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 Mem *pMem =
4d60: 26 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 3b &pElem->aMem[i];
4d70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 67 . if( pAg
4d80: 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 20 26 26 20 g->apFunc[i] &&
4d90: 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d (pMem->flags & M
4da0: 45 4d 5f 41 67 67 43 74 78 29 21 3d 30 20 29 7b EM_AggCtx)!=0 ){
4db0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
4dc0: 65 33 5f 63 6f 6e 74 65 78 74 20 63 74 78 3b 0a e3_context ctx;.
4dd0: 20 20 20 20 20 20 20 20 20 20 63 74 78 2e 70 46 ctx.pF
4de0: 75 6e 63 20 3d 20 70 41 67 67 2d 3e 61 70 46 75 unc = pAgg->apFu
4df0: 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 nc[i];.
4e00: 20 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d ctx.s.flags = M
4e10: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 EM_Null;.
4e20: 20 20 20 63 74 78 2e 70 41 67 67 20 3d 20 70 4d ctx.pAgg = pM
4e30: 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 em->z;.
4e40: 20 63 74 78 2e 63 6e 74 20 3d 20 70 4d 65 6d 2d ctx.cnt = pMem-
4e50: 3e 69 3b 0a 20 20 20 20 20 20 20 20 20 20 63 74 >i;. ct
4e60: 78 2e 69 73 53 74 65 70 20 3d 20 30 3b 0a 20 20 x.isStep = 0;.
4e70: 20 20 20 20 20 20 20 20 63 74 78 2e 69 73 45 72 ctx.isEr
4e80: 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 ror = 0;.
4e90: 20 20 20 28 2a 70 41 67 67 2d 3e 61 70 46 75 6e (*pAgg->apFun
4ea0: 63 5b 69 5d 2d 3e 78 46 69 6e 61 6c 69 7a 65 29 c[i]->xFinalize)
4eb0: 28 26 63 74 78 29 3b 0a 20 20 20 20 20 20 20 20 (&ctx);.
4ec0: 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 63 74 78 2e pMem->z = ctx.
4ed0: 70 41 67 67 3b 0a 20 20 20 20 20 20 20 20 20 20 pAgg;.
4ee0: 69 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 26 if( pMem->z!=0 &
4ef0: 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 65 6d 2d & pMem->z!=pMem-
4f00: 3e 7a 53 68 6f 72 74 20 29 7b 0a 20 20 20 20 20 >zShort ){.
4f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 sqliteFre
4f20: 65 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 e(pMem->z);.
4f30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
4f40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d sqlite3VdbeMem
4f50: 52 65 6c 65 61 73 65 28 26 63 74 78 2e 73 29 3b Release(&ctx.s);
4f60: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
4f70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
4f80: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
4f90: 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 7d pMem);. }
4fa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 . }. s
4fb0: 71 6c 69 74 65 46 72 65 65 28 70 45 6c 65 6d 29 qliteFree(pElem)
4fc0: 3b 0a 20 20 20 20 20 20 72 63 3d 73 71 6c 69 74 ;. rc=sqlit
4fd0: 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 73 72 e3BtreeNext(pCsr
4fe0: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 , &res);. }.
4ff0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
5000: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 E_OK ){. re
5010: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a turn rc;. }..
5020: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 sqlite3Btree
5030: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 73 72 CloseCursor(pCsr
5040: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 );. sqlite3Bt
5050: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 41 reeClearTable(pA
5060: 67 67 2d 3e 70 42 74 72 65 65 2c 20 70 41 67 67 gg->pBtree, pAgg
5070: 2d 3e 6e 54 61 62 29 3b 0a 20 20 7d 0a 0a 20 20 ->nTab);. }..
5080: 2f 2a 20 49 66 20 64 62 20 69 73 20 6e 6f 74 20 /* If db is not
5090: 4e 55 4c 4c 20 61 6e 64 20 77 65 20 68 61 76 65 NULL and we have
50a0: 20 6e 6f 74 20 79 65 74 20 61 6e 64 20 77 65 20 not yet and we
50b0: 68 61 76 65 20 6e 6f 74 20 79 65 74 20 6f 70 65 have not yet ope
50c0: 6e 65 64 0a 20 20 2a 2a 20 74 68 65 20 74 65 6d ned. ** the tem
50d0: 70 6f 72 61 72 79 20 62 74 72 65 65 20 74 68 65 porary btree the
50e0: 6e 20 64 6f 20 73 6f 20 61 6e 64 20 63 72 65 61 n do so and crea
50f0: 74 65 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 te the table to
5100: 73 74 6f 72 65 20 61 67 67 72 65 67 61 74 65 0a store aggregate.
5110: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ** information
5120: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 64 .. **. ** If d
5130: 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 b is NULL, then
5140: 63 6c 6f 73 65 20 74 68 65 20 74 65 6d 70 6f 72 close the tempor
5150: 61 72 79 20 62 74 72 65 65 20 69 66 20 69 74 20 ary btree if it
5160: 69 73 20 6f 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 is open.. */.
5170: 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 69 66 if( db ){. if
5180: 28 20 21 70 41 67 67 2d 3e 70 42 74 72 65 65 20 ( !pAgg->pBtree
5190: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 ){. assert(
51a0: 20 70 41 67 67 2d 3e 6e 54 61 62 3d 3d 30 20 29 pAgg->nTab==0 )
51b0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c ;. rc = sql
51c0: 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79 ite3BtreeFactory
51d0: 28 64 62 2c 20 22 3a 6d 65 6d 6f 72 79 3a 22 2c (db, ":memory:",
51e0: 20 30 2c 20 54 45 4d 50 5f 50 41 47 45 53 2c 20 0, TEMP_PAGES,
51f0: 26 70 41 67 67 2d 3e 70 42 74 72 65 65 29 3b 0a &pAgg->pBtree);.
5200: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
5210: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e LITE_OK ) return
5220: 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 rc;. sqlit
5230: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e e3BtreeBeginTran
5240: 73 28 70 41 67 67 2d 3e 70 42 74 72 65 65 2c 20 s(pAgg->pBtree,
5250: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 20 1, 0);. rc
5260: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 = sqlite3BtreeCr
5270: 65 61 74 65 54 61 62 6c 65 28 70 41 67 67 2d 3e eateTable(pAgg->
5280: 70 42 74 72 65 65 2c 20 26 70 41 67 67 2d 3e 6e pBtree, &pAgg->n
5290: 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 Tab, 0);. i
52a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
52b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 ) return rc;.
52c0: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 }. assert(
52d0: 70 41 67 67 2d 3e 6e 54 61 62 21 3d 30 20 29 3b pAgg->nTab!=0 );
52e0: 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 .. rc = sqlit
52f0: 65 33 42 74 72 65 65 43 75 72 73 6f 72 28 70 41 e3BtreeCursor(pA
5300: 67 67 2d 3e 70 42 74 72 65 65 2c 20 70 41 67 67 gg->pBtree, pAgg
5310: 2d 3e 6e 54 61 62 2c 20 31 2c 0a 20 20 20 20 20 ->nTab, 1,.
5320: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 sqlite3VdbeRe
5330: 63 6f 72 64 43 6f 6d 70 61 72 65 2c 20 70 4b 65 cordCompare, pKe
5340: 79 49 6e 66 6f 2c 20 26 70 41 67 67 2d 3e 70 43 yInfo, &pAgg->pC
5350: 73 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 sr);. if( rc!
5360: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 =SQLITE_OK ) ret
5370: 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b urn rc;. }else{
5380: 0a 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e 70 . if( pAgg->p
5390: 42 74 72 65 65 20 29 7b 0a 20 20 20 20 20 20 73 Btree ){. s
53a0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 qlite3BtreeClose
53b0: 28 70 41 67 67 2d 3e 70 42 74 72 65 65 29 3b 0a (pAgg->pBtree);.
53c0: 20 20 20 20 20 20 70 41 67 67 2d 3e 70 42 74 72 pAgg->pBtr
53d0: 65 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 41 ee = 0;. pA
53e0: 67 67 2d 3e 6e 54 61 62 20 3d 20 30 3b 0a 20 20 gg->nTab = 0;.
53f0: 20 20 7d 0a 20 20 20 20 70 41 67 67 2d 3e 70 43 }. pAgg->pC
5400: 73 72 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 sr = 0;. }.. i
5410: 66 28 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 f( pAgg->apFunc
5420: 29 7b 20 0a 20 20 20 20 73 71 6c 69 74 65 46 72 ){ . sqliteFr
5430: 65 65 28 70 41 67 67 2d 3e 61 70 46 75 6e 63 29 ee(pAgg->apFunc)
5440: 3b 0a 20 20 20 20 70 41 67 67 2d 3e 61 70 46 75 ;. pAgg->apFu
5450: 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 41 nc = 0;. }. pA
5460: 67 67 2d 3e 70 43 75 72 72 65 6e 74 20 3d 20 30 gg->pCurrent = 0
5470: 3b 0a 20 20 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d ;. pAgg->nMem =
5480: 20 30 3b 0a 20 20 70 41 67 67 2d 3e 73 65 61 72 0;. pAgg->sear
5490: 63 68 69 6e 67 20 3d 20 30 3b 0a 20 20 72 65 74 ching = 0;. ret
54a0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
54b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 .../*.** Delete
54c0: 61 20 6b 65 79 6c 69 73 74 0a 2a 2f 0a 76 6f 69 a keylist.*/.voi
54d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 d sqlite3VdbeKey
54e0: 6c 69 73 74 46 72 65 65 28 4b 65 79 6c 69 73 74 listFree(Keylist
54f0: 20 2a 70 29 7b 0a 20 20 77 68 69 6c 65 28 20 70 *p){. while( p
5500: 20 29 7b 0a 20 20 20 20 4b 65 79 6c 69 73 74 20 ){. Keylist
5510: 2a 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 *pNext = p->pNex
5520: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 t;. sqliteFre
5530: 65 28 70 29 3b 0a 20 20 20 20 70 20 3d 20 70 4e e(p);. p = pN
5540: 65 78 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a ext;. }.}../*.*
5550: 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 * Close a cursor
5560: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c and release all
5570: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 the resources t
5580: 68 61 74 20 63 75 72 73 6f 72 20 68 61 70 70 65 hat cursor happe
5590: 6e 73 0a 2a 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a ns.** to hold..*
55a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
55b0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 43 75 72 beFreeCursor(Cur
55c0: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 sor *pCx){. if(
55d0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 pCx==0 ){. r
55e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 eturn;. }. if(
55f0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29 7b pCx->pCursor ){
5600: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 . sqlite3Btre
5610: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 eCloseCursor(pCx
5620: 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d 0a ->pCursor);. }.
5630: 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 if( pCx->pBt )
5640: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 {. sqlite3Btr
5650: 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 eeClose(pCx->pBt
5660: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 );. }. sqliteF
5670: 72 65 65 28 70 43 78 2d 3e 70 44 61 74 61 29 3b ree(pCx->pData);
5680: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 43 . sqliteFree(pC
5690: 78 2d 3e 61 54 79 70 65 29 3b 0a 20 20 73 71 6c x->aType);. sql
56a0: 69 74 65 46 72 65 65 28 70 43 78 29 3b 0a 7d 0a iteFree(pCx);.}.
56b0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c ./*.** Close all
56c0: 20 63 75 72 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 cursors.*/.stat
56d0: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c ic void closeAll
56e0: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 Cursors(Vdbe *p)
56f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 {. int i;. for
5700: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 (i=0; i<p->nCurs
5710: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 or; i++){. sq
5720: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 lite3VdbeFreeCur
5730: 73 6f 72 28 70 2d 3e 61 70 43 73 72 5b 69 5d 29 sor(p->apCsr[i])
5740: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 ;. }. sqliteFr
5750: 65 65 28 70 2d 3e 61 70 43 73 72 29 3b 0a 20 20 ee(p->apCsr);.
5760: 70 2d 3e 61 70 43 73 72 20 3d 20 30 3b 0a 20 20 p->apCsr = 0;.
5770: 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 30 3b 0a p->nCursor = 0;.
5780: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 }../*.** Clean u
5790: 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 65 p the VM after e
57a0: 78 65 63 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 xecution..**.**
57b0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c This routine wil
57c0: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 l automatically
57d0: 63 6c 6f 73 65 20 61 6e 79 20 63 75 72 73 6f 72 close any cursor
57e0: 73 2c 20 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 s, lists, and/or
57f0: 0a 2a 2a 20 73 6f 72 74 65 72 73 20 74 68 61 74 .** sorters that
5800: 20 77 65 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e were left open.
5810: 20 20 49 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 It also delete
5820: 73 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 0a s the values of.
5830: 2a 2a 20 76 61 72 69 61 62 6c 65 73 20 69 6e 20 ** variables in
5840: 74 68 65 20 61 56 61 72 5b 5d 20 61 72 72 61 79 the aVar[] array
5850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
5860: 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 Cleanup(Vdbe *p
5870: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 ){. int i;. if
5880: 28 20 70 2d 3e 61 53 74 61 63 6b 20 29 7b 0a 20 ( p->aStack ){.
5890: 20 20 20 4d 65 6d 20 2a 70 54 6f 73 20 3d 20 70 Mem *pTos = p
58a0: 2d 3e 70 54 6f 73 3b 0a 20 20 20 20 77 68 69 6c ->pTos;. whil
58b0: 65 28 20 70 54 6f 73 3e 3d 70 2d 3e 61 53 74 61 e( pTos>=p->aSta
58c0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 ck ){. sqli
58d0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
58e0: 65 28 70 54 6f 73 29 3b 0a 20 20 20 20 20 20 70 e(pTos);. p
58f0: 54 6f 73 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 Tos--;. }.
5900: 20 70 2d 3e 70 54 6f 73 20 3d 20 70 54 6f 73 3b p->pTos = pTos;
5910: 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 . }. closeAllC
5920: 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 ursors(p);. if(
5930: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 p->aMem ){.
5940: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d for(i=0; i<p->nM
5950: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 em; i++){.
5960: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 sqlite3VdbeMemRe
5970: 6c 65 61 73 65 28 26 70 2d 3e 61 4d 65 6d 5b 69 lease(&p->aMem[i
5980: 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 ]);. }. }.
5990: 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4d sqliteFree(p->aM
59a0: 65 6d 29 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d em);. p->aMem =
59b0: 20 30 3b 0a 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 0;. p->nMem =
59c0: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 0;. if( p->pLis
59d0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 t ){. sqlite3
59e0: 56 64 62 65 4b 65 79 6c 69 73 74 46 72 65 65 28 VdbeKeylistFree(
59f0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 70 p->pList);. p
5a00: 2d 3e 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 7d ->pList = 0;. }
5a10: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f . sqlite3VdbeSo
5a20: 72 74 65 72 52 65 73 65 74 28 70 29 3b 0a 20 20 rterReset(p);.
5a30: 69 66 28 20 70 2d 3e 70 46 69 6c 65 20 29 7b 0a if( p->pFile ){.
5a40: 20 20 20 20 69 66 28 20 70 2d 3e 70 46 69 6c 65 if( p->pFile
5a50: 21 3d 73 74 64 69 6e 20 29 20 66 63 6c 6f 73 65 !=stdin ) fclose
5a60: 28 70 2d 3e 70 46 69 6c 65 29 3b 0a 20 20 20 20 (p->pFile);.
5a70: 70 2d 3e 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 p->pFile = 0;.
5a80: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 46 69 65 }. if( p->azFie
5a90: 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 ld ){. sqlite
5aa0: 46 72 65 65 28 70 2d 3e 61 7a 46 69 65 6c 64 29 Free(p->azField)
5ab0: 3b 0a 20 20 20 20 70 2d 3e 61 7a 46 69 65 6c 64 ;. p->azField
5ac0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e = 0;. }. p->n
5ad0: 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 69 66 28 Field = 0;. if(
5ae0: 20 70 2d 3e 7a 4c 69 6e 65 20 29 7b 0a 20 20 20 p->zLine ){.
5af0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 7a sqliteFree(p->z
5b00: 4c 69 6e 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 4c Line);. p->zL
5b10: 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 ine = 0;. }. p
5b20: 2d 3e 6e 4c 69 6e 65 41 6c 6c 6f 63 20 3d 20 30 ->nLineAlloc = 0
5b30: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 ;. sqlite3VdbeA
5b40: 67 67 52 65 73 65 74 28 30 2c 20 26 70 2d 3e 61 ggReset(0, &p->a
5b50: 67 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d gg, 0);. if( p-
5b60: 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 20 29 7b >keylistStack ){
5b70: 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 . int ii;.
5b80: 20 66 6f 72 28 69 69 20 3d 20 30 3b 20 69 69 20 for(ii = 0; ii
5b90: 3c 20 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 63 < p->keylistStac
5ba0: 6b 44 65 70 74 68 3b 20 69 69 2b 2b 29 7b 0a 20 kDepth; ii++){.
5bb0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 sqlite3Vdbe
5bc0: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 6b KeylistFree(p->k
5bd0: 65 79 6c 69 73 74 53 74 61 63 6b 5b 69 69 5d 29 eylistStack[ii])
5be0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 ;. }. sqli
5bf0: 74 65 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69 73 teFree(p->keylis
5c00: 74 53 74 61 63 6b 29 3b 0a 20 20 20 20 70 2d 3e tStack);. p->
5c10: 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70 74 keylistStackDept
5c20: 68 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6b 65 h = 0;. p->ke
5c30: 79 6c 69 73 74 53 74 61 63 6b 20 3d 20 30 3b 0a ylistStack = 0;.
5c40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 }. sqliteFree
5c50: 28 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b (p->contextStack
5c60: 29 3b 0a 20 20 70 2d 3e 63 6f 6e 74 65 78 74 53 );. p->contextS
5c70: 74 61 63 6b 20 3d 20 30 3b 0a 20 20 73 71 6c 69 tack = 0;. sqli
5c80: 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 teFree(p->zErrMs
5c90: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 g);. p->zErrMsg
5ca0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 = 0;.}../*.** S
5cb0: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 et the number of
5cc0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 result columns
5cd0: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 that will be ret
5ce0: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 urned by this SQ
5cf0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 L.** statement.
5d00: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 This is now set
5d10: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c at compile time,
5d20: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 rather than dur
5d30: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e ing.** execution
5d40: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f of the vdbe pro
5d50: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c gram so that sql
5d60: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e ite3_column_coun
5d70: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 t() can.** be ca
5d80: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 lled on an SQL s
5d90: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 tatement before
5da0: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a sqlite3_step()..
5db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
5dc0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 dbeSetNumCols(Vd
5dd0: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 be *p, int nResC
5de0: 6f 6c 75 6d 6e 29 7b 0a 20 20 61 73 73 65 72 74 olumn){. assert
5df0: 28 20 30 3d 3d 70 2d 3e 6e 52 65 73 43 6f 6c 75 ( 0==p->nResColu
5e00: 6d 6e 20 29 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 mn );. p->nResC
5e10: 6f 6c 75 6d 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 olumn = nResColu
5e20: 6d 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 mn;.}../*.** Set
5e30: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 the name of the
5e40: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 idx'th column t
5e50: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 o be returned by
5e60: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 the SQL stateme
5e70: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 nt..** zName mus
5e80: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 t be a pointer t
5e90: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 o a nul terminat
5ea0: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a ed string..**.**
5eb0: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 This call must
5ec0: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 be made after a
5ed0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 call to sqlite3V
5ee0: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e dbeSetNumCols().
5ef0: 0a 2a 2a 0a 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f .**.** If N==P3_
5f00: 53 54 41 54 49 43 20 20 69 74 20 6d 65 61 6e 73 STATIC it means
5f10: 20 74 68 61 74 20 7a 4e 61 6d 65 20 69 73 20 61 that zName is a
5f20: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 63 6f pointer to a co
5f30: 6e 73 74 61 6e 74 20 73 74 61 74 69 63 0a 2a 2a nstant static.**
5f40: 20 73 74 72 69 6e 67 20 61 6e 64 20 77 65 20 63 string and we c
5f50: 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 an just copy the
5f60: 20 70 6f 69 6e 74 65 72 2e 20 49 66 20 69 74 20 pointer. If it
5f70: 69 73 20 50 33 5f 44 59 4e 41 4d 49 43 2c 20 74 is P3_DYNAMIC, t
5f80: 68 65 6e 20 0a 2a 2a 20 74 68 65 20 73 74 72 69 hen .** the stri
5f90: 6e 67 20 69 73 20 66 72 65 65 64 20 75 73 69 6e ng is freed usin
5fa0: 67 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 77 g sqliteFree() w
5fb0: 68 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 hen the vdbe is
5fc0: 66 69 6e 69 73 68 65 64 20 77 69 74 68 0a 2a 2a finished with.**
5fd0: 20 69 74 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 it. Otherwise,
5fe0: 4e 20 62 79 74 65 73 20 6f 66 20 7a 4e 61 6d 65 N bytes of zName
5ff0: 20 61 72 65 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a are copied..*/.
6000: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53 int sqlite3VdbeS
6010: 65 74 43 6f 6c 4e 61 6d 65 28 56 64 62 65 20 2a etColName(Vdbe *
6020: 70 2c 20 69 6e 74 20 69 64 78 2c 20 63 6f 6e 73 p, int idx, cons
6030: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 t char *zName, i
6040: 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 72 63 3b nt N){. int rc;
6050: 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 . Mem *pColName
6060: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3c ;. assert( idx<
6070: 28 32 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e (2*p->nResColumn
6080: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 ) );.. /* If th
6090: 65 20 56 64 62 65 2e 61 43 6f 6c 4e 61 6d 65 20 e Vdbe.aColName
60a0: 61 72 72 61 79 20 68 61 73 20 6e 6f 74 20 79 65 array has not ye
60b0: 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 t been allocated
60c0: 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 , allocate. **
60d0: 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 it now.. */. i
60e0: 66 28 20 21 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 f( !p->aColName
60f0: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 ){. int i;.
6100: 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 p->aColName =
6110: 28 4d 65 6d 20 2a 29 73 71 6c 69 74 65 4d 61 6c (Mem *)sqliteMal
6120: 6c 6f 63 28 73 69 7a 65 6f 66 28 4d 65 6d 29 2a loc(sizeof(Mem)*
6130: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 32 29 p->nResColumn*2)
6140: 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 61 43 ;. if( !p->aC
6150: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 olName ){.
6160: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f return SQLITE_NO
6170: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 MEM;. }. f
6180: 6f 72 28 69 3d 30 3b 20 69 3c 28 32 2a 70 2d 3e or(i=0; i<(2*p->
6190: 6e 52 65 73 43 6f 6c 75 6d 6e 29 3b 20 69 2b 2b nResColumn); i++
61a0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 43 6f 6c ){. p->aCol
61b0: 4e 61 6d 65 5b 69 5d 2e 66 6c 61 67 73 20 3d 20 Name[i].flags =
61c0: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a MEM_Null;. }.
61d0: 20 20 7d 0a 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 }.. pColName
61e0: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b = &(p->aColName[
61f0: 69 64 78 5d 29 3b 0a 20 20 69 66 28 20 4e 3d 3d idx]);. if( N==
6200: 50 33 5f 44 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d P3_DYNAMIC || N=
6210: 3d 50 33 5f 53 54 41 54 49 43 20 29 7b 0a 20 20 =P3_STATIC ){.
6220: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 rc = sqlite3Vd
6230: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c beMemSetStr(pCol
6240: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c Name, zName, -1,
6250: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 SQLITE_UTF8, SQ
6260: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 LITE_STATIC);.
6270: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 }else{. rc =
6280: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
6290: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a tStr(pColName, z
62a0: 4e 61 6d 65 2c 20 4e 2c 20 53 51 4c 49 54 45 5f Name, N, SQLITE_
62b0: 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 52 41 4e UTF8,SQLITE_TRAN
62c0: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 69 66 SIENT);. }. if
62d0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
62e0: 26 26 20 4e 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 && N==P3_DYNAMIC
62f0: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 ){. pColName
6300: 2d 3e 66 6c 61 67 73 20 3d 20 28 70 43 6f 6c 4e ->flags = (pColN
6310: 61 6d 65 2d 3e 66 6c 61 67 73 26 28 7e 4d 45 4d ame->flags&(~MEM
6320: 5f 53 74 61 74 69 63 29 29 7c 4d 45 4d 5f 44 79 _Static))|MEM_Dy
6330: 6e 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d n;. pColName-
6340: 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 >xDel = 0;. }.
6350: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
6360: 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 *.** A read or w
6370: 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e rite transaction
6380: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 may or may not
6390: 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 be active on dat
63a0: 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 abase handle.**
63b0: 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 db. If a transac
63c0: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 tion is active,
63d0: 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 commit it. If th
63e0: 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 ere is a.** writ
63f0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 e-transaction sp
6400: 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e anning more than
6410: 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 one database fi
6420: 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 le, this routine
6430: 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f .** takes care o
6440: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 f the master jou
6450: 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a rnal trickery..*
6460: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 /.static int vdb
6470: 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 20 2a eCommit(sqlite *
6480: 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 db){. int i;.
6490: 69 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 int nTrans = 0;
64a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 /* Number of da
64b0: 74 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 tabases with an
64c0: 61 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 active write-tra
64d0: 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e nsaction */. in
64e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
64f0: 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d ;. int needXcom
6500: 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 mit = 0;.. for(
6510: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 i=0; i<db->nDb;
6520: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 i++){ . Btree
6530: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
6540: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 i].pBt;. if(
6550: 70 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 pBt && sqlite3Bt
6560: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 reeIsInTrans(pBt
6570: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 ) ){. needX
6580: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 commit = 1;.
6590: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 if( i!=1 ) nTr
65a0: 61 6e 73 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d ans++;. }. }
65b0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 .. /* If there
65c0: 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 are any write-tr
65d0: 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c ansactions at al
65e0: 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f l, invoke the co
65f0: 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 mmit hook */. i
6600: 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 f( needXcommit &
6610: 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c & db->xCommitCal
6620: 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 69 66 28 lback ){. if(
6630: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c db->xCommitCall
6640: 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 back(db->pCommit
6650: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 72 65 Arg) ){. re
6660: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 turn SQLITE_CONS
6670: 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 TRAINT;. }.
6680: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 }.. /* The simp
6690: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 le case - no mor
66a0: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 e than one datab
66b0: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f ase file (not co
66c0: 75 6e 74 69 6e 67 20 74 68 65 20 54 45 4d 50 0a unting the TEMP.
66d0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 29 20 68 ** database) h
66e0: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e as a transaction
66f0: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 active. There
6700: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 is no need for
6710: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d the. ** master-
6720: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 journal.. **.
6730: 2a 2a 20 69 66 20 64 62 2d 3e 6e 4d 61 73 74 65 ** if db->nMaste
6740: 72 3d 3d 30 2c 20 69 74 20 6d 65 61 6e 73 20 74 r==0, it means t
6750: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 he main database
6760: 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 is :memory:. I
6770: 6e 20 74 68 61 74 20 63 61 73 65 0a 20 20 2a 2a n that case. **
6780: 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f we do not suppo
6790: 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d rt atomic multi-
67a0: 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f file commits, so
67b0: 20 75 73 65 20 74 68 65 20 73 69 6d 70 6c 65 20 use the simple
67c0: 63 61 73 65 20 74 68 65 6e 0a 20 20 2a 2a 20 74 case then. ** t
67d0: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 oo.. */. if( d
67e0: 62 2d 3e 6e 4d 61 73 74 65 72 3c 3d 30 20 7c 7c b->nMaster<=0 ||
67f0: 20 6e 54 72 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 nTrans<=1 ){.
6800: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 for(i=0; rc==S
6810: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 QLITE_OK && i<db
6820: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 ->nDb; i++){ .
6830: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d Btree *pBt =
6840: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b db->aDb[i].pBt;
6850: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 . if( pBt )
6860: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 {. rc = s
6870: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 qlite3BtreeSync(
6880: 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d pBt, 0);. }
6890: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 . }.. /* D
68a0: 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c o the commit onl
68b0: 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 y if all databas
68c0: 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 es successfully
68d0: 73 79 6e 63 65 64 20 2a 2f 0a 20 20 20 20 69 66 synced */. if
68e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
68f0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 ){. for(i=0
6900: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b ; i<db->nDb; i++
6910: 29 7b 0a 20 20 20 20 20 20 20 20 42 74 72 65 65 ){. Btree
6920: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
6930: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 20 20 i].pBt;.
6940: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 if( pBt ){.
6950: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 sqlite3Btre
6960: 65 43 6f 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 eCommit(pBt);.
6970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
6980: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 }. }.. /*
6990: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 The complex case
69a0: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 - There is a mu
69b0: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 lti-file write-t
69c0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 ransaction activ
69d0: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 e.. ** This req
69e0: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a uires a master j
69f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 ournal file to e
6a00: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 nsure the transa
6a10: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f ction is. ** co
6a20: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 mmitted atomicly
6a30: 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 .. */. else{.
6a40: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 char *zMaster
6a50: 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d = 0; /* File-
6a60: 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 name for the mas
6a70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 ter journal */.
6a80: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a char const *z
6a90: 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 MainFile = sqlit
6aa0: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 e3BtreeGetFilena
6ab0: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 me(db->aDb[0].pB
6ac0: 74 29 3b 0a 20 20 20 20 4f 73 46 69 6c 65 20 6d t);. OsFile m
6ad0: 61 73 74 65 72 3b 0a 0a 20 20 20 20 2f 2a 20 53 aster;.. /* S
6ae0: 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a elect a master j
6af0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 ournal file name
6b00: 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 */. do {.
6b10: 20 20 20 75 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 u32 random;.
6b20: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 sqliteFree(
6b30: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 zMaster);.
6b40: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 sqlite3Randomnes
6b50: 73 28 73 69 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 s(sizeof(random)
6b60: 2c 20 26 72 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 , &random);.
6b70: 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 zMaster = sqli
6b80: 74 65 33 4d 50 72 69 6e 74 66 28 22 25 73 2d 6d te3MPrintf("%s-m
6b90: 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c j%08X", zMainFil
6ba0: 65 2c 20 72 61 6e 64 6f 6d 26 30 78 37 66 66 66 e, random&0x7fff
6bb0: 66 66 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 ffff);. if(
6bc0: 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 !zMaster ){.
6bd0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
6be0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 TE_NOMEM;.
6bf0: 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73 71 }. }while( sq
6c00: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 lite3OsFileExist
6c10: 73 28 7a 4d 61 73 74 65 72 29 20 29 3b 0a 0a 20 s(zMaster) );..
6c20: 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d /* Open the m
6c30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a aster journal. *
6c40: 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 74 /. assert( st
6c50: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3c 64 62 rlen(zMaster)<db
6c60: 2d 3e 6e 4d 61 73 74 65 72 20 29 3b 0a 20 20 20 ->nMaster );.
6c70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f rc = sqlite3OsO
6c80: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 4d 61 penExclusive(zMa
6c90: 73 74 65 72 2c 20 26 6d 61 73 74 65 72 2c 20 30 ster, &master, 0
6ca0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 );. if( rc!=S
6cb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
6cc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 sqliteFree(zMa
6cd0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 ster);. ret
6ce0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a urn rc;. }. .
6cf0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 /* Write the
6d00: 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 name of each da
6d10: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 tabase file in t
6d20: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 he transaction i
6d30: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 nto the new.
6d40: 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 ** master journa
6d50: 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 l file. If an er
6d60: 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 ror occurs at th
6d70: 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 is point close.
6d80: 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 ** and delete
6d90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 the master jour
6da0: 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 nal file. All th
6db0: 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 e individual jou
6dc0: 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a rnal files. *
6dd0: 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 * still have 'nu
6de0: 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 ll' as the maste
6df0: 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 r journal pointe
6e00: 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 r, so they will
6e10: 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b roll. ** back
6e20: 20 69 6e 64 65 70 65 6e 64 61 6e 74 6c 79 20 69 independantly i
6e30: 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 f a failure occu
6e40: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 rs.. */. f
6e50: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 or(i=0; i<db->nD
6e60: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 b; i++){ .
6e70: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d Btree *pBt = db-
6e80: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 >aDb[i].pBt;.
6e90: 20 20 20 69 66 28 20 69 3d 3d 31 20 29 20 63 6f if( i==1 ) co
6ea0: 6e 74 69 6e 75 65 3b 20 20 20 2f 2a 20 49 67 6e ntinue; /* Ign
6eb0: 6f 72 65 20 74 68 65 20 54 45 4d 50 20 64 61 74 ore the TEMP dat
6ec0: 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 69 abase */. i
6ed0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 f( pBt && sqlite
6ee0: 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 3BtreeIsInTrans(
6ef0: 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 pBt) ){.
6f00: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c char const *zFil
6f10: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 e = sqlite3Btree
6f20: 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 GetJournalname(p
6f30: 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 Bt);. if(
6f40: 20 7a 46 69 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 zFile[0]==0 ) c
6f50: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e ontinue; /* Ign
6f60: 6f 72 65 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 ore :memory: dat
6f70: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 abases */.
6f80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
6f90: 57 72 69 74 65 28 26 6d 61 73 74 65 72 2c 20 7a Write(&master, z
6fa0: 46 69 6c 65 2c 20 73 74 72 6c 65 6e 28 7a 46 69 File, strlen(zFi
6fb0: 6c 65 29 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 le)+1);.
6fc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
6fd0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 K ){. s
6fe0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d qlite3OsClose(&m
6ff0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 aster);.
7000: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 sqlite3OsDelet
7010: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 e(zMaster);.
7020: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 sqliteFree
7030: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 (zMaster);.
7040: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
7050: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
7060: 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a }. }... /*
7070: 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 Sync the master
7080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 42 journal file. B
7090: 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 69 73 efore doing this
70a0: 2c 20 6f 70 65 6e 20 74 68 65 20 64 69 72 65 63 , open the direc
70b0: 74 6f 72 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 tory. ** the
70c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
70d0: 69 6c 65 20 69 73 20 73 74 6f 72 65 20 69 6e 20 ile is store in
70e0: 73 6f 20 74 68 61 74 20 69 74 20 67 65 74 73 20 so that it gets
70f0: 73 79 6e 63 65 64 20 74 6f 6f 2e 0a 20 20 20 20 synced too..
7100: 2a 2f 0a 20 20 20 20 7a 4d 61 69 6e 46 69 6c 65 */. zMainFile
7110: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 = sqlite3BtreeG
7120: 65 74 44 69 72 6e 61 6d 65 28 64 62 2d 3e 61 44 etDirname(db->aD
7130: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 72 b[0].pBt);. r
7140: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 c = sqlite3OsOpe
7150: 6e 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e nDirectory(zMain
7160: 46 69 6c 65 2c 20 26 6d 61 73 74 65 72 29 3b 0a File, &master);.
7170: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
7180: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 TE_OK ){. s
7190: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d qlite3OsClose(&m
71a0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 aster);. sq
71b0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d lite3OsDelete(zM
71c0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 aster);. sq
71d0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 liteFree(zMaster
71e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
71f0: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 rc;. }. rc
7200: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 = sqlite3OsSync
7210: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 69 (&master);. i
7220: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
7230: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
7240: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 3OsClose(&master
7250: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 );. sqliteF
7260: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 ree(zMaster);.
7270: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 return rc;.
7280: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e }.. /* Syn
7290: 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c c all the db fil
72a0: 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 es involved in t
72b0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 he transaction.
72c0: 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 The same call.
72d0: 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 ** sets the ma
72e0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 ster journal poi
72f0: 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 nter in each ind
7300: 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e ividual journal.
7310: 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 If. ** an er
7320: 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c ror occurs here,
7330: 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 do not delete t
7340: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
7350: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 l file.. **.
7360: 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 ** If the err
7370: 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 or occurs during
7380: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 the first call
7390: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 to sqlite3BtreeS
73a0: 79 6e 63 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 ync(),. ** th
73b0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 en there is a ch
73c0: 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6d 61 ance that the ma
73d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c ster journal fil
73e0: 65 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a e will be. **
73f0: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 orphaned. But w
7400: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 e cannot delete
7410: 69 74 2c 20 69 6e 20 63 61 73 65 20 74 68 65 20 it, in case the
7420: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 master journal.
7430: 20 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 20 ** file name
7440: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f was written into
7450: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c the journal fil
7460: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 e before the fai
7470: 6c 75 72 65 0a 20 20 20 20 2a 2a 20 6f 63 63 75 lure. ** occu
7480: 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 red.. */.
7490: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e for(i=0; i<db->n
74a0: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 Db; i++){ .
74b0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 Btree *pBt = db
74c0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 ->aDb[i].pBt;.
74d0: 20 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 if( pBt && s
74e0: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 qlite3BtreeIsInT
74f0: 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 rans(pBt) ){.
7500: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
7510: 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c 20 3BtreeSync(pBt,
7520: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 zMaster);.
7530: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
7540: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 _OK ){.
7550: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 sqlite3OsClose(
7560: 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 &master);.
7570: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a sqliteFree(z
7580: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 Master);.
7590: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
75a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
75b0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
75c0: 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 3OsClose(&master
75d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 );.. /* Delet
75e0: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 e the master jou
75f0: 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 rnal file. This
7600: 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e commits the tran
7610: 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 saction. After.
7620: 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 ** doing this
7630: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 the directory i
7640: 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 s synced again b
7650: 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 efore any indivi
7660: 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e dual. ** tran
7670: 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 saction files ar
7680: 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a e deleted.. *
7690: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 /. rc = sqlit
76a0: 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 e3OsDelete(zMast
76b0: 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 er);. assert(
76c0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
76d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 ;. sqliteFree
76e0: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a (zMaster);. z
76f0: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 Master = 0;.
7700: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 rc = sqlite3OsSy
7710: 6e 63 44 69 72 65 63 74 6f 72 79 28 7a 4d 61 69 ncDirectory(zMai
7720: 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 nFile);. if(
7730: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
7740: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 69 . /* This i
7750: 73 20 6e 6f 74 20 67 6f 6f 64 2e 20 54 68 65 20 s not good. The
7760: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
7770: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 64 65 6c ile has been del
7780: 65 74 65 64 2c 20 62 75 74 0a 20 20 20 20 20 20 eted, but.
7790: 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 ** the directory
77a0: 20 73 79 6e 63 20 66 61 69 6c 65 64 2e 20 54 68 sync failed. Th
77b0: 65 72 65 20 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 ere is no comple
77c0: 74 65 6c 79 20 73 61 66 65 20 63 6f 75 72 73 65 tely safe course
77d0: 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 of. ** act
77e0: 69 6f 6e 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 ion from here. T
77f0: 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f he individual jo
7800: 75 72 6e 61 6c 73 20 63 6f 6e 74 61 69 6e 20 74 urnals contain t
7810: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 20 he name of the.
7820: 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a ** master j
7830: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 62 75 74 ournal file, but
7840: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 there is no way
7850: 20 6f 66 20 6b 6e 6f 77 69 6e 67 20 69 66 20 74 of knowing if t
7860: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 6d 61 73 hat. ** mas
7870: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 ter journal exis
7880: 74 73 20 6e 6f 77 20 6f 72 20 69 66 20 69 74 20 ts now or if it
7890: 77 69 6c 6c 20 65 78 69 73 74 20 61 66 74 65 72 will exist after
78a0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 0a 20 the operating.
78b0: 20 20 20 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 ** system c
78c0: 72 61 73 68 20 74 68 61 74 20 6d 61 79 20 66 6f rash that may fo
78d0: 6c 6c 6f 77 20 74 68 65 20 66 73 79 6e 63 28 29 llow the fsync()
78e0: 20 66 61 69 6c 75 72 65 2e 0a 20 20 20 20 20 20 failure..
78f0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 */. assert(
7900: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 0);. sqlite
7910: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 Free(zMaster);.
7920: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
7930: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c }.. /* Al
7940: 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 l files and dire
7950: 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 ctories have alr
7960: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 eady been synced
7970: 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 , so the followi
7980: 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 ng. ** calls
7990: 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 to sqlite3BtreeC
79a0: 6f 6d 6d 69 74 28 29 20 61 72 65 20 6f 6e 6c 79 ommit() are only
79b0: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 closing files a
79c0: 6e 64 20 64 65 6c 65 74 69 6e 67 0a 20 20 20 20 nd deleting.
79d0: 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 ** journals. If
79e0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 something goes w
79f0: 72 6f 6e 67 20 77 68 69 6c 65 20 74 68 69 73 20 rong while this
7a00: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 is happening we
7a10: 64 6f 6e 27 74 0a 20 20 20 20 2a 2a 20 72 65 61 don't. ** rea
7a20: 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e lly care. The in
7a30: 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 20 74 tegrity of the t
7a40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c ransaction is al
7a50: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 ready guaranteed
7a60: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 73 6f 6d ,. ** but som
7a70: 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a e stray 'cold' j
7a80: 6f 75 72 6e 61 6c 73 20 6d 61 79 20 62 65 20 6c ournals may be l
7a90: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 ying around. Ret
7aa0: 75 72 6e 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a urning an. **
7ab0: 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 error code won'
7ac0: 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a t help matters..
7ad0: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 */. for(i
7ae0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 =0; i<db->nDb; i
7af0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 ++){ . Btre
7b00: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 e *pBt = db->aDb
7b10: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 [i].pBt;. i
7b20: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 f( pBt ){.
7b30: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f sqlite3BtreeCo
7b40: 6d 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 mmit(pBt);.
7b50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 }. }. }..
7b60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a return rc;.}../*
7b70: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e .** This routin
7b80: 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 e checks that th
7b90: 65 20 73 71 6c 69 74 65 33 2e 61 63 74 69 76 65 e sqlite3.active
7ba0: 56 64 62 65 43 6e 74 20 63 6f 75 6e 74 20 76 61 VdbeCnt count va
7bb0: 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 riable.** matche
7bc0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
7bd0: 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 vdbe's in the li
7be0: 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 st sqlite3.pVdbe
7bf0: 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 that are.** cur
7c00: 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 rently active. A
7c10: 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c n assertion fail
7c20: 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 s if the two cou
7c30: 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 nts do not match
7c40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 ..**.** This is
7c50: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 a no-op if NDEBU
7c60: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f G is defined..*/
7c70: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
7c80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 static void chec
7c90: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 kActiveVdbeCnt(s
7ca0: 71 6c 69 74 65 20 2a 64 62 29 7b 0a 20 20 56 64 qlite *db){. Vd
7cb0: 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 be *p;. int cnt
7cc0: 20 3d 20 30 3b 0a 0a 20 20 70 20 3d 20 64 62 2d = 0;.. p = db-
7cd0: 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 >pVdbe;. while(
7ce0: 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70 p ){. if( (p
7cf0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
7d00: 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 GIC_RUN && p->pc
7d10: 3e 3d 30 29 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 >=0) || p->magic
7d20: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c ==VDBE_MAGIC_HAL
7d30: 54 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b T ){. cnt++
7d40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 ;. }. p =
7d50: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 p->pNext;. }..
7d60: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 assert( cnt==db
7d70: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 ->activeVdbeCnt
7d80: 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 );.}.#else.#defi
7d90: 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 ne checkActiveVd
7da0: 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a beCnt(x).#endif.
7db0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 ./*.** Clean up
7dc0: 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 a VDBE after exe
7dd0: 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f cution but do no
7de0: 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 t delete the VDB
7df0: 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 E just yet..** W
7e00: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d rite any error m
7e10: 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a essages into *pz
7e20: 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 ErrMsg. Return
7e30: 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e the result code.
7e40: 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 .**.** After thi
7e50: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e s routine is run
7e60: 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c , the VDBE shoul
7e70: 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 d be ready to be
7e80: 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 executed.** aga
7e90: 69 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 in..*/.int sqlit
7ea0: 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 e3VdbeReset(Vdbe
7eb0: 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 20 2a *p){. sqlite *
7ec0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e db = p->db;. in
7ed0: 74 20 69 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 t i;. int (*xFu
7ee0: 6e 63 29 28 42 74 72 65 65 20 2a 70 42 74 29 20 nc)(Btree *pBt)
7ef0: 3d 20 30 3b 20 20 2f 2a 20 46 75 6e 63 74 69 6f = 0; /* Functio
7f00: 6e 20 74 6f 20 63 61 6c 6c 20 6f 6e 20 65 61 63 n to call on eac
7f10: 68 20 62 74 72 65 65 20 62 61 63 6b 65 6e 64 20 h btree backend
7f20: 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 */.. if( p->mag
7f30: 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 ic!=VDBE_MAGIC_R
7f40: 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 21 3d UN && p->magic!=
7f50: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 VDBE_MAGIC_HALT
7f60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 ){. sqlite3Er
7f70: 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 ror(p->db, SQLIT
7f80: 45 5f 4d 49 53 55 53 45 2c 20 30 20 2c 30 29 3b E_MISUSE, 0 ,0);
7f90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
7fa0: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 TE_MISUSE;. }.
7fb0: 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 if( p->zErrMsg
7fc0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 ){. sqlite3Er
7fd0: 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 ror(p->db, p->rc
7fe0: 2c 20 22 25 73 22 2c 20 70 2d 3e 7a 45 72 72 4d , "%s", p->zErrM
7ff0: 73 67 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 sg, 0);. sqli
8000: 74 65 46 72 65 65 28 70 2d 3e 7a 45 72 72 4d 73 teFree(p->zErrMs
8010: 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d g);. p->zErrM
8020: 73 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 sg = 0;. }else
8030: 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 if( p->rc ){.
8040: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d sqlite3Error(p-
8050: 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a >db, p->rc, 0);.
8060: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c }else{. sql
8070: 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c ite3Error(p->db,
8080: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a SQLITE_OK, 0);.
8090: 20 20 7d 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 }. Cleanup(p)
80a0: 3b 0a 0a 20 20 2f 2a 20 57 68 61 74 20 69 73 20 ;.. /* What is
80b0: 64 6f 6e 65 20 6e 6f 77 20 64 65 70 65 6e 64 73 done now depends
80c0: 20 6f 6e 20 74 68 65 20 65 78 69 74 20 73 74 61 on the exit sta
80d0: 74 75 73 20 6f 66 20 74 68 65 20 76 64 62 65 2c tus of the vdbe,
80e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 the value of.
80f0: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 2e 61 75 ** the sqlite.au
8100: 74 6f 43 6f 6d 6d 69 74 20 66 6c 61 67 20 61 6e toCommit flag an
8110: 64 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 d whether or not
8120: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f there are any o
8130: 74 68 65 72 0a 20 20 2a 2a 20 71 75 65 72 69 65 ther. ** querie
8140: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 41 s in progress. A
8150: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 transaction or
8160: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 statement transa
8170: 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 ction may need.
8180: 20 2a 2a 20 74 6f 20 62 65 20 63 6f 6d 6d 69 74 ** to be commit
8190: 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 ted or rolled ba
81a0: 63 6b 20 6f 6e 20 65 61 63 68 20 6f 70 65 6e 20 ck on each open
81b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 database file..
81c0: 20 2a 2f 0a 20 20 63 68 65 63 6b 41 63 74 69 76 */. checkActiv
81d0: 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 eVdbeCnt(db);.
81e0: 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d if( db->autoComm
81f0: 69 74 20 26 26 20 64 62 2d 3e 61 63 74 69 76 65 it && db->active
8200: 56 64 62 65 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 VdbeCnt==1 ){.
8210: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c if( p->rc==SQL
8220: 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 ITE_OK || p->err
8230: 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 orAction==OE_Fai
8240: 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 l ){. /* Th
8250: 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c e auto-commit fl
8260: 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 72 ag is true, ther
8270: 65 20 61 72 65 20 6e 6f 20 6f 74 68 65 72 20 61 e are no other a
8280: 63 74 69 76 65 20 71 75 65 72 69 65 73 0a 20 20 ctive queries.
8290: 20 20 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 69 ** using thi
82a0: 73 20 68 61 6e 64 6c 65 20 61 6e 64 20 74 68 65 s handle and the
82b0: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 vdbe program wa
82c0: 73 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 s successful or
82d0: 68 69 74 20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 hit an. **
82e0: 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 'OR FAIL' constr
82f0: 61 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 aint. This means
8300: 20 61 20 63 6f 6d 6d 69 74 20 69 73 20 72 65 71 a commit is req
8310: 75 69 72 65 64 2c 20 77 68 69 63 68 20 69 73 0a uired, which is.
8320: 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 64 ** handled
8330: 20 61 20 6c 69 74 74 6c 65 20 64 69 66 66 65 72 a little differ
8340: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f ently from the o
8350: 74 68 65 72 20 6f 70 74 69 6f 6e 73 2e 0a 20 20 ther options..
8360: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e */. p->
8370: 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 rc = vdbeCommit(
8380: 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 db);. if( p
8390: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ->rc!=SQLITE_OK
83a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
83b0: 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 70 e3Error(p->db, p
83c0: 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 ->rc, 0);.
83d0: 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c if( p->rc==SQL
83e0: 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 61 ITE_BUSY && p->a
83f0: 75 74 6f 43 6f 6d 6d 69 74 4f 6e 20 29 7b 0a 20 utoCommitOn ){.
8400: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 /* If w
8410: 65 20 6a 75 73 74 20 6e 6f 77 20 68 61 76 65 20 e just now have
8420: 74 75 72 6e 65 64 20 61 75 74 6f 63 6f 6d 6d 69 turned autocommi
8430: 74 20 6f 6e 20 28 6d 65 61 6e 69 6e 67 20 77 65 t on (meaning we
8440: 20 6a 75 73 74 20 68 61 76 65 0a 20 20 20 20 20 just have.
8450: 20 20 20 20 20 2a 2a 20 66 69 6e 69 73 68 65 64 ** finished
8460: 20 65 78 65 63 75 74 69 6e 67 20 61 20 43 4f 4d executing a COM
8470: 4d 49 54 20 63 6f 6d 6d 61 6e 64 29 20 62 75 74 MIT command) but
8480: 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c the commit fail
8490: 73 20 64 75 65 0a 20 20 20 20 20 20 20 20 20 20 s due.
84a0: 2a 2a 20 74 6f 20 6c 6f 63 6b 20 63 6f 6e 74 65 ** to lock conte
84b0: 6e 74 69 6f 6e 2c 20 61 75 74 6f 63 6f 6d 6d 69 ntion, autocommi
84c0: 74 20 62 61 63 6b 20 6f 66 66 2e 20 20 54 68 69 t back off. Thi
84d0: 73 20 67 69 76 65 73 20 74 68 65 20 75 73 65 72 s gives the user
84e0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 . ** th
84f0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f e opportunity to
8500: 20 74 72 79 20 61 67 61 69 6e 20 61 66 74 65 72 try again after
8510: 20 74 68 65 20 6c 6f 63 6b 20 74 68 61 74 20 77 the lock that w
8520: 61 73 20 70 72 65 76 65 6e 74 69 6e 67 0a 20 20 as preventing.
8530: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 ** the c
8540: 6f 6d 6d 69 74 20 68 61 73 20 63 6c 65 61 72 65 ommit has cleare
8550: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 d. */.
8560: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d db->autoCommit =
8570: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 0;. }els
8580: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 e{. /*
8590: 49 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6a If the command j
85a0: 75 73 74 20 65 78 65 63 75 74 65 64 20 77 61 73 ust executed was
85b0: 20 6e 6f 74 20 61 20 43 4f 4d 4d 49 54 20 63 6f not a COMMIT co
85c0: 6d 6d 61 6e 64 2c 20 74 68 65 6e 0a 20 20 20 20 mmand, then.
85d0: 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 ** rollbac
85e0: 6b 20 77 68 61 74 65 76 65 72 20 74 68 65 20 72 k whatever the r
85f0: 65 73 75 6c 74 73 20 6f 66 20 74 68 61 74 20 63 esults of that c
8600: 6f 6d 6d 61 6e 64 20 77 65 72 65 20 2a 2f 0a 20 ommand were */.
8610: 20 20 20 20 20 20 20 20 20 78 46 75 6e 63 20 3d xFunc =
8620: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c sqlite3BtreeRol
8630: 6c 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d lback;. }
8640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c . }. }el
8650: 73 65 7b 0a 20 20 20 20 20 20 78 46 75 6e 63 20 se{. xFunc
8660: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f = sqlite3BtreeRo
8670: 6c 6c 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 llback;. }.
8680: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 }else{. if( p
8690: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ->rc==SQLITE_OK
86a0: 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f || p->errorActio
86b0: 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 n==OE_Fail ){.
86c0: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 xFunc = sqli
86d0: 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 te3BtreeCommitSt
86e0: 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 mt;. }else if
86f0: 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e ( p->errorAction
8700: 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 ==OE_Abort ){.
8710: 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 xFunc = sqli
8720: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b te3BtreeRollback
8730: 53 74 6d 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b Stmt;. }else{
8740: 0a 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 . xFunc = s
8750: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 qlite3BtreeRollb
8760: 61 63 6b 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 ack;. db->a
8770: 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 utoCommit = 1;.
8780: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 61 75 }. }. p->au
8790: 74 6f 43 6f 6d 6d 69 74 4f 6e 20 3d 20 30 3b 0a toCommitOn = 0;.
87a0: 0a 20 20 2f 2a 20 49 66 20 78 46 75 6e 63 20 69 . /* If xFunc i
87b0: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e s not NULL, then
87c0: 20 69 74 20 69 73 20 6f 6e 65 20 6f 66 20 73 71 it is one of sq
87d0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 lite3BtreeRollba
87e0: 63 6b 2c 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 ck,. ** sqlite3
87f0: 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d BtreeRollbackStm
8800: 74 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 t or sqlite3Btre
8810: 65 43 6f 6d 6d 69 74 53 74 6d 74 2e 20 43 61 6c eCommitStmt. Cal
8820: 6c 20 69 74 20 6f 6e 63 65 20 6f 6e 0a 20 20 2a l it once on. *
8830: 2a 20 65 61 63 68 20 62 61 63 6b 65 6e 64 2e 20 * each backend.
8840: 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 If an error occu
8850: 72 73 20 61 6e 64 20 74 68 65 20 72 65 74 75 72 rs and the retur
8860: 6e 20 63 6f 64 65 20 69 73 20 73 74 69 6c 6c 0a n code is still.
8870: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 ** SQLITE_OK,
8880: 73 65 74 20 74 68 65 20 72 65 74 75 72 6e 20 63 set the return c
8890: 6f 64 65 20 74 6f 20 74 68 65 20 6e 65 77 20 65 ode to the new e
88a0: 72 72 6f 72 20 76 61 6c 75 65 2e 0a 20 20 2a 2f rror value.. */
88b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 78 46 75 6e . for(i=0; xFun
88c0: 63 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 c && i<db->nDb;
88d0: 69 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 i++){ . int r
88e0: 63 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 c;. Btree *pB
88f0: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 t = db->aDb[i].p
8900: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 Bt;. if( pBt
8910: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 46 ){. rc = xF
8920: 75 6e 63 28 70 42 74 29 3b 0a 20 20 20 20 20 20 unc(pBt);.
8930: 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 if( p->rc==SQLIT
8940: 45 5f 4f 4b 20 29 20 70 2d 3e 72 63 20 3d 20 72 E_OK ) p->rc = r
8950: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 c;. }. }..
8960: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 /* If this was a
8970: 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 n INSERT, UPDATE
8980: 20 6f 72 20 44 45 4c 45 54 45 2c 20 73 65 74 20 or DELETE, set
8990: 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 the change count
89a0: 65 72 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e er. */. if( p->
89b0: 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 changeCntOn ){.
89c0: 20 20 20 69 66 28 20 21 78 46 75 6e 63 20 7c 7c if( !xFunc ||
89d0: 20 78 46 75 6e 63 3d 3d 73 71 6c 69 74 65 33 42 xFunc==sqlite3B
89e0: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 20 29 treeCommitStmt )
89f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 {. sqlite3V
8a00: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 dbeSetChanges(db
8a10: 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 , p->nChange);.
8a20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
8a30: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 sqlite3VdbeSetCh
8a40: 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 anges(db, 0);.
8a50: 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 43 68 61 6e }. p->nChan
8a60: 67 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 ge = 0;. }.. i
8a70: 66 28 20 70 2d 3e 72 63 21 3d 53 51 4c 49 54 45 f( p->rc!=SQLITE
8a80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 _OK ){. sqlit
8a90: 65 33 52 6f 6c 6c 62 61 63 6b 49 6e 74 65 72 6e e3RollbackIntern
8aa0: 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 alChanges(db);.
8ab0: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 66 }else if( db->f
8ac0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e lags & SQLITE_In
8ad0: 74 65 72 6e 43 68 61 6e 67 65 73 20 29 7b 0a 20 ternChanges ){.
8ae0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 sqlite3Commit
8af0: 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 InternalChanges(
8b00: 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 db);. }.. if(
8b10: 28 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f (p->magic==VDBE_
8b20: 4d 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e MAGIC_RUN && p->
8b30: 70 63 3e 3d 30 29 20 7c 7c 20 70 2d 3e 6d 61 67 pc>=0) || p->mag
8b40: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 ic==VDBE_MAGIC_H
8b50: 41 4c 54 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 ALT ){. db->a
8b60: 63 74 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a ctiveVdbeCnt--;.
8b70: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 }.. assert( p
8b80: 2d 3e 70 54 6f 73 3c 26 70 2d 3e 61 53 74 61 63 ->pTos<&p->aStac
8b90: 6b 5b 70 2d 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 k[p->pc<0?0:p->p
8ba0: 63 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 61 c] || sqlite3_ma
8bb0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 3d 3d 31 20 29 lloc_failed==1 )
8bc0: 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 ;.#ifdef VDBE_PR
8bd0: 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 OFILE. {. FI
8be0: 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 LE *out = fopen(
8bf0: 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 "vdbe_profile.ou
8c00: 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 t", "a");. if
8c10: 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 ( out ){. i
8c20: 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 nt i;. fpri
8c30: 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 ntf(out, "---- "
8c40: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 );. for(i=0
8c50: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 ; i<p->nOp; i++)
8c60: 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 {. fprint
8c70: 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 f(out, "%02x", p
8c80: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 ->aOp[i].opcode)
8c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
8ca0: 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e fprintf(out, "\n
8cb0: 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d ");. for(i=
8cc0: 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 0; i<p->nOp; i++
8cd0: 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e ){. fprin
8ce0: 74 66 28 6f 75 74 2c 20 22 25 36 64 20 25 31 30 tf(out, "%6d %10
8cf0: 6c 6c 64 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 lld %8lld ",.
8d00: 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 p->aOp[i
8d10: 5d 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 ].cnt,.
8d20: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c p->aOp[i].cycl
8d30: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 es,. p
8d40: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f ->aOp[i].cnt>0 ?
8d50: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 p->aOp[i].cycle
8d60: 73 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 s/p->aOp[i].cnt
8d70: 3a 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 : 0. );.
8d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
8d90: 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 bePrintOp(out, i
8da0: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 , &p->aOp[i]);.
8db0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c }. fcl
8dc0: 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a ose(out);. }.
8dd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e }.#endif. p->
8de0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 magic = VDBE_MAG
8df0: 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 IC_INIT;. retur
8e00: 6e 20 70 2d 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a n p->rc;.}../*.*
8e10: 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 * Clean up and d
8e20: 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 elete a VDBE aft
8e30: 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 er execution. R
8e40: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
8e50: 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 which is.** the
8e60: 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 result code. W
8e70: 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d rite any error m
8e80: 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f essage text into
8e90: 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 *pzErrMsg..*/.i
8ea0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 nt sqlite3VdbeFi
8eb0: 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b nalize(Vdbe *p){
8ec0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c . int rc;. sql
8ed0: 69 74 65 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 ite *db;.. if(
8ee0: 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d p->magic!=VDBE_M
8ef0: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 6d AGIC_RUN && p->m
8f00: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 agic!=VDBE_MAGIC
8f10: 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 69 66 28 _HALT ){. if(
8f20: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
8f30: 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 MAGIC_INIT ){.
8f40: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 sqlite3Error
8f50: 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d (p->db, SQLITE_M
8f60: 49 53 55 53 45 2c 20 30 29 3b 0a 20 20 20 20 7d ISUSE, 0);. }
8f70: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
8f80: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 TE_MISUSE;. }.
8f90: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 db = p->db;. r
8fa0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 c = sqlite3VdbeR
8fb0: 65 73 65 74 28 70 29 3b 0a 20 20 73 71 6c 69 74 eset(p);. sqlit
8fc0: 65 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b e3VdbeDelete(p);
8fd0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 . if( rc==SQLIT
8fe0: 45 5f 53 43 48 45 4d 41 20 29 7b 0a 20 20 20 20 E_SCHEMA ){.
8ff0: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65 sqlite3ResetInte
9000: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 rnalSchema(db, 0
9010: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 );. }. return
9020: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c rc;.}../*.** Cal
9030: 6c 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 l the destructor
9040: 20 66 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 for each auxdat
9050: 61 20 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 a entry in pVdbe
9060: 46 75 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a Func for which.*
9070: 2a 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 * the correspond
9080: 69 6e 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 ing bit in mask
9090: 69 73 20 73 65 74 2e 20 20 41 75 78 64 61 74 61 is set. Auxdata
90a0: 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 entries beyond
90b0: 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 31.** are always
90c0: 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 destroyed. To
90d0: 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 destroy all auxd
90e0: 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c ata entries, cal
90f0: 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e l this.** routin
9100: 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 2d 31 2e e with mask==-1.
9110: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
9120: 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 VdbeDeleteAuxDat
9130: 61 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 a(VdbeFunc *pVdb
9140: 65 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 eFunc, int mask)
9150: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 {. int i;. for
9160: 28 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e (i=0; i<pVdbeFun
9170: 63 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 c->nAux; i++){.
9180: 20 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74 struct AuxDat
9190: 61 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 a *pAux = &pVdbe
91a0: 46 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a Func->apAux[i];.
91b0: 20 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c if( (i>31 ||
91c0: 20 21 28 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 !(mask&(1<<i)))
91d0: 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 29 && pAux->pAux )
91e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 {. if( pAux
91f0: 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 ->xDelete ){.
9200: 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 pAux->xDele
9210: 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a te(pAux->pAux);.
9220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 }. pA
9230: 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 ux->pAux = 0;.
9240: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a }. }.}../*.**
9250: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 Delete an entir
9260: 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 e VDBE..*/.void
9270: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 sqlite3VdbeDelet
9280: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e e(Vdbe *p){. in
9290: 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 t i;. if( p==0
92a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 ) return;. Clea
92b0: 6e 75 70 28 70 29 3b 0a 20 20 69 66 28 20 70 2d nup(p);. if( p-
92c0: 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d >pPrev ){. p-
92d0: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 >pPrev->pNext =
92e0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 p->pNext;. }els
92f0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 e{. assert( p
9300: 2d 3e 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 ->db->pVdbe==p )
9310: 3b 0a 20 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 ;. p->db->pVd
9320: 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 be = p->pNext;.
9330: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 }. if( p->pNex
9340: 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 t ){. p->pNex
9350: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 t->pPrev = p->pP
9360: 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 rev;. }. p->pP
9370: 72 65 76 20 3d 20 70 2d 3e 70 4e 65 78 74 20 3d rev = p->pNext =
9380: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 0;. if( p->nOp
9390: 41 6c 6c 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 Alloc==0 ){.
93a0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20 p->aOp = 0;.
93b0: 70 2d 3e 6e 4f 70 20 3d 20 30 3b 0a 20 20 7d 0a p->nOp = 0;. }.
93c0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
93d0: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4f nOp; i++){. O
93e0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 p *pOp = &p->aOp
93f0: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 [i];. if( pOp
9400: 2d 3e 70 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e ->p3type==P3_DYN
9410: 41 4d 49 43 20 7c 7c 20 70 4f 70 2d 3e 70 33 74 AMIC || pOp->p3t
9420: 79 70 65 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 ype==P3_KEYINFO
9430: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 ){. sqliteF
9440: 72 65 65 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 ree(pOp->p3);.
9450: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 2d }. if( pOp-
9460: 3e 70 33 74 79 70 65 3d 3d 50 33 5f 56 44 42 45 >p3type==P3_VDBE
9470: 46 55 4e 43 20 29 7b 0a 20 20 20 20 20 20 56 64 FUNC ){. Vd
9480: 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e beFunc *pVdbeFun
9490: 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a 29 c = (VdbeFunc *)
94a0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 pOp->p3;. s
94b0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
94c0: 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 6e AuxData(pVdbeFun
94d0: 63 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 c, -1);. sq
94e0: 6c 69 74 65 46 72 65 65 28 70 56 64 62 65 46 75 liteFree(pVdbeFu
94f0: 6e 63 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 nc);. }.#ifnd
9500: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 73 71 ef NDEBUG. sq
9510: 6c 69 74 65 46 72 65 65 28 70 4f 70 2d 3e 7a 43 liteFree(pOp->zC
9520: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 0a omment);.#endif.
9530: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 }. for(i=0; i
9540: 3c 70 2d 3e 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a <p->nVar; i++){.
9550: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
9560: 65 6d 52 65 6c 65 61 73 65 28 26 70 2d 3e 61 70 emRelease(&p->ap
9570: 56 61 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 Var[i]);. }. s
9580: 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 4f 70 qliteFree(p->aOp
9590: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 );. sqliteFree(
95a0: 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 71 p->aLabel);. sq
95b0: 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 53 74 61 liteFree(p->aSta
95c0: 63 6b 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 ck);. if( p->aC
95d0: 6f 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f olName ){. fo
95e0: 72 28 69 3d 30 3b 20 69 3c 28 70 2d 3e 6e 52 65 r(i=0; i<(p->nRe
95f0: 73 43 6f 6c 75 6d 6e 29 2a 32 3b 20 69 2b 2b 29 sColumn)*2; i++)
9600: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 {. sqlite3V
9610: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 28 dbeMemRelease(&(
9620: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 5d 29 29 p->aColName[i]))
9630: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 ;. }. sqli
9640: 74 65 46 72 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 teFree(p->aColNa
9650: 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 me);. }. p->ma
9660: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
9670: 5f 44 45 41 44 3b 0a 20 20 73 71 6c 69 74 65 46 _DEAD;. sqliteF
9680: 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ree(p);.}../*.**
9690: 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 If a MoveTo ope
96a0: 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e ration is pendin
96b0: 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 g on the given c
96c0: 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 ursor, then do t
96d0: 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f hat.** MoveTo no
96e0: 77 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 w. Return an er
96f0: 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 6e 6f ror code. If no
9700: 20 4d 6f 76 65 54 6f 20 69 73 20 70 65 6e 64 69 MoveTo is pendi
9710: 6e 67 2c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 ng, this.** rout
9720: 69 6e 65 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 ine does nothing
9730: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 53 51 4c and returns SQL
9740: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 ITE_OK..*/.int s
9750: 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 qlite3VdbeCursor
9760: 4d 6f 76 65 74 6f 28 43 75 72 73 6f 72 20 2a 70 Moveto(Cursor *p
9770: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 ){. if( p->defe
9780: 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 rredMoveto ){.
9790: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 65 int res;. e
97a0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 xtern int sqlite
97b0: 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 3_search_count;.
97c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 assert( p->i
97d0: 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 69 66 28 ntKey );. if(
97e0: 20 70 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 p->intKey ){.
97f0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 sqlite3Btree
9800: 4d 6f 76 65 74 6f 28 70 2d 3e 70 43 75 72 73 6f Moveto(p->pCurso
9810: 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 r, 0, p->movetoT
9820: 61 72 67 65 74 2c 20 26 72 65 73 29 3b 0a 20 20 arget, &res);.
9830: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 }else{. s
9840: 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 qlite3BtreeMovet
9850: 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 28 63 68 o(p->pCursor,(ch
9860: 61 72 2a 29 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 ar*)&p->movetoTa
9870: 72 67 65 74 2c 73 69 7a 65 6f 66 28 69 36 34 29 rget,sizeof(i64)
9880: 2c 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 ,&res);. }.
9890: 20 20 2a 70 2d 3e 70 49 6e 63 72 4b 65 79 20 3d *p->pIncrKey =
98a0: 20 30 3b 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 0;. p->lastR
98b0: 65 63 6e 6f 20 3d 20 6b 65 79 54 6f 49 6e 74 28 ecno = keyToInt(
98c0: 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 29 p->movetoTarget)
98d0: 3b 0a 20 20 20 20 70 2d 3e 72 65 63 6e 6f 49 73 ;. p->recnoIs
98e0: 56 61 6c 69 64 20 3d 20 72 65 73 3d 3d 30 3b 0a Valid = res==0;.
98f0: 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b if( res<0 ){
9900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 . sqlite3Bt
9910: 72 65 65 4e 65 78 74 28 70 2d 3e 70 43 75 72 73 reeNext(p->pCurs
9920: 6f 72 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d or, &res);. }
9930: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 . sqlite3_sea
9940: 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 rch_count++;.
9950: 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 p->deferredMove
9960: 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 63 to = 0;. p->c
9970: 61 63 68 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 acheValid = 0;.
9980: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 }. return SQLI
9990: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
99a0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 The following fu
99b0: 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 nctions:.**.** s
99c0: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
99d0: 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 Type().** sqlite
99e0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 3VdbeSerialTypeL
99f0: 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 en().** sqlite3V
9a00: 64 62 65 53 65 72 69 61 6c 52 65 61 64 28 29 0a dbeSerialRead().
9a10: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 ** sqlite3VdbeSe
9a20: 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c rialLen().** sql
9a30: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 57 72 ite3VdbeSerialWr
9a40: 69 74 65 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 ite().**.** enca
9a50: 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 psulate the code
9a60: 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 that serializes
9a70: 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 values for stor
9a80: 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a age in SQLite.**
9a90: 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 data and index
9aa0: 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 records. Each se
9ab0: 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 rialized value c
9ac0: 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 onsists of a.**
9ad0: 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 'serial-type' an
9ae0: 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 d a blob of data
9af0: 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 . The serial typ
9b00: 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 e is an 8-byte u
9b10: 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 nsigned.** integ
9b20: 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 er, stored as a
9b30: 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e varint..**.** In
9b40: 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 an SQLite index
9b50: 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 record, the ser
9b60: 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 ial type is stor
9b70: 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f ed directly befo
9b80: 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f re.** the blob o
9b90: 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 f data that it c
9ba0: 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 orresponds to. I
9bb0: 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 n a table record
9bc0: 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 , all serial.**
9bd0: 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 types are stored
9be0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 at the start of
9bf0: 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 the record, and
9c00: 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 the blobs of da
9c10: 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 ta at.** the end
9c20: 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 . Hence these fu
9c30: 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 nctions allow th
9c40: 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 e caller to hand
9c50: 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c le the.** serial
9c60: 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 -type and data b
9c70: 6c 6f 62 20 73 65 70 65 72 61 74 65 6c 79 2e 0a lob seperately..
9c80: 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 **.** The follow
9c90: 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 ing table descri
9ca0: 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 bes the various
9cb0: 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 storage classes
9cc0: 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 for data:.**.**
9cd0: 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 serial type
9ce0: 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 bytes of da
9cf0: 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 ta type.**
9d00: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
9d10: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d -----------
9d20: 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d ---- --------
9d30: 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 -------.**
9d40: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0
9d50: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 0
9d60: 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 NULL.**
9d70: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1
9d80: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 1
9d90: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 signed intege
9da0: 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 r.** 2
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9dc0: 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 2 sig
9dd0: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 ned integer.**
9de0: 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 3
9df0: 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 3
9e00: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e signed in
9e10: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 teger.** 4
9e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9e30: 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 4
9e40: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a signed integer.
9e50: 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 ** 5
9e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 6
9e70: 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 signe
9e80: 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 d integer.**
9e90: 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 6
9ea0: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 8
9eb0: 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 signed inte
9ec0: 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 ger.** 7
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ee0: 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 8 I
9ef0: 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 EEE float.**
9f00: 20 38 2d 31 31 20 20 20 20 20 20 20 20 20 20 20 8-11
9f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9f20: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f reserved fo
9f30: 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 r expansion.**
9f40: 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e N>=12 and even
9f50: 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 (N-12)/2
9f60: 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 BLOB.**
9f70: 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 N>=13 and odd
9f80: 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 (N-13)/2
9f90: 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a text.**.*
9fa0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 /../*.** Return
9fb0: 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 the serial-type
9fc0: 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 for the value st
9fd0: 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f ored in pMem..*/
9fe0: 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 .u32 sqlite3Vdbe
9ff0: 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a SerialType(Mem *
a000: 70 4d 65 6d 29 7b 0a 20 20 69 6e 74 20 66 6c 61 pMem){. int fla
a010: 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 gs = pMem->flags
a020: 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d ;.. if( flags&M
a030: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 EM_Null ){. r
a040: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 eturn 0;. }. i
a050: 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 f( flags&MEM_Int
a060: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 ){. /* Figur
a070: 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f e out whether to
a080: 20 75 73 65 20 31 2c 20 32 2c 20 34 20 6f 72 20 use 1, 2, 4 or
a090: 38 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 8 bytes. */.
a0a0: 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b i64 i = pMem->i;
a0b0: 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 31 32 37 . if( i>=-127
a0c0: 20 26 26 20 69 3c 3d 31 32 37 20 29 20 72 65 74 && i<=127 ) ret
a0d0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 69 urn 1;. if( i
a0e0: 3e 3d 2d 33 32 37 36 37 20 26 26 20 69 3c 3d 33 >=-32767 && i<=3
a0f0: 32 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 2767 ) return 2;
a100: 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 38 33 38 . if( i>=-838
a110: 38 36 30 37 20 26 26 20 69 3c 3d 38 33 38 38 36 8607 && i<=83886
a120: 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 07 ) return 3;.
a130: 20 20 20 69 66 28 20 69 3e 3d 2d 32 31 34 37 34 if( i>=-21474
a140: 38 33 36 34 37 20 26 26 20 69 3c 3d 32 31 34 37 83647 && i<=2147
a150: 34 38 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 483647 ) return
a160: 34 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 31 4;. if( i>=-1
a170: 34 30 37 33 37 34 38 38 33 35 35 33 32 38 4c 20 40737488355328L
a180: 26 26 20 69 3c 3d 31 34 30 37 33 37 34 38 38 33 && i<=1407374883
a190: 35 35 33 32 38 4c 20 29 20 72 65 74 75 72 6e 20 55328L ) return
a1a0: 35 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 5;. return 6;
a1b0: 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 . }. if( flags
a1c0: 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 &MEM_Real ){.
a1d0: 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 return 7;. }.
a1e0: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 53 if( flags&MEM_S
a1f0: 74 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 tr ){. int n
a200: 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 61 = pMem->n;. a
a210: 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 ssert( n>=0 );.
a220: 20 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 return ((n*2)
a230: 20 2b 20 31 33 29 3b 0a 20 20 7d 0a 20 20 69 66 + 13);. }. if
a240: 28 20 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 ( flags&MEM_Blob
a250: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 ){. return (
a260: 70 4d 65 6d 2d 3e 6e 2a 32 20 2b 20 31 32 29 3b pMem->n*2 + 12);
a270: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b . }. return 0;
a280: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
a290: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 the length of t
a2a0: 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f he data correspo
a2b0: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 nding to the sup
a2c0: 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 plied serial-typ
a2d0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 e..*/.int sqlite
a2e0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 3VdbeSerialTypeL
a2f0: 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 en(u32 serial_ty
a300: 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 pe){. if( seria
a310: 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 l_type>=12 ){.
a320: 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c return (serial
a330: 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d _type-12)/2;. }
a340: 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 else{. static
a350: 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 u8 aSize[] = {
a360: 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 0, 1, 2, 3, 4, 6
a370: 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c , 8, 8, 0, 0, 0,
a380: 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 0 };. return
a390: 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 aSize[serial_ty
a3a0: 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a pe];. }.}../*.*
a3b0: 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 * Write the seri
a3c0: 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 alized data blob
a3d0: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 for the value s
a3e0: 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e tored in pMem in
a3f0: 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 to .** buf. It i
a400: 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 s assumed that t
a410: 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c he caller has al
a420: 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 located sufficie
a430: 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 nt space..** Ret
a440: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f urn the number o
a450: 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e f bytes written.
a460: 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 .*/ .int sqlite3
a470: 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 6e VdbeSerialPut(un
a480: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 signed char *buf
a490: 2c 20 4d 65 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 , Mem *pMem){.
a4a0: 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 u32 serial_type
a4b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 = sqlite3VdbeSer
a4c0: 69 61 6c 54 79 70 65 28 70 4d 65 6d 29 3b 0a 20 ialType(pMem);.
a4d0: 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 int len;.. /*
a4e0: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 73 65 NULL */. if( se
a4f0: 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a rial_type==0 ){.
a500: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
a510: 7d 0a 20 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 }. . /* Integer
a520: 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 and Real */. i
a530: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d f( serial_type<=
a540: 37 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 7 ){. u64 v;.
a550: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 int i;. i
a560: 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d f( serial_type==
a570: 37 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 2a 7 ){. v = *
a580: 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 72 3b 0a (u64*)&pMem->r;.
a590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
a5a0: 20 76 20 3d 20 2a 28 75 36 34 2a 29 26 70 4d 65 v = *(u64*)&pMe
a5b0: 6d 2d 3e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 m->i;. }.
a5c0: 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 len = i = sqlite
a5d0: 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 3VdbeSerialTypeL
a5e0: 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b en(serial_type);
a5f0: 0a 20 20 20 20 77 68 69 6c 65 28 20 69 2d 2d 20 . while( i--
a600: 29 7b 0a 20 20 20 20 20 20 62 75 66 5b 69 5d 20 ){. buf[i]
a610: 3d 20 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 = (v&0xFF);.
a620: 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d v >>= 8;. }
a630: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b . return len;
a640: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 53 74 72 . }. . /* Str
a650: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 ing or blob */.
a660: 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f assert( serial_
a670: 74 79 70 65 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 type>=12 );. le
a680: 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 n = sqlite3VdbeS
a690: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
a6a0: 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 6d 65 6d ial_type);. mem
a6b0: 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a cpy(buf, pMem->z
a6c0: 2c 20 6c 65 6e 29 3b 0a 20 20 72 65 74 75 72 6e , len);. return
a6d0: 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 len;.}../*.** D
a6e0: 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 eserialize the d
a6f0: 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 ata blob pointed
a700: 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 to by buf as se
a710: 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c rial type serial
a720: 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f _type.** and sto
a730: 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e re the result in
a740: 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 pMem. Return t
a750: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
a760: 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 es read..*/ .int
a770: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
a780: 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 alGet(. const u
a790: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
a7a0: 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 f, /* Buffer
a7b0: 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 to deserialize
a7c0: 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 from */. u32 se
a7d0: 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 rial_type,
a7e0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 /* Seria
a7f0: 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 l type to deseri
a800: 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a alize */. Mem *
a810: 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 pMem
a820: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f /* Memo
a830: 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 ry cell to write
a840: 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 value into */.)
a850: 7b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 {. int len;..
a860: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d if( serial_type=
a870: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 55 4c =0 ){. /* NUL
a880: 4c 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 L */. pMem->f
a890: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b lags = MEM_Null;
a8a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 . return 0;.
a8b0: 20 7d 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 }. len = sqlit
a8c0: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
a8d0: 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 Len(serial_type)
a8e0: 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 ;. if( serial_t
a8f0: 79 70 65 3c 3d 37 20 29 7b 0a 20 20 20 20 2f 2a ype<=7 ){. /*
a900: 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 Integer and Rea
a910: 6c 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 65 72 l */. if( ser
a920: 69 61 6c 5f 74 79 70 65 3c 3d 34 20 29 7b 0a 20 ial_type<=4 ){.
a930: 20 20 20 20 20 2f 2a 20 33 32 2d 62 69 74 20 69 /* 32-bit i
a940: 6e 74 65 67 65 72 20 74 79 70 65 2e 20 20 54 68 nteger type. Th
a950: 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 is is handled by
a960: 20 61 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 a special case
a970: 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 for. ** per
a980: 66 6f 72 6d 61 6e 63 65 20 72 65 61 73 6f 6e 73 formance reasons
a990: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 76 . */. int v
a9a0: 20 3d 20 62 75 66 5b 30 5d 3b 0a 20 20 20 20 20 = buf[0];.
a9b0: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 69 66 int n;. if
a9c0: 28 20 76 26 30 78 38 30 20 29 7b 0a 20 20 20 20 ( v&0x80 ){.
a9d0: 20 20 20 20 76 20 7c 3d 20 2d 32 35 36 3b 0a 20 v |= -256;.
a9e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 }. for
a9f0: 28 6e 3d 31 3b 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b (n=1; n<len; n++
aa00: 29 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 28 ){. v = (
aa10: 76 3c 3c 38 29 20 7c 20 62 75 66 5b 6e 5d 3b 0a v<<8) | buf[n];.
aa20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d }. pM
aa30: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
aa40: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d Int;. pMem-
aa50: 3e 69 20 3d 20 76 3b 0a 20 20 20 20 20 20 72 65 >i = v;. re
aa60: 74 75 72 6e 20 6e 3b 0a 20 20 20 20 7d 65 6c 73 turn n;. }els
aa70: 65 7b 0a 20 20 20 20 20 20 75 36 34 20 76 20 3d e{. u64 v =
aa80: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0;. int n;
aa90: 0a 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 5b .. if( buf[
aaa0: 30 5d 26 30 78 38 30 20 29 7b 0a 20 20 20 20 20 0]&0x80 ){.
aab0: 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20 20 20 v = -1;.
aac0: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 30 }. for(n=0
aad0: 3b 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 ; n<len; n++){.
aae0: 20 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 38 v = (v<<8
aaf0: 29 20 7c 20 62 75 66 5b 6e 5d 3b 0a 20 20 20 20 ) | buf[n];.
ab00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 65 }. if( se
ab10: 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a rial_type==7 ){.
ab20: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c pMem->fl
ab30: 61 67 73 20 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a ags = MEM_Real;.
ab40: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 72 20 pMem->r
ab50: 3d 20 2a 28 64 6f 75 62 6c 65 2a 29 26 76 3b 0a = *(double*)&v;.
ab60: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
ab70: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
ab80: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
ab90: 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d 20 2a 28 pMem->i = *(
aba0: 69 36 34 2a 29 26 76 3b 0a 20 20 20 20 20 20 7d i64*)&v;. }
abb0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a . }. }else{.
abc0: 20 20 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 /* String or
abd0: 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 61 73 73 blob */. ass
abe0: 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 ert( serial_type
abf0: 3e 3d 31 32 20 29 3b 0a 20 20 20 20 70 4d 65 6d >=12 );. pMem
ac00: 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 ->z = (char *)bu
ac10: 66 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d f;. pMem->n =
ac20: 20 6c 65 6e 3b 0a 20 20 20 20 69 66 28 20 73 65 len;. if( se
ac30: 72 69 61 6c 5f 74 79 70 65 26 30 78 30 31 20 29 rial_type&0x01 )
ac40: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c {. pMem->fl
ac50: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 ags = MEM_Str |
ac60: 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 7d MEM_Ephem;. }
ac70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4d 65 6d else{. pMem
ac80: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c ->flags = MEM_Bl
ac90: 6f 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a ob | MEM_Ephem;.
aca0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 }. }. retu
acb0: 72 6e 20 6c 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a rn len;.}../*.**
acc0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 This function c
acd0: 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 ompares the two
ace0: 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e table rows or in
acf0: 64 65 78 20 72 65 63 6f 72 64 73 20 73 70 65 63 dex records spec
ad00: 69 66 69 65 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b ified by .** {nK
ad10: 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 ey1, pKey1} and
ad20: 7b 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2c 20 {nKey2, pKey2},
ad30: 72 65 74 75 72 6e 69 6e 67 20 61 20 6e 65 67 61 returning a nega
ad40: 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 tive, zero.** or
ad50: 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 positive intege
ad60: 72 20 69 66 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 r if {nKey1, pKe
ad70: 79 31 7d 20 69 73 20 6c 65 73 73 20 74 68 61 6e y1} is less than
ad80: 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a , equal to or .*
ad90: 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7b * greater than {
ada0: 6e 4b 65 79 32 2c 20 70 4b 65 79 32 7d 2e 20 20 nKey2, pKey2}.
adb0: 42 6f 74 68 20 4b 65 79 31 20 61 6e 64 20 4b 65 Both Key1 and Ke
adc0: 79 32 20 6d 75 73 74 20 62 65 20 62 79 74 65 20 y2 must be byte
add0: 73 74 72 69 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f strings.** compo
ade0: 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 sed by the OP_Ma
adf0: 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 keRecord opcode
ae00: 6f 66 20 74 68 65 20 56 44 42 45 2e 0a 2a 2f 0a of the VDBE..*/.
ae10: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 int sqlite3VdbeR
ae20: 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 ecordCompare(.
ae30: 76 6f 69 64 20 2a 75 73 65 72 44 61 74 61 2c 0a void *userData,.
ae40: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e int nKey1, con
ae50: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 st void *pKey1,
ae60: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f . int nKey2, co
ae70: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a nst void *pKey2.
ae80: 29 7b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b ){. KeyInfo *pK
ae90: 65 79 49 6e 66 6f 20 3d 20 28 4b 65 79 49 6e 66 eyInfo = (KeyInf
aea0: 6f 2a 29 75 73 65 72 44 61 74 61 3b 0a 20 20 75 o*)userData;. u
aeb0: 33 32 20 64 31 2c 20 64 32 3b 20 20 20 20 20 20 32 d1, d2;
aec0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e /* Offset in
aed0: 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 to aKey[] of nex
aee0: 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a t data element *
aef0: 2f 0a 20 20 75 33 32 20 69 64 78 31 2c 20 69 64 /. u32 idx1, id
af00: 78 32 3b 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 x2; /* Offs
af10: 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f et into aKey[] o
af20: 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c f next header el
af30: 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 ement */. u32 s
af40: 7a 48 64 72 31 2c 20 73 7a 48 64 72 32 3b 20 20 zHdr1, szHdr2;
af50: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
af60: 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a es in header */.
af70: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 int i = 0;. i
af80: 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 nt nField;. int
af90: 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 rc = 0;. const
afa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
afb0: 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 aKey1 = (const u
afc0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 nsigned char *)p
afd0: 4b 65 79 31 3b 0a 20 20 63 6f 6e 73 74 20 75 6e Key1;. const un
afe0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 signed char *aKe
aff0: 79 32 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 y2 = (const unsi
b000: 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 gned char *)pKey
b010: 32 3b 0a 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 2;.. Mem mem1;.
b020: 20 20 4d 65 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 Mem mem2;. me
b030: 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 m1.enc = pKeyInf
b040: 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 o->enc;. mem2.e
b050: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 nc = pKeyInfo->e
b060: 6e 63 3b 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 nc;. . idx1 =
b070: 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 sqlite3GetVarint
b080: 33 32 28 70 4b 65 79 31 2c 20 26 73 7a 48 64 72 32(pKey1, &szHdr
b090: 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 1);. d1 = szHdr
b0a0: 31 3b 0a 20 20 69 64 78 32 20 3d 20 73 71 6c 69 1;. idx2 = sqli
b0b0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 te3GetVarint32(p
b0c0: 4b 65 79 32 2c 20 26 73 7a 48 64 72 32 29 3b 0a Key2, &szHdr2);.
b0d0: 20 20 64 32 20 3d 20 73 7a 48 64 72 32 3b 0a 20 d2 = szHdr2;.
b0e0: 20 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e nField = pKeyIn
b0f0: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 0a 20 20 77 68 fo->nField;. wh
b100: 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 ile( idx1<szHdr1
b110: 20 26 26 20 69 64 78 32 3c 73 7a 48 64 72 32 20 && idx2<szHdr2
b120: 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 ){. u32 seria
b130: 6c 5f 74 79 70 65 31 3b 0a 20 20 20 20 75 33 32 l_type1;. u32
b140: 20 73 65 72 69 61 6c 5f 74 79 70 65 32 3b 0a 0a serial_type2;..
b150: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 /* Read the
b160: 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 serial types for
b170: 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e the next elemen
b180: 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a t in each key. *
b190: 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 /. idx1 += sq
b1a0: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 lite3GetVarint32
b1b0: 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 26 (&aKey1[idx1], &
b1c0: 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3b 0a 20 serial_type1);.
b1d0: 20 20 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 if( d1>=nKey1
b1e0: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 && sqlite3VdbeS
b1f0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
b200: 69 61 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 ial_type1)>0 ) b
b210: 72 65 61 6b 3b 0a 20 20 20 20 69 64 78 32 20 2b reak;. idx2 +
b220: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 = sqlite3GetVari
b230: 6e 74 33 32 28 26 61 4b 65 79 32 5b 69 64 78 32 nt32(&aKey2[idx2
b240: 5d 2c 20 26 73 65 72 69 61 6c 5f 74 79 70 65 32 ], &serial_type2
b250: 29 3b 0a 20 20 20 20 69 66 28 20 64 32 3e 3d 6e );. if( d2>=n
b260: 4b 65 79 32 20 26 26 20 73 71 6c 69 74 65 33 56 Key2 && sqlite3V
b270: 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e dbeSerialTypeLen
b280: 28 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3e 30 (serial_type2)>0
b290: 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f ) break;.. /
b2a0: 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 * Assert that th
b2b0: 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 73 70 ere is enough sp
b2c0: 61 63 65 20 6c 65 66 74 20 69 6e 20 65 61 63 68 ace left in each
b2d0: 20 6b 65 79 20 66 6f 72 20 74 68 65 20 62 6c 6f key for the blo
b2e0: 62 20 6f 66 0a 20 20 20 20 2a 2a 20 64 61 74 61 b of. ** data
b2f0: 20 74 6f 20 67 6f 20 77 69 74 68 20 74 68 65 20 to go with the
b300: 73 65 72 69 61 6c 20 74 79 70 65 20 6a 75 73 74 serial type just
b310: 20 72 65 61 64 2e 20 54 68 69 73 20 61 73 73 65 read. This asse
b320: 72 74 20 6d 61 79 20 66 61 69 6c 20 69 66 0a 20 rt may fail if.
b330: 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 69 ** the file i
b340: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54 68 s corrupted. Th
b350: 65 6e 20 72 65 61 64 20 74 68 65 20 76 61 6c 75 en read the valu
b360: 65 20 66 72 6f 6d 20 65 61 63 68 20 6b 65 79 20 e from each key
b370: 69 6e 74 6f 20 6d 65 6d 31 0a 20 20 20 20 2a 2a into mem1. **
b380: 20 61 6e 64 20 6d 65 6d 32 20 72 65 73 70 65 63 and mem2 respec
b390: 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 tively.. */.
b3a0: 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 d1 += sqlite3
b3b0: 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 VdbeSerialGet(&a
b3c0: 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c Key1[d1], serial
b3d0: 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a _type1, &mem1);.
b3e0: 20 20 20 20 64 32 20 2b 3d 20 73 71 6c 69 74 65 d2 += sqlite
b3f0: 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 3VdbeSerialGet(&
b400: 61 4b 65 79 32 5b 64 32 5d 2c 20 73 65 72 69 61 aKey2[d2], seria
b410: 6c 5f 74 79 70 65 32 2c 20 26 6d 65 6d 32 29 3b l_type2, &mem2);
b420: 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 .. rc = sqlit
b430: 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 e3MemCompare(&me
b440: 6d 31 2c 20 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 m1, &mem2, i<nFi
b450: 65 6c 64 20 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e eld ? pKeyInfo->
b460: 61 43 6f 6c 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 aColl[i] : 0);.
b470: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
b480: 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 3b mRelease(&mem1);
b490: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
b4a0: 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 32 MemRelease(&mem2
b4b0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 );. if( rc!=0
b4c0: 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b ){. break;
b4d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a . }. i++;.
b4e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 }.. /* One of
b4f0: 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 the keys ran ou
b500: 74 20 6f 66 20 66 69 65 6c 64 73 2c 20 62 75 74 t of fields, but
b510: 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 all the fields
b520: 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 up to that point
b530: 0a 20 20 2a 2a 20 77 65 72 65 20 65 71 75 61 6c . ** were equal
b540: 2e 20 49 66 20 74 68 65 20 69 6e 63 72 4b 65 79 . If the incrKey
b550: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 flag is true, t
b560: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 6b hen the second k
b570: 65 79 20 69 73 0a 20 20 2a 2a 20 74 72 65 61 74 ey is. ** treat
b580: 65 64 20 61 73 20 6c 61 72 67 65 72 2e 0a 20 20 ed as larger..
b590: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 */. if( rc==0 )
b5a0: 7b 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e {. if( pKeyIn
b5b0: 66 6f 2d 3e 69 6e 63 72 4b 65 79 20 29 7b 0a 20 fo->incrKey ){.
b5c0: 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 rc = -1;.
b5d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 64 31 3c 6e }else if( d1<n
b5e0: 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 72 63 Key1 ){. rc
b5f0: 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 = 1;. }else
b600: 69 66 28 20 64 32 3c 6e 4b 65 79 32 20 29 7b 0a if( d2<nKey2 ){.
b610: 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 rc = -1;.
b620: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 }. }.. if(
b630: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f pKeyInfo->aSortO
b640: 72 64 65 72 20 26 26 20 69 3c 70 4b 65 79 49 6e rder && i<pKeyIn
b650: 66 6f 2d 3e 6e 46 69 65 6c 64 20 26 26 20 70 4b fo->nField && pK
b660: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 eyInfo->aSortOrd
b670: 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 72 63 20 er[i] ){. rc
b680: 3d 20 2d 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 = -rc;. }.. re
b690: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
b6a0: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69 * The argument i
b6b0: 73 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 s an index entry
b6c0: 20 63 6f 6d 70 6f 73 65 64 20 75 73 69 6e 67 20 composed using
b6d0: 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 the OP_MakeRecor
b6e0: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 d opcode..** The
b6f0: 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 last entry in t
b700: 68 69 73 20 72 65 63 6f 72 64 20 73 68 6f 75 6c his record shoul
b710: 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 d be an integer
b720: 28 73 70 65 63 69 66 69 63 61 6c 6c 79 0a 2a 2a (specifically.**
b730: 20 61 6e 20 69 6e 74 65 67 65 72 20 72 6f 77 69 an integer rowi
b740: 64 29 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e d). This routin
b750: 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e 75 e returns the nu
b760: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e mber of bytes in
b770: 0a 2a 2a 20 74 68 61 74 20 69 6e 74 65 67 65 72 .** that integer
b780: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
b790: 56 64 62 65 49 64 78 52 6f 77 69 64 4c 65 6e 28 VdbeIdxRowidLen(
b7a0: 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 int nKey, const
b7b0: 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 u8 *aKey){. u32
b7c0: 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f szHdr; /
b7d0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 * Size of the he
b7e0: 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 ader */. u32 ty
b7f0: 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 peRowid; /* S
b800: 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 erial type of th
b810: 65 20 72 6f 77 69 64 20 2a 2f 0a 0a 20 20 73 71 e rowid */.. sq
b820: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 lite3GetVarint32
b830: 28 61 4b 65 79 2c 20 26 73 7a 48 64 72 29 3b 0a (aKey, &szHdr);.
b840: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 sqlite3GetVari
b850: 6e 74 33 32 28 26 61 4b 65 79 5b 73 7a 48 64 72 nt32(&aKey[szHdr
b860: 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 -1], &typeRowid)
b870: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 ;. return sqlit
b880: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
b890: 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a Len(typeRowid);.
b8a0: 7d 0a 20 20 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 }. ../*.** pCur
b8b0: 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e points at an in
b8c0: 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 dex entry create
b8d0: 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d d using the OP_M
b8e0: 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 akeRecord opcode
b8f0: 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f ..** Read the ro
b900: 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 wid (the last fi
b910: 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 eld in the recor
b920: 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 d) and store it
b930: 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 in *rowid..** Re
b940: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 turn SQLITE_OK i
b950: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 f everything wor
b960: 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 ks, or an error
b970: 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a code otherwise..
b980: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
b990: 62 65 49 64 78 52 6f 77 69 64 28 42 74 43 75 72 beIdxRowid(BtCur
b9a0: 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a sor *pCur, i64 *
b9b0: 72 6f 77 69 64 29 7b 0a 20 20 75 36 34 20 6e 43 rowid){. u64 nC
b9c0: 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 63 ellKey;. int rc
b9d0: 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 ;. u32 szHdr;
b9e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
b9f0: 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 the header */.
ba00: 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 u32 typeRowid;
ba10: 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 /* Serial typ
ba20: 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a e of the rowid *
ba30: 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 /. u32 lenRowid
ba40: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 ; /* Size of
ba50: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 the rowid */.
ba60: 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c Mem m, v;.. sql
ba70: 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 ite3BtreeKeySize
ba80: 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 (pCur, &nCellKey
ba90: 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 );. if( nCellKe
baa0: 79 3c 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 y<=0 ){. retu
bab0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
bac0: 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 T;. }. rc = sq
bad0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d lite3VdbeMemFrom
bae0: 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 6e Btree(pCur, 0, n
baf0: 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b CellKey, 1, &m);
bb00: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 . if( rc ){.
bb10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a return rc;. }.
bb20: 20 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 sqlite3GetVari
bb30: 6e 74 33 32 28 6d 2e 7a 2c 20 26 73 7a 48 64 72 nt32(m.z, &szHdr
bb40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 47 65 74 56 );. sqlite3GetV
bb50: 61 72 69 6e 74 33 32 28 26 6d 2e 7a 5b 73 7a 48 arint32(&m.z[szH
bb60: 64 72 2d 31 5d 2c 20 26 74 79 70 65 52 6f 77 69 dr-1], &typeRowi
bb70: 64 29 3b 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d d);. lenRowid =
bb80: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
bb90: 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f alTypeLen(typeRo
bba0: 77 69 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 wid);. sqlite3V
bbb0: 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 6d 2e dbeSerialGet(&m.
bbc0: 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c z[m.n-lenRowid],
bbd0: 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b typeRowid, &v);
bbe0: 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 69 3b . *rowid = v.i;
bbf0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 . sqlite3VdbeMe
bc00: 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 mRelease(&m);.
bc10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
bc20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 ;.}../*.** Compa
bc30: 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 re the key of th
bc40: 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 e index entry th
bc50: 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 at cursor pC is
bc60: 70 6f 69 6e 74 20 74 6f 20 61 67 61 69 6e 73 74 point to against
bc70: 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 .** the key stri
bc80: 6e 67 20 69 6e 20 70 4b 65 79 20 28 6f 66 20 6c ng in pKey (of l
bc90: 65 6e 67 74 68 20 6e 4b 65 79 29 2e 20 20 57 72 ength nKey). Wr
bca0: 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 ite into *pRes a
bcb0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 number.** that
bcc0: 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 is negative, zer
bcd0: 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 o, or positive i
bce0: 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61 f pC is less tha
bcf0: 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 n, equal to,.**
bd00: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 or greater than
bd10: 70 4b 65 79 2e 20 20 52 65 74 75 72 6e 20 53 51 pKey. Return SQ
bd20: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 LITE_OK on succe
bd30: 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 ss..**.** pKey i
bd40: 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 s either created
bd50: 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 without a rowid
bd60: 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 or is truncated
bd70: 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f so that it.** o
bd80: 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 mits the rowid a
bd90: 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 t the end. The
bda0: 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 rowid at the end
bdb0: 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e of the index en
bdc0: 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 try.** is ignore
bdd0: 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e d as well..*/.in
bde0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 t sqlite3VdbeIdx
bdf0: 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 43 75 KeyCompare(. Cu
be00: 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 rsor *pC,
be10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
be20: 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 cursor to compa
be30: 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 re against */.
be40: 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 int nKey, const
be50: 75 38 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 u8 *pKey, /* T
be60: 68 65 20 6b 65 79 20 74 6f 20 63 6f 6d 70 61 72 he key to compar
be70: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 e */. int *res
be80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
be90: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 /* Write the
bea0: 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c comparison resul
beb0: 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 t here */.){. u
bec0: 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 64 nCellKey;. i
bed0: 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f nt rc;. BtCurso
bee0: 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 r *pCur = pC->pC
bef0: 75 72 73 6f 72 3b 0a 20 20 69 6e 74 20 6c 65 6e ursor;. int len
bf00: 52 6f 77 69 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a Rowid;. Mem m;.
bf10: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b . sqlite3BtreeK
bf20: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 eySize(pCur, &nC
bf30: 65 6c 6c 4b 65 79 29 3b 0a 20 20 69 66 28 20 6e ellKey);. if( n
bf40: 43 65 6c 6c 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 CellKey<=0 ){.
bf50: 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 *res = 0;.
bf60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
bf70: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c ;. }. rc = sql
bf80: 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 ite3VdbeMemFromB
bf90: 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 tree(pC->pCursor
bfa0: 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 , 0, nCellKey, 1
bfb0: 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 , &m);. if( rc
bfc0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 ){. return rc
bfd0: 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 ;. }. lenRowid
bfe0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 = sqlite3VdbeId
bff0: 78 52 6f 77 69 64 4c 65 6e 28 6d 2e 6e 2c 20 6d xRowidLen(m.n, m
c000: 2e 7a 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 .z);. *res = sq
c010: 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 lite3VdbeRecordC
c020: 6f 6d 70 61 72 65 28 70 43 2d 3e 70 4b 65 79 49 ompare(pC->pKeyI
c030: 6e 66 6f 2c 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 nfo, m.n-lenRowi
c040: 64 2c 20 6d 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b d, m.z, nKey, pK
c050: 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 ey);. sqlite3Vd
c060: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 beMemRelease(&m)
c070: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
c080: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 E_OK;.}../*.** T
c090: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 his routine sets
c0a0: 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 the value to be
c0b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 returned by sub
c0c0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f sequent calls to
c0d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e .** sqlite3_chan
c0e0: 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 ges() on the dat
c0f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 abase handle 'db
c100: 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 '. .*/.void sqli
c110: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 te3VdbeSetChange
c120: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 s(sqlite3 *db, i
c130: 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 64 nt nChange){. d
c140: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 b->nChange = nCh
c150: 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 ange;. db->nTot
c160: 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 alChange += nCha
c170: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 nge;.}../*.** Se
c180: 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 t a flag in the
c190: 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 vdbe to update t
c1a0: 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 he change counte
c1b0: 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e r when it is fin
c1c0: 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 alised.** or res
c1d0: 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 et..*/.void sqli
c1e0: 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e te3VdbeCountChan
c1f0: 67 65 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ges(Vdbe *p){.
c200: 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d p->changeCntOn =
c210: 20 31 3b 0a 7d 0a 0a 0a 0a 1;.}....