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 46 72 65 65 20 61 6c 6c 20 72 65 *.** Free all re
46d0: 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63 69 61 74 sources allociat
46e0: 65 64 20 77 69 74 68 20 41 67 67 45 6c 65 6d 20 ed with AggElem
46f0: 70 45 6c 65 6d 2c 20 61 6e 20 65 6c 65 6d 65 6e pElem, an elemen
4700: 74 20 6f 66 0a 2a 2a 20 61 67 67 72 65 67 61 74 t of.** aggregat
4710: 65 20 70 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 66 e pAgg..*/.int f
4720: 72 65 65 41 67 67 45 6c 65 6d 28 41 67 67 45 6c reeAggElem(AggEl
4730: 65 6d 20 2a 70 45 6c 65 6d 2c 20 41 67 67 20 2a em *pElem, Agg *
4740: 70 41 67 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a pAgg){. int i;.
4750: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 67 for(i=0; i<pAg
4760: 67 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 g->nMem; i++){.
4770: 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 Mem *pMem = &
4780: 70 45 6c 65 6d 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a pElem->aMem[i];.
4790: 20 20 20 20 69 66 28 20 70 41 67 67 2d 3e 61 70 if( pAgg->ap
47a0: 46 75 6e 63 5b 69 5d 20 26 26 20 28 70 4d 65 6d Func[i] && (pMem
47b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 ->flags & MEM_Ag
47c0: 67 43 74 78 29 21 3d 30 20 29 7b 0a 20 20 20 20 gCtx)!=0 ){.
47d0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 sqlite3_contex
47e0: 74 20 63 74 78 3b 0a 20 20 20 20 20 20 63 74 78 t ctx;. ctx
47f0: 2e 70 46 75 6e 63 20 3d 20 70 41 67 67 2d 3e 61 .pFunc = pAgg->a
4800: 70 46 75 6e 63 5b 69 5d 3b 0a 20 20 20 20 20 20 pFunc[i];.
4810: 63 74 78 2e 73 2e 66 6c 61 67 73 20 3d 20 4d 45 ctx.s.flags = ME
4820: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 63 74 M_Null;. ct
4830: 78 2e 70 41 67 67 20 3d 20 70 4d 65 6d 2d 3e 7a x.pAgg = pMem->z
4840: 3b 0a 20 20 20 20 20 20 63 74 78 2e 63 6e 74 20 ;. ctx.cnt
4850: 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 20 20 = pMem->i;.
4860: 20 63 74 78 2e 69 73 53 74 65 70 20 3d 20 30 3b ctx.isStep = 0;
4870: 0a 20 20 20 20 20 20 63 74 78 2e 69 73 45 72 72 . ctx.isErr
4880: 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 28 2a or = 0;. (*
4890: 70 41 67 67 2d 3e 61 70 46 75 6e 63 5b 69 5d 2d pAgg->apFunc[i]-
48a0: 3e 78 46 69 6e 61 6c 69 7a 65 29 28 26 63 74 78 >xFinalize)(&ctx
48b0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a );. pMem->z
48c0: 20 3d 20 63 74 78 2e 70 41 67 67 3b 0a 20 20 20 = ctx.pAgg;.
48d0: 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 21 3d if( pMem->z!=
48e0: 30 20 26 26 20 70 4d 65 6d 2d 3e 7a 21 3d 70 4d 0 && pMem->z!=pM
48f0: 65 6d 2d 3e 7a 53 68 6f 72 74 20 29 7b 0a 20 20 em->zShort ){.
4900: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 sqliteFree
4910: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 (pMem->z);.
4920: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
4930: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 VdbeMemRelease(&
4940: 63 74 78 2e 73 29 3b 0a 20 20 20 20 7d 65 6c 73 ctx.s);. }els
4950: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 e{. sqlite3
4960: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 VdbeMemRelease(p
4970: 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a Mem);. }. }.
4980: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 45 6c sqliteFree(pEl
4990: 65 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 em);.}../*.** Re
49a0: 73 65 74 20 61 6e 20 41 67 67 20 73 74 72 75 63 set an Agg struc
49b0: 74 75 72 65 2e 20 20 44 65 6c 65 74 65 20 61 6c ture. Delete al
49c0: 6c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 0a l its contents..
49d0: 2a 2a 0a 2a 2a 20 46 6f 72 20 69 6e 73 74 61 6c **.** For instal
49e0: 6c 61 62 6c 65 20 61 67 67 72 65 67 61 74 65 20 lable aggregate
49f0: 66 75 6e 63 74 69 6f 6e 73 2c 20 69 66 20 74 68 functions, if th
4a00: 65 20 73 74 65 70 20 66 75 6e 63 74 69 6f 6e 20 e step function
4a10: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 63 61 6c 6c has been.** call
4a20: 65 64 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 ed, make sure th
4a30: 65 20 66 69 6e 61 6c 69 7a 65 72 20 66 75 6e 63 e finalizer func
4a40: 74 69 6f 6e 20 68 61 73 20 61 6c 73 6f 20 62 65 tion has also be
4a50: 65 6e 20 63 61 6c 6c 65 64 2e 20 20 54 68 65 0a en called. The.
4a60: 2a 2a 20 66 69 6e 61 6c 69 7a 65 72 20 6d 69 67 ** finalizer mig
4a70: 68 74 20 6e 65 65 64 20 74 6f 20 66 72 65 65 20 ht need to free
4a80: 6d 65 6d 6f 72 79 20 74 68 61 74 20 77 61 73 20 memory that was
4a90: 61 6c 6c 6f 63 61 74 65 64 20 61 73 20 70 61 72 allocated as par
4aa0: 74 20 6f 66 20 69 74 73 0a 2a 2a 20 70 72 69 76 t of its.** priv
4ab0: 61 74 65 20 63 6f 6e 74 65 78 74 2e 20 20 49 66 ate context. If
4ac0: 20 74 68 65 20 66 69 6e 61 6c 69 7a 65 72 20 68 the finalizer h
4ad0: 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 61 6c 6c as not been call
4ae0: 65 64 20 79 65 74 2c 20 63 61 6c 6c 20 69 74 0a ed yet, call it.
4af0: 2a 2a 20 6e 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 ** now..**.** If
4b00: 20 64 62 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 db is NULL, the
4b10: 6e 20 74 68 69 73 20 69 73 20 62 65 69 6e 67 20 n this is being
4b20: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 called from sqli
4b30: 74 65 56 64 62 65 52 65 73 65 74 28 29 2e 20 49 teVdbeReset(). I
4b40: 6e 0a 2a 2a 20 74 68 69 73 20 63 61 73 65 20 63 n.** this case c
4b50: 6c 65 61 6e 20 75 70 20 61 6c 6c 20 72 65 66 65 lean up all refe
4b60: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 74 65 rences to the te
4b70: 6d 70 2d 74 61 62 6c 65 20 75 73 65 64 20 66 6f mp-table used fo
4b80: 72 0a 2a 2a 20 61 67 67 72 65 67 61 74 65 73 20 r.** aggregates
4b90: 28 69 66 20 69 74 20 77 61 73 20 65 76 65 72 20 (if it was ever
4ba0: 6f 70 65 6e 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 49 opened)..**.** I
4bb0: 66 20 64 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c f db is not NULL
4bc0: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 62 , then this is b
4bd0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d eing called from
4be0: 20 77 69 74 68 20 61 6e 20 4f 50 5f 41 67 67 52 with an OP_AggR
4bf0: 65 73 65 74 0a 2a 2a 20 6f 70 63 6f 64 65 2e 20 eset.** opcode.
4c00: 4f 70 65 6e 20 74 68 65 20 74 65 6d 70 2d 74 61 Open the temp-ta
4c10: 62 6c 65 2c 20 69 66 20 69 74 20 68 61 73 20 6e ble, if it has n
4c20: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 ot already been
4c30: 6f 70 65 6e 65 64 20 61 6e 64 0a 2a 2a 20 64 65 opened and.** de
4c40: 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 lete the content
4c50: 73 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 s of the table u
4c60: 73 65 64 20 66 6f 72 20 61 67 67 72 65 67 61 74 sed for aggregat
4c70: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 72 e information, r
4c80: 65 61 64 79 0a 2a 2a 20 66 6f 72 20 74 68 65 20 eady.** for the
4c90: 6e 65 78 74 20 72 6f 75 6e 64 20 6f 66 20 61 67 next round of ag
4ca0: 67 72 65 67 61 74 65 20 70 72 6f 63 65 73 73 69 gregate processi
4cb0: 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 ng..*/.int sqlit
4cc0: 65 33 56 64 62 65 41 67 67 52 65 73 65 74 28 73 e3VdbeAggReset(s
4cd0: 71 6c 69 74 65 20 2a 64 62 2c 20 41 67 67 20 2a qlite *db, Agg *
4ce0: 70 41 67 67 2c 20 4b 65 79 49 6e 66 6f 20 2a 70 pAgg, KeyInfo *p
4cf0: 4b 65 79 49 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 KeyInfo){. int
4d00: 69 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b i;. int rc = 0;
4d10: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 73 . BtCursor *pCs
4d20: 72 20 3d 20 70 41 67 67 2d 3e 70 43 73 72 3b 0a r = pAgg->pCsr;.
4d30: 0a 20 20 61 73 73 65 72 74 28 20 28 70 43 73 72 . assert( (pCsr
4d40: 20 26 26 20 70 41 67 67 2d 3e 6e 54 61 62 3e 30 && pAgg->nTab>0
4d50: 29 20 7c 7c 20 28 21 70 43 73 72 20 26 26 20 70 ) || (!pCsr && p
4d60: 41 67 67 2d 3e 6e 54 61 62 3d 3d 30 29 0a 20 20 Agg->nTab==0).
4d70: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 || sqlite
4d80: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 3_malloc_failed
4d90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 43 73 72 );.. /* If pCsr
4da0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 is not NULL, th
4db0: 65 6e 20 74 68 65 20 74 61 62 6c 65 20 75 73 65 en the table use
4dc0: 64 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 d for aggregate
4dd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 20 20 2a 2a information. **
4de0: 20 69 73 20 6f 70 65 6e 2e 20 4c 6f 6f 70 20 74 is open. Loop t
4df0: 68 72 6f 75 67 68 20 69 74 20 61 6e 64 20 66 72 hrough it and fr
4e00: 65 65 20 74 68 65 20 41 67 67 45 6c 65 6d 2a 20 ee the AggElem*
4e10: 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 structure pointe
4e20: 64 20 61 74 0a 20 20 2a 2a 20 62 79 20 65 61 63 d at. ** by eac
4e30: 68 20 65 6e 74 72 79 2e 20 49 66 20 74 68 65 20 h entry. If the
4e40: 66 69 6e 61 6c 69 7a 65 72 20 68 61 73 20 6e 6f finalizer has no
4e50: 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 66 6f t been called fo
4e60: 72 20 61 6e 20 41 67 67 45 6c 65 6d 2c 0a 20 20 r an AggElem,.
4e70: 2a 2a 20 64 6f 20 74 68 61 74 20 74 6f 6f 2e 20 ** do that too.
4e80: 46 69 6e 61 6c 6c 79 2c 20 63 6c 65 61 72 20 74 Finally, clear t
4e90: 68 65 20 62 74 72 65 65 20 74 61 62 6c 65 20 69 he btree table i
4ea0: 74 73 65 6c 66 2e 0a 20 20 2a 2f 0a 20 20 69 66 tself.. */. if
4eb0: 28 20 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e ( pCsr ){. in
4ec0: 74 20 72 65 73 3b 0a 20 20 20 20 61 73 73 65 72 t res;. asser
4ed0: 74 28 20 70 41 67 67 2d 3e 70 42 74 72 65 65 20 t( pAgg->pBtree
4ee0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 );. assert( p
4ef0: 41 67 67 2d 3e 6e 54 61 62 3e 30 20 29 3b 0a 0a Agg->nTab>0 );..
4f00: 20 20 20 20 72 63 3d 73 71 6c 69 74 65 33 42 74 rc=sqlite3Bt
4f10: 72 65 65 46 69 72 73 74 28 70 43 73 72 2c 20 26 reeFirst(pCsr, &
4f20: 72 65 73 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 res);. while(
4f30: 20 72 65 73 3d 3d 30 20 26 26 20 72 63 3d 3d 53 res==0 && rc==S
4f40: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
4f50: 20 20 41 67 67 45 6c 65 6d 20 2a 70 45 6c 65 6d AggElem *pElem
4f60: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c ;. rc = sql
4f70: 69 74 65 33 42 74 72 65 65 44 61 74 61 28 70 43 ite3BtreeData(pC
4f80: 73 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41 67 sr, 0, sizeof(Ag
4f90: 67 45 6c 65 6d 2a 29 2c 20 28 63 68 61 72 20 2a gElem*), (char *
4fa0: 29 26 70 45 6c 65 6d 29 3b 0a 20 20 20 20 20 20 )&pElem);.
4fb0: 69 66 28 20 72 65 73 21 3d 53 51 4c 49 54 45 5f if( res!=SQLITE_
4fc0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 OK ){. re
4fd0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d turn rc;. }
4fe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
4ff0: 41 67 67 2d 3e 61 70 46 75 6e 63 21 3d 30 20 29 Agg->apFunc!=0 )
5000: 3b 0a 20 20 20 20 20 20 66 72 65 65 41 67 67 45 ;. freeAggE
5010: 6c 65 6d 28 70 45 6c 65 6d 2c 20 70 41 67 67 29 lem(pElem, pAgg)
5020: 3b 0a 20 20 20 20 20 20 72 63 3d 73 71 6c 69 74 ;. rc=sqlit
5030: 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 73 72 e3BtreeNext(pCsr
5040: 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 , &res);. }.
5050: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
5060: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 E_OK ){. re
5070: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a turn rc;. }..
5080: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 sqlite3Btree
5090: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 73 72 CloseCursor(pCsr
50a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 );. sqlite3Bt
50b0: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 41 reeClearTable(pA
50c0: 67 67 2d 3e 70 42 74 72 65 65 2c 20 70 41 67 67 gg->pBtree, pAgg
50d0: 2d 3e 6e 54 61 62 29 3b 0a 20 20 7d 65 6c 73 65 ->nTab);. }else
50e0: 7b 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 75 { . /* The cu
50f0: 72 73 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 rsor may not be
5100: 6f 70 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 open because the
5110: 20 61 67 67 72 65 67 61 74 6f 72 20 77 61 73 20 aggregator was
5120: 6e 65 76 65 72 20 75 73 65 64 2c 0a 20 20 20 20 never used,.
5130: 2a 2a 20 6f 72 20 69 74 20 63 6f 75 6c 64 20 62 ** or it could b
5140: 65 20 74 68 61 74 20 69 74 20 77 61 73 20 75 73 e that it was us
5150: 65 64 20 62 75 74 20 74 68 65 72 65 20 77 61 73 ed but there was
5160: 20 6e 6f 20 47 52 4f 55 50 20 42 59 20 63 6c 61 no GROUP BY cla
5170: 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 use.. */.
5180: 69 66 28 20 70 41 67 67 2d 3e 70 43 75 72 72 65 if( pAgg->pCurre
5190: 6e 74 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 nt ){. free
51a0: 41 67 67 45 6c 65 6d 28 70 41 67 67 2d 3e 70 43 AggElem(pAgg->pC
51b0: 75 72 72 65 6e 74 2c 20 70 41 67 67 29 3b 0a 20 urrent, pAgg);.
51c0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 }. }.. /* I
51d0: 66 20 64 62 20 69 73 20 6e 6f 74 20 4e 55 4c 4c f db is not NULL
51e0: 20 61 6e 64 20 77 65 20 68 61 76 65 20 6e 6f 74 and we have not
51f0: 20 79 65 74 20 61 6e 64 20 77 65 20 68 61 76 65 yet and we have
5200: 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 65 64 0a not yet opened.
5210: 20 20 2a 2a 20 74 68 65 20 74 65 6d 70 6f 72 61 ** the tempora
5220: 72 79 20 62 74 72 65 65 20 74 68 65 6e 20 64 6f ry btree then do
5230: 20 73 6f 20 61 6e 64 20 63 72 65 61 74 65 20 74 so and create t
5240: 68 65 20 74 61 62 6c 65 20 74 6f 20 73 74 6f 72 he table to stor
5250: 65 20 61 67 67 72 65 67 61 74 65 0a 20 20 2a 2a e aggregate. **
5260: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 information..
5270: 2a 2a 0a 20 20 2a 2a 20 49 66 20 64 62 20 69 73 **. ** If db is
5280: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 6c 6f 73 NULL, then clos
5290: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 e the temporary
52a0: 62 74 72 65 65 20 69 66 20 69 74 20 69 73 20 6f btree if it is o
52b0: 70 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 pen.. */. if(
52c0: 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 db ){. if( !p
52d0: 41 67 67 2d 3e 70 42 74 72 65 65 20 29 7b 0a 20 Agg->pBtree ){.
52e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 assert( pAg
52f0: 67 2d 3e 6e 54 61 62 3d 3d 30 20 29 3b 0a 20 20 g->nTab==0 );.
5300: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
5310: 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c BtreeFactory(db,
5320: 20 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 30 2c 20 ":memory:", 0,
5330: 54 45 4d 50 5f 50 41 47 45 53 2c 20 26 70 41 67 TEMP_PAGES, &pAg
5340: 67 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 20 20 g->pBtree);.
5350: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
5360: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b _OK ) return rc;
5370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 . sqlite3Bt
5380: 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70 41 reeBeginTrans(pA
5390: 67 67 2d 3e 70 42 74 72 65 65 2c 20 31 2c 20 30 gg->pBtree, 1, 0
53a0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 );. rc = sq
53b0: 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 lite3BtreeCreate
53c0: 54 61 62 6c 65 28 70 41 67 67 2d 3e 70 42 74 72 Table(pAgg->pBtr
53d0: 65 65 2c 20 26 70 41 67 67 2d 3e 6e 54 61 62 2c ee, &pAgg->nTab,
53e0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 0);. if( r
53f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 c!=SQLITE_OK ) r
5400: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a eturn rc;. }.
5410: 20 20 20 20 61 73 73 65 72 74 28 20 70 41 67 67 assert( pAgg
5420: 2d 3e 6e 54 61 62 21 3d 30 20 29 3b 0a 0a 20 20 ->nTab!=0 );..
5430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 rc = sqlite3Bt
5440: 72 65 65 43 75 72 73 6f 72 28 70 41 67 67 2d 3e reeCursor(pAgg->
5450: 70 42 74 72 65 65 2c 20 70 41 67 67 2d 3e 6e 54 pBtree, pAgg->nT
5460: 61 62 2c 20 31 2c 0a 20 20 20 20 20 20 20 20 73 ab, 1,. s
5470: 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 qlite3VdbeRecord
5480: 43 6f 6d 70 61 72 65 2c 20 70 4b 65 79 49 6e 66 Compare, pKeyInf
5490: 6f 2c 20 26 70 41 67 67 2d 3e 70 43 73 72 29 3b o, &pAgg->pCsr);
54a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
54b0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 ITE_OK ) return
54c0: 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 rc;. }else{.
54d0: 20 69 66 28 20 70 41 67 67 2d 3e 70 42 74 72 65 if( pAgg->pBtre
54e0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 e ){. sqlit
54f0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 41 67 e3BtreeClose(pAg
5500: 67 2d 3e 70 42 74 72 65 65 29 3b 0a 20 20 20 20 g->pBtree);.
5510: 20 20 70 41 67 67 2d 3e 70 42 74 72 65 65 20 3d pAgg->pBtree =
5520: 20 30 3b 0a 20 20 20 20 20 20 70 41 67 67 2d 3e 0;. pAgg->
5530: 6e 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 7d 0a nTab = 0;. }.
5540: 20 20 20 20 70 41 67 67 2d 3e 70 43 73 72 20 3d pAgg->pCsr =
5550: 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 0;. }.. if( p
5560: 41 67 67 2d 3e 61 70 46 75 6e 63 20 29 7b 20 0a Agg->apFunc ){ .
5570: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 sqliteFree(p
5580: 41 67 67 2d 3e 61 70 46 75 6e 63 29 3b 0a 20 20 Agg->apFunc);.
5590: 20 20 70 41 67 67 2d 3e 61 70 46 75 6e 63 20 3d pAgg->apFunc =
55a0: 20 30 3b 0a 20 20 7d 0a 20 20 70 41 67 67 2d 3e 0;. }. pAgg->
55b0: 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20 pCurrent = 0;.
55c0: 70 41 67 67 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a pAgg->nMem = 0;.
55d0: 20 20 70 41 67 67 2d 3e 73 65 61 72 63 68 69 6e pAgg->searchin
55e0: 67 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 g = 0;. return
55f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f SQLITE_OK;.}.../
5600: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 6b 65 *.** Delete a ke
5610: 79 6c 69 73 74 0a 2a 2f 0a 76 6f 69 64 20 73 71 ylist.*/.void sq
5620: 6c 69 74 65 33 56 64 62 65 4b 65 79 6c 69 73 74 lite3VdbeKeylist
5630: 46 72 65 65 28 4b 65 79 6c 69 73 74 20 2a 70 29 Free(Keylist *p)
5640: 7b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a {. while( p ){.
5650: 20 20 20 20 4b 65 79 6c 69 73 74 20 2a 70 4e 65 Keylist *pNe
5660: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 xt = p->pNext;.
5670: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 29 sqliteFree(p)
5680: 3b 0a 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b ;. p = pNext;
5690: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c . }.}../*.** Cl
56a0: 6f 73 65 20 61 20 63 75 72 73 6f 72 20 61 6e 64 ose a cursor and
56b0: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 release all the
56c0: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 resources that
56d0: 63 75 72 73 6f 72 20 68 61 70 70 65 6e 73 0a 2a cursor happens.*
56e0: 2a 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f * to hold..*/.vo
56f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 id sqlite3VdbeFr
5700: 65 65 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20 eeCursor(Cursor
5710: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 *pCx){. if( pCx
5720: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ==0 ){. retur
5730: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 78 n;. }. if( pCx
5740: 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 ->pCursor ){.
5750: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f sqlite3BtreeClo
5760: 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 seCursor(pCx->pC
5770: 75 72 73 6f 72 29 3b 0a 20 20 7d 0a 20 20 69 66 ursor);. }. if
5780: 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 ( pCx->pBt ){.
5790: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c sqlite3BtreeCl
57a0: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 ose(pCx->pBt);.
57b0: 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 }. sqliteFree(
57c0: 70 43 78 2d 3e 70 44 61 74 61 29 3b 0a 20 20 73 pCx->pData);. s
57d0: 71 6c 69 74 65 46 72 65 65 28 70 43 78 2d 3e 61 qliteFree(pCx->a
57e0: 54 79 70 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 Type);. sqliteF
57f0: 72 65 65 28 70 43 78 29 3b 0a 7d 0a 0a 2f 2a 0a ree(pCx);.}../*.
5800: 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 ** Close all cur
5810: 73 6f 72 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 sors.*/.static v
5820: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 oid closeAllCurs
5830: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ors(Vdbe *p){.
5840: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 int i;. for(i=0
5850: 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 ; i<p->nCursor;
5860: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 i++){. sqlite
5870: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 3VdbeFreeCursor(
5880: 70 2d 3e 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 p->apCsr[i]);.
5890: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 }. sqliteFree(p
58a0: 2d 3e 61 70 43 73 72 29 3b 0a 20 20 70 2d 3e 61 ->apCsr);. p->a
58b0: 70 43 73 72 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e pCsr = 0;. p->n
58c0: 43 75 72 73 6f 72 20 3d 20 30 3b 0a 7d 0a 0a 2f Cursor = 0;.}../
58d0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 *.** Clean up th
58e0: 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 e VM after execu
58f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 tion..**.** This
5900: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 routine will au
5910: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 tomatically clos
5920: 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c e any cursors, l
5930: 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 ists, and/or.**
5940: 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 sorters that wer
5950: 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 e left open. It
5960: 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 also deletes th
5970: 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 e values of.** v
5980: 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 ariables in the
5990: 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f aVar[] array..*/
59a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 .static void Cle
59b0: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 anup(Vdbe *p){.
59c0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d int i;. if( p-
59d0: 3e 61 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 4d >aStack ){. M
59e0: 65 6d 20 2a 70 54 6f 73 20 3d 20 70 2d 3e 70 54 em *pTos = p->pT
59f0: 6f 73 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 os;. while( p
5a00: 54 6f 73 3e 3d 70 2d 3e 61 53 74 61 63 6b 20 29 Tos>=p->aStack )
5a10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 {. sqlite3V
5a20: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 54 dbeMemRelease(pT
5a30: 6f 73 29 3b 0a 20 20 20 20 20 20 70 54 6f 73 2d os);. pTos-
5a40: 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e -;. }. p->
5a50: 70 54 6f 73 20 3d 20 70 54 6f 73 3b 0a 20 20 7d pTos = pTos;. }
5a60: 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f . closeAllCurso
5a70: 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e rs(p);. if( p->
5a80: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 aMem ){. for(
5a90: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 i=0; i<p->nMem;
5aa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 i++){. sqli
5ab0: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
5ac0: 65 28 26 70 2d 3e 61 4d 65 6d 5b 69 5d 29 3b 0a e(&p->aMem[i]);.
5ad0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 }. }. sqli
5ae0: 74 65 46 72 65 65 28 70 2d 3e 61 4d 65 6d 29 3b teFree(p->aMem);
5af0: 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 30 3b 0a . p->aMem = 0;.
5b00: 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 30 3b 0a 20 p->nMem = 0;.
5b10: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b if( p->pList ){
5b20: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
5b30: 4b 65 79 6c 69 73 74 46 72 65 65 28 70 2d 3e 70 KeylistFree(p->p
5b40: 4c 69 73 74 29 3b 0a 20 20 20 20 70 2d 3e 70 4c List);. p->pL
5b50: 69 73 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 ist = 0;. }. s
5b60: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72 qlite3VdbeSorter
5b70: 52 65 73 65 74 28 70 29 3b 0a 20 20 69 66 28 20 Reset(p);. if(
5b80: 70 2d 3e 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 p->pFile ){.
5b90: 69 66 28 20 70 2d 3e 70 46 69 6c 65 21 3d 73 74 if( p->pFile!=st
5ba0: 64 69 6e 20 29 20 66 63 6c 6f 73 65 28 70 2d 3e din ) fclose(p->
5bb0: 70 46 69 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 70 pFile);. p->p
5bc0: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 File = 0;. }.
5bd0: 69 66 28 20 70 2d 3e 61 7a 46 69 65 6c 64 20 29 if( p->azField )
5be0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 {. sqliteFree
5bf0: 28 70 2d 3e 61 7a 46 69 65 6c 64 29 3b 0a 20 20 (p->azField);.
5c00: 20 20 70 2d 3e 61 7a 46 69 65 6c 64 20 3d 20 30 p->azField = 0
5c10: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 46 69 65 6c ;. }. p->nFiel
5c20: 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e d = 0;. if( p->
5c30: 7a 4c 69 6e 65 20 29 7b 0a 20 20 20 20 73 71 6c zLine ){. sql
5c40: 69 74 65 46 72 65 65 28 70 2d 3e 7a 4c 69 6e 65 iteFree(p->zLine
5c50: 29 3b 0a 20 20 20 20 70 2d 3e 7a 4c 69 6e 65 20 );. p->zLine
5c60: 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4c = 0;. }. p->nL
5c70: 69 6e 65 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 ineAlloc = 0;.
5c80: 73 71 6c 69 74 65 33 56 64 62 65 41 67 67 52 65 sqlite3VdbeAggRe
5c90: 73 65 74 28 30 2c 20 26 70 2d 3e 61 67 67 2c 20 set(0, &p->agg,
5ca0: 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6b 65 79 0);. if( p->key
5cb0: 6c 69 73 74 53 74 61 63 6b 20 29 7b 0a 20 20 20 listStack ){.
5cc0: 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 66 6f 72 int ii;. for
5cd0: 28 69 69 20 3d 20 30 3b 20 69 69 20 3c 20 70 2d (ii = 0; ii < p-
5ce0: 3e 6b 65 79 6c 69 73 74 53 74 61 63 6b 44 65 70 >keylistStackDep
5cf0: 74 68 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 th; ii++){.
5d00: 20 73 71 6c 69 74 65 33 56 64 62 65 4b 65 79 6c sqlite3VdbeKeyl
5d10: 69 73 74 46 72 65 65 28 70 2d 3e 6b 65 79 6c 69 istFree(p->keyli
5d20: 73 74 53 74 61 63 6b 5b 69 69 5d 29 3b 0a 20 20 stStack[ii]);.
5d30: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 }. sqliteFr
5d40: 65 65 28 70 2d 3e 6b 65 79 6c 69 73 74 53 74 61 ee(p->keylistSta
5d50: 63 6b 29 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c ck);. p->keyl
5d60: 69 73 74 53 74 61 63 6b 44 65 70 74 68 20 3d 20 istStackDepth =
5d70: 30 3b 0a 20 20 20 20 70 2d 3e 6b 65 79 6c 69 73 0;. p->keylis
5d80: 74 53 74 61 63 6b 20 3d 20 30 3b 0a 20 20 7d 0a tStack = 0;. }.
5d90: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e sqliteFree(p->
5da0: 63 6f 6e 74 65 78 74 53 74 61 63 6b 29 3b 0a 20 contextStack);.
5db0: 20 70 2d 3e 63 6f 6e 74 65 78 74 53 74 61 63 6b p->contextStack
5dc0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 = 0;. sqliteFr
5dd0: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a ee(p->zErrMsg);.
5de0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 p->zErrMsg = 0
5df0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 ;.}../*.** Set t
5e00: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 he number of res
5e10: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 ult columns that
5e20: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 will be returne
5e30: 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a d by this SQL.**
5e40: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 statement. This
5e50: 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 is now set at c
5e60: 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 ompile time, rat
5e70: 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a her than during.
5e80: 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 ** execution of
5e90: 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d the vdbe program
5ea0: 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 so that sqlite3
5eb0: 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 _column_count()
5ec0: 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 can.** be called
5ed0: 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 on an SQL state
5ee0: 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 ment before sqli
5ef0: 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 te3_step()..*/.v
5f00: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 oid sqlite3VdbeS
5f10: 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a etNumCols(Vdbe *
5f20: 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d p, int nResColum
5f30: 6e 29 7b 0a 20 20 61 73 73 65 72 74 28 20 30 3d n){. assert( 0=
5f40: 3d 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 =p->nResColumn )
5f50: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d ;. p->nResColum
5f60: 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a n = nResColumn;.
5f70: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 }../*.** Set the
5f80: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 name of the idx
5f90: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 'th column to be
5fa0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 returned by the
5fb0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a SQL statement..
5fc0: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 ** zName must be
5fd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 a pointer to a
5fe0: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 nul terminated s
5ff0: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 tring..**.** Thi
6000: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d s call must be m
6010: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c ade after a call
6020: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 to sqlite3VdbeS
6030: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a etNumCols()..**.
6040: 2a 2a 20 49 66 20 4e 3d 3d 50 33 5f 53 54 41 54 ** If N==P3_STAT
6050: 49 43 20 20 69 74 20 6d 65 61 6e 73 20 74 68 61 IC it means tha
6060: 74 20 7a 4e 61 6d 65 20 69 73 20 61 20 70 6f 69 t zName is a poi
6070: 6e 74 65 72 20 74 6f 20 61 20 63 6f 6e 73 74 61 nter to a consta
6080: 6e 74 20 73 74 61 74 69 63 0a 2a 2a 20 73 74 72 nt static.** str
6090: 69 6e 67 20 61 6e 64 20 77 65 20 63 61 6e 20 6a ing and we can j
60a0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 ust copy the poi
60b0: 6e 74 65 72 2e 20 49 66 20 69 74 20 69 73 20 50 nter. If it is P
60c0: 33 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 3_DYNAMIC, then
60d0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 .** the string i
60e0: 73 20 66 72 65 65 64 20 75 73 69 6e 67 20 73 71 s freed using sq
60f0: 6c 69 74 65 46 72 65 65 28 29 20 77 68 65 6e 20 liteFree() when
6100: 74 68 65 20 76 64 62 65 20 69 73 20 66 69 6e 69 the vdbe is fini
6110: 73 68 65 64 20 77 69 74 68 0a 2a 2a 20 69 74 2e shed with.** it.
6120: 20 4f 74 68 65 72 77 69 73 65 2c 20 4e 20 62 79 Otherwise, N by
6130: 74 65 73 20 6f 66 20 7a 4e 61 6d 65 20 61 72 65 tes of zName are
6140: 20 63 6f 70 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 copied..*/.int
6150: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f sqlite3VdbeSetCo
6160: 6c 4e 61 6d 65 28 56 64 62 65 20 2a 70 2c 20 69 lName(Vdbe *p, i
6170: 6e 74 20 69 64 78 2c 20 63 6f 6e 73 74 20 63 68 nt idx, const ch
6180: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 4e ar *zName, int N
6190: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d ){. int rc;. M
61a0: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 em *pColName;.
61b0: 61 73 73 65 72 74 28 20 69 64 78 3c 28 32 2a 70 assert( idx<(2*p
61c0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 29 20 29 3b ->nResColumn) );
61d0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 64 .. /* If the Vd
61e0: 62 65 2e 61 43 6f 6c 4e 61 6d 65 20 61 72 72 61 be.aColName arra
61f0: 79 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 y has not yet be
6200: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c en allocated, al
6210: 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 69 74 20 6e locate. ** it n
6220: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 ow.. */. if( !
6230: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 29 7b 0a 20 p->aColName ){.
6240: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 2d int i;. p-
6250: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d >aColName = (Mem
6260: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 *)sqliteMalloc(
6270: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 70 2d 3e 6e sizeof(Mem)*p->n
6280: 52 65 73 43 6f 6c 75 6d 6e 2a 32 29 3b 0a 20 20 ResColumn*2);.
6290: 20 20 69 66 28 20 21 70 2d 3e 61 43 6f 6c 4e 61 if( !p->aColNa
62a0: 6d 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 me ){. retu
62b0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b rn SQLITE_NOMEM;
62c0: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 . }. for(i
62d0: 3d 30 3b 20 69 3c 28 32 2a 70 2d 3e 6e 52 65 73 =0; i<(2*p->nRes
62e0: 43 6f 6c 75 6d 6e 29 3b 20 69 2b 2b 29 7b 0a 20 Column); i++){.
62f0: 20 20 20 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 p->aColName
6300: 5b 69 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f [i].flags = MEM_
6310: 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a Null;. }. }.
6320: 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 . pColName = &(
6330: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 5d p->aColName[idx]
6340: 29 3b 0a 20 20 69 66 28 20 4e 3d 3d 50 33 5f 44 );. if( N==P3_D
6350: 59 4e 41 4d 49 43 20 7c 7c 20 4e 3d 3d 50 33 5f YNAMIC || N==P3_
6360: 53 54 41 54 49 43 20 29 7b 0a 20 20 20 20 72 63 STATIC ){. rc
6370: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 = sqlite3VdbeMe
6380: 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 mSetStr(pColName
6390: 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c , zName, -1, SQL
63a0: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 ITE_UTF8, SQLITE
63b0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 _STATIC);. }els
63c0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 e{. rc = sqli
63d0: 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 te3VdbeMemSetStr
63e0: 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 (pColName, zName
63f0: 2c 20 4e 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 , N, SQLITE_UTF8
6400: 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e ,SQLITE_TRANSIEN
6410: 54 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 T);. }. if( rc
6420: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 4e ==SQLITE_OK && N
6430: 3d 3d 50 33 5f 44 59 4e 41 4d 49 43 20 29 7b 0a ==P3_DYNAMIC ){.
6440: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c pColName->fl
6450: 61 67 73 20 3d 20 28 70 43 6f 6c 4e 61 6d 65 2d ags = (pColName-
6460: 3e 66 6c 61 67 73 26 28 7e 4d 45 4d 5f 53 74 61 >flags&(~MEM_Sta
6470: 74 69 63 29 29 7c 4d 45 4d 5f 44 79 6e 3b 0a 20 tic))|MEM_Dyn;.
6480: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 78 44 65 pColName->xDe
6490: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 l = 0;. }. ret
64a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
64b0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 A read or write
64c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 transaction may
64d0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 or may not be a
64e0: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 ctive on databas
64f0: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 e handle.** db.
6500: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e If a transaction
6510: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d is active, comm
6520: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 it it. If there
6530: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 is a.** write-tr
6540: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 ansaction spanni
6550: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 ng more than one
6560: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 database file,
6570: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 this routine.**
6580: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 takes care of th
6590: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
65a0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 trickery..*/.st
65b0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d atic int vdbeCom
65c0: 6d 69 74 28 73 71 6c 69 74 65 20 2a 64 62 29 7b mit(sqlite *db){
65d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 . int i;. int
65e0: 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 nTrans = 0; /*
65f0: 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 Number of databa
6600: 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 ses with an acti
6610: 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 ve write-transac
6620: 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 tion */. int rc
6630: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
6640: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 int needXcommit
6650: 3d 20 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b = 0;.. for(i=0;
6660: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 i<db->nDb; i++)
6670: 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 { . Btree *pB
6680: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 t = db->aDb[i].p
6690: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 Bt;. if( pBt
66a0: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 && sqlite3BtreeI
66b0: 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b sInTrans(pBt) ){
66c0: 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d . needXcomm
66d0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 it = 1;. if
66e0: 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b ( i!=1 ) nTrans+
66f0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 +;. }. }..
6700: 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 /* If there are
6710: 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 any write-transa
6720: 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 ctions at all, i
6730: 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 nvoke the commit
6740: 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e hook */. if( n
6750: 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 eedXcommit && db
6760: 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 ->xCommitCallbac
6770: 6b 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d k ){. if( db-
6780: 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b >xCommitCallback
6790: 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 (db->pCommitArg)
67a0: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){. return
67b0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
67c0: 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 NT;. }. }..
67d0: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 /* The simple c
67e0: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 ase - no more th
67f0: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 an one database
6800: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 file (not counti
6810: 6e 67 20 74 68 65 20 54 45 4d 50 0a 20 20 2a 2a ng the TEMP. **
6820: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 database) has a
6830: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 transaction act
6840: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 ive. There is
6850: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a no need for the.
6860: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 ** master-jour
6870: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 69 nal.. **. ** i
6880: 66 20 64 62 2d 3e 6e 4d 61 73 74 65 72 3d 3d 30 f db->nMaster==0
6890: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d , it means the m
68a0: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 ain database is
68b0: 3a 6d 65 6d 6f 72 79 3a 2e 20 20 49 6e 20 74 68 :memory:. In th
68c0: 61 74 20 63 61 73 65 0a 20 20 2a 2a 20 77 65 20 at case. ** we
68d0: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 do not support a
68e0: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 tomic multi-file
68f0: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 commits, so use
6900: 20 74 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 the simple case
6910: 20 74 68 65 6e 0a 20 20 2a 2a 20 74 6f 6f 2e 0a then. ** too..
6920: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e */. if( db->n
6930: 4d 61 73 74 65 72 3c 3d 30 20 7c 7c 20 6e 54 72 Master<=0 || nTr
6940: 61 6e 73 3c 3d 31 20 29 7b 0a 20 20 20 20 66 6f ans<=1 ){. fo
6950: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 r(i=0; rc==SQLIT
6960: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 E_OK && i<db->nD
6970: 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 b; i++){ .
6980: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d Btree *pBt = db-
6990: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 >aDb[i].pBt;.
69a0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 if( pBt ){.
69b0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
69c0: 65 33 42 74 72 65 65 53 79 6e 63 28 70 42 74 2c e3BtreeSync(pBt,
69d0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0);. }.
69e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 }.. /* Do th
69f0: 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 e commit only if
6a00: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 all databases s
6a10: 75 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 uccessfully sync
6a20: 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 ed */. if( rc
6a30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
6a40: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c for(i=0; i<
6a50: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 db->nDb; i++){.
6a60: 20 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 Btree *pB
6a70: 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 t = db->aDb[i].p
6a80: 42 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 Bt;. if(
6a90: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 pBt ){.
6aa0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d sqlite3BtreeCom
6ab0: 6d 69 74 28 70 42 74 29 3b 0a 20 20 20 20 20 20 mit(pBt);.
6ac0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
6ad0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 }. }.. /* The
6ae0: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 complex case - T
6af0: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d here is a multi-
6b00: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 file write-trans
6b10: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 action active..
6b20: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 ** This require
6b30: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e s a master journ
6b40: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 al file to ensur
6b50: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f e the transactio
6b60: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 n is. ** commit
6b70: 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 ted atomicly..
6b80: 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 63 */. else{. c
6b90: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 har *zMaster = 0
6ba0: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 ; /* File-name
6bb0: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 for the master
6bc0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 journal */. c
6bd0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e har const *zMain
6be0: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 File = sqlite3Bt
6bf0: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 reeGetFilename(d
6c00: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a b->aDb[0].pBt);.
6c10: 20 20 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 OsFile maste
6c20: 72 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 r;.. /* Selec
6c30: 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e t a master journ
6c40: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a al file name */.
6c50: 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 do {. u
6c60: 33 32 20 72 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 32 random;.
6c70: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 sqliteFree(zMas
6c80: 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 ter);. sqli
6c90: 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 te3Randomness(si
6ca0: 7a 65 6f 66 28 72 61 6e 64 6f 6d 29 2c 20 26 72 zeof(random), &r
6cb0: 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d andom);. zM
6cc0: 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d aster = sqlite3M
6cd0: 50 72 69 6e 74 66 28 22 25 73 2d 6d 6a 25 30 38 Printf("%s-mj%08
6ce0: 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 72 X", zMainFile, r
6cf0: 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 66 66 andom&0x7fffffff
6d00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 7a 4d );. if( !zM
6d10: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 aster ){.
6d20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e return SQLITE_N
6d30: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 OMEM;. }.
6d40: 20 20 7d 77 68 69 6c 65 28 20 73 71 6c 69 74 65 }while( sqlite
6d50: 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 3OsFileExists(zM
6d60: 61 73 74 65 72 29 20 29 3b 0a 0a 20 20 20 20 2f aster) );.. /
6d70: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 * Open the maste
6d80: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 r journal. */.
6d90: 20 20 61 73 73 65 72 74 28 20 73 74 72 6c 65 6e assert( strlen
6da0: 28 7a 4d 61 73 74 65 72 29 3c 64 62 2d 3e 6e 4d (zMaster)<db->nM
6db0: 61 73 74 65 72 20 29 3b 0a 20 20 20 20 72 63 20 aster );. rc
6dc0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 = sqlite3OsOpenE
6dd0: 78 63 6c 75 73 69 76 65 28 7a 4d 61 73 74 65 72 xclusive(zMaster
6de0: 2c 20 26 6d 61 73 74 65 72 2c 20 30 29 3b 0a 20 , &master, 0);.
6df0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
6e00: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 E_OK ){. sq
6e10: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 liteFree(zMaster
6e20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
6e30: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 rc;. }. .
6e40: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d /* Write the nam
6e50: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 e of each databa
6e60: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 se file in the t
6e70: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 ransaction into
6e80: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d the new. ** m
6e90: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
6ea0: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 le. If an error
6eb0: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 occurs at this p
6ec0: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a oint close. *
6ed0: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 * and delete the
6ee0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
6ef0: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e file. All the in
6f00: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c dividual journal
6f10: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 files. ** st
6f20: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 ill have 'null'
6f30: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f as the master jo
6f40: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 urnal pointer, s
6f50: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c o they will roll
6f60: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 . ** back ind
6f70: 65 70 65 6e 64 61 6e 74 6c 79 20 69 66 20 61 20 ependantly if a
6f80: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a failure occurs..
6f90: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 */. for(i
6fa0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 =0; i<db->nDb; i
6fb0: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 ++){ . Btre
6fc0: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 e *pBt = db->aDb
6fd0: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 [i].pBt;. i
6fe0: 66 28 20 69 3d 3d 31 20 29 20 63 6f 6e 74 69 6e f( i==1 ) contin
6ff0: 75 65 3b 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 ue; /* Ignore
7000: 74 68 65 20 54 45 4d 50 20 64 61 74 61 62 61 73 the TEMP databas
7010: 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 e */. if( p
7020: 42 74 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 Bt && sqlite3Btr
7030: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 eeIsInTrans(pBt)
7040: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 ){. char
7050: 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 const *zFile =
7060: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a sqlite3BtreeGetJ
7070: 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b ournalname(pBt);
7080: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 . if( zFi
7090: 6c 65 5b 30 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 le[0]==0 ) conti
70a0: 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 nue; /* Ignore
70b0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 :memory: databas
70c0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 es */. rc
70d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 = sqlite3OsWrit
70e0: 65 28 26 6d 61 73 74 65 72 2c 20 7a 46 69 6c 65 e(&master, zFile
70f0: 2c 20 73 74 72 6c 65 6e 28 7a 46 69 6c 65 29 2b , strlen(zFile)+
7100: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 1);. if(
7110: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
7120: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
7130: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 e3OsClose(&maste
7140: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 r);. sq
7150: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d lite3OsDelete(zM
7160: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 aster);.
7170: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 sqliteFree(zMa
7180: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 ster);.
7190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 return rc;.
71a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
71b0: 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 53 79 6e }... /* Syn
71c0: 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 c the master jou
71d0: 72 6e 61 6c 20 66 69 6c 65 2e 20 42 65 66 6f 72 rnal file. Befor
71e0: 65 20 64 6f 69 6e 67 20 74 68 69 73 2c 20 6f 70 e doing this, op
71f0: 65 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 en the directory
7200: 0a 20 20 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 . ** the mast
7210: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 er journal file
7220: 69 73 20 73 74 6f 72 65 20 69 6e 20 73 6f 20 74 is store in so t
7230: 68 61 74 20 69 74 20 67 65 74 73 20 73 79 6e 63 hat it gets sync
7240: 65 64 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 ed too.. */.
7250: 20 20 20 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 zMainFile = s
7260: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 44 69 qlite3BtreeGetDi
7270: 72 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d rname(db->aDb[0]
7280: 2e 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 .pBt);. rc =
7290: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 sqlite3OsOpenDir
72a0: 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c 65 ectory(zMainFile
72b0: 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 20 20 , &master);.
72c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
72d0: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 K ){. sqlit
72e0: 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 e3OsClose(&maste
72f0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 r);. sqlite
7300: 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 3OsDelete(zMaste
7310: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 r);. sqlite
7320: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 Free(zMaster);.
7330: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
7340: 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 }. rc = s
7350: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 6d 61 qlite3OsSync(&ma
7360: 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 ster);. if( r
7370: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c!=SQLITE_OK ){.
7380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 sqlite3OsC
7390: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 lose(&master);.
73a0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 sqliteFree(
73b0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 zMaster);.
73c0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d return rc;. }
73d0: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c .. /* Sync al
73e0: 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 l the db files i
73f0: 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 nvolved in the t
7400: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 ransaction. The
7410: 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a same call. **
7420: 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 sets the master
7430: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 journal pointer
7440: 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 in each individ
7450: 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a ual journal. If.
7460: 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 ** an error
7470: 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 occurs here, do
7480: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d not delete the m
7490: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
74a0: 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a le.. **. *
74b0: 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f * If the error o
74c0: 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 ccurs during the
74d0: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 first call to s
74e0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 qlite3BtreeSync(
74f0: 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 ),. ** then t
7500: 68 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 here is a chance
7510: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 that the master
7520: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 journal file wi
7530: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6f 72 70 ll be. ** orp
7540: 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 haned. But we ca
7550: 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 20 nnot delete it,
7560: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 in case the mast
7570: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a er journal. *
7580: 2a 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 * file name was
7590: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 written into the
75a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 journal file be
75b0: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 fore the failure
75c0: 0a 20 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 2e . ** occured.
75d0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 . */. for(
75e0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 i=0; i<db->nDb;
75f0: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 i++){ . Btr
7600: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
7610: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 b[i].pBt;.
7620: 69 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 if( pBt && sqlit
7630: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 e3BtreeIsInTrans
7640: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 (pBt) ){.
7650: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc = sqlite3Btr
7660: 65 65 53 79 6e 63 28 70 42 74 2c 20 7a 4d 61 73 eeSync(pBt, zMas
7670: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 ter);. if
7680: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
7690: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c ){. sql
76a0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73 ite3OsClose(&mas
76b0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ter);.
76c0: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 sqliteFree(zMast
76d0: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 er);. r
76e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 eturn rc;.
76f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
7700: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 }. sqlite3OsC
7710: 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 0a lose(&master);..
7720: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 /* Delete th
7730: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
7740: 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d file. This comm
7750: 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 its the transact
7760: 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a ion. After. *
7770: 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 * doing this the
7780: 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 directory is sy
7790: 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 nced again befor
77a0: 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c e any individual
77b0: 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 . ** transact
77c0: 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 ion files are de
77d0: 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 leted.. */.
77e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
77f0: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b Delete(zMaster);
7800: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d . assert( rc=
7810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 =SQLITE_OK );.
7820: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 sqliteFree(zMa
7830: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 ster);. zMast
7840: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d er = 0;. rc =
7850: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 44 69 sqlite3OsSyncDi
7860: 72 65 63 74 6f 72 79 28 7a 4d 61 69 6e 46 69 6c rectory(zMainFil
7870: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d e);. if( rc!=
7880: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
7890: 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f /* This is no
78a0: 74 20 67 6f 6f 64 2e 20 54 68 65 20 6d 61 73 74 t good. The mast
78b0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 er journal file
78c0: 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74 65 64 has been deleted
78d0: 2c 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 , but. ** t
78e0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e he directory syn
78f0: 63 20 66 61 69 6c 65 64 2e 20 54 68 65 72 65 20 c failed. There
7900: 69 73 20 6e 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 is no completely
7910: 20 73 61 66 65 20 63 6f 75 72 73 65 20 6f 66 0a safe course of.
7920: 20 20 20 20 20 20 2a 2a 20 61 63 74 69 6f 6e 20 ** action
7930: 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 65 20 69 from here. The i
7940: 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 ndividual journa
7950: 6c 73 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e ls contain the n
7960: 61 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 ame of the.
7970: 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e ** master journ
7980: 61 6c 20 66 69 6c 65 2c 20 62 75 74 20 74 68 65 al file, but the
7990: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 6f 66 20 re is no way of
79a0: 6b 6e 6f 77 69 6e 67 20 69 66 20 74 68 61 74 0a knowing if that.
79b0: 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 ** master
79c0: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 6e journal exists n
79d0: 6f 77 20 6f 72 20 69 66 20 69 74 20 77 69 6c 6c ow or if it will
79e0: 20 65 78 69 73 74 20 61 66 74 65 72 20 74 68 65 exist after the
79f0: 20 6f 70 65 72 61 74 69 6e 67 0a 20 20 20 20 20 operating.
7a00: 20 2a 2a 20 73 79 73 74 65 6d 20 63 72 61 73 68 ** system crash
7a10: 20 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 that may follow
7a20: 20 74 68 65 20 66 73 79 6e 63 28 29 20 66 61 69 the fsync() fai
7a30: 6c 75 72 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 lure.. */.
7a40: 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a assert(0);.
7a50: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 sqliteFree
7a60: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 (zMaster);.
7a70: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 return rc;.
7a80: 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 }.. /* All fi
7a90: 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 les and director
7aa0: 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 ies have already
7ab0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f been synced, so
7ac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 the following.
7ad0: 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 ** calls to s
7ae0: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 qlite3BtreeCommi
7af0: 74 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f t() are only clo
7b00: 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 20 64 sing files and d
7b10: 65 6c 65 74 69 6e 67 0a 20 20 20 20 2a 2a 20 6a eleting. ** j
7b20: 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 ournals. If some
7b30: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 thing goes wrong
7b40: 20 77 68 69 6c 65 20 74 68 69 73 20 69 73 20 68 while this is h
7b50: 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 appening we don'
7b60: 74 0a 20 20 20 20 2a 2a 20 72 65 61 6c 6c 79 20 t. ** really
7b70: 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 care. The integr
7b80: 69 74 79 20 6f 66 20 74 68 65 20 74 72 61 6e 73 ity of the trans
7b90: 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 action is alread
7ba0: 79 20 67 75 61 72 61 6e 74 65 65 64 2c 0a 20 20 y guaranteed,.
7bb0: 20 20 2a 2a 20 62 75 74 20 73 6f 6d 65 20 73 74 ** but some st
7bc0: 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e ray 'cold' journ
7bd0: 61 6c 73 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 als may be lying
7be0: 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 around. Returni
7bf0: 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 65 72 72 ng an. ** err
7c00: 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 or code won't he
7c10: 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 lp matters..
7c20: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 */. for(i=0;
7c30: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
7c40: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 . Btree *p
7c50: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e Bt = db->aDb[i].
7c60: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 pBt;. if( p
7c70: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 Bt ){. sq
7c80: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
7c90: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 (pBt);. }.
7ca0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 }. }.. retu
7cb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a rn rc;.}../* .**
7cc0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 This routine ch
7cd0: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 ecks that the sq
7ce0: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 lite3.activeVdbe
7cf0: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 Cnt count variab
7d00: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 le.** matches th
7d10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 e number of vdbe
7d20: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 's in the list s
7d30: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 qlite3.pVdbe tha
7d40: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 t are.** current
7d50: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 ly active. An as
7d60: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 sertion fails if
7d70: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 the two counts
7d80: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a do not match..**
7d90: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f .** This is a no
7da0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 -op if NDEBUG is
7db0: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 defined..*/.#if
7dc0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 ndef NDEBUG.stat
7dd0: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 ic void checkAct
7de0: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 iveVdbeCnt(sqlit
7df0: 65 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a e *db){. Vdbe *
7e00: 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 p;. int cnt = 0
7e10: 3b 0a 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 ;.. p = db->pVd
7e20: 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 be;. while( p )
7e30: 7b 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 6d 61 {. if( (p->ma
7e40: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
7e50: 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 29 RUN && p->pc>=0)
7e60: 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 || p->magic==VD
7e70: 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b BE_MAGIC_HALT ){
7e80: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 . cnt++;.
7e90: 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 }. p = p->p
7ea0: 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 Next;. }.. ass
7eb0: 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 61 63 ert( cnt==db->ac
7ec0: 74 69 76 65 56 64 62 65 43 6e 74 20 29 3b 0a 7d tiveVdbeCnt );.}
7ed0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 .#else.#define c
7ee0: 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e heckActiveVdbeCn
7ef0: 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a t(x).#endif../*.
7f00: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 ** Clean up a VD
7f10: 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 BE after executi
7f20: 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 on but do not de
7f30: 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 lete the VDBE ju
7f40: 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 st yet..** Write
7f50: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 any error messa
7f60: 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d ges into *pzErrM
7f70: 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 sg. Return the
7f80: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a result code..**.
7f90: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f ** After this ro
7fa0: 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 utine is run, th
7fb0: 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 e VDBE should be
7fc0: 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 ready to be exe
7fd0: 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a cuted.** again..
7fe0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
7ff0: 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 beReset(Vdbe *p)
8000: 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d {. sqlite *db =
8010: 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 69 3b p->db;. int i;
8020: 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 . int (*xFunc)(
8030: 42 74 72 65 65 20 2a 70 42 74 29 20 3d 20 30 3b Btree *pBt) = 0;
8040: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f /* Function to
8050: 20 63 61 6c 6c 20 6f 6e 20 65 61 63 68 20 62 74 call on each bt
8060: 72 65 65 20 62 61 63 6b 65 6e 64 20 2a 2f 0a 0a ree backend */..
8070: 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d if( p->magic!=
8080: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 26 VDBE_MAGIC_RUN &
8090: 26 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 & p->magic!=VDBE
80a0: 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 _MAGIC_HALT ){.
80b0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 sqlite3Error(
80c0: 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49 p->db, SQLITE_MI
80d0: 53 55 53 45 2c 20 30 20 2c 30 29 3b 0a 20 20 20 SUSE, 0 ,0);.
80e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d return SQLITE_M
80f0: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 ISUSE;. }. if(
8100: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 p->zErrMsg ){.
8110: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 sqlite3Error(
8120: 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 2c 20 22 25 p->db, p->rc, "%
8130: 73 22 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 s", p->zErrMsg,
8140: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 0);. sqliteFr
8150: 65 65 28 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a ee(p->zErrMsg);.
8160: 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d p->zErrMsg =
8170: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 0;. }else if(
8180: 70 2d 3e 72 63 20 29 7b 0a 20 20 20 20 73 71 6c p->rc ){. sql
8190: 69 74 65 33 45 72 72 6f 72 28 70 2d 3e 64 62 2c ite3Error(p->db,
81a0: 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 7d 65 p->rc, 0);. }e
81b0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 lse{. sqlite3
81c0: 45 72 72 6f 72 28 70 2d 3e 64 62 2c 20 53 51 4c Error(p->db, SQL
81d0: 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 7d 0a ITE_OK, 0);. }.
81e0: 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 Cleanup(p);..
81f0: 20 2f 2a 20 57 68 61 74 20 69 73 20 64 6f 6e 65 /* What is done
8200: 20 6e 6f 77 20 64 65 70 65 6e 64 73 20 6f 6e 20 now depends on
8210: 74 68 65 20 65 78 69 74 20 73 74 61 74 75 73 20 the exit status
8220: 6f 66 20 74 68 65 20 76 64 62 65 2c 20 74 68 65 of the vdbe, the
8230: 20 76 61 6c 75 65 20 6f 66 0a 20 20 2a 2a 20 74 value of. ** t
8240: 68 65 20 73 71 6c 69 74 65 2e 61 75 74 6f 43 6f he sqlite.autoCo
8250: 6d 6d 69 74 20 66 6c 61 67 20 61 6e 64 20 77 68 mmit flag and wh
8260: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 ether or not the
8270: 72 65 20 61 72 65 20 61 6e 79 20 6f 74 68 65 72 re are any other
8280: 0a 20 20 2a 2a 20 71 75 65 72 69 65 73 20 69 6e . ** queries in
8290: 20 70 72 6f 67 72 65 73 73 2e 20 41 20 74 72 61 progress. A tra
82a0: 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61 74 nsaction or stat
82b0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
82c0: 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 2a 2a 20 n may need. **
82d0: 74 6f 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 to be committed
82e0: 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 6f or rolled back o
82f0: 6e 20 65 61 63 68 20 6f 70 65 6e 20 64 61 74 61 n each open data
8300: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a base file.. */.
8310: 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 checkActiveVdb
8320: 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 eCnt(db);. if(
8330: 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 26 db->autoCommit &
8340: 26 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 & db->activeVdbe
8350: 43 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 69 66 Cnt==1 ){. if
8360: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
8370: 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 OK || p->errorAc
8380: 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b tion==OE_Fail ){
8390: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75 . /* The au
83a0: 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 to-commit flag i
83b0: 73 20 74 72 75 65 2c 20 74 68 65 72 65 20 61 72 s true, there ar
83c0: 65 20 6e 6f 20 6f 74 68 65 72 20 61 63 74 69 76 e no other activ
83d0: 65 20 71 75 65 72 69 65 73 0a 20 20 20 20 20 20 e queries.
83e0: 2a 2a 20 75 73 69 6e 67 20 74 68 69 73 20 68 61 ** using this ha
83f0: 6e 64 6c 65 20 61 6e 64 20 74 68 65 20 76 64 62 ndle and the vdb
8400: 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 e program was su
8410: 63 63 65 73 73 66 75 6c 20 6f 72 20 68 69 74 20 ccessful or hit
8420: 61 6e 0a 20 20 20 20 20 20 2a 2a 20 27 4f 52 20 an. ** 'OR
8430: 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 FAIL' constraint
8440: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 . This means a c
8450: 6f 6d 6d 69 74 20 69 73 20 72 65 71 75 69 72 65 ommit is require
8460: 64 2c 20 77 68 69 63 68 20 69 73 0a 20 20 20 20 d, which is.
8470: 20 20 2a 2a 20 68 61 6e 64 6c 65 64 20 61 20 6c ** handled a l
8480: 69 74 74 6c 65 20 64 69 66 66 65 72 65 6e 74 6c ittle differentl
8490: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 y from the other
84a0: 20 6f 70 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20 options..
84b0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d */. p->rc =
84c0: 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 29 3b vdbeCommit(db);
84d0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 . if( p->rc
84e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
84f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 sqlite3Er
8500: 72 6f 72 28 70 2d 3e 64 62 2c 20 70 2d 3e 72 63 ror(p->db, p->rc
8510: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 , 0);. if
8520: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
8530: 42 55 53 59 20 26 26 20 70 2d 3e 61 75 74 6f 43 BUSY && p->autoC
8540: 6f 6d 6d 69 74 4f 6e 20 29 7b 0a 20 20 20 20 20 ommitOn ){.
8550: 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 6a 75 /* If we ju
8560: 73 74 20 6e 6f 77 20 68 61 76 65 20 74 75 72 6e st now have turn
8570: 65 64 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6f 6e ed autocommit on
8580: 20 28 6d 65 61 6e 69 6e 67 20 77 65 20 6a 75 73 (meaning we jus
8590: 74 20 68 61 76 65 0a 20 20 20 20 20 20 20 20 20 t have.
85a0: 20 2a 2a 20 66 69 6e 69 73 68 65 64 20 65 78 65 ** finished exe
85b0: 63 75 74 69 6e 67 20 61 20 43 4f 4d 4d 49 54 20 cuting a COMMIT
85c0: 63 6f 6d 6d 61 6e 64 29 20 62 75 74 20 74 68 65 command) but the
85d0: 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 64 75 commit fails du
85e0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 e. ** t
85f0: 6f 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f o lock contentio
8600: 6e 2c 20 61 75 74 6f 63 6f 6d 6d 69 74 20 62 61 n, autocommit ba
8610: 63 6b 20 6f 66 66 2e 20 20 54 68 69 73 20 67 69 ck off. This gi
8620: 76 65 73 20 74 68 65 20 75 73 65 72 0a 20 20 20 ves the user.
8630: 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 70 ** the op
8640: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 74 72 79 portunity to try
8650: 20 61 67 61 69 6e 20 61 66 74 65 72 20 74 68 65 again after the
8660: 20 6c 6f 63 6b 20 74 68 61 74 20 77 61 73 20 70 lock that was p
8670: 72 65 76 65 6e 74 69 6e 67 0a 20 20 20 20 20 20 reventing.
8680: 20 20 20 20 2a 2a 20 74 68 65 20 63 6f 6d 6d 69 ** the commi
8690: 74 20 68 61 73 20 63 6c 65 61 72 65 64 2e 20 2a t has cleared. *
86a0: 2f 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e /. db->
86b0: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 30 3b 0a autoCommit = 0;.
86c0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
86d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 /* If t
86e0: 68 65 20 63 6f 6d 6d 61 6e 64 20 6a 75 73 74 20 he command just
86f0: 65 78 65 63 75 74 65 64 20 77 61 73 20 6e 6f 74 executed was not
8700: 20 61 20 43 4f 4d 4d 49 54 20 63 6f 6d 6d 61 6e a COMMIT comman
8710: 64 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 d, then.
8720: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 77 68 ** rollback wh
8730: 61 74 65 76 65 72 20 74 68 65 20 72 65 73 75 6c atever the resul
8740: 74 73 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61 ts of that comma
8750: 6e 64 20 77 65 72 65 20 2a 2f 0a 20 20 20 20 20 nd were */.
8760: 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c xFunc = sql
8770: 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 ite3BtreeRollbac
8780: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 k;. }.
8790: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a }. }else{.
87a0: 20 20 20 20 20 20 78 46 75 6e 63 20 3d 20 73 71 xFunc = sq
87b0: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 lite3BtreeRollba
87c0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 ck;. }. }els
87d0: 65 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 e{. if( p->rc
87e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 ==SQLITE_OK || p
87f0: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f ->errorAction==O
8800: 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 E_Fail ){.
8810: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 xFunc = sqlite3B
8820: 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 3b 0a treeCommitStmt;.
8830: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d }else if( p-
8840: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 >errorAction==OE
8850: 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 _Abort ){.
8860: 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 xFunc = sqlite3B
8870: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 treeRollbackStmt
8880: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
8890: 20 20 20 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 xFunc = sqlit
88a0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 3b e3BtreeRollback;
88b0: 0a 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 . db->autoC
88c0: 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d ommit = 1;. }
88d0: 0a 20 20 7d 0a 20 20 70 2d 3e 61 75 74 6f 43 6f . }. p->autoCo
88e0: 6d 6d 69 74 4f 6e 20 3d 20 30 3b 0a 0a 20 20 2f mmitOn = 0;.. /
88f0: 2a 20 49 66 20 78 46 75 6e 63 20 69 73 20 6e 6f * If xFunc is no
8900: 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 t NULL, then it
8910: 69 73 20 6f 6e 65 20 6f 66 20 73 71 6c 69 74 65 is one of sqlite
8920: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 2c 0a 3BtreeRollback,.
8930: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 ** sqlite3Btre
8940: 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 20 6f 72 eRollbackStmt or
8950: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d sqlite3BtreeCom
8960: 6d 69 74 53 74 6d 74 2e 20 43 61 6c 6c 20 69 74 mitStmt. Call it
8970: 20 6f 6e 63 65 20 6f 6e 0a 20 20 2a 2a 20 65 61 once on. ** ea
8980: 63 68 20 62 61 63 6b 65 6e 64 2e 20 49 66 20 61 ch backend. If a
8990: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 n error occurs a
89a0: 6e 64 20 74 68 65 20 72 65 74 75 72 6e 20 63 6f nd the return co
89b0: 64 65 20 69 73 20 73 74 69 6c 6c 0a 20 20 2a 2a de is still. **
89c0: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 73 65 74 20 SQLITE_OK, set
89d0: 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 the return code
89e0: 74 6f 20 74 68 65 20 6e 65 77 20 65 72 72 6f 72 to the new error
89f0: 20 76 61 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 66 value.. */. f
8a00: 6f 72 28 69 3d 30 3b 20 78 46 75 6e 63 20 26 26 or(i=0; xFunc &&
8a10: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 i<db->nDb; i++)
8a20: 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 { . int rc;.
8a30: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
8a40: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
8a50: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 if( pBt ){.
8a60: 20 20 20 20 20 72 63 20 3d 20 78 46 75 6e 63 28 rc = xFunc(
8a70: 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 pBt);. if(
8a80: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b p->rc==SQLITE_OK
8a90: 20 29 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 ) p->rc = rc;.
8aa0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 }. }.. /* I
8ab0: 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e f this was an IN
8ac0: 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 SERT, UPDATE or
8ad0: 44 45 4c 45 54 45 2c 20 73 65 74 20 74 68 65 20 DELETE, set the
8ae0: 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 change counter.
8af0: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 63 68 61 6e */. if( p->chan
8b00: 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 69 geCntOn ){. i
8b10: 66 28 20 21 78 46 75 6e 63 20 7c 7c 20 78 46 75 f( !xFunc || xFu
8b20: 6e 63 3d 3d 73 71 6c 69 74 65 33 42 74 72 65 65 nc==sqlite3Btree
8b30: 43 6f 6d 6d 69 74 53 74 6d 74 20 29 7b 0a 20 20 CommitStmt ){.
8b40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 sqlite3VdbeS
8b50: 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d etChanges(db, p-
8b60: 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 7d >nChange);. }
8b70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 else{. sqli
8b80: 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 te3VdbeSetChange
8b90: 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 7d 0a s(db, 0);. }.
8ba0: 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d p->nChange =
8bb0: 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 0;. }.. if( p
8bc0: 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ->rc!=SQLITE_OK
8bd0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 6f ){. sqlite3Ro
8be0: 6c 6c 62 61 63 6b 49 6e 74 65 72 6e 61 6c 43 68 llbackInternalCh
8bf0: 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 7d 65 6c anges(db);. }el
8c00: 73 65 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 se if( db->flags
8c10: 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e & SQLITE_Intern
8c20: 43 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 Changes ){. s
8c30: 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 qlite3CommitInte
8c40: 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b rnalChanges(db);
8c50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 28 70 2d 3e . }.. if( (p->
8c60: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
8c70: 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 63 3e 3d C_RUN && p->pc>=
8c80: 30 29 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 0) || p->magic==
8c90: 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 VDBE_MAGIC_HALT
8ca0: 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 69 76 ){. db->activ
8cb0: 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 7d 0a eVdbeCnt--;. }.
8cc0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 54 . assert( p->pT
8cd0: 6f 73 3c 26 70 2d 3e 61 53 74 61 63 6b 5b 70 2d os<&p->aStack[p-
8ce0: 3e 70 63 3c 30 3f 30 3a 70 2d 3e 70 63 5d 20 7c >pc<0?0:p->pc] |
8cf0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 | sqlite3_malloc
8d00: 5f 66 61 69 6c 65 64 3d 3d 31 20 29 3b 0a 23 69 _failed==1 );.#i
8d10: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c fdef VDBE_PROFIL
8d20: 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a E. {. FILE *
8d30: 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 out = fopen("vdb
8d40: 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 e_profile.out",
8d50: 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 "a");. if( ou
8d60: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 t ){. int i
8d70: 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 ;. fprintf(
8d80: 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 out, "---- ");.
8d90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c for(i=0; i<
8da0: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 p->nOp; i++){.
8db0: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 fprintf(ou
8dc0: 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f t, "%02x", p->aO
8dd0: 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 p[i].opcode);.
8de0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 }. fpri
8df0: 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a ntf(out, "\n");.
8e00: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 for(i=0; i
8e10: 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 <p->nOp; i++){.
8e20: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f fprintf(o
8e30: 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 20 ut, "%6d %10lld
8e40: 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 20 %8lld ",.
8e50: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e p->aOp[i].cn
8e60: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d t,. p-
8e70: 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a >aOp[i].cycles,.
8e80: 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f p->aO
8e90: 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e p[i].cnt>0 ? p->
8ea0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d aOp[i].cycles/p-
8eb0: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a >aOp[i].cnt : 0.
8ec0: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 );.
8ed0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 sqlite3VdbePr
8ee0: 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 intOp(out, i, &p
8ef0: 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 ->aOp[i]);.
8f00: 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 }. fclose(
8f10: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a out);. }. }.
8f20: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 #endif. p->magi
8f30: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 c = VDBE_MAGIC_I
8f40: 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d NIT;. return p-
8f50: 3e 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c >rc;.}../*.** Cl
8f60: 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 ean up and delet
8f70: 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 e a VDBE after e
8f80: 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 xecution. Retur
8f90: 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 n an integer whi
8fa0: 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 ch is.** the res
8fb0: 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 ult code. Write
8fc0: 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 any error messa
8fd0: 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a ge text into *pz
8fe0: 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 ErrMsg..*/.int s
8ff0: 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 qlite3VdbeFinali
9000: 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 ze(Vdbe *p){. i
9010: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 20 nt rc;. sqlite
9020: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6d *db;.. if( p->m
9030: 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 agic!=VDBE_MAGIC
9040: 5f 52 55 4e 20 26 26 20 70 2d 3e 6d 61 67 69 63 _RUN && p->magic
9050: 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c !=VDBE_MAGIC_HAL
9060: 54 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e T ){. if( p->
9070: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
9080: 43 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 20 20 C_INIT ){.
9090: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 70 2d 3e sqlite3Error(p->
90a0: 64 62 2c 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 db, SQLITE_MISUS
90b0: 45 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 E, 0);. }.
90c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d return SQLITE_M
90d0: 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 64 62 20 ISUSE;. }. db
90e0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 = p->db;. rc =
90f0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 sqlite3VdbeReset
9100: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 (p);. sqlite3Vd
9110: 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 69 beDelete(p);. i
9120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 53 43 f( rc==SQLITE_SC
9130: 48 45 4d 41 20 29 7b 0a 20 20 20 20 73 71 6c 69 HEMA ){. sqli
9140: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c te3ResetInternal
9150: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 Schema(db, 0);.
9160: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a }. return rc;.
9170: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 }../*.** Call th
9180: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 e destructor for
9190: 20 65 61 63 68 20 61 75 78 64 61 74 61 20 65 6e each auxdata en
91a0: 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 6e 63 try in pVdbeFunc
91b0: 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 for which.** th
91c0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 e corresponding
91d0: 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 bit in mask is c
91e0: 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 20 65 lear. Auxdata e
91f0: 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 33 31 ntries beyond 31
9200: 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 20 64 .** are always d
9210: 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 estroyed. To de
9220: 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 stroy all auxdat
9230: 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 a entries, call
9240: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 this.** routine
9250: 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f with mask==0..*/
9260: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
9270: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 eDeleteAuxData(V
9280: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 dbeFunc *pVdbeFu
9290: 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 nc, int mask){.
92a0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d int i;. for(i=
92b0: 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 0; i<pVdbeFunc->
92c0: 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 nAux; i++){.
92d0: 73 74 72 75 63 74 20 41 75 78 44 61 74 61 20 2a struct AuxData *
92e0: 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 75 6e pAux = &pVdbeFun
92f0: 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 c->apAux[i];.
9300: 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 if( (i>31 || !(
9310: 6d 61 73 6b 26 28 31 3c 3c 69 29 29 29 20 26 26 mask&(1<<i))) &&
9320: 20 70 41 75 78 2d 3e 70 41 75 78 20 29 7b 0a 20 pAux->pAux ){.
9330: 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 if( pAux->x
9340: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 Delete ){.
9350: 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 pAux->xDelete(
9360: 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 pAux->pAux);.
9370: 20 20 20 7d 0a 20 20 20 20 20 20 70 41 75 78 2d }. pAux-
9380: 3e 70 41 75 78 20 3d 20 30 3b 0a 20 20 20 20 7d >pAux = 0;. }
9390: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 . }.}../*.** De
93a0: 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 lete an entire V
93b0: 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c DBE..*/.void sql
93c0: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 ite3VdbeDelete(V
93d0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 dbe *p){. int i
93e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 ;. if( p==0 ) r
93f0: 65 74 75 72 6e 3b 0a 20 20 43 6c 65 61 6e 75 70 eturn;. Cleanup
9400: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 (p);. if( p->pP
9410: 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 rev ){. p->pP
9420: 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e rev->pNext = p->
9430: 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a pNext;. }else{.
9440: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 assert( p->d
9450: 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 b->pVdbe==p );.
9460: 20 20 20 70 2d 3e 64 62 2d 3e 70 56 64 62 65 20 p->db->pVdbe
9470: 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a = p->pNext;. }.
9480: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 if( p->pNext )
9490: 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e {. p->pNext->
94a0: 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 pPrev = p->pPrev
94b0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 50 72 65 76 ;. }. p->pPrev
94c0: 20 3d 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b = p->pNext = 0;
94d0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c . if( p->nOpAll
94e0: 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e oc==0 ){. p->
94f0: 61 4f 70 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e aOp = 0;. p->
9500: 6e 4f 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 66 nOp = 0;. }. f
9510: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 or(i=0; i<p->nOp
9520: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4f 70 20 2a ; i++){. Op *
9530: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d pOp = &p->aOp[i]
9540: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 ;. if( pOp->p
9550: 33 74 79 70 65 3d 3d 50 33 5f 44 59 4e 41 4d 49 3type==P3_DYNAMI
9560: 43 20 7c 7c 20 70 4f 70 2d 3e 70 33 74 79 70 65 C || pOp->p3type
9570: 3d 3d 50 33 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a ==P3_KEYINFO ){.
9580: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 sqliteFree
9590: 28 70 4f 70 2d 3e 70 33 29 3b 0a 20 20 20 20 7d (pOp->p3);. }
95a0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 33 . if( pOp->p3
95b0: 74 79 70 65 3d 3d 50 33 5f 56 44 42 45 46 55 4e type==P3_VDBEFUN
95c0: 43 20 29 7b 0a 20 20 20 20 20 20 56 64 62 65 46 C ){. VdbeF
95d0: 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 20 3d unc *pVdbeFunc =
95e0: 20 28 56 64 62 65 46 75 6e 63 20 2a 29 70 4f 70 (VdbeFunc *)pOp
95f0: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 73 71 6c 69 ->p3;. sqli
9600: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 te3VdbeDeleteAux
9610: 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 Data(pVdbeFunc,
9620: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 0);. sqlite
9630: 46 72 65 65 28 70 56 64 62 65 46 75 6e 63 29 3b Free(pVdbeFunc);
9640: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e . }.#ifndef N
9650: 44 45 42 55 47 0a 20 20 20 20 73 71 6c 69 74 65 DEBUG. sqlite
9660: 46 72 65 65 28 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 Free(pOp->zComme
9670: 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a nt);.#endif. }.
9680: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
9690: 6e 56 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 nVar; i++){.
96a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 sqlite3VdbeMemRe
96b0: 6c 65 61 73 65 28 26 70 2d 3e 61 70 56 61 72 5b lease(&p->apVar[
96c0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 i]);. }. sqlit
96d0: 65 46 72 65 65 28 70 2d 3e 61 4f 70 29 3b 0a 20 eFree(p->aOp);.
96e0: 20 73 71 6c 69 74 65 46 72 65 65 28 70 2d 3e 61 sqliteFree(p->a
96f0: 4c 61 62 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 Label);. sqlite
9700: 46 72 65 65 28 70 2d 3e 61 53 74 61 63 6b 29 3b Free(p->aStack);
9710: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 . if( p->aColNa
9720: 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d me ){. for(i=
9730: 30 3b 20 69 3c 28 70 2d 3e 6e 52 65 73 43 6f 6c 0; i<(p->nResCol
9740: 75 6d 6e 29 2a 32 3b 20 69 2b 2b 29 7b 0a 20 20 umn)*2; i++){.
9750: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
9760: 65 6d 52 65 6c 65 61 73 65 28 26 28 70 2d 3e 61 emRelease(&(p->a
9770: 43 6f 6c 4e 61 6d 65 5b 69 5d 29 29 3b 0a 20 20 ColName[i]));.
9780: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 }. sqliteFr
9790: 65 65 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b ee(p->aColName);
97a0: 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 . }. p->magic
97b0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 = VDBE_MAGIC_DEA
97c0: 44 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 D;. sqliteFree(
97d0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 p);.}../*.** If
97e0: 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 a MoveTo operati
97f0: 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e on is pending on
9800: 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f the given curso
9810: 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a r, then do that.
9820: 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 ** MoveTo now.
9830: 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 Return an error
9840: 63 6f 64 65 2e 20 20 49 66 20 6e 6f 20 4d 6f 76 code. If no Mov
9850: 65 54 6f 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 eTo is pending,
9860: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 this.** routine
9870: 64 6f 65 73 20 6e 6f 74 68 69 6e 67 20 61 6e 64 does nothing and
9880: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f returns SQLITE_
9890: 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 OK..*/.int sqlit
98a0: 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 e3VdbeCursorMove
98b0: 74 6f 28 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 to(Cursor *p){.
98c0: 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 if( p->deferred
98d0: 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 69 6e Moveto ){. in
98e0: 74 20 72 65 73 3b 0a 20 20 20 20 65 78 74 65 72 t res;. exter
98f0: 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 n int sqlite3_se
9900: 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 20 20 arch_count;.
9910: 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 74 4b 65 assert( p->intKe
9920: 79 20 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e y );. if( p->
9930: 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 intKey ){.
9940: 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 sqlite3BtreeMove
9950: 74 6f 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 30 to(p->pCursor, 0
9960: 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 , p->movetoTarge
9970: 74 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 65 t, &res);. }e
9980: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 lse{. sqlit
9990: 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 2d e3BtreeMoveto(p-
99a0: 3e 70 43 75 72 73 6f 72 2c 28 63 68 61 72 2a 29 >pCursor,(char*)
99b0: 26 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 &p->movetoTarget
99c0: 2c 73 69 7a 65 6f 66 28 69 36 34 29 2c 26 72 65 ,sizeof(i64),&re
99d0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 s);. }. *p
99e0: 2d 3e 70 49 6e 63 72 4b 65 79 20 3d 20 30 3b 0a ->pIncrKey = 0;.
99f0: 20 20 20 20 70 2d 3e 6c 61 73 74 52 65 63 6e 6f p->lastRecno
9a00: 20 3d 20 6b 65 79 54 6f 49 6e 74 28 70 2d 3e 6d = keyToInt(p->m
9a10: 6f 76 65 74 6f 54 61 72 67 65 74 29 3b 0a 20 20 ovetoTarget);.
9a20: 20 20 70 2d 3e 72 65 63 6e 6f 49 73 56 61 6c 69 p->recnoIsVali
9a30: 64 20 3d 20 72 65 73 3d 3d 30 3b 0a 20 20 20 20 d = res==0;.
9a40: 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 if( res<0 ){.
9a50: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e sqlite3BtreeN
9a60: 65 78 74 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20 ext(p->pCursor,
9a70: 26 72 65 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 &res);. }.
9a80: 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f sqlite3_search_
9a90: 63 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 70 2d 3e count++;. p->
9aa0: 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d deferredMoveto =
9ab0: 20 30 3b 0a 20 20 20 20 70 2d 3e 63 61 63 68 65 0;. p->cache
9ac0: 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 Valid = 0;. }.
9ad0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
9ae0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 K;.}../*.** The
9af0: 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 following functi
9b00: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 ons:.**.** sqlit
9b10: 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
9b20: 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 ().** sqlite3Vdb
9b30: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 eSerialTypeLen()
9b40: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 .** sqlite3VdbeS
9b50: 65 72 69 61 6c 52 65 61 64 28 29 0a 2a 2a 20 73 erialRead().** s
9b60: 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
9b70: 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 Len().** sqlite3
9b80: 56 64 62 65 53 65 72 69 61 6c 57 72 69 74 65 28 VdbeSerialWrite(
9b90: 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c ).**.** encapsul
9ba0: 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 ate the code tha
9bb0: 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c t serializes val
9bc0: 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 ues for storage
9bd0: 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 in SQLite.** dat
9be0: 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f a and index reco
9bf0: 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c rds. Each serial
9c00: 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 ized value consi
9c10: 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 sts of a.** 'ser
9c20: 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 ial-type' and a
9c30: 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 blob of data. Th
9c40: 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 e serial type is
9c50: 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 an 8-byte unsig
9c60: 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 ned.** integer,
9c70: 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 stored as a vari
9c80: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 nt..**.** In an
9c90: 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 SQLite index rec
9ca0: 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 ord, the serial
9cb0: 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 type is stored d
9cc0: 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a irectly before.*
9cd0: 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 * the blob of da
9ce0: 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 ta that it corre
9cf0: 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 sponds to. In a
9d00: 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c table record, al
9d10: 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 l serial.** type
9d20: 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 s are stored at
9d30: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 the start of the
9d40: 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 record, and the
9d50: 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 blobs of data a
9d60: 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 t.** the end. He
9d70: 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 nce these functi
9d80: 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 ons allow the ca
9d90: 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 ller to handle t
9da0: 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 he.** serial-typ
9db0: 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 e and data blob
9dc0: 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a seperately..**.*
9dd0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
9de0: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 table describes
9df0: 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 the various stor
9e00: 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 age classes for
9e10: 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 data:.**.** se
9e20: 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 rial type
9e30: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 bytes of data
9e40: 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d type.** --
9e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 ------------
9e60: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
9e70: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
9e80: 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 ---.** 0
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ea0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 0 N
9eb0: 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 ULL.** 1
9ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ed0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 1 s
9ee0: 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a igned integer.**
9ef0: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 2
9f00: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 2
9f10: 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 signed
9f20: 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 integer.**
9f30: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3
9f40: 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 3
9f50: 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 signed intege
9f60: 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 r.** 4
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9f80: 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 4 sig
9f90: 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 ned integer.**
9fa0: 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 5
9fb0: 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 6
9fc0: 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e signed in
9fd0: 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 teger.** 6
9fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9ff0: 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 8
a000: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a signed integer.
a010: 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 ** 7
a020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 8
a030: 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 IEEE
a040: 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 38 2d 31 float.** 8-1
a050: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a070: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 reserved for ex
a080: 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e pansion.** N>
a090: 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 =12 and even
a0a0: 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 (N-12)/2
a0b0: 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e BLOB.** N>
a0c0: 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 =13 and odd
a0d0: 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 (N-13)/2
a0e0: 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2f 0a 0a 2f text.**.*/../
a0f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
a100: 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 serial-type for
a110: 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 the value stored
a120: 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 in pMem..*/.u32
a130: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
a140: 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d alType(Mem *pMem
a150: 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d ){. int flags =
a160: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 0a 20 pMem->flags;..
a170: 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e if( flags&MEM_N
a180: 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ull ){. retur
a190: 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 n 0;. }. if( f
a1a0: 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a lags&MEM_Int ){.
a1b0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 /* Figure ou
a1c0: 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 t whether to use
a1d0: 20 31 2c 20 32 2c 20 34 20 6f 72 20 38 20 62 79 1, 2, 4 or 8 by
a1e0: 74 65 73 2e 20 2a 2f 0a 20 20 20 20 69 36 34 20 tes. */. i64
a1f0: 69 20 3d 20 70 4d 65 6d 2d 3e 69 3b 0a 20 20 20 i = pMem->i;.
a200: 20 69 66 28 20 69 3e 3d 2d 31 32 37 20 26 26 20 if( i>=-127 &&
a210: 69 3c 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 i<=127 ) return
a220: 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 3d 2d 33 1;. if( i>=-3
a230: 32 37 36 37 20 26 26 20 69 3c 3d 33 32 37 36 37 2767 && i<=32767
a240: 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 ) return 2;.
a250: 20 69 66 28 20 69 3e 3d 2d 38 33 38 38 36 30 37 if( i>=-8388607
a260: 20 26 26 20 69 3c 3d 38 33 38 38 36 30 37 20 29 && i<=8388607 )
a270: 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 return 3;. i
a280: 66 28 20 69 3e 3d 2d 32 31 34 37 34 38 33 36 34 f( i>=-214748364
a290: 37 20 26 26 20 69 3c 3d 32 31 34 37 34 38 33 36 7 && i<=21474836
a2a0: 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 47 ) return 4;.
a2b0: 20 20 20 69 66 28 20 69 3e 3d 2d 31 34 30 37 33 if( i>=-14073
a2c0: 37 34 38 38 33 35 35 33 32 38 4c 20 26 26 20 69 7488355328L && i
a2d0: 3c 3d 31 34 30 37 33 37 34 38 38 33 35 35 33 32 <=14073748835532
a2e0: 38 4c 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 8L ) return 5;.
a2f0: 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d return 6;. }
a300: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d . if( flags&MEM
a310: 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 _Real ){. ret
a320: 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 69 66 28 urn 7;. }. if(
a330: 20 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 flags&MEM_Str )
a340: 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4d {. int n = pM
a350: 65 6d 2d 3e 6e 3b 0a 20 20 20 20 61 73 73 65 72 em->n;. asser
a360: 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 20 20 72 t( n>=0 );. r
a370: 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 eturn ((n*2) + 1
a380: 33 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 3);. }. if( fl
a390: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a ags&MEM_Blob ){.
a3a0: 20 20 20 20 72 65 74 75 72 6e 20 28 70 4d 65 6d return (pMem
a3b0: 2d 3e 6e 2a 32 20 2b 20 31 32 29 3b 0a 20 20 7d ->n*2 + 12);. }
a3c0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a . return 0;.}..
a3d0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
a3e0: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 length of the d
a3f0: 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e ata correspondin
a400: 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 g to the supplie
a410: 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a d serial-type..*
a420: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
a430: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 eSerialTypeLen(u
a440: 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 32 serial_type){
a450: 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 . if( serial_ty
a460: 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 pe>=12 ){. re
a470: 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 turn (serial_typ
a480: 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 e-12)/2;. }else
a490: 7b 0a 20 20 20 20 73 74 61 74 69 63 20 75 38 20 {. static u8
a4a0: 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20 31 aSize[] = { 0, 1
a4b0: 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38 2c , 2, 3, 4, 6, 8,
a4c0: 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d 8, 0, 0, 0, 0 }
a4d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53 69 ;. return aSi
a4e0: 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b ze[serial_type];
a4f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 . }.}../*.** Wr
a500: 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a ite the serializ
a510: 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 ed data blob for
a520: 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 the value store
a530: 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a d in pMem into .
a540: 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 ** buf. It is as
a550: 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 sumed that the c
a560: 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 aller has alloca
a570: 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 ted sufficient s
a580: 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 pace..** Return
a590: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
a5a0: 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 20 tes written..*/
a5b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
a5c0: 53 65 72 69 61 6c 50 75 74 28 75 6e 73 69 67 6e SerialPut(unsign
a5d0: 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 4d 65 ed char *buf, Me
a5e0: 6d 20 2a 70 4d 65 6d 29 7b 0a 20 20 75 33 32 20 m *pMem){. u32
a5f0: 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 73 71 serial_type = sq
a600: 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
a610: 79 70 65 28 70 4d 65 6d 29 3b 0a 20 20 69 6e 74 ype(pMem);. int
a620: 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 4e 55 4c 4c len;.. /* NULL
a630: 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c */. if( serial
a640: 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 _type==0 ){.
a650: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 0a return 0;. }. .
a660: 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 /* Integer and
a670: 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 Real */. if( s
a680: 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 29 7b erial_type<=7 ){
a690: 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 . u64 v;.
a6a0: 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 73 int i;. if( s
a6b0: 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b erial_type==7 ){
a6c0: 0a 20 20 20 20 20 20 76 20 3d 20 2a 28 75 36 34 . v = *(u64
a6d0: 2a 29 26 70 4d 65 6d 2d 3e 72 3b 0a 20 20 20 20 *)&pMem->r;.
a6e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d }else{. v =
a6f0: 20 2a 28 75 36 34 2a 29 26 70 4d 65 6d 2d 3e 69 *(u64*)&pMem->i
a700: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 ;. }. len
a710: 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 56 64 62 = i = sqlite3Vdb
a720: 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 eSerialTypeLen(s
a730: 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 erial_type);.
a740: 20 77 68 69 6c 65 28 20 69 2d 2d 20 29 7b 0a 20 while( i-- ){.
a750: 20 20 20 20 20 62 75 66 5b 69 5d 20 3d 20 28 76 buf[i] = (v
a760: 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 &0xFF);. v
a770: 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 >>= 8;. }.
a780: 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d return len;. }
a790: 0a 20 20 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 . . /* String
a7a0: 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 61 73 73 or blob */. ass
a7b0: 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 ert( serial_type
a7c0: 3e 3d 31 32 20 29 3b 0a 20 20 6c 65 6e 20 3d 20 >=12 );. len =
a7d0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
a7e0: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f lTypeLen(serial_
a7f0: 74 79 70 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 type);. memcpy(
a800: 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 buf, pMem->z, le
a810: 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 6c 65 6e n);. return len
a820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 ;.}../*.** Deser
a830: 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 ialize the data
a840: 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 blob pointed to
a850: 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c by buf as serial
a860: 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 type serial_typ
a870: 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 e.** and store t
a880: 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 he result in pMe
a890: 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e m. Return the n
a8a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 umber of bytes r
a8b0: 65 61 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c ead..*/ .int sql
a8c0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 ite3VdbeSerialGe
a8d0: 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 t(. const unsig
a8e0: 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 ned char *buf,
a8f0: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 /* Buffer to
a900: 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d deserialize from
a910: 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c */. u32 serial
a920: 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 _type,
a930: 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 /* Serial ty
a940: 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a pe to deserializ
a950: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d e */. Mem *pMem
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a970: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 /* Memory c
a980: 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c ell to write val
a990: 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 ue into */.){.
a9a0: 69 6e 74 20 6c 65 6e 3b 0a 0a 20 20 69 66 28 20 int len;.. if(
a9b0: 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 serial_type==0 )
a9c0: 7b 0a 20 20 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f {. /* NULL */
a9d0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 . pMem->flags
a9e0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 = MEM_Null;.
a9f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
aa00: 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 len = sqlite3Vd
aa10: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
aa20: 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 serial_type);.
aa30: 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c if( serial_type<
aa40: 3d 37 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 74 =7 ){. /* Int
aa50: 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f eger and Real */
aa60: 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f . if( serial_
aa70: 74 79 70 65 3c 3d 34 20 29 7b 0a 20 20 20 20 20 type<=4 ){.
aa80: 20 2f 2a 20 33 32 2d 62 69 74 20 69 6e 74 65 67 /* 32-bit integ
aa90: 65 72 20 74 79 70 65 2e 20 20 54 68 69 73 20 69 er type. This i
aaa0: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 61 20 73 s handled by a s
aab0: 70 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 0a pecial case for.
aac0: 20 20 20 20 20 20 2a 2a 20 70 65 72 66 6f 72 6d ** perform
aad0: 61 6e 63 65 20 72 65 61 73 6f 6e 73 2e 20 2a 2f ance reasons. */
aae0: 0a 20 20 20 20 20 20 69 6e 74 20 76 20 3d 20 62 . int v = b
aaf0: 75 66 5b 30 5d 3b 0a 20 20 20 20 20 20 69 6e 74 uf[0];. int
ab00: 20 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 76 26 n;. if( v&
ab10: 30 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 0x80 ){.
ab20: 76 20 7c 3d 20 2d 32 35 36 3b 0a 20 20 20 20 20 v |= -256;.
ab30: 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 6e 3d 31 }. for(n=1
ab40: 3b 20 6e 3c 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 ; n<len; n++){.
ab50: 20 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 38 v = (v<<8
ab60: 29 20 7c 20 62 75 66 5b 6e 5d 3b 0a 20 20 20 20 ) | buf[n];.
ab70: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e }. pMem->
ab80: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
ab90: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 69 20 3d . pMem->i =
aba0: 20 76 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e v;. return
abb0: 20 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 n;. }else{.
abc0: 20 20 20 20 20 75 36 34 20 76 20 3d 20 30 3b 0a u64 v = 0;.
abd0: 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 int n;..
abe0: 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 if( buf[0]&0
abf0: 78 38 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76 x80 ){. v
ac00: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 = -1;. }.
ac10: 20 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c for(n=0; n<
ac20: 6c 65 6e 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 len; n++){.
ac30: 20 20 20 76 20 3d 20 28 76 3c 3c 38 29 20 7c 20 v = (v<<8) |
ac40: 62 75 66 5b 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a buf[n];. }.
ac50: 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c if( serial
ac60: 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 _type==7 ){.
ac70: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
ac80: 3d 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 20 20 = MEM_Real;.
ac90: 20 20 20 20 70 4d 65 6d 2d 3e 72 20 3d 20 2a 28 pMem->r = *(
aca0: 64 6f 75 62 6c 65 2a 29 26 76 3b 0a 20 20 20 20 double*)&v;.
acb0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
acc0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
acd0: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 20 20 EM_Int;.
ace0: 70 4d 65 6d 2d 3e 69 20 3d 20 2a 28 69 36 34 2a pMem->i = *(i64*
acf0: 29 26 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 )&v;. }.
ad00: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }. }else{.
ad10: 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f /* String or blo
ad20: 62 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 b */. assert(
ad30: 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 serial_type>=12
ad40: 20 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 );. pMem->z
ad50: 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 = (char *)buf;.
ad60: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 6e pMem->n = len
ad70: 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c ;. if( serial
ad80: 5f 74 79 70 65 26 30 78 30 31 20 29 7b 0a 20 20 _type&0x01 ){.
ad90: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
ada0: 3d 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f = MEM_Str | MEM_
adb0: 45 70 68 65 6d 3b 0a 20 20 20 20 7d 65 6c 73 65 Ephem;. }else
adc0: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c {. pMem->fl
add0: 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c ags = MEM_Blob |
ade0: 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 MEM_Ephem;.
adf0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6c }. }. return l
ae00: 65 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 en;.}../*.** Thi
ae10: 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 s function compa
ae20: 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c res the two tabl
ae30: 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 e rows or index
ae40: 72 65 63 6f 72 64 73 20 73 70 65 63 69 66 69 65 records specifie
ae50: 64 20 62 79 20 0a 2a 2a 20 7b 6e 4b 65 79 31 2c d by .** {nKey1,
ae60: 20 70 4b 65 79 31 7d 20 61 6e 64 20 7b 6e 4b 65 pKey1} and {nKe
ae70: 79 32 2c 20 70 4b 65 79 32 7d 2c 20 72 65 74 75 y2, pKey2}, retu
ae80: 72 6e 69 6e 67 20 61 20 6e 65 67 61 74 69 76 65 rning a negative
ae90: 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 , zero.** or pos
aea0: 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 itive integer if
aeb0: 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 {nKey1, pKey1}
aec0: 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 is less than, eq
aed0: 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 ual to or .** gr
aee0: 65 61 74 65 72 20 74 68 61 6e 20 7b 6e 4b 65 79 eater than {nKey
aef0: 32 2c 20 70 4b 65 79 32 7d 2e 20 20 42 6f 74 68 2, pKey2}. Both
af00: 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 6d Key1 and Key2 m
af10: 75 73 74 20 62 65 20 62 79 74 65 20 73 74 72 69 ust be byte stri
af20: 6e 67 73 0a 2a 2a 20 63 6f 6d 70 6f 73 65 64 20 ngs.** composed
af30: 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 by the OP_MakeRe
af40: 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 cord opcode of t
af50: 68 65 20 56 44 42 45 2e 0a 2a 2f 0a 69 6e 74 20 he VDBE..*/.int
af60: 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 sqlite3VdbeRecor
af70: 64 43 6f 6d 70 61 72 65 28 0a 20 20 76 6f 69 64 dCompare(. void
af80: 20 2a 75 73 65 72 44 61 74 61 2c 0a 20 20 69 6e *userData,. in
af90: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 t nKey1, const v
afa0: 6f 69 64 20 2a 70 4b 65 79 31 2c 20 0a 20 20 69 oid *pKey1, . i
afb0: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 nt nKey2, const
afc0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 void *pKey2.){.
afd0: 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e KeyInfo *pKeyIn
afe0: 66 6f 20 3d 20 28 4b 65 79 49 6e 66 6f 2a 29 75 fo = (KeyInfo*)u
aff0: 73 65 72 44 61 74 61 3b 0a 20 20 75 33 32 20 64 serData;. u32 d
b000: 31 2c 20 64 32 3b 20 20 20 20 20 20 20 20 20 20 1, d2;
b010: 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 /* Offset into a
b020: 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 Key[] of next da
b030: 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 ta element */.
b040: 75 33 32 20 69 64 78 31 2c 20 69 64 78 32 3b 20 u32 idx1, idx2;
b050: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 /* Offset i
b060: 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 nto aKey[] of ne
b070: 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e xt header elemen
b080: 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 t */. u32 szHdr
b090: 31 2c 20 73 7a 48 64 72 32 3b 20 20 2f 2a 20 4e 1, szHdr2; /* N
b0a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 umber of bytes i
b0b0: 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e n header */. in
b0c0: 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e t i = 0;. int n
b0d0: 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 20 Field;. int rc
b0e0: 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 = 0;. const uns
b0f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 igned char *aKey
b100: 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 1 = (const unsig
b110: 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 ned char *)pKey1
b120: 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e ;. const unsign
b130: 65 64 20 63 68 61 72 20 2a 61 4b 65 79 32 20 3d ed char *aKey2 =
b140: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
b150: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 3b 0a 0a char *)pKey2;..
b160: 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 20 20 4d 65 Mem mem1;. Me
b170: 6d 20 6d 65 6d 32 3b 0a 20 20 6d 65 6d 31 2e 65 m mem2;. mem1.e
b180: 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 nc = pKeyInfo->e
b190: 6e 63 3b 0a 20 20 6d 65 6d 32 2e 65 6e 63 20 3d nc;. mem2.enc =
b1a0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a pKeyInfo->enc;.
b1b0: 20 20 0a 20 20 69 64 78 31 20 3d 20 73 71 6c 69 . idx1 = sqli
b1c0: 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 70 te3GetVarint32(p
b1d0: 4b 65 79 31 2c 20 26 73 7a 48 64 72 31 29 3b 0a Key1, &szHdr1);.
b1e0: 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 d1 = szHdr1;.
b1f0: 20 69 64 78 32 20 3d 20 73 71 6c 69 74 65 33 47 idx2 = sqlite3G
b200: 65 74 56 61 72 69 6e 74 33 32 28 70 4b 65 79 32 etVarint32(pKey2
b210: 2c 20 26 73 7a 48 64 72 32 29 3b 0a 20 20 64 32 , &szHdr2);. d2
b220: 20 3d 20 73 7a 48 64 72 32 3b 0a 20 20 6e 46 69 = szHdr2;. nFi
b230: 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e eld = pKeyInfo->
b240: 6e 46 69 65 6c 64 3b 0a 20 20 77 68 69 6c 65 28 nField;. while(
b250: 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 idx1<szHdr1 &&
b260: 69 64 78 32 3c 73 7a 48 64 72 32 20 29 7b 0a 20 idx2<szHdr2 ){.
b270: 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 u32 serial_ty
b280: 70 65 31 3b 0a 20 20 20 20 75 33 32 20 73 65 72 pe1;. u32 ser
b290: 69 61 6c 5f 74 79 70 65 32 3b 0a 0a 20 20 20 20 ial_type2;..
b2a0: 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 /* Read the seri
b2b0: 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 al types for the
b2c0: 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e next element in
b2d0: 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 each key. */.
b2e0: 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 idx1 += sqlite
b2f0: 33 47 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 3GetVarint32(&aK
b300: 65 79 31 5b 69 64 78 31 5d 2c 20 26 73 65 72 69 ey1[idx1], &seri
b310: 61 6c 5f 74 79 70 65 31 29 3b 0a 20 20 20 20 69 al_type1);. i
b320: 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 20 f( d1>=nKey1 &&
b330: 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
b340: 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f lTypeLen(serial_
b350: 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 6b type1)>0 ) break
b360: 3b 0a 20 20 20 20 69 64 78 32 20 2b 3d 20 73 71 ;. idx2 += sq
b370: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 lite3GetVarint32
b380: 28 26 61 4b 65 79 32 5b 69 64 78 32 5d 2c 20 26 (&aKey2[idx2], &
b390: 73 65 72 69 61 6c 5f 74 79 70 65 32 29 3b 0a 20 serial_type2);.
b3a0: 20 20 20 69 66 28 20 64 32 3e 3d 6e 4b 65 79 32 if( d2>=nKey2
b3b0: 20 26 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 && sqlite3VdbeS
b3c0: 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
b3d0: 69 61 6c 5f 74 79 70 65 32 29 3e 30 20 29 20 62 ial_type2)>0 ) b
b3e0: 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 41 73 reak;.. /* As
b3f0: 73 65 72 74 20 74 68 61 74 20 74 68 65 72 65 20 sert that there
b400: 69 73 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 is enough space
b410: 6c 65 66 74 20 69 6e 20 65 61 63 68 20 6b 65 79 left in each key
b420: 20 66 6f 72 20 74 68 65 20 62 6c 6f 62 20 6f 66 for the blob of
b430: 0a 20 20 20 20 2a 2a 20 64 61 74 61 20 74 6f 20 . ** data to
b440: 67 6f 20 77 69 74 68 20 74 68 65 20 73 65 72 69 go with the seri
b450: 61 6c 20 74 79 70 65 20 6a 75 73 74 20 72 65 61 al type just rea
b460: 64 2e 20 54 68 69 73 20 61 73 73 65 72 74 20 6d d. This assert m
b470: 61 79 20 66 61 69 6c 20 69 66 0a 20 20 20 20 2a ay fail if. *
b480: 2a 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f * the file is co
b490: 72 72 75 70 74 65 64 2e 20 20 54 68 65 6e 20 72 rrupted. Then r
b4a0: 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 66 72 ead the value fr
b4b0: 6f 6d 20 65 61 63 68 20 6b 65 79 20 69 6e 74 6f om each key into
b4c0: 20 6d 65 6d 31 0a 20 20 20 20 2a 2a 20 61 6e 64 mem1. ** and
b4d0: 20 6d 65 6d 32 20 72 65 73 70 65 63 74 69 76 65 mem2 respective
b4e0: 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 ly.. */. d
b4f0: 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 1 += sqlite3Vdbe
b500: 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 SerialGet(&aKey1
b510: 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 [d1], serial_typ
b520: 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 e1, &mem1);.
b530: 64 32 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 d2 += sqlite3Vdb
b540: 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 eSerialGet(&aKey
b550: 32 5b 64 32 5d 2c 20 73 65 72 69 61 6c 5f 74 79 2[d2], serial_ty
b560: 70 65 32 2c 20 26 6d 65 6d 32 29 3b 0a 0a 20 20 pe2, &mem2);..
b570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 rc = sqlite3Me
b580: 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 mCompare(&mem1,
b590: 26 6d 65 6d 32 2c 20 69 3c 6e 46 69 65 6c 64 20 &mem2, i<nField
b5a0: 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c ? pKeyInfo->aCol
b5b0: 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 73 l[i] : 0);. s
b5c0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
b5d0: 65 61 73 65 28 26 6d 65 6d 31 29 3b 0a 20 20 20 ease(&mem1);.
b5e0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 sqlite3VdbeMemR
b5f0: 65 6c 65 61 73 65 28 26 6d 65 6d 32 29 3b 0a 20 elease(&mem2);.
b600: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a if( rc!=0 ){.
b610: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
b620: 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a }. i++;. }.
b630: 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 . /* One of the
b640: 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 keys ran out of
b650: 20 66 69 65 6c 64 73 2c 20 62 75 74 20 61 6c 6c fields, but all
b660: 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 the fields up t
b670: 6f 20 74 68 61 74 20 70 6f 69 6e 74 0a 20 20 2a o that point. *
b680: 2a 20 77 65 72 65 20 65 71 75 61 6c 2e 20 49 66 * were equal. If
b690: 20 74 68 65 20 69 6e 63 72 4b 65 79 20 66 6c 61 the incrKey fla
b6a0: 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 g is true, then
b6b0: 74 68 65 20 73 65 63 6f 6e 64 20 6b 65 79 20 69 the second key i
b6c0: 73 0a 20 20 2a 2a 20 74 72 65 61 74 65 64 20 61 s. ** treated a
b6d0: 73 20 6c 61 72 67 65 72 2e 0a 20 20 2a 2f 0a 20 s larger.. */.
b6e0: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 if( rc==0 ){.
b6f0: 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e if( pKeyInfo->
b700: 69 6e 63 72 4b 65 79 20 29 7b 0a 20 20 20 20 20 incrKey ){.
b710: 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 rc = -1;. }e
b720: 6c 73 65 20 69 66 28 20 64 31 3c 6e 4b 65 79 31 lse if( d1<nKey1
b730: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 ){. rc = 1
b740: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
b750: 64 32 3c 6e 4b 65 79 32 20 29 7b 0a 20 20 20 20 d2<nKey2 ){.
b760: 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 7d rc = -1;. }
b770: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4b 65 79 . }.. if( pKey
b780: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 Info->aSortOrder
b790: 20 26 26 20 69 3c 70 4b 65 79 49 6e 66 6f 2d 3e && i<pKeyInfo->
b7a0: 6e 46 69 65 6c 64 20 26 26 20 70 4b 65 79 49 6e nField && pKeyIn
b7b0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 fo->aSortOrder[i
b7c0: 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 72 ] ){. rc = -r
b7d0: 63 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e c;. }.. return
b7e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 rc;.}../*.** Th
b7f0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 6e e argument is an
b800: 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 6f 6d index entry com
b810: 70 6f 73 65 64 20 75 73 69 6e 67 20 74 68 65 20 posed using the
b820: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 OP_MakeRecord op
b830: 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 code..** The las
b840: 74 20 65 6e 74 72 79 20 69 6e 20 74 68 69 73 20 t entry in this
b850: 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 record should be
b860: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 73 70 65 an integer (spe
b870: 63 69 66 69 63 61 6c 6c 79 0a 2a 2a 20 61 6e 20 cifically.** an
b880: 69 6e 74 65 67 65 72 20 72 6f 77 69 64 29 2e 20 integer rowid).
b890: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 This routine re
b8a0: 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 turns the number
b8b0: 20 6f 66 20 62 79 74 65 73 20 69 6e 0a 2a 2a 20 of bytes in.**
b8c0: 74 68 61 74 20 69 6e 74 65 67 65 72 2e 0a 2a 2f that integer..*/
b8d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
b8e0: 49 64 78 52 6f 77 69 64 4c 65 6e 28 69 6e 74 20 IdxRowidLen(int
b8f0: 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a nKey, const u8 *
b900: 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 73 7a 48 aKey){. u32 szH
b910: 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 dr; /* Si
b920: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 ze of the header
b930: 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f */. u32 typeRo
b940: 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 wid; /* Seria
b950: 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f l type of the ro
b960: 77 69 64 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 wid */.. sqlite
b970: 33 47 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 3GetVarint32(aKe
b980: 79 2c 20 26 73 7a 48 64 72 29 3b 0a 20 20 73 71 y, &szHdr);. sq
b990: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 lite3GetVarint32
b9a0: 28 26 61 4b 65 79 5b 73 7a 48 64 72 2d 31 5d 2c (&aKey[szHdr-1],
b9b0: 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 &typeRowid);.
b9c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 return sqlite3Vd
b9d0: 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
b9e0: 74 79 70 65 52 6f 77 69 64 29 3b 0a 7d 0a 20 20 typeRowid);.}.
b9f0: 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 ../*.** pCur poi
ba00: 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 nts at an index
ba10: 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 entry created us
ba20: 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 ing the OP_MakeR
ba30: 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a ecord opcode..**
ba40: 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 Read the rowid
ba50: 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 (the last field
ba60: 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 in the record) a
ba70: 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a nd store it in *
ba80: 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e rowid..** Return
ba90: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 SQLITE_OK if ev
baa0: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 erything works,
bab0: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 or an error code
bac0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69 otherwise..*/.i
bad0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 nt sqlite3VdbeId
bae0: 78 52 6f 77 69 64 28 42 74 43 75 72 73 6f 72 20 xRowid(BtCursor
baf0: 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 *pCur, i64 *rowi
bb00: 64 29 7b 0a 20 20 75 36 34 20 6e 43 65 6c 6c 4b d){. u64 nCellK
bb10: 65 79 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 ey;. int rc;.
bb20: 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 u32 szHdr;
bb30: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 /* Size of the
bb40: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 header */. u32
bb50: 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f typeRowid; /
bb60: 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 * Serial type of
bb70: 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 the rowid */.
bb80: 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 u32 lenRowid;
bb90: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 /* Size of the
bba0: 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 rowid */. Mem
bbb0: 6d 2c 20 76 3b 0a 0a 20 20 73 71 6c 69 74 65 33 m, v;.. sqlite3
bbc0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 BtreeKeySize(pCu
bbd0: 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 r, &nCellKey);.
bbe0: 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 if( nCellKey<=0
bbf0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){. return S
bc00: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 QLITE_CORRUPT;.
bc10: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 }. rc = sqlite
bc20: 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 3VdbeMemFromBtre
bc30: 65 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c e(pCur, 0, nCell
bc40: 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 Key, 1, &m);. i
bc50: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 f( rc ){. ret
bc60: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 73 71 urn rc;. }. sq
bc70: 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 lite3GetVarint32
bc80: 28 6d 2e 7a 2c 20 26 73 7a 48 64 72 29 3b 0a 20 (m.z, &szHdr);.
bc90: 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e sqlite3GetVarin
bca0: 74 33 32 28 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 t32(&m.z[szHdr-1
bcb0: 5d 2c 20 26 74 79 70 65 52 6f 77 69 64 29 3b 0a ], &typeRowid);.
bcc0: 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c lenRowid = sql
bcd0: 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 ite3VdbeSerialTy
bce0: 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 peLen(typeRowid)
bcf0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 ;. sqlite3VdbeS
bd00: 65 72 69 61 6c 47 65 74 28 26 6d 2e 7a 5b 6d 2e erialGet(&m.z[m.
bd10: 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 n-lenRowid], typ
bd20: 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a eRowid, &v);. *
bd30: 72 6f 77 69 64 20 3d 20 76 2e 69 3b 0a 20 20 73 rowid = v.i;. s
bd40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
bd50: 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 ease(&m);. retu
bd60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a rn SQLITE_OK;.}.
bd70: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 ./*.** Compare t
bd80: 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e he key of the in
bd90: 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 dex entry that c
bda0: 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e ursor pC is poin
bdb0: 74 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 t to against.**
bdc0: 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69 the key string i
bdd0: 6e 20 70 4b 65 79 20 28 6f 66 20 6c 65 6e 67 74 n pKey (of lengt
bde0: 68 20 6e 4b 65 79 29 2e 20 20 57 72 69 74 65 20 h nKey). Write
bdf0: 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d into *pRes a num
be00: 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e ber.** that is n
be10: 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f egative, zero, o
be20: 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 r positive if pC
be30: 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
be40: 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 qual to,.** or g
be50: 72 65 61 74 65 72 20 74 68 61 6e 20 70 4b 65 79 reater than pKey
be60: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 . Return SQLITE
be70: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a _OK on success..
be80: 2a 2a 0a 2a 2a 20 70 4b 65 79 20 69 73 20 65 69 **.** pKey is ei
be90: 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 ther created wit
bea0: 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 hout a rowid or
beb0: 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 is truncated so
bec0: 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 that it.** omits
bed0: 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 the rowid at th
bee0: 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 e end. The rowi
bef0: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 d at the end of
bf00: 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a the index entry.
bf10: 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 ** is ignored as
bf20: 20 77 65 6c 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 well..*/.int sq
bf30: 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 lite3VdbeIdxKeyC
bf40: 6f 6d 70 61 72 65 28 0a 20 20 43 75 72 73 6f 72 ompare(. Cursor
bf50: 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 *pC,
bf60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 /* The cur
bf70: 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 sor to compare a
bf80: 67 61 69 6e 73 74 20 2a 2f 0a 20 20 69 6e 74 20 gainst */. int
bf90: 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 75 38 20 2a nKey, const u8 *
bfa0: 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 6b pKey, /* The k
bfb0: 65 79 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f ey to compare */
bfc0: 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 . int *res
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
bfe0: 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 * Write the comp
bff0: 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 arison result he
c000: 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 6e re */.){. u64 n
c010: 43 65 6c 6c 4b 65 79 3b 0a 20 20 69 6e 74 20 72 CellKey;. int r
c020: 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 c;. BtCursor *p
c030: 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f Cur = pC->pCurso
c040: 72 3b 0a 20 20 69 6e 74 20 6c 65 6e 52 6f 77 69 r;. int lenRowi
c050: 64 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 73 d;. Mem m;.. s
c060: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 qlite3BtreeKeySi
c070: 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b ze(pCur, &nCellK
c080: 65 79 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c ey);. if( nCell
c090: 4b 65 79 3c 3d 30 20 29 7b 0a 20 20 20 20 2a 72 Key<=0 ){. *r
c0a0: 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 es = 0;. retu
c0b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 rn SQLITE_OK;.
c0c0: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 }. rc = sqlite3
c0d0: 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 VdbeMemFromBtree
c0e0: 28 70 43 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c (pC->pCursor, 0,
c0f0: 20 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d nCellKey, 1, &m
c100: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 );. if( rc ){.
c110: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
c120: 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 }. lenRowid = s
c130: 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 qlite3VdbeIdxRow
c140: 69 64 4c 65 6e 28 6d 2e 6e 2c 20 6d 2e 7a 29 3b idLen(m.n, m.z);
c150: 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 . *res = sqlite
c160: 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 3VdbeRecordCompa
c170: 72 65 28 70 43 2d 3e 70 4b 65 79 49 6e 66 6f 2c re(pC->pKeyInfo,
c180: 20 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 2c 20 6d m.n-lenRowid, m
c190: 2e 7a 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 29 3b .z, nKey, pKey);
c1a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 . sqlite3VdbeMe
c1b0: 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 mRelease(&m);.
c1c0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
c1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 ;.}../*.** This
c1e0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 routine sets the
c1f0: 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 value to be ret
c200: 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 urned by subsequ
c210: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 ent calls to.**
c220: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 sqlite3_changes(
c230: 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 ) on the databas
c240: 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a e handle 'db'. .
c250: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
c260: 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 dbeSetChanges(sq
c270: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e lite3 *db, int n
c280: 43 68 61 6e 67 65 29 7b 0a 20 20 64 62 2d 3e 6e Change){. db->n
c290: 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 Change = nChange
c2a0: 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 ;. db->nTotalCh
c2b0: 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b ange += nChange;
c2c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 .}../*.** Set a
c2d0: 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 flag in the vdbe
c2e0: 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 to update the c
c2f0: 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 hange counter wh
c300: 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 en it is finalis
c310: 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a ed.** or reset..
c320: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
c330: 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 dbeCountChanges(
c340: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 63 Vdbe *p){. p->c
c350: 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a hangeCntOn = 1;.
c360: 7d 0a 0a 0a 0a }....