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 76 64 62 65 49 6e 74 2e 68 22 lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 pParse){. sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a >db;. Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 zeof(Vdbe) );.
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 n 0;. p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 b;. if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 be ){. db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d }. p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d db->pVdbe;. p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 >pPrev = 0;. db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 ->pVdbe = p;. p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e AGIC_INIT;. p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 ->nLabel==0 );.
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 (Vdbe *p, const
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 char *z, int n,
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29 int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72 {. assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73 epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50 LLOG). if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72 repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 n;.#endif. asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 ;. p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 ->db, z, n);. p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20 ->isPrepareV2 =
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61 the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61 ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 _stmt *pStmt){.
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65 Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 *)pStmt;. retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72 rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53 epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 Vdbe *pB){. Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 be tmp, *pTmp;.
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74 char *zTmp;. t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 mp = *pA;. *pA
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 = *pB;. *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d mp;. pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e >pNext;. pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 . pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 Tmp;. pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 ->pPrev;. pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 ;. pB->pPrev =
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 pTmp;. zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a A->zSql;. pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 p;. pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 at it is at leas
08c0: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c t nOp elements l
08d0: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69 arger .** than i
08e0: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e ts current size.
08f0: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65 nOp is guarante
0900: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 ed to be less th
0910: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 an or equal.** t
0920: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 o 1024/sizeof(Op
0930: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f )..**.** If an o
0940: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 ut-of-memory err
0950: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 or occurs while
0960: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 resizing the arr
0970: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 ay, return.** SQ
0980: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 LITE_NOMEM. In t
0990: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f his case Vdbe.aO
09a0: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41 p and Parse.nOpA
09b0: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 lloc remain .**
09c0: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 unchanged (this
09d0: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f is so that any o
09e0: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 pcodes already a
09f0: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 llocated can be
0a00: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 .** correctly de
0a10: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 allocated along
0a20: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 with the rest of
0a30: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 the Vdbe)..*/.s
0a40: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 tatic int growOp
0a50: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69 Array(Vdbe *v, i
0a60: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f nt nOp){. VdbeO
0a70: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 p *pNew;. Parse
0a80: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b *p = v->pParse;
0a90: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 .. /* The SQLIT
0aa0: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 E_TEST_REALLOC_S
0ab0: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69 TRESS compile-ti
0ac0: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73 me option is des
0ad0: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20 igned to force.
0ae0: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e ** more frequen
0af0: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68 t reallocs and h
0b00: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72 ence provide mor
0b10: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 e opportunities
0b20: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 for . ** simula
0b30: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 ted OOM faults.
0b40: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 SQLITE_TEST_REA
0b50: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67 LLOC_STRESS is g
0b60: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20 enerally used.
0b70: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e ** during testin
0b80: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51 g only. With SQ
0b90: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f LITE_TEST_REALLO
0ba0: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68 C_STRESS grow th
0bb0: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20 e op array. **
0bc0: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 by the minimum*
0bd0: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20 amount required
0be0: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72 until the size r
0bf0: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72 eaches 512. Nor
0c00: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 mal. ** operati
0c10: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49 on (without SQLI
0c20: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f TE_TEST_REALLOC_
0c30: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f STRESS) is to do
0c40: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74 uble the current
0c50: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 . ** size of th
0c60: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64 e op array or ad
0c70: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20 d 1KB of space,
0c80: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 whichever is sma
0c90: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20 ller. */.#ifdef
0ca0: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c SQLITE_TEST_REAL
0cb0: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74 LOC_STRESS. int
0cc0: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 nNew = (p->nOpA
0cd0: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e lloc>=512 ? p->n
0ce0: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e OpAlloc*2 : p->n
0cf0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 OpAlloc+nOp);.#e
0d00: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d lse. int nNew =
0d10: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 (p->nOpAlloc ?
0d20: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 p->nOpAlloc*2 :
0d30: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f (int)(1024/sizeo
0d40: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 f(Op)));. UNUSE
0d50: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 D_PARAMETER(nOp)
0d60: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 ;.#endif.. asse
0d70: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 rt( nOp<=(1024/s
0d80: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 izeof(Op)) );.
0d90: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 assert( nNew>=(p
0da0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 ->nOpAlloc+nOp)
0db0: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 );. pNew = sqli
0dc0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e te3DbRealloc(p->
0dd0: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 db, v->aOp, nNew
0de0: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 *sizeof(Op));.
0df0: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 if( pNew ){.
0e00: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 p->nOpAlloc = sq
0e10: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a lite3DbMallocSiz
0e20: 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 e(p->db, pNew)/s
0e30: 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 izeof(Op);. v
0e40: 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 ->aOp = pNew;.
0e50: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 }. return (pNew
0e60: 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 ? SQLITE_OK : S
0e70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a QLITE_NOMEM);.}.
0e80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
0e90: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75 EBUG./* This rou
0ea0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63 tine is just a c
0eb0: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 onvenient place
0ec0: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f to set a breakpo
0ed0: 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a int that will.**
0ee0: 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 68 fire after each
0ef0: 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72 opcode is inser
0f00: 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65 ted and displaye
0f10: 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47 d using.** "PRAG
0f20: 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61 MA vdbe_addoptra
0f30: 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69 ce=on"..*/.stati
0f40: 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f c void test_addo
0f50: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 p_breakpoint(voi
0f60: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 d){. static int
0f70: 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d n = 0;. n++;.}
0f80: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 .#endif../*.** A
0f90: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63 dd a new instruc
0fa0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74 tion to the list
0fb0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 of instructions
0fc0: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a current in the.
0fd0: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e ** VDBE. Return
0fe0: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 the address of
0ff0: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74 the new instruct
1000: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d ion..**.** Param
1010: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 eters:.**.**
1020: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p
1030: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56 Pointer to the V
1040: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20 DBE.**.** op
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 The
1060: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73 opcode for this
1070: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a instruction.**.
1080: 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33 ** p1, p2, p3
1090: 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a Operands.*
10a0: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c *.** Use the sql
10b0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c ite3VdbeResolveL
10c0: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 abel() function
10d0: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73 to fix an addres
10e0: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c s and.** the sql
10f0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 ite3VdbeChangeP4
1100: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63 () function to c
1110: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 hange the value
1120: 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65 of the P4.** ope
1130: 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c rand..*/.int sql
1140: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 56 ite3VdbeAddOp3(V
1150: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 dbe *p, int op,
1160: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 int p1, int p2,
1170: 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 int p3){. int i
1180: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b ;. VdbeOp *pOp;
1190: 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a .. i = p->nOp;.
11a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 assert( p->mag
11b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 ic==VDBE_MAGIC_I
11c0: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 NIT );. assert(
11d0: 20 6f 70 3e 30 20 26 26 20 6f 70 3c 30 78 66 66 op>0 && op<0xff
11e0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 );. if( p->pPa
11f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 rse->nOpAlloc<=i
1200: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 ){. if( grow
1210: 4f 70 41 72 72 61 79 28 70 2c 20 31 29 20 29 7b OpArray(p, 1) ){
1220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b . return 1;
1230: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e . }. }. p->
1240: 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 nOp++;. pOp = &
1250: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 p->aOp[i];. pOp
1260: 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f ->opcode = (u8)o
1270: 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 p;. pOp->p5 = 0
1280: 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 ;. pOp->p1 = p1
1290: 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 ;. pOp->p2 = p2
12a0: 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 ;. pOp->p3 = p3
12b0: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 ;. pOp->p4.p =
12c0: 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 0;. pOp->p4type
12d0: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 = P4_NOTUSED;.#
12e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
12f0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d BLE_EXPLAIN_COMM
1300: 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d ENTS. pOp->zCom
1310: 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 ment = 0;.#endif
1320: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
1330: 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e 64 62 EBUG. if( p->db
1340: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 ->flags & SQLITE
1350: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 _VdbeAddopTrace
1360: 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c 20 6b ){. int jj, k
1370: 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a 70 50 k;. Parse *pP
1380: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 arse = p->pParse
1390: 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d ;. for(jj=kk=
13a0: 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 0; jj<SQLITE_N_C
13b0: 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a OLCACHE; jj++){.
13c0: 20 20 20 20 20 20 73 74 72 75 63 74 20 79 43 6f struct yCo
13d0: 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50 61 72 lCache *x = pPar
13e0: 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20 2b 20 se->aColCache +
13f0: 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 78 2d jj;. if( x-
1400: 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65 2d 3e >iLevel>pParse->
1410: 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c 20 78 iCacheLevel || x
1420: 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f 6e 74 ->iReg==0 ) cont
1430: 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72 69 6e inue;. prin
1440: 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 tf(" r[%d]={%d:%
1450: 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20 78 2d d}", x->iReg, x-
1460: 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c >iTable, x->iCol
1470: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b umn);. kk++
1480: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
1490: 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 kk ) printf("\n"
14a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 );. sqlite3Vd
14b0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 bePrintOp(0, i,
14c0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 &p->aOp[i]);.
14d0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 test_addop_brea
14e0: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 kpoint();. }.#e
14f0: 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 ndif.#ifdef VDBE
1500: 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e _PROFILE. pOp->
1510: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f cycles = 0;. pO
1520: 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 p->cnt = 0;.#end
1530: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 if.#ifdef SQLITE
1540: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 _VDBE_COVERAGE.
1550: 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65 20 3d pOp->iSrcLine =
1560: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 0;.#endif. ret
1570: 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c urn i;.}.int sql
1580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 56 ite3VdbeAddOp0(V
1590: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 7b dbe *p, int op){
15a0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
15b0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 3VdbeAddOp3(p, o
15c0: 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 p, 0, 0, 0);.}.i
15d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
15e0: 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 6e dOp1(Vdbe *p, in
15f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a 20 t op, int p1){.
1600: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
1610: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c dbeAddOp3(p, op,
1620: 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e p1, 0, 0);.}.in
1630: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 t sqlite3VdbeAdd
1640: 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 Op2(Vdbe *p, int
1650: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 op, int p1, int
1660: 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 p2){. return s
1670: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 qlite3VdbeAddOp3
1680: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 (p, op, p1, p2,
1690: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 0);.}.../*.** Ad
16a0: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 d an opcode that
16b0: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 includes the p4
16c0: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e value as a poin
16d0: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 ter..*/.int sqli
16e0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 te3VdbeAddOp4(.
16f0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 Vdbe *p,
1700: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 /* Add the
1710: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 opcode to this V
1720: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 M */. int op,
1730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
1740: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a e new opcode */.
1750: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 int p1,
1760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 /* The P1
1770: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
1780: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 p2,
1790: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 /* The P2 opera
17a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 nd */. int p3,
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
17c0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f he P3 operand */
17d0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
17e0: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 P4, /* The P4
17f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e operand */. in
1800: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 t p4type
1810: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 /* P4 operand
1820: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 type */.){. int
1830: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 addr = sqlite3V
1840: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c dbeAddOp3(p, op,
1850: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 p1, p2, p3);.
1860: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
1870: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 eP4(p, addr, zP4
1880: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 , p4type);. ret
1890: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a urn addr;.}../*.
18a0: 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 ** Add an OP_Par
18b0: 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e seSchema opcode.
18c0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 This routine i
18d0: 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f s broken out fro
18e0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 m.** sqlite3Vdbe
18f0: 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 69 AddOp4() since i
1900: 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 t needs to also
1910: 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c needs to mark al
1920: 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 l btrees.** as h
1930: 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64 2e aving been used.
1940: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 .**.** The zWher
1950: 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68 61 e string must ha
1960: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 ve been obtained
1970: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 from sqlite3_ma
1980: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 lloc()..** This
1990: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b routine will tak
19a0: 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20 74 e ownership of t
19b0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d he allocated mem
19c0: 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ory..*/.void sql
19d0: 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73 65 ite3VdbeAddParse
19e0: 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 SchemaOp(Vdbe *p
19f0: 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72 20 , int iDb, char
1a00: 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 *zWhere){. int
1a10: 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 j;. int addr =
1a20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
1a30: 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68 3(p, OP_ParseSch
1a40: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 29 3b ema, iDb, 0, 0);
1a50: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 . sqlite3VdbeCh
1a60: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 angeP4(p, addr,
1a70: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d zWhere, P4_DYNAM
1a80: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 IC);. for(j=0;
1a90: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b j<p->db->nDb; j+
1aa0: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 +) sqlite3VdbeUs
1ab0: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d esBtree(p, j);.}
1ac0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f ../*.** Add an o
1ad0: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 pcode that inclu
1ae0: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 des the p4 value
1af0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a as an integer..
1b00: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
1b10: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56 beAddOp4Int(. V
1b20: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 dbe *p,
1b30: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 /* Add the op
1b40: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 code to this VM
1b50: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 */. int op,
1b60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
1b70: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 new opcode */.
1b80: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 int p1,
1b90: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 /* The P1 op
1ba0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 erand */. int p
1bb0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2, /
1bc0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 * The P2 operand
1bd0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 */. int p3,
1be0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1bf0: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 P3 operand */.
1c00: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20 int p4
1c10: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f /* The P4 o
1c20: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74 perand as an int
1c30: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 eger */.){. int
1c40: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 addr = sqlite3V
1c50: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c dbeAddOp3(p, op,
1c60: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 p1, p2, p3);.
1c70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
1c80: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c eP4(p, addr, SQL
1c90: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70 ITE_INT_TO_PTR(p
1ca0: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20 4), P4_INT32);.
1cb0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a return addr;.}.
1cc0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 ./*.** Create a
1cd0: 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 new symbolic lab
1ce0: 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 el for an instru
1cf0: 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 ction that has y
1d00: 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 et to be.** code
1d10: 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 d. The symbolic
1d20: 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 label is really
1d30: 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 just a negative
1d40: 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a number. The.**
1d50: 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 label can be us
1d60: 65 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c ed as the P2 val
1d70: 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 ue of an operati
1d80: 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e on. Later, when
1d90: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 .** the label is
1da0: 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 resolved to a s
1db0: 70 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c pecific address,
1dc0: 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 the VDBE will s
1dd0: 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 can.** through i
1de0: 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 ts operation lis
1df0: 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c t and change all
1e00: 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 values of P2 wh
1e10: 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 ich match.** the
1e20: 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 label into the
1e30: 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 resolved address
1e40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 ..**.** The VDBE
1e50: 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 knows that a P2
1e60: 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 value is a labe
1e70: 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 l because labels
1e80: 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e are.** always n
1e90: 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 egative and P2 v
1ea0: 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 alues are suppos
1eb0: 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 e to be non-nega
1ec0: 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 tive..** Hence,
1ed0: 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 a negative P2 va
1ee0: 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 lue is a label t
1ef0: 68 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 hat has yet to b
1f00: 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a e resolved..**.*
1f10: 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e * Zero is return
1f20: 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 ed if a malloc()
1f30: 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 fails..*/.int s
1f40: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 qlite3VdbeMakeLa
1f50: 62 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 bel(Vdbe *v){.
1f60: 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 Parse *p = v->pP
1f70: 61 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20 arse;. int i =
1f80: 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 p->nLabel++;. a
1f90: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d ssert( v->magic=
1fa0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 =VDBE_MAGIC_INIT
1fb0: 20 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28 );. if( (i & (
1fc0: 69 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 i-1))==0 ){.
1fd0: 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 p->aLabel = sqli
1fe0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 te3DbReallocOrFr
1ff0: 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 ee(p->db, p->aLa
2000: 62 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 bel, .
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a (i*
2030: 32 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 2+1)*sizeof(p->a
2040: 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a Label[0]));. }.
2050: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 if( p->aLabel
2060: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c ){. p->aLabel
2070: 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 [i] = -1;. }.
2080: 72 65 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a return -1-i;.}..
2090: 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 /*.** Resolve la
20a0: 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 bel "x" to be th
20b0: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 e address of the
20c0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f next instructio
20d0: 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 n to.** be inser
20e0: 74 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 ted. The parame
20f0: 74 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 ter "x" must hav
2100: 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 e been obtained
2110: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 from.** a prior
2120: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 call to sqlite3V
2130: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a dbeMakeLabel()..
2140: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
2150: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 dbeResolveLabel(
2160: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b Vdbe *v, int x){
2170: 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d . Parse *p = v-
2180: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a >pParse;. int j
2190: 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 73 73 65 72 = -1-x;. asser
21a0: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 t( v->magic==VDB
21b0: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a E_MAGIC_INIT );.
21c0: 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e assert( j<p->n
21d0: 4c 61 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 41 Label );. if( A
21e0: 4c 57 41 59 53 28 6a 3e 3d 30 29 20 26 26 20 70 LWAYS(j>=0) && p
21f0: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 ->aLabel ){.
2200: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 p->aLabel[j] = v
2210: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e ->nOp;. }. p->
2220: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f iFixedOp = v->nO
2230: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 p - 1;.}../*.**
2240: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 Mark the VDBE as
2250: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e one that can on
2260: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 ly be run one ti
2270: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 me..*/.void sqli
2280: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e te3VdbeRunOnlyOn
2290: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 ce(Vdbe *p){. p
22a0: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 ->runOnlyOnce =
22b0: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 1;.}..#ifdef SQL
22c0: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c ITE_DEBUG /* sql
22d0: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f ite3AssertMayAbo
22e0: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f rt() logic */../
22f0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 *.** The followi
2300: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 ng type and func
2310: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f tion are used to
2320: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 iterate through
2330: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 all opcodes.**
2340: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 in a Vdbe main p
2350: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 rogram and each
2360: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 of the sub-progr
2370: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 ams (triggers) i
2380: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 t may .** invoke
2390: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 directly or ind
23a0: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 irectly. It shou
23b0: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f ld be used as fo
23c0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f llows:.**.** O
23d0: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 p *pOp;.** Vdb
23e0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a eOpIter sIter;.*
23f0: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 *.** memset(&s
2400: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 Iter, 0, sizeof(
2410: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 sIter));.** sI
2420: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 ter.v = v;
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2440: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 // v is of
2450: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 type Vdbe* .**
2460: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 while( (pOp =
2470: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 opIterNext(&sIte
2480: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f r)) ){.** //
2490: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 Do something wi
24a0: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a th pOp.** }.**
24b0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
24c0: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 (v->db, sIter.ap
24d0: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 Sub);.** .*/.typ
24e0: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 edef struct Vdbe
24f0: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 OpIter VdbeOpIte
2500: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 r;.struct VdbeOp
2510: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 Iter {. Vdbe *v
2520: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
2530: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 /* Vdbe to i
2540: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 terate through t
2550: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f he opcodes of */
2560: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a . SubProgram **
2570: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a apSub; /*
2580: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f Array of subpro
2590: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e grams */. int n
25a0: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 Sub;
25b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
25c0: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 of entries in ap
25d0: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 Sub */. int iAd
25e0: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dr;
25f0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f /* Address o
2600: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 f next instructi
2610: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a on to return */.
2620: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 int iSub;
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2640: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 0 = main program
2650: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d , 1 = first sub-
2660: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a program etc. */.
2670: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 };.static Op *op
2680: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 IterNext(VdbeOpI
2690: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 ter *p){. Vdbe
26a0: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 *v = p->v;. Op
26b0: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 *pRet = 0;. Op
26c0: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b *aOp;. int nOp;
26d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c .. if( p->iSub<
26e0: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 =p->nSub ){..
26f0: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 if( p->iSub==0
2700: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 ){. aOp = v
2710: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 ->aOp;. nOp
2720: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d = v->nOp;. }
2730: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 else{. aOp
2740: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 = p->apSub[p->iS
2750: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 ub-1]->aOp;.
2760: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 nOp = p->apSub
2770: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 [p->iSub-1]->nOp
2780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 ;. }. asse
2790: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 rt( p->iAddr<nOp
27a0: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 );.. pRet =
27b0: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a &aOp[p->iAddr];.
27c0: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a p->iAddr++;.
27d0: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 if( p->iAddr
27e0: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 ==nOp ){. p
27f0: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 ->iSub++;.
2800: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 p->iAddr = 0;.
2810: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 }. . if( p
2820: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f Ret->p4type==P4_
2830: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 SUBPROGRAM ){.
2840: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 int nByte =
2850: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 (p->nSub+1)*size
2860: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b of(SubProgram*);
2870: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 . int j;.
2880: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 for(j=0; j<p
2890: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 ->nSub; j++){.
28a0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 if( p->apS
28b0: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e ub[j]==pRet->p4.
28c0: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b pProgram ) break
28d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
28e0: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 if( j==p->nSub )
28f0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 {. p->apS
2900: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 ub = sqlite3DbRe
2910: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 allocOrFree(v->d
2920: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 b, p->apSub, nBy
2930: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 te);. if(
2940: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 !p->apSub ){.
2950: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 pRet = 0
2960: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
2970: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 . p->ap
2980: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d Sub[p->nSub++] =
2990: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 pRet->p4.pProgr
29a0: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 am;. }.
29b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a }. }. }.
29c0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a . return pRet;.
29d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 }../*.** Check i
29e0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 f the program st
29f0: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 ored in the VM a
2a00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 ssociated with p
2a10: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 Parse may.** thr
2a20: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 ow an ABORT exce
2a30: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 ption (causing t
2a40: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 he statement, bu
2a50: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 t not entire tra
2a60: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 nsaction.** to b
2a70: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 e rolled back).
2a80: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 This condition i
2a90: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 s true if the ma
2aa0: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e in program or an
2ab0: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d y.** sub-program
2ac0: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f s contains any o
2ad0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a f the following:
2ae0: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 .**.** * OP_H
2af0: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 alt with P1=SQLI
2b00: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e TE_CONSTRAINT an
2b10: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a d P2=OE_Abort..*
2b20: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 * * OP_HaltIf
2b30: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c Null with P1=SQL
2b40: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 ITE_CONSTRAINT a
2b50: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a nd P2=OE_Abort..
2b60: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 ** * OP_Destr
2b70: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 oy.** * OP_VU
2b80: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 pdate.** * OP
2b90: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 _VRename.** *
2ba0: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 OP_FkCounter wi
2bb0: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 th P2==0 (immedi
2bc0: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 ate foreign key
2bd0: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 0a 2a constraint).**.*
2be0: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 * Then check tha
2bf0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 t the value of P
2c00: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 arse.mayAbort is
2c10: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 true if an.** A
2c20: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f BORT may be thro
2c30: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 wn, or false oth
2c40: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 erwise. Return t
2c50: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a rue if it does.*
2c60: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 * match, or fals
2c70: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 e otherwise. Thi
2c80: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
2c90: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 tended to be use
2ca0: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 d as.** part of
2cb0: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d an assert statem
2cc0: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 ent in the compi
2cd0: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a ler. Similar to:
2ce0: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 .**.** assert(
2cf0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 sqlite3VdbeAsse
2d00: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 rtMayAbort(pPars
2d10: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 e->pVdbe, pParse
2d20: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a ->mayAbort) );.*
2d30: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
2d40: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 eAssertMayAbort(
2d50: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 Vdbe *v, int may
2d60: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 Abort){. int ha
2d70: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 4f 70 sAbort = 0;. Op
2d80: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 *pOp;. VdbeOpI
2d90: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d ter sIter;. mem
2da0: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 set(&sIter, 0, s
2db0: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 izeof(sIter));.
2dc0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 sIter.v = v;..
2dd0: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f while( (pOp = o
2de0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 pIterNext(&sIter
2df0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 ))!=0 ){. int
2e00: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f opcode = pOp->o
2e10: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f pcode;. if( o
2e20: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f pcode==OP_Destro
2e30: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f y || opcode==OP_
2e40: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 VUpdate || opcod
2e50: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 23 e==OP_VRename .#
2e60: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
2e70: 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 IT_FOREIGN_KEY.
2e80: 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 3d 3d || (opcode==
2e90: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 OP_FkCounter &&
2ea0: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f pOp->p1==0 && pO
2eb0: 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e 64 69 p->p2==1) .#endi
2ec0: 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f f. || ((opco
2ed0: 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f de==OP_Halt || o
2ee0: 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 pcode==OP_HaltIf
2ef0: 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 Null) . &&
2f00: 28 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d ((pOp->p1&0xff)=
2f10: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 =SQLITE_CONSTRAI
2f20: 4e 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f NT && pOp->p2==O
2f30: 45 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b E_Abort)). ){
2f40: 0a 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 . hasAbort
2f50: 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b = 1;. break
2f60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 ;. }. }. sq
2f70: 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 lite3DbFree(v->d
2f80: 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b b, sIter.apSub);
2f90: 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 .. /* Return tr
2fa0: 75 65 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d ue if hasAbort==
2fb0: 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 mayAbort. Or if
2fc0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 a malloc failure
2fd0: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 occurred.. **
2fe0: 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 If malloc failed
2ff0: 2c 20 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 , then the while
3000: 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 () loop above ma
3010: 79 20 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 y not have itera
3020: 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 ted. ** through
3030: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 all opcodes and
3040: 20 68 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 hasAbort may be
3050: 20 73 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 set incorrectly
3060: 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 . Return. ** tr
3070: 75 65 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 ue for this case
3080: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 to prevent the
3090: 61 73 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 assert() in the
30a0: 63 61 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 callers frame.
30b0: 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e ** from failing.
30c0: 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 */. return (
30d0: 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 v->db->mallocFai
30e0: 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d led || hasAbort=
30f0: 3d 6d 61 79 41 62 6f 72 74 20 29 3b 0a 7d 0a 23 =mayAbort );.}.#
3100: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
3110: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 DEBUG - the sqli
3120: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 te3AssertMayAbor
3130: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a t() function */.
3140: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 74 68 72 6f ./*.** Loop thro
3150: 75 67 68 20 74 68 65 20 70 72 6f 67 72 61 6d 20 ugh the program
3160: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 50 32 20 76 looking for P2 v
3170: 61 6c 75 65 73 20 74 68 61 74 20 61 72 65 20 6e alues that are n
3180: 65 67 61 74 69 76 65 0a 2a 2a 20 6f 6e 20 6a 75 egative.** on ju
3190: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 2e mp instructions.
31a0: 20 20 45 61 63 68 20 73 75 63 68 20 76 61 6c 75 Each such valu
31b0: 65 20 69 73 20 61 20 6c 61 62 65 6c 2e 20 20 52 e is a label. R
31c0: 65 73 6f 6c 76 65 20 74 68 65 0a 2a 2a 20 6c 61 esolve the.** la
31d0: 62 65 6c 20 62 79 20 73 65 74 74 69 6e 67 20 74 bel by setting t
31e0: 68 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 69 he P2 value to i
31f0: 74 73 20 63 6f 72 72 65 63 74 20 6e 6f 6e 2d 7a ts correct non-z
3200: 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a ero value..**.**
3210: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
3220: 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20 61 66 74 called once aft
3230: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 er all opcodes h
3240: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 ave been inserte
3250: 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 69 61 62 6c d..**.** Variabl
3260: 65 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 e *pMaxFuncArgs
3270: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6d 61 is set to the ma
3280: 78 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20 61 ximum value of a
3290: 6e 79 20 50 32 20 61 72 67 75 6d 65 6e 74 20 0a ny P2 argument .
32a0: 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f 46 75 6e 63 ** to an OP_Func
32b0: 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 53 74 65 70 tion, OP_AggStep
32c0: 20 6f 72 20 4f 50 5f 56 46 69 6c 74 65 72 20 6f or OP_VFilter o
32d0: 70 63 6f 64 65 2e 20 54 68 69 73 20 69 73 20 75 pcode. This is u
32e0: 73 65 64 20 62 79 20 0a 2a 2a 20 73 71 6c 69 74 sed by .** sqlit
32f0: 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 e3VdbeMakeReady(
3300: 29 20 74 6f 20 73 69 7a 65 20 74 68 65 20 56 64 ) to size the Vd
3310: 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 be.apArg[] array
3320: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 70 2e 6f ..**.** The Op.o
3330: 70 66 6c 61 67 73 20 66 69 65 6c 64 20 69 73 20 pflags field is
3340: 73 65 74 20 6f 6e 20 61 6c 6c 20 6f 70 63 6f 64 set on all opcod
3350: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f es..*/.static vo
3360: 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 id resolveP2Valu
3370: 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 es(Vdbe *p, int
3380: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a *pMaxFuncArgs){.
3390: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e int i;. int n
33a0: 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 MaxArgs = *pMaxF
33b0: 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 uncArgs;. Op *p
33c0: 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 Op;. Parse *pPa
33d0: 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b rse = p->pParse;
33e0: 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d . int *aLabel =
33f0: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b pParse->aLabel;
3400: 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d . p->readOnly =
3410: 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 1;. p->bIsRead
3420: 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 4f er = 0;. for(pO
3430: 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d 3e 6e p=p->aOp, i=p->n
3440: 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 2c Op-1; i>=0; i--,
3450: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 38 20 pOp++){. u8
3460: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 opcode = pOp->op
3470: 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 4e 4f code;.. /* NO
3480: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75 TE: Be sure to u
3490: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e pdate mkopcodeh.
34a0: 61 77 6b 20 77 68 65 6e 20 61 64 64 69 6e 67 20 awk when adding
34b0: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20 or removing.
34c0: 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 74 68 ** cases from th
34d0: 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 is switch! */.
34e0: 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f 64 65 switch( opcode
34f0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 4f ){. case O
3500: 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a 20 20 20 20 P_Function:.
3510: 20 20 63 61 73 65 20 4f 50 5f 41 67 67 53 74 65 case OP_AggSte
3520: 70 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 p: {. if(
3530: 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 78 41 72 67 pOp->p5>nMaxArg
3540: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 s ) nMaxArgs = p
3550: 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 20 20 20 20 Op->p5;.
3560: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 break;. }.
3570: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61 case OP_Tra
3580: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 nsaction: {.
3590: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 if( pOp->p2!
35a0: 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 =0 ) p->readOnly
35b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a = 0;. /*
35c0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 fall thru */.
35d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
35e0: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a OP_AutoCommit:.
35f0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61 case OP_Sa
3600: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 vepoint: {.
3610: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 p->bIsReader
3620: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 = 1;. bre
3630: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e ak;. }.#ifn
3640: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
3650: 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f WAL. case O
3660: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 P_Checkpoint:.#e
3670: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 ndif. case
3680: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 OP_Vacuum:.
3690: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c case OP_Journal
36a0: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 Mode: {.
36b0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b p->readOnly = 0;
36c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 . p->bIsR
36d0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 eader = 1;.
36e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
36f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 }.#ifndef SQLITE
3700: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
3710: 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 LE. case OP
3720: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 _VUpdate: {.
3730: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e if( pOp->p2>
3740: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 nMaxArgs ) nMaxA
3750: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 rgs = pOp->p2;.
3760: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3770: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
3780: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 OP_VFilter: {.
3790: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 int n;.
37a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d assert( p-
37b0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b >nOp - i >= 3 );
37c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
37d0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d pOp[-1].opcode=
37e0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 =OP_Integer );.
37f0: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d n = pOp[-
3800: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69 1].p1;. i
3810: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 f( n>nMaxArgs )
3820: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 nMaxArgs = n;.
3830: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
3840: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
3850: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a case OP_Next:.
3860: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 case OP_Ne
3870: 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 xtIfOpen:.
3880: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 case OP_SorterNe
3890: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f xt: {. pO
38a0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d p->p4.xAdvance =
38b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 sqlite3BtreeNex
38c0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e t;. pOp->
38d0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 p4type = P4_ADVA
38e0: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 NCE;. bre
38f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
3900: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a case OP_Prev:.
3910: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 case OP_Pr
3920: 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 evIfOpen: {.
3930: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 pOp->p4.xAdv
3940: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 ance = sqlite3Bt
3950: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 reePrevious;.
3960: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 pOp->p4type
3970: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 = P4_ADVANCE;.
3980: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3990: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
39a0: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 pOp->opflags =
39b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f sqlite3OpcodePro
39c0: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 perty[opcode];.
39d0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 if( (pOp->opf
39e0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d lags & OPFLG_JUM
39f0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 P)!=0 && pOp->p2
3a00: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 <0 ){. asse
3a10: 72 74 28 20 2d 31 2d 70 4f 70 2d 3e 70 32 3c 70 rt( -1-pOp->p2<p
3a20: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b Parse->nLabel );
3a30: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d . pOp->p2 =
3a40: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e aLabel[-1-pOp->
3a50: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 p2];. }. }.
3a60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 sqlite3DbFree(p
3a70: 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c ->db, pParse->aL
3a80: 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d abel);. pParse-
3a90: 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 >aLabel = 0;. p
3aa0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 Parse->nLabel =
3ab0: 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 0;. *pMaxFuncAr
3ac0: 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 gs = nMaxArgs;.
3ad0: 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 assert( p->bIsR
3ae0: 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 eader!=0 || DbMa
3af0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 skAllZero(p->btr
3b00: 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a eeMask) );.}../*
3b10: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 .** Return the a
3b20: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 ddress of the ne
3b30: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 xt instruction t
3b40: 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a o be inserted..*
3b50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
3b60: 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 eCurrentAddr(Vdb
3b70: 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 e *p){. assert(
3b80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
3b90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 MAGIC_INIT );.
3ba0: 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d return p->nOp;.}
3bb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e ../*.** This fun
3bc0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 ction returns a
3bd0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 pointer to the a
3be0: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 rray of opcodes
3bf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a associated with.
3c00: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73 ** the Vdbe pass
3c10: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 ed as the first
3c20: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 argument. It is
3c30: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 the callers resp
3c40: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f onsibility.** to
3c50: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 arrange for the
3c60: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 returned array
3c70: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 to be eventually
3c80: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 freed using the
3c90: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 .** vdbeFreeOpA
3ca0: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e rray() function.
3cb0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 .**.** Before re
3cc0: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 turning, *pnOp i
3cd0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d s set to the num
3ce0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 ber of entries i
3cf0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a n the returned.*
3d00: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a * array. Also, *
3d10: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 pnMaxArg is set
3d20: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 to the larger of
3d30: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c its current val
3d40: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e ue and .** the n
3d50: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 umber of entries
3d60: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 in the Vdbe.apA
3d70: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 rg[] array requi
3d80: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 red to execute t
3d90: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 he .** returned
3da0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 program..*/.Vdbe
3db0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 Op *sqlite3VdbeT
3dc0: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 akeOpArray(Vdbe
3dd0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 *p, int *pnOp, i
3de0: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 nt *pnMaxArg){.
3df0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 VdbeOp *aOp = p
3e00: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 ->aOp;. assert(
3e10: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e aOp && !p->db->
3e20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a mallocFailed );.
3e30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 . /* Check that
3e40: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 sqlite3VdbeUses
3e50: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 Btree() was not
3e60: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 called on this V
3e70: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 M */. assert( D
3e80: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e bMaskAllZero(p->
3e90: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 btreeMask) );..
3ea0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 resolveP2Values
3eb0: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 (p, pnMaxArg);.
3ec0: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b *pnOp = p->nOp;
3ed0: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 . p->aOp = 0;.
3ee0: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a return aOp;.}..
3ef0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c /*.** Add a whol
3f00: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 e list of operat
3f10: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 ions to the oper
3f20: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 ation stack. Re
3f30: 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 turn the.** addr
3f40: 65 73 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 ess of the first
3f50: 20 6f 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 operation added
3f60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
3f70: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 VdbeAddOpList(Vd
3f80: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 be *p, int nOp,
3f90: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 VdbeOpList const
3fa0: 20 2a 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 *aOp, int iLine
3fb0: 6e 6f 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b no){. int addr;
3fc0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 . assert( p->ma
3fd0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
3fe0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d INIT );. if( p-
3ff0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e >nOp + nOp > p->
4000: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 pParse->nOpAlloc
4010: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 && growOpArray(
4020: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 p, nOp) ){. r
4030: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 eturn 0;. }. a
4040: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 ddr = p->nOp;.
4050: 69 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 if( ALWAYS(nOp>0
4060: 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a ) ){. int i;.
4070: 20 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 VdbeOpList c
4080: 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b onst *pIn = aOp;
4090: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
40a0: 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 nOp; i++, pIn++)
40b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d {. int p2 =
40c0: 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 pIn->p2;.
40d0: 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 VdbeOp *pOut = &
40e0: 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a p->aOp[i+addr];.
40f0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f pOut->opco
4100: 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 de = pIn->opcode
4110: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 ;. pOut->p1
4120: 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 = pIn->p1;.
4130: 20 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 if( p2<0 ){.
4140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 assert( sq
4150: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 lite3OpcodePrope
4160: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 rty[pOut->opcode
4170: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 ] & OPFLG_JUMP )
4180: 3b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e ;. pOut->
4190: 70 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 p2 = addr + ADDR
41a0: 28 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 (p2);. }els
41b0: 65 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d e{. pOut-
41c0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 >p2 = p2;.
41d0: 7d 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 }. pOut->p3
41e0: 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 = pIn->p3;.
41f0: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d pOut->p4type =
4200: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 P4_NOTUSED;.
4210: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 pOut->p4.p =
4220: 30 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 0;. pOut->p
4230: 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 5 = 0;.#ifdef SQ
4240: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c LITE_ENABLE_EXPL
4250: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 AIN_COMMENTS.
4260: 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e pOut->zCommen
4270: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 t = 0;.#endif.#i
4280: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 fdef SQLITE_VDBE
4290: 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 _COVERAGE.
42a0: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d pOut->iSrcLine =
42b0: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 iLineno+i;.#els
42c0: 65 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c e. (void)iL
42d0: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 ineno;.#endif.#i
42e0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 fdef SQLITE_DEBU
42f0: 47 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 G. if( p->d
4300: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 b->flags & SQLIT
4310: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 E_VdbeAddopTrace
4320: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
4330: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 te3VdbePrintOp(0
4340: 2c 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f , i+addr, &p->aO
4350: 70 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 p[i+addr]);.
4360: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d }.#endif. }
4370: 0a 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e . p->nOp += n
4380: 4f 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e Op;. }. return
4390: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 addr;.}../*.**
43a0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 Change the value
43b0: 20 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 of the P1 opera
43c0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 nd for a specifi
43d0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a c instruction..*
43e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
43f0: 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 s useful when a
4400: 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 large program is
4410: 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a loaded from a.*
4420: 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 * static array u
4430: 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 sing sqlite3Vdbe
4440: 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 AddOpList but we
4450: 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a want to make a.
4460: 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 ** few minor cha
4470: 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 nges to the prog
4480: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ram..*/.void sql
4490: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 ite3VdbeChangeP1
44a0: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 (Vdbe *p, u32 ad
44b0: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 dr, int val){.
44c0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a assert( p!=0 );.
44d0: 20 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e if( ((u32)p->n
44e0: 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 Op)>addr ){.
44f0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 p->aOp[addr].p1
4500: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a = val;. }.}../*
4510: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 .** Change the v
4520: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f alue of the P2 o
4530: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 perand for a spe
4540: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f cific instructio
4550: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 n..** This routi
4560: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 ne is useful for
4570: 20 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 setting a jump
4580: 64 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a destination..*/.
4590: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
45a0: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 ChangeP2(Vdbe *p
45b0: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 , u32 addr, int
45c0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 val){. assert(
45d0: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 p!=0 );. if( ((
45e0: 75 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 u32)p->nOp)>addr
45f0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 ){. p->aOp[a
4600: 64 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 ddr].p2 = val;.
4610: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e }.}../*.** Chan
4620: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 ge the value of
4630: 74 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 the P3 operand f
4640: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e or a specific in
4650: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f struction..*/.vo
4660: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 id sqlite3VdbeCh
4670: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 angeP3(Vdbe *p,
4680: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 u32 addr, int va
4690: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 l){. assert( p!
46a0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 =0 );. if( ((u3
46b0: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 2)p->nOp)>addr )
46c0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 {. p->aOp[add
46d0: 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d r].p3 = val;. }
46e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 .}../*.** Change
46f0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 the value of th
4700: 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 e P5 operand for
4710: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 the most recent
4720: 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 ly.** added oper
4730: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ation..*/.void s
4740: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
4750: 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 P5(Vdbe *p, u8 v
4760: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 al){. assert( p
4770: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e !=0 );. if( p->
4780: 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 aOp ){. asser
4790: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 t( p->nOp>0 );.
47a0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 p->aOp[p->nOp
47b0: 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 -1].p5 = val;.
47c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 }.}../*.** Chang
47d0: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 e the P2 operand
47e0: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 of instruction
47f0: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 addr so that it
4800: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 points to.** the
4810: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 address of the
4820: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e next instruction
4830: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f to be coded..*/
4840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
4850: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a eJumpHere(Vdbe *
4860: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 p, int addr){.
4870: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
4880: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e eP2(p, addr, p->
4890: 6e 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73 nOp);. p->pPars
48a0: 65 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d e->iFixedOp = p-
48b0: 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a >nOp - 1;.}.../*
48c0: 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 .** If the input
48d0: 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 FuncDef structu
48e0: 72 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c re is ephemeral,
48f0: 20 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 then free it.
4900: 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 If.** the FuncDe
4910: 66 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 f is not epherma
4920: 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 l, then do nothi
4930: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ng..*/.static vo
4940: 69 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c id freeEphemeral
4950: 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 Function(sqlite3
4960: 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 *db, FuncDef *p
4970: 44 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 Def){. if( ALWA
4980: 59 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 YS(pDef) && (pDe
4990: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 f->funcFlags & S
49a0: 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d QLITE_FUNC_EPHEM
49b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 )!=0 ){. sqli
49c0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 te3DbFree(db, pD
49d0: 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 ef);. }.}..stat
49e0: 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 ic void vdbeFree
49f0: 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 OpArray(sqlite3
4a00: 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a *, Op *, int);..
4a10: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 /*.** Delete a P
4a20: 34 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 4 value if neces
4a30: 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 sary..*/.static
4a40: 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 void freeP4(sqli
4a50: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 te3 *db, int p4t
4a60: 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a ype, void *p4){.
4a70: 20 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 if( p4 ){.
4a80: 61 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 assert( db );.
4a90: 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 switch( p4type
4aa0: 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 ){. case P
4ab0: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 4_REAL:. ca
4ac0: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 se P4_INT64:.
4ad0: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d case P4_DYNAM
4ae0: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 IC:. case P
4af0: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 4_INTARRAY: {.
4b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 sqlite3DbF
4b10: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 ree(db, p4);.
4b20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
4b30: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 }. case P
4b40: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 4_KEYINFO: {.
4b50: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 if( db->pnB
4b60: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 ytesFreed==0 ) s
4b70: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 qlite3KeyInfoUnr
4b80: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 ef((KeyInfo*)p4)
4b90: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
4ba0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 . }. c
4bb0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 ase P4_MPRINTF:
4bc0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 {. if( db
4bd0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d ->pnBytesFreed==
4be0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 0 ) sqlite3_free
4bf0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 (p4);. br
4c00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
4c10: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 case P4_FUNCD
4c20: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 EF: {. fr
4c30: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 eeEphemeralFunct
4c40: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 ion(db, (FuncDef
4c50: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 *)p4);. b
4c60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
4c70: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a case P4_MEM:
4c80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 {. if( d
4c90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d b->pnBytesFreed=
4ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
4cb0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 sqlite3ValueFree
4cc0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a ((sqlite3_value*
4cd0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 )p4);. }e
4ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d lse{. M
4cf0: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 em *p = (Mem*)p4
4d00: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 ;. sqli
4d10: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
4d20: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 >zMalloc);.
4d30: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
4d40: 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 ee(db, p);.
4d50: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 }. bre
4d60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
4d70: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a case P4_VTAB :
4d80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 {. if( d
4d90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d b->pnBytesFreed=
4da0: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 =0 ) sqlite3Vtab
4db0: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a Unlock((VTable *
4dc0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 )p4);. br
4dd0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
4de0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 }. }.}../*.**
4df0: 46 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 Free the space a
4e00: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 llocated for aOp
4e10: 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 and any p4 valu
4e20: 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 es allocated for
4e30: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 the.** opcodes
4e40: 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e contained within
4e50: 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 . If aOp is not
4e60: 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d NULL it is assum
4e70: 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a ed to contain .*
4e80: 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a * nOp entries. .
4e90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 */.static void v
4ea0: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 dbeFreeOpArray(s
4eb0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a qlite3 *db, Op *
4ec0: 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 aOp, int nOp){.
4ed0: 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 if( aOp ){.
4ee0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 Op *pOp;. for
4ef0: 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 (pOp=aOp; pOp<&a
4f00: 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b Op[nOp]; pOp++){
4f10: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 . freeP4(db
4f20: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 , pOp->p4type, p
4f30: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 Op->p4.p);.#ifde
4f40: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
4f50: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 EXPLAIN_COMMENTS
4f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 . sqlite3Db
4f70: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 Free(db, pOp->zC
4f80: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 omment);.#endif
4f90: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 . }. }.
4fa0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
4fb0: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a b, aOp);.}../*.*
4fc0: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 * Link the SubPr
4fd0: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 ogram object pas
4fe0: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e sed as the secon
4ff0: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 d argument into
5000: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 the linked.** li
5010: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 st at Vdbe.pSubP
5020: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 rogram. This lis
5030: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c t is used to del
5040: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 ete all sub-prog
5050: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 ram.** objects w
5060: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f hen the VM is no
5070: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 longer required
5080: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
5090: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 3VdbeLinkSubProg
50a0: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c ram(Vdbe *pVdbe,
50b0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b SubProgram *p){
50c0: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 . p->pNext = pV
50d0: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 dbe->pProgram;.
50e0: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d pVdbe->pProgram
50f0: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 = p;.}../*.** C
5100: 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 hange the opcode
5110: 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 at addr into OP
5120: 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 _Noop.*/.void sq
5130: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 lite3VdbeChangeT
5140: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 oNoop(Vdbe *p, i
5150: 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 nt addr){. if(
5160: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 addr<p->nOp ){.
5170: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d VdbeOp *pOp =
5180: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a &p->aOp[addr];.
5190: 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 sqlite3 *db
51a0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 = p->db;. fre
51b0: 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 eP4(db, pOp->p4t
51c0: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b ype, pOp->p4.p);
51d0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c . memset(pOp,
51e0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 0, sizeof(pOp[0
51f0: 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 ]));. pOp->op
5200: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a code = OP_Noop;.
5210: 20 20 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d if( addr==p-
5220: 3e 6e 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d >nOp-1 ) p->nOp-
5230: 2d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 -;. }.}../*.**
5240: 52 65 6d 6f 76 65 20 74 68 65 20 6c 61 73 74 20 Remove the last
5250: 6f 70 63 6f 64 65 20 69 6e 73 65 72 74 65 64 0a opcode inserted.
5260: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
5270: 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 beDeletePriorOpc
5280: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 ode(Vdbe *p, u8
5290: 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e op){. if( (p->n
52a0: 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73 65 Op-1)>(p->pParse
52b0: 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20 70 ->iFixedOp) && p
52c0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e ->aOp[p->nOp-1].
52d0: 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 opcode==op ){.
52e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 sqlite3VdbeCha
52f0: 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e ngeToNoop(p, p->
5300: 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 nOp-1);. retu
5310: 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 rn 1;. }else{.
5320: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
5330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 .}../*.** Change
5340: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 the value of th
5350: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 e P4 operand for
5360: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 a specific inst
5370: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 ruction..** This
5380: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 routine is usef
5390: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 ul when a large
53a0: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 program is loade
53b0: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 d from a.** stat
53c0: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 ic array using s
53d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c qlite3VdbeAddOpL
53e0: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 ist but we want
53f0: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 to make a.** few
5400: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 minor changes t
5410: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a o the program..*
5420: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 *.** If n>=0 the
5430: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 n the P4 operand
5440: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 is dynamic, mea
5450: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 ning that a copy
5460: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e of.** the strin
5470: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d g is made into m
5480: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 emory obtained f
5490: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c rom sqlite3_mall
54a0: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 oc()..** A value
54b0: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 of n==0 means c
54c0: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 opy bytes of zP4
54d0: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 up to and inclu
54e0: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 ding the.** firs
54f0: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 t null byte. If
5500: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e n>0 then copy n
5510: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e +1 bytes of zP4.
5520: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 .** .** Other va
5530: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 lues of n (P4_ST
5540: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 ATIC, P4_COLLSEQ
5550: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 etc.) indicate
5560: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a that zP4 points.
5570: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f ** to a string o
5580: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 r structure that
5590: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 is guaranteed t
55a0: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 o exist for the
55b0: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 lifetime of.** t
55c0: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 he Vdbe. In thes
55d0: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a e cases we can j
55e0: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 ust copy the poi
55f0: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 nter..**.** If a
5600: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 ddr<0 then chang
5610: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 e P4 on the most
5620: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 recently insert
5630: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a ed instruction..
5640: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
5650: 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62 65 dbeChangeP4(Vdbe
5660: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 *p, int addr, c
5670: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 onst char *zP4,
5680: 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f int n){. Op *pO
5690: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 p;. sqlite3 *db
56a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 ;. assert( p!=0
56b0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 );. db = p->db
56c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d ;. assert( p->m
56d0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 agic==VDBE_MAGIC
56e0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 _INIT );. if( p
56f0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d 3e ->aOp==0 || db->
5700: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a mallocFailed ){.
5710: 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56 54 if( n!=P4_VT
5720: 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 AB ){. free
5730: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a P4(db, n, (void*
5740: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b )*(char**)&zP4);
5750: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
5760: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 n;. }. assert(
5770: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 p->nOp>0 );. a
5780: 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e ssert( addr<p->n
5790: 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 Op );. if( addr
57a0: 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d <0 ){. addr =
57b0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d p->nOp - 1;. }
57c0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 . pOp = &p->aOp
57d0: 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72 74 [addr];. assert
57e0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 ( pOp->p4type==P
57f0: 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20 20 4_NOTUSED.
5800: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d || pOp->p4type=
5810: 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20 20 =P4_INT32.
5820: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d || pOp->p4type=
5830: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a 20 =P4_KEYINFO );.
5840: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d freeP4(db, pOp-
5850: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 >p4type, pOp->p4
5860: 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 .p);. pOp->p4.p
5870: 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d 50 = 0;. if( n==P
5880: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 4_INT32 ){. /
5890: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 * Note: this cas
58a0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 t is safe, becau
58b0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 se the origin da
58c0: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 ta point was an
58d0: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 int. ** that
58e0: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 was cast to a (c
58f0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f onst char *). */
5900: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d . pOp->p4.i =
5910: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 SQLITE_PTR_TO_I
5920: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 NT(zP4);. pOp
5930: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e ->p4type = P4_IN
5940: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 T32;. }else if(
5950: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 70 zP4==0 ){. p
5960: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 Op->p4.p = 0;.
5970: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 pOp->p4type =
5980: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d 65 P4_NOTUSED;. }e
5990: 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 lse if( n==P4_KE
59a0: 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f 70 YINFO ){. pOp
59b0: 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 ->p4.p = (void*)
59c0: 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 zP4;. pOp->p4
59d0: 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e 46 type = P4_KEYINF
59e0: 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e O;. }else if( n
59f0: 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 20 ==P4_VTAB ){.
5a00: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f pOp->p4.p = (vo
5a10: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 id*)zP4;. pOp
5a20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 54 ->p4type = P4_VT
5a30: 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 AB;. sqlite3V
5a40: 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 20 tabLock((VTable
5a50: 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 65 *)zP4);. asse
5a60: 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 7a rt( ((VTable *)z
5a70: 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 29 P4)->db==p->db )
5a80: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3c ;. }else if( n<
5a90: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 0 ){. pOp->p4
5aa0: 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b .p = (void*)zP4;
5ab0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 . pOp->p4type
5ac0: 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 29 = (signed char)
5ad0: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 n;. }else{.
5ae0: 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 if( n==0 ) n = s
5af0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
5b00: 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 P4);. pOp->p4
5b10: 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 .z = sqlite3DbSt
5b20: 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 rNDup(p->db, zP4
5b30: 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 , n);. pOp->p
5b40: 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 4type = P4_DYNAM
5b50: 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a IC;. }.}../*.**
5b60: 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 Set the P4 on t
5b70: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 he most recently
5b80: 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f added opcode to
5b90: 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 the KeyInfo for
5ba0: 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 the.** index gi
5bb0: 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ven..*/.void sql
5bc0: 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 ite3VdbeSetP4Key
5bd0: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 Info(Parse *pPar
5be0: 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 se, Index *pIdx)
5bf0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 {. Vdbe *v = pP
5c00: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 arse->pVdbe;. a
5c10: 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 ssert( v!=0 );.
5c20: 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 assert( pIdx!=0
5c30: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 );. sqlite3Vdb
5c40: 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c eChangeP4(v, -1,
5c50: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b (char*)sqlite3K
5c60: 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 eyInfoOfIndex(pP
5c70: 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 arse, pIdx),.
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c90: 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a P4_KEYINFO);.
5ca0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }..#ifdef SQLITE
5cb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
5cc0: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 COMMENTS./*.** C
5cd0: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e hange the commen
5ce0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 t on the most re
5cf0: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 cently coded ins
5d00: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a truction. Or.**
5d10: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 insert a No-op
5d20: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d and add the comm
5d30: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 ent to that new
5d40: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 instruction. Th
5d50: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 is.** makes the
5d60: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 code easier to r
5d70: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 ead during debug
5d80: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 ging. None of t
5d90: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 his happens.** i
5da0: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 n a production b
5db0: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 uild..*/.static
5dc0: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e void vdbeVCommen
5dd0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 t(Vdbe *p, const
5de0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
5df0: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 va_list ap){. a
5e00: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 ssert( p->nOp>0
5e10: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a || p->aOp==0 );.
5e20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 assert( p->aOp
5e30: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d ==0 || p->aOp[p-
5e40: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 >nOp-1].zComment
5e50: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 ==0 || p->db->ma
5e60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 llocFailed );.
5e70: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 if( p->nOp ){.
5e80: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 assert( p->aOp
5e90: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 );. sqlite3D
5ea0: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e bFree(p->db, p->
5eb0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 aOp[p->nOp-1].zC
5ec0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e omment);. p->
5ed0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 aOp[p->nOp-1].zC
5ee0: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 omment = sqlite3
5ef0: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 VMPrintf(p->db,
5f00: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 zFormat, ap);.
5f10: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 }.}.void sqlite3
5f20: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 VdbeComment(Vdbe
5f30: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 *p, const char
5f40: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a *zFormat, ...){.
5f50: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 va_list ap;.
5f60: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f if( p ){. va_
5f70: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
5f80: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d t);. vdbeVCom
5f90: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c ment(p, zFormat,
5fa0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 ap);. va_end
5fb0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 (ap);. }.}.void
5fc0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 sqlite3VdbeNoop
5fd0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c Comment(Vdbe *p,
5fe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f const char *zFo
5ff0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 rmat, ...){. va
6000: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 _list ap;. if(
6010: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 p ){. sqlite3
6020: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 VdbeAddOp0(p, OP
6030: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 _Noop);. va_s
6040: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 tart(ap, zFormat
6050: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d );. vdbeVComm
6060: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 ent(p, zFormat,
6070: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 ap);. va_end(
6080: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 ap);. }.}.#endi
6090: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a f /* NDEBUG */.
60a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 .#ifdef SQLITE_V
60b0: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a DBE_COVERAGE./*.
60c0: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 ** Set the value
60d0: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 if the iSrcLine
60e0: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 field for the p
60f0: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 reviously coded
6100: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a instruction..*/.
6110: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
6120: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 SetLineNumber(Vd
6130: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 be *v, int iLine
6140: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 ){. sqlite3Vdbe
6150: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 GetOp(v,-1)->iSr
6160: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d cLine = iLine;.}
6170: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
6180: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 E_VDBE_COVERAGE
6190: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e */../*.** Return
61a0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 the opcode for
61b0: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e a given address.
61c0: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 If the address
61d0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 is -1, then.**
61e0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 return the most
61f0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 recently inserte
6200: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 d opcode..**.**
6210: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f If a memory allo
6220: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 cation error has
6230: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 occurred prior
6240: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f to the calling o
6250: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e f this.** routin
6260: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 e, then a pointe
6270: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 r to a dummy Vdb
6280: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 eOp will be retu
6290: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f rned. That opco
62a0: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c de.** is readabl
62b0: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 e but not writab
62c0: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 le, though it is
62d0: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 cast to a writa
62e0: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 ble value..** Th
62f0: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 e return of a du
6300: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 mmy opcode allow
6310: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f s the call to co
6320: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 ntinue functioni
6330: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f ng.** after an O
6340: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 OM fault without
6350: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b having to check
6360: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 to see if the r
6370: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 eturn from .** t
6380: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 his routine is a
6390: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 valid pointer.
63a0: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 But because the
63b0: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 dummy.opcode is
63c0: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 0,.** dummy wil
63d0: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 l never be writt
63e0: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 en to. This is
63f0: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 verified by code
6400: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a inspection and.
6410: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 ** by running wi
6420: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a th Valgrind..*/.
6430: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 VdbeOp *sqlite3V
6440: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 dbeGetOp(Vdbe *p
6450: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f , int addr){. /
6460: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 * C89 specifies
6470: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e that the constan
6480: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 t "dummy" will b
6490: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f e initialized to
64a0: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c all. ** zeros,
64b0: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 which is correc
64c0: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 t. MSVC generat
64d0: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 es a warning, ne
64e0: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 vertheless. */.
64f0: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 static VdbeOp d
6500: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 ummy; /* Ignore
6510: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e the MSVC warnin
6520: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 g about no initi
6530: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 alizer */. asse
6540: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 rt( p->magic==VD
6550: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b BE_MAGIC_INIT );
6560: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b . if( addr<0 ){
6570: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e . addr = p->n
6580: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 Op - 1;. }. as
6590: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 sert( (addr>=0 &
65a0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c & addr<p->nOp) |
65b0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 | p->db->mallocF
65c0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 ailed );. if( p
65d0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ->db->mallocFail
65e0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e ed ){. return
65f0: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 (VdbeOp*)&dummy
6600: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 ;. }else{. r
6610: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 eturn &p->aOp[ad
6620: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 dr];. }.}..#if
6630: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 defined(SQLITE_E
6640: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f NABLE_EXPLAIN_CO
6650: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 MMENTS)./*.** Re
6660: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 turn an integer
6670: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 value for one of
6680: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 the parameters
6690: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f to the opcode pO
66a0: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 p.** determined
66b0: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a by character c..
66c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 */.static int tr
66d0: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c anslateP(char c,
66e0: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b const Op *pOp){
66f0: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 . if( c=='1' )
6700: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a return pOp->p1;.
6710: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 if( c=='2' ) r
6720: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 eturn pOp->p2;.
6730: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 if( c=='3' ) re
6740: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 turn pOp->p3;.
6750: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 if( c=='4' ) ret
6760: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 urn pOp->p4.i;.
6770: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b return pOp->p5;
6780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 .}../*.** Comput
6790: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 e a string for t
67a0: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 he "comment" fie
67b0: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 ld of a VDBE opc
67c0: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a ode listing..**.
67d0: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a ** The Synopsis:
67e0: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e field in commen
67f0: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 ts in the vdbe.c
6800: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 source file get
6810: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 s converted.** t
6820: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e o an extra strin
6830: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 g that is append
6840: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 ed to the sqlite
6850: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 3OpcodeName().
6860: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 In the.** absenc
6870: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 e of other comme
6880: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 nts, this synops
6890: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 is becomes the c
68a0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 omment on the op
68b0: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 code..** Some tr
68c0: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 anslation occurs
68d0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 :.**.** "P
68e0: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 X" -> "r[X
68f0: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 ]".** "PX@
6900: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e PY" -> "r[X..
6910: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 X+Y-1]" or "r[x
6920: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 ]" if y is 0 or
6930: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 1.** "PX@P
6940: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 Y+1" -> "r[X..X
6950: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d +Y]" or "r[x]
6960: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 " if y is 0.**
6970: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d "PY..PY" -
6980: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 > "r[X..Y]"
6990: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 or "r[x]" if y
69a0: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e <=x.*/.static in
69b0: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 t displayComment
69c0: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f (. const Op *pO
69d0: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 p, /* The op
69e0: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 code to be comme
69f0: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 nted */. const
6a00: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 char *zP4, /*
6a10: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 Previously obtai
6a20: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 ned value for P4
6a30: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d */. char *zTem
6a40: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 p, /* Writ
6a50: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f e result here */
6a60: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 . int nTemp
6a70: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 /* Space a
6a80: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d vailable in zTem
6a90: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 p[] */.){. cons
6aa0: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b t char *zOpName;
6ab0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
6ac0: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 Synopsis;. int
6ad0: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 nOpName;. int i
6ae0: 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 i, jj;. zOpName
6af0: 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 = sqlite3Opcode
6b00: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 Name(pOp->opcode
6b10: 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 );. nOpName = s
6b20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
6b30: 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a OpName);. if( z
6b40: 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 OpName[nOpName+1
6b50: 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 ] ){. int see
6b60: 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 nCom = 0;. ch
6b70: 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 ar c;. zSynop
6b80: 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d sis = zOpName +=
6b90: 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 nOpName + 1;.
6ba0: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a for(ii=jj=0; j
6bb0: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 j<nTemp-1 && (c
6bc0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 = zSynopsis[ii])
6bd0: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 !=0; ii++){.
6be0: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a if( c=='P' ){.
6bf0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e c = zSyn
6c00: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 opsis[++ii];.
6c10: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 if( c=='4'
6c20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c ){. sql
6c30: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
6c40: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a emp-jj, zTemp+jj
6c50: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 , "%s", zP4);.
6c60: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
6c70: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 c=='X' ){.
6c80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
6c90: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a intf(nTemp-jj, z
6ca0: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 Temp+jj, "%s", p
6cb0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 Op->zComment);.
6cc0: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d seenCom
6cd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 = 1;. }e
6ce0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 lse{. i
6cf0: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 nt v1 = translat
6d00: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 eP(c, pOp);.
6d10: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 int v2;.
6d20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
6d30: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a snprintf(nTemp-j
6d40: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 j, zTemp+jj, "%d
6d50: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 ", v1);.
6d60: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 if( strncmp(zS
6d70: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 ynopsis+ii+1, "@
6d80: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 P", 2)==0 ){.
6d90: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 ii += 3
6da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a ;. jj
6db0: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 += sqlite3Strle
6dc0: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 n30(zTemp+jj);.
6dd0: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 v2 =
6de0: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f translateP(zSyno
6df0: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a psis[ii], pOp);.
6e00: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 if(
6e10: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 strncmp(zSynopsi
6e20: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d s+ii+1,"+1",2)==
6e30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0 ){.
6e40: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 ii += 2;.
6e50: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a v2++;.
6e60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 }.
6e70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 if( v2
6e80: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 >1 ){.
6e90: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
6ea0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a intf(nTemp-jj, z
6eb0: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c Temp+jj, "..%d",
6ec0: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 v1+v2-1);.
6ed0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
6ee0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 }else if( str
6ef0: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 ncmp(zSynopsis+i
6f00: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d i+1, "..P3", 4)=
6f10: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 =0 && pOp->p3==0
6f20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
6f30: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 ii += 4;.
6f40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 }. }.
6f50: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c jj += sql
6f60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 ite3Strlen30(zTe
6f70: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 mp+jj);. }e
6f80: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 lse{. zTe
6f90: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 mp[jj++] = c;.
6fa0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }. }.
6fb0: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 if( !seenCom &&
6fc0: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f jj<nTemp-5 && pO
6fd0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 p->zComment ){.
6fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
6ff0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 rintf(nTemp-jj,
7000: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 zTemp+jj, "; %s"
7010: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 , pOp->zComment)
7020: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 ;. jj += sq
7030: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 lite3Strlen30(zT
7040: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 emp+jj);. }.
7050: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 if( jj<nTemp
7060: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b ) zTemp[jj] = 0;
7070: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 . }else if( pOp
7080: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 ->zComment ){.
7090: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
70a0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
70b0: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d "%s", pOp->zCom
70c0: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 ment);. jj =
70d0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
70e0: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b zTemp);. }else{
70f0: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 . zTemp[0] =
7100: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 0;. jj = 0;.
7110: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a }. return jj;.
7120: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 }.#endif /* SQLI
7130: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23 69 TE_DEBUG */...#i
7140: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 f !defined(SQLIT
7150: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29 20 E_OMIT_EXPLAIN)
7160: 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 || !defined(NDEB
7170: 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64 65 UG) \. || de
7180: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 fined(VDBE_PROFI
7190: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 LE) || defined(S
71a0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a QLITE_DEBUG)./*.
71b0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 ** Compute a str
71c0: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 ing that describ
71d0: 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 es the P4 parame
71e0: 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 ter for an opcod
71f0: 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 e..** Use zTemp
7200: 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 for any required
7210: 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 temporary buffe
7220: 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 r space..*/.stat
7230: 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 ic char *display
7240: 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 P4(Op *pOp, char
7250: 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 *zTemp, int nTe
7260: 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 mp){. char *zP4
7270: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73 65 = zTemp;. asse
7280: 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29 3b rt( nTemp>=20 );
7290: 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e . switch( pOp->
72a0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 p4type ){. ca
72b0: 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b se P4_KEYINFO: {
72c0: 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b . int i, j;
72d0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a . KeyInfo *
72e0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e pKeyInfo = pOp->
72f0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 p4.pKeyInfo;.
7300: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 assert( pKeyI
7310: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 nfo->aSortOrder!
7320: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 =0 );. sqli
7330: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 te3_snprintf(nTe
7340: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25 64 mp, zTemp, "k(%d
7350: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 ", pKeyInfo->nFi
7360: 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d 20 eld);. i =
7370: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
7380: 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 6f zTemp);. fo
7390: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 r(j=0; j<pKeyInf
73a0: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b o->nField; j++){
73b0: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 . CollSeq
73c0: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e *pColl = pKeyIn
73d0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 fo->aColl[j];.
73e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 const char
73f0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 *zColl = pColl
7400: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a ? pColl->zName :
7410: 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20 20 "nil";.
7420: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 int n = sqlite3S
7430: 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b 0a trlen30(zColl);.
7440: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 36 if( n==6
7450: 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c 6c && memcmp(zColl
7460: 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30 20 ,"BINARY",6)==0
7470: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f ){. zCo
7480: 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 20 ll = "B";.
7490: 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20 20 n = 1;.
74a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
74b0: 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b 0a i+n>nTemp-6 ){.
74c0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 memcpy
74d0: 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e (&zTemp[i],",...
74e0: 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ",4);.
74f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d break;. }
7500: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 . zTemp[i
7510: 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 ++] = ',';.
7520: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d if( pKeyInfo-
7530: 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 29 >aSortOrder[j] )
7540: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65 6d {. zTem
7550: 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20 20 p[i++] = '-';.
7560: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
7570: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d memcpy(&zTemp[i]
7580: 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 , zColl, n+1);.
7590: 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a 20 i += n;.
75a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 }. zTe
75b0: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 mp[i++] = ')';.
75c0: 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d 20 zTemp[i] =
75d0: 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 0;. assert(
75e0: 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20 20 i<nTemp );.
75f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
7600: 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 case P4_COLLS
7610: 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c EQ: {. Coll
7620: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 Seq *pColl = pOp
7630: 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 ->p4.pColl;.
7640: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
7650: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
7660: 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c "(%.20s)", pCol
7670: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 l->zName);.
7680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
7690: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 case P4_FUNCDE
76a0: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 F: {. FuncD
76b0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e ef *pDef = pOp->
76c0: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 p4.pFunc;.
76d0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
76e0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 (nTemp, zTemp, "
76f0: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a %s(%d)", pDef->z
7700: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 Name, pDef->nArg
7710: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
7720: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 }. case P
7730: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 4_INT64: {.
7740: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
7750: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 f(nTemp, zTemp,
7760: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 "%lld", *pOp->p4
7770: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 .pI64);. br
7780: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
7790: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a ase P4_INT32: {.
77a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
77b0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 printf(nTemp, zT
77c0: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e emp, "%d", pOp->
77d0: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 p4.i);. bre
77e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
77f0: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 se P4_REAL: {.
7800: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
7810: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d intf(nTemp, zTem
7820: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 p, "%.16g", *pOp
7830: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 ->p4.pReal);.
7840: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
7850: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a case P4_MEM:
7860: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d {. Mem *pM
7870: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 em = pOp->p4.pMe
7880: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 m;. if( pMe
7890: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 m->flags & MEM_S
78a0: 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 tr ){. zP
78b0: 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 4 = pMem->z;.
78c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 }else if( pMe
78d0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 m->flags & MEM_I
78e0: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 nt ){. sq
78f0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
7900: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c Temp, zTemp, "%l
7910: 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b ld", pMem->u.i);
7920: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
7930: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d pMem->flags & M
7940: 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 EM_Real ){.
7950: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
7960: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
7970: 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d , "%.16g", pMem-
7980: 3e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 >r);. }else
7990: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 if( pMem->flags
79a0: 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 & MEM_Null ){.
79b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
79c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
79d0: 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 Temp, "NULL");.
79e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
79f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d assert( pMem
7a00: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c ->flags & MEM_Bl
7a10: 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 ob );. zP
7a20: 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 4 = "(blob)";.
7a30: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 }. brea
7a40: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 k;. }.#ifndef
7a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 SQLITE_OMIT_VIR
7a60: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 TUALTABLE. ca
7a70: 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 se P4_VTAB: {.
7a80: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 sqlite3_vtab
7a90: 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 *pVtab = pOp->p
7aa0: 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 4.pVtab->pVtab;.
7ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
7ac0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 printf(nTemp, zT
7ad0: 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 emp, "vtab:%p:%p
7ae0: 22 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d ", pVtab, pVtab-
7af0: 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 >pModule);.
7b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 break;. }.#e
7b10: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 ndif. case P4
7b20: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 _INTARRAY: {.
7b30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
7b40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
7b50: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 , "intarray");.
7b60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
7b70: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 }. case P4_SU
7b80: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 BPROGRAM: {.
7b90: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
7ba0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
7bb0: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 "program");.
7bc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
7bd0: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 case P4_ADVA
7be0: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 NCE: {. zTe
7bf0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 mp[0] = 0;.
7c00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
7c10: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 default: {.
7c20: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 zP4 = pOp->p4
7c30: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 .z;. if( zP
7c40: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4==0 ){.
7c50: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 zP4 = zTemp;.
7c60: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 zTemp[0] =
7c70: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0;. }. }
7c80: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a . }. assert( z
7c90: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 P4!=0 );. retur
7ca0: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a n zP4;.}.#endif.
7cb0: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 ./*.** Declare t
7cc0: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20 o the Vdbe that
7cd0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74 the BTree object
7ce0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 at db->aDb[i] i
7cf0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 s used..**.** Th
7d00: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 e prepared state
7d10: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e ments need to kn
7d20: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68 ow in advance th
7d30: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f e complete set o
7d40: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 f.** attached da
7d50: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c tabases that wil
7d60: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73 l be use. A mas
7d70: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62 k of these datab
7d80: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 ases.** is maint
7d90: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 ained in p->btre
7da0: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c eMask. The p->l
7db0: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 ockMask value is
7dc0: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a the subset of.*
7dd0: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f * p->btreeMask o
7de0: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 f databases that
7df0: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 will require a
7e00: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 lock..*/.void sq
7e10: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72 lite3VdbeUsesBtr
7e20: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 ee(Vdbe *p, int
7e30: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e i){. assert( i>
7e40: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e =0 && i<p->db->n
7e50: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a Db && i<(int)siz
7e60: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 eof(yDbMask)*8 )
7e70: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69 ;. assert( i<(i
7e80: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 nt)sizeof(p->btr
7e90: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 eeMask)*8 );. D
7ea0: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 bMaskSet(p->btre
7eb0: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 eMask, i);. if(
7ec0: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33 i!=1 && sqlite3
7ed0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d BtreeSharable(p-
7ee0: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 >db->aDb[i].pBt)
7ef0: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 ){. DbMaskSe
7f00: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 t(p->lockMask, i
7f10: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 );. }.}..#if !d
7f20: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
7f30: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 IT_SHARED_CACHE)
7f40: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 && SQLITE_THREA
7f50: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 DSAFE>0./*.** If
7f60: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 SQLite is compi
7f70: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 led to support s
7f80: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 hared-cache mode
7f90: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 and to be threa
7fa0: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 dsafe,.** this r
7fb0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 outine obtains t
7fc0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 he mutex associa
7fd0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 ted with each Bt
7fe0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 Shared structure
7ff0: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 .** that may be
8000: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 accessed by the
8010: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 VM passed as an
8020: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 argument. In doi
8030: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a ng so it also.**
8040: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 sets the BtShar
8050: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 ed.db member of
8060: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 each of the BtSh
8070: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c ared structures,
8080: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 ensuring.** tha
8090: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 t the correct bu
80a0: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 sy-handler callb
80b0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 ack is invoked i
80c0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a f required..**.*
80d0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e * If SQLite is n
80e0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 ot threadsafe bu
80f0: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 t does support s
8100: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 hared-cache mode
8110: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 , then.** sqlite
8120: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 3BtreeEnter() is
8130: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 invoked to set
8140: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 the BtShared.db
8150: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 variables.** of
8160: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 all of BtShared
8170: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 structures acces
8180: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 sible via the da
8190: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a tabase handle .*
81a0: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 * associated wit
81b0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 h the VM..**.**
81c0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 If SQLite is not
81d0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 threadsafe and
81e0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 does not support
81f0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f shared-cache mo
8200: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 de, this.** func
8210: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e tion is a no-op.
8220: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 .**.** The p->bt
8230: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 reeMask field is
8240: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c a bitmask of al
8250: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 l btrees that th
8260: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 e prepared .** s
8270: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 tatement p will
8280: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e ever use. Let N
8290: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f be the number o
82a0: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 f bits in p->btr
82b0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 eeMask.** corres
82c0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 ponding to btree
82d0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 s that use share
82e0: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 d cache. Then t
82f0: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a he runtime of.**
8300: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 this routine is
8310: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 N*N. But as N
8320: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 is rarely more t
8330: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 han 1, this shou
8340: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 ld not.** be a p
8350: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 roblem..*/.void
8360: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 sqlite3VdbeEnter
8370: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 (Vdbe *p){. int
8380: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 i;. sqlite3 *d
8390: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 b;. Db *aDb;.
83a0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 int nDb;. if( D
83b0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e bMaskAllZero(p->
83c0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 lockMask) ) retu
83d0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d rn; /* The comm
83e0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 on case */. db
83f0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d = p->db;. aDb =
8400: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 db->aDb;. nDb
8410: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 = db->nDb;. for
8420: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b (i=0; i<nDb; i++
8430: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 ){. if( i!=1
8440: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d && DbMaskTest(p-
8450: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 >lockMask,i) &&
8460: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 ALWAYS(aDb[i].pB
8470: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 t!=0) ){. s
8480: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
8490: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 (aDb[i].pBt);.
84a0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 }. }.}.#endif
84b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 ..#if !defined(S
84c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 QLITE_OMIT_SHARE
84d0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 D_CACHE) && SQLI
84e0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a TE_THREADSAFE>0.
84f0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c /*.** Unlock all
8500: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 of the btrees p
8510: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 reviously locked
8520: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 by a call to sq
8530: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 lite3VdbeEnter()
8540: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
8550: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 3VdbeLeave(Vdbe
8560: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 *p){. int i;.
8570: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 sqlite3 *db;. D
8580: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 b *aDb;. int nD
8590: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 b;. if( DbMaskA
85a0: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 llZero(p->lockMa
85b0: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f sk) ) return; /
85c0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 * The common cas
85d0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 e */. db = p->d
85e0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 b;. aDb = db->a
85f0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e Db;. nDb = db->
8600: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 nDb;. for(i=0;
8610: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 i<nDb; i++){.
8620: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d if( i!=1 && DbM
8630: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d askTest(p->lockM
8640: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 ask,i) && ALWAYS
8650: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 (aDb[i].pBt!=0)
8660: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
8670: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 BtreeLeave(aDb[i
8680: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 ].pBt);. }.
8690: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 }.}.#endif..#if
86a0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f defined(VDBE_PRO
86b0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 FILE) || defined
86c0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f (SQLITE_DEBUG)./
86d0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e *.** Print a sin
86e0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 gle opcode. Thi
86f0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 s routine is use
8700: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 d for debugging
8710: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 only..*/.void sq
8720: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 lite3VdbePrintOp
8730: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 (FILE *pOut, int
8740: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 pc, Op *pOp){.
8750: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 char *zP4;. ch
8760: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 ar zPtr[50];. c
8770: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 har zCom[100];.
8780: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
8790: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 ar *zFormat1 = "
87a0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 %4d %-13s %4d %4
87b0: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 d %4d %-13s %.2X
87c0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f %s\n";. if( pO
87d0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 ut==0 ) pOut = s
87e0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 tdout;. zP4 = d
87f0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 isplayP4(pOp, zP
8800: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 tr, sizeof(zPtr)
8810: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
8820: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
8830: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c COMMENTS. displ
8840: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a ayComment(pOp, z
8850: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 P4, zCom, sizeof
8860: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 (zCom));.#else.
8870: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 zCom[0] = 0;.#e
8880: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 ndif. /* NB: T
8890: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 he sqlite3Opcode
88a0: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 Name() function
88b0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 is implemented b
88c0: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 y code created.
88d0: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 ** by the mkopc
88e0: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f odeh.awk and mko
88f0: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 pcodec.awk scrip
8900: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 ts which extract
8910: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d the. ** inform
8920: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 ation from the v
8930: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 dbe.c source tex
8940: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 t */. fprintf(p
8950: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 Out, zFormat1, p
8960: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 c, . sqlite
8970: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3OpcodeName(pOp-
8980: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 >opcode), pOp->p
8990: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 1, pOp->p2, pOp-
89a0: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 >p3, zP4, pOp->p
89b0: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 5,. zCom.
89c0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 );. fflush(pOut
89d0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a );.}.#endif../*.
89e0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 ** Release an ar
89f0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 ray of N Mem ele
8a00: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 ments.*/.static
8a10: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 void releaseMemA
8a20: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 rray(Mem *p, int
8a30: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 N){. if( p &&
8a40: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 N ){. Mem *pE
8a50: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 nd;. sqlite3
8a60: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 *db = p->db;.
8a70: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 u8 malloc_faile
8a80: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 d = db->mallocFa
8a90: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 iled;. if( db
8aa0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 ->pnBytesFreed )
8ab0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 {. for(pEnd
8ac0: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 =&p[N]; p<pEnd;
8ad0: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 p++){. sq
8ae0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
8af0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 p->zMalloc);.
8b00: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 }. retur
8b10: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 n;. }. for
8b20: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 (pEnd=&p[N]; p<p
8b30: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 End; p++){.
8b40: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 assert( (&p[1])
8b50: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 ==pEnd || p[0].d
8b60: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 b==p[1].db );.
8b70: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 assert( sqli
8b80: 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 te3VdbeCheckMemI
8b90: 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a nvariants(p) );.
8ba0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 . /* This b
8bb0: 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 lock is really a
8bc0: 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f n inlined versio
8bd0: 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 n of sqlite3Vdbe
8be0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 MemRelease().
8bf0: 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 ** that takes
8c00: 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 advantage of th
8c10: 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 e fact that the
8c20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 memory cell valu
8c30: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 e is . ** b
8c40: 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c eing set to NULL
8c50: 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 after releasing
8c60: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 any dynamic res
8c70: 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a ources.. **
8c80: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 . ** The ju
8c90: 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 stification for
8ca0: 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 duplicating code
8cb0: 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 is that accordi
8cc0: 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 ng to . **
8cd0: 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 callgrind, this
8ce0: 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e causes a certain
8cf0: 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 test case to hi
8d00: 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 t the CPU 4.7 .
8d10: 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 ** percent
8d20: 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c less (x86 linux,
8d30: 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 gcc version 4.1
8d40: 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 .2, -O6) than if
8d50: 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 . ** sqlit
8d60: 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 e3MemRelease() w
8d70: 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 ere called from
8d80: 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 here. With -O2,
8d90: 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 this jumps.
8da0: 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 ** to 6.6 perce
8db0: 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 nt. The test cas
8dc0: 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 e is inserting 1
8dd0: 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 000 rows into a
8de0: 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 table . **
8df0: 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 with no indexes
8e00: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 using a single p
8e10: 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 repared INSERT s
8e20: 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 tatement, bind()
8e30: 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 . ** and r
8e40: 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 eset(). Inserts
8e50: 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f are grouped into
8e60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a a transaction..
8e70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 */. t
8e80: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 estcase( p->flag
8e90: 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 s & MEM_Agg );.
8ea0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 testcase( p
8eb0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 ->flags & MEM_Dy
8ec0: 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 n );. testc
8ed0: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 ase( p->flags &
8ee0: 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 MEM_Frame );.
8ef0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e testcase( p->
8f00: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 flags & MEM_RowS
8f10: 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 et );. if(
8f20: 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 p->flags&(MEM_Ag
8f30: 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 g|MEM_Dyn|MEM_Fr
8f40: 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 ame|MEM_RowSet)
8f50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
8f60: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 e3VdbeMemRelease
8f70: 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 (p);. }else
8f80: 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 if( p->zMalloc
8f90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
8fa0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e e3DbFree(db, p->
8fb0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 zMalloc);.
8fc0: 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 p->zMalloc = 0
8fd0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 ;. }..
8fe0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f p->flags = MEM_
8ff0: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d Undefined;. }
9000: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 . db->mallocF
9010: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 ailed = malloc_f
9020: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a ailed;. }.}../*
9030: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 .** Delete a Vdb
9040: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e eFrame object an
9050: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 d its contents.
9060: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 VdbeFrame object
9070: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 s are.** allocat
9080: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f ed by the OP_Pro
9090: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 gram opcode in s
90a0: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 qlite3VdbeExec()
90b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
90c0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 3VdbeFrameDelete
90d0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a (VdbeFrame *p){.
90e0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a int i;. Mem *
90f0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 aMem = VdbeFrame
9100: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 Mem(p);. VdbeCu
9110: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 rsor **apCsr = (
9120: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 VdbeCursor **)&a
9130: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d Mem[p->nChildMem
9140: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c ];. for(i=0; i<
9150: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b p->nChildCsr; i+
9160: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 +){. sqlite3V
9170: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d dbeFreeCursor(p-
9180: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 >v, apCsr[i]);.
9190: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 }. releaseMemA
91a0: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 rray(aMem, p->nC
91b0: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 hildMem);. sqli
91c0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e te3DbFree(p->v->
91d0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 db, p);.}..#ifnd
91e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 ef SQLITE_OMIT_E
91f0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 XPLAIN./*.** Giv
9200: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 e a listing of t
9210: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 he program in th
9220: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e e virtual machin
9230: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 e..**.** The int
9240: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 erface is the sa
9250: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 me as sqlite3Vdb
9260: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e eExec(). But in
9270: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e stead of.** runn
9280: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 ing the code, it
9290: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c invokes the cal
92a0: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 lback once for e
92b0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e ach instruction.
92c0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 .** This feature
92d0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c is used to impl
92e0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e ement "EXPLAIN".
92f0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 .**.** When p->e
9300: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 xplain==1, each
9310: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c instruction is l
9320: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 isted. When.**
9330: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f p->explain==2, o
9340: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 nly OP_Explain i
9350: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 nstructions are
9360: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 listed and these
9370: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e .** are shown in
9380: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 a different for
9390: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e mat. p->explain
93a0: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 ==2 is used to i
93b0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c mplement.** EXPL
93c0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a AIN QUERY PLAN..
93d0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 **.** When p->ex
93e0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 plain==1, first
93f0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d the main program
9400: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e is listed, then
9410: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 each of.** the
9420: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 trigger subprogr
9430: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f ams are listed o
9440: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e ne by one..*/.in
9450: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 t sqlite3VdbeLis
9460: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 t(. Vdbe *p
9470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
9480: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b * The VDBE */.){
9490: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 . int nRow;
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
94b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 /* Stop
94c0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 when row count r
94d0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 eaches this */.
94e0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 int nSub = 0;
94f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9500: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
9510: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 of sub-vdbes see
9520: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 n so far */. Su
9530: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 bProgram **apSub
9540: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
9550: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 /* Array of s
9560: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 ub-vdbes */. Me
9570: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 m *pSub = 0;
9580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9590: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c /* Memory cel
95a0: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 l hold array of
95b0: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 subprogs */. sq
95c0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
95d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
95e0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 /* The databa
95f0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f se connection */
9600: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 . int i;
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9620: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 /* Loop
9630: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 counter */. int
9640: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9660: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 /* Return code
9670: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 */. Mem *pMem
9680: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 = &p->aMem[1];
9690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 /* Fi
96a0: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c rst Mem of resul
96b0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 t set */.. asse
96c0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 rt( p->explain )
96d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d ;. assert( p->m
96e0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 agic==VDBE_MAGIC
96f0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 _RUN );. assert
9700: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
9710: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c OK || p->rc==SQL
9720: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 ITE_BUSY || p->r
9730: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 c==SQLITE_NOMEM
9740: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 );.. /* Even th
9750: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 ough this opcode
9760: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 does not use dy
9770: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f namic strings fo
9780: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c r. ** the resul
9790: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e t, result column
97a0: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e s may become dyn
97b0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 amic if the user
97c0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 calls. ** sqli
97d0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 te3_column_text1
97e0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 6(), causing a t
97f0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 ranslation to UT
9800: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 F-16 encoding..
9810: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d */. releaseMem
9820: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a Array(pMem, 8);.
9830: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 p->pResultSet
9840: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 = 0;.. if( p->r
9850: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 c==SQLITE_NOMEM
9860: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 ){. /* This h
9870: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c appens if a mall
9880: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 oc() inside a ca
9890: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f ll to sqlite3_co
98a0: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 lumn_text() or.
98b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f ** sqlite3_co
98c0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 lumn_text16() fa
98d0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 iled. */. db
98e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
98f0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 1;. return S
9900: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d QLITE_ERROR;. }
9910: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 .. /* When the
9920: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 number of output
9930: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 rows reaches nR
9940: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 ow, that means t
9950: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 he. ** listing
9960: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 has finished and
9970: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 sqlite3_step()
9980: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 should return SQ
9990: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 LITE_DONE.. **
99a0: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 nRow is the sum
99b0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 of the number of
99c0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 rows in the mai
99d0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a n program, plus.
99e0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 ** the sum of
99f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f the number of ro
9a00: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 ws in all trigge
9a10: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e r subprograms en
9a20: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 countered. ** s
9a30: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 o far. The nRow
9a40: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 value will incr
9a50: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 ease as new trig
9a60: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 ger subprograms
9a70: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 are. ** encount
9a80: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 ered, but p->pc
9a90: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 will eventually
9aa0: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 catch up to nRow
9ab0: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 .. */. nRow =
9ac0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d p->nOp;. if( p-
9ad0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 >explain==1 ){.
9ae0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 /* The first
9af0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 8 memory cells a
9b00: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 re used for the
9b10: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 result set. So
9b20: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 we will. ** c
9b30: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 ommandeer the 9t
9b40: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 h cell to use as
9b50: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 storage for an
9b60: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 array of pointer
9b70: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 s. ** to trig
9b80: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e ger subprograms.
9b90: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 The VDBE is gu
9ba0: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 aranteed to have
9bb0: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 at least 9.
9bc0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 ** cells. */.
9bd0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 assert( p->nMe
9be0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 m>9 );. pSub
9bf0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 = &p->aMem[9];.
9c00: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 if( pSub->fla
9c10: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 gs&MEM_Blob ){.
9c20: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 /* On the f
9c30: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c irst call to sql
9c40: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 ite3_step(), pSu
9c50: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 b will hold a NU
9c60: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 LL. It is.
9c70: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 ** initialized
9c80: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 to a BLOB by the
9c90: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 P4_SUBPROGRAM p
9ca0: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 rocessing logic
9cb0: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e below */. n
9cc0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 Sub = pSub->n/si
9cd0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 zeof(Vdbe*);.
9ce0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 apSub = (SubP
9cf0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e rogram **)pSub->
9d00: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 z;. }. for
9d10: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b (i=0; i<nSub; i+
9d20: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b +){. nRow +
9d30: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b = apSub[i]->nOp;
9d40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f . }. }.. do
9d50: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b {. i = p->pc+
9d60: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e +;. }while( i<n
9d70: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 Row && p->explai
9d80: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 n==2 && p->aOp[i
9d90: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 ].opcode!=OP_Exp
9da0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e lain );. if( i>
9db0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e =nRow ){. p->
9dc0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
9dd0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f rc = SQLITE_
9de0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 DONE;. }else if
9df0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 ( db->u1.isInter
9e00: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d rupted ){. p-
9e10: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 >rc = SQLITE_INT
9e20: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d ERRUPT;. rc =
9e30: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 SQLITE_ERROR;.
9e40: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 sqlite3SetStr
9e50: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c ing(&p->zErrMsg,
9e60: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 db, "%s", sqlit
9e70: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 e3ErrStr(p->rc))
9e80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 ;. }else{. c
9e90: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 har *zP4;. Op
9ea0: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 *pOp;. if( i
9eb0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 <p->nOp ){.
9ec0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c /* The output l
9ed0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d ine number is sm
9ee0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 all enough that
9ef0: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 we are still in
9f00: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 the. ** mai
9f10: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 n program. */.
9f20: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f pOp = &p->aO
9f30: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b p[i];. }else{
9f40: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 . /* We are
9f50: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 currently listi
9f60: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 ng subprograms.
9f70: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 Figure out whic
9f80: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 h one and.
9f90: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 ** pick up the a
9fa0: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 ppropriate opcod
9fb0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 e. */. int
9fc0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d j;. i -= p-
9fd0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 >nOp;. for(
9fe0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d j=0; i>=apSub[j]
9ff0: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 ->nOp; j++){.
a000: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b i -= apSub[
a010: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d j]->nOp;. }
a020: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 . pOp = &ap
a030: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a Sub[j]->aOp[i];.
a040: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d }. if( p-
a050: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 >explain==1 ){.
a060: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
a070: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
a080: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b pMem->u.i = i;
a090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a0b0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 /* Program count
a0c0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d er */. pMem
a0d0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 ++;. . pMe
a0e0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 m->flags = MEM_S
a0f0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 tatic|MEM_Str|ME
a100: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d M_Term;. pM
a110: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 em->z = (char*)s
a120: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 qlite3OpcodeName
a130: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f (pOp->opcode); /
a140: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 * Opcode */.
a150: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e assert( pMem->
a160: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d z!=0 );. pM
a170: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 em->n = sqlite3S
a180: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 trlen30(pMem->z)
a190: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e ;. pMem->en
a1a0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b c = SQLITE_UTF8;
a1b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a . pMem++;..
a1c0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e /* When an
a1d0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f OP_Program opco
a1e0: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 de is encounter
a1f0: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 (the only opcode
a200: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 that has.
a210: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 ** a P4_SUBPROGR
a220: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 AM argument), ex
a230: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 pand the size of
a240: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 the array of su
a250: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 bprograms.
a260: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d ** kept in p->aM
a270: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 em[9].z to hold
a280: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 the new program
a290: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 - assuming this
a2a0: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 subprogram.
a2b0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 ** has not alre
a2c0: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 ady been seen..
a2d0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
a2e0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 ( pOp->p4type==P
a2f0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 4_SUBPROGRAM ){.
a300: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 int nByt
a310: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a e = (nSub+1)*siz
a320: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 eof(SubProgram*)
a330: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b ;. int j;
a340: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 . for(j=0
a350: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a ; j<nSub; j++){.
a360: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 if( ap
a370: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e Sub[j]==pOp->p4.
a380: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b pProgram ) break
a390: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
a3a0: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 if( j==nSub
a3b0: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 && SQLITE_OK==sq
a3c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 lite3VdbeMemGrow
a3d0: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 (pSub, nByte, nS
a3e0: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 ub!=0) ){.
a3f0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 apSub = (Sub
a400: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d Program **)pSub-
a410: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 >z;. ap
a420: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f Sub[nSub++] = pO
a430: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a p->p4.pProgram;.
a440: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e pSub->
a450: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f flags |= MEM_Blo
a460: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 b;. pSu
a470: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 b->n = nSub*size
a480: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b of(SubProgram*);
a490: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
a4a0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d }. }.. pM
a4b0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
a4c0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 Int;. pMem->u
a4d0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 .i = pOp->p1;
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a4f0: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a /* P1 */.
a500: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 pMem++;..
a510: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
a520: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d EM_Int;. pMem
a530: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b ->u.i = pOp->p2;
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 /* P2
a560: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a */. pMem++;..
a570: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
a580: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 = MEM_Int;. p
a590: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e Mem->u.i = pOp->
a5a0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 p3;
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
a5c0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b P3 */. pMem++
a5d0: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 ;.. if( sqlit
a5e0: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d e3VdbeMemGrow(pM
a5f0: 65 6d 2c 20 33 32 2c 20 30 29 20 29 7b 20 20 20 em, 32, 0) ){
a600: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 2a /* P4 *
a610: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 /. assert(
a620: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
a630: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 led );. ret
a640: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 urn SQLITE_ERROR
a650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d ;. }. pMem
a660: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 ->flags = MEM_St
a670: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 r|MEM_Term;.
a680: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 zP4 = displayP4(
a690: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 pOp, pMem->z, 32
a6a0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d );. if( zP4!=
a6b0: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 pMem->z ){.
a6c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
a6d0: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c etStr(pMem, zP4,
a6e0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 -1, SQLITE_UTF8
a6f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b , 0);. }else{
a700: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
a710: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 Mem->z!=0 );.
a720: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c pMem->n = sql
a730: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 ite3Strlen30(pMe
a740: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 m->z);. pMe
a750: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f m->enc = SQLITE_
a760: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 UTF8;. }.
a770: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 pMem++;.. if(
a780: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 p->explain==1 )
a790: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 {. if( sqli
a7a0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 te3VdbeMemGrow(p
a7b0: 4d 65 6d 2c 20 34 2c 20 30 29 20 29 7b 0a 20 20 Mem, 4, 0) ){.
a7c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d assert( p-
a7d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
a7e0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 d );. ret
a7f0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 urn SQLITE_ERROR
a800: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
a810: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
a820: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a M_Str|MEM_Term;.
a830: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 pMem->n =
a840: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 2;. sqlite3
a850: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 _snprintf(3, pMe
a860: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f m->z, "%.2x", pO
a870: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 p->p5); /* P5
a880: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 */. pMem->e
a890: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 nc = SQLITE_UTF8
a8a0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a ;. pMem++;.
a8b0: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 .#ifdef SQLITE
a8c0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
a8d0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 COMMENTS. i
a8e0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 f( sqlite3VdbeMe
a8f0: 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 35 30 30 2c mGrow(pMem, 500,
a900: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 0) ){. a
a910: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 ssert( p->db->ma
a920: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 llocFailed );.
a930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
a940: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 ITE_ERROR;.
a950: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 }. pMem->f
a960: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d lags = MEM_Str|M
a970: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 EM_Term;. p
a980: 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 Mem->n = display
a990: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 Comment(pOp, zP4
a9a0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b , pMem->z, 500);
a9b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 . pMem->enc
a9c0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a = SQLITE_UTF8;.
a9d0: 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d #else. pMem
a9e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 ->flags = MEM_Nu
a9f0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ll;
aa00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d /* Com
aa10: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 ment */.#endif.
aa20: 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 }.. p->nRe
aa30: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a sColumn = 8 - 4*
aa40: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a (p->explain-1);.
aa50: 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 p->pResultSe
aa60: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b t = &p->aMem[1];
aa70: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c . p->rc = SQL
aa80: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d ITE_OK;. rc =
aa90: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d SQLITE_ROW;. }
aaa0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
aab0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 #endif /* SQLITE
aac0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f _OMIT_EXPLAIN */
aad0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
aae0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e DEBUG./*.** Prin
aaf0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 t the SQL that w
ab00: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 as used to gener
ab10: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 ate a VDBE progr
ab20: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 am..*/.void sqli
ab30: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 te3VdbePrintSql(
ab40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 Vdbe *p){. cons
ab50: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 t char *z = 0;.
ab60: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a if( p->zSql ){.
ab70: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b z = p->zSql;
ab80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e . }else if( p->
ab90: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f nOp>=1 ){. co
aba0: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 nst VdbeOp *pOp
abb0: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 = &p->aOp[0];.
abc0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 if( pOp->opcod
abd0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f e==OP_Init && pO
abe0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 p->p4.z!=0 ){.
abf0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e z = pOp->p4.
ac00: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 z;. while(
ac10: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a sqlite3Isspace(*
ac20: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a z) ) z++;. }.
ac30: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 }. if( z ) pr
ac40: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c intf("SQL: [%s]\
ac50: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 n", z);.}.#endif
ac60: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 ..#if !defined(S
ac70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 QLITE_OMIT_TRACE
ac80: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c ) && defined(SQL
ac90: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 ITE_ENABLE_IOTRA
aca0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 CE)./*.** Print
acb0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 an IOTRACE messa
acc0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 ge showing SQL c
acd0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 ontent..*/.void
ace0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 sqlite3VdbeIOTra
acf0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a ceSql(Vdbe *p){.
ad00: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e int nOp = p->n
ad10: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f Op;. VdbeOp *pO
ad20: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 p;. if( sqlite3
ad30: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 IoTrace==0 ) ret
ad40: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 urn;. if( nOp<1
ad50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 ) return;. pOp
ad60: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 = &p->aOp[0];.
ad70: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 if( pOp->opcode
ad80: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 ==OP_Init && pOp
ad90: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 ->p4.z!=0 ){.
ada0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 int i, j;. c
adb0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 har z[1000];.
adc0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
add0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 f(sizeof(z), z,
ade0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 "%s", pOp->p4.z)
adf0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 ;. for(i=0; s
ae00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b qlite3Isspace(z[
ae10: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 i]); i++){}.
ae20: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 for(j=0; z[i]; i
ae30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 ++){. if( s
ae40: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b qlite3Isspace(z[
ae50: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 i]) ){. i
ae60: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 f( z[i-1]!=' ' )
ae70: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b {. z[j+
ae80: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 +] = ' ';.
ae90: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b }. }else{
aea0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 . z[j++]
aeb0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a = z[i];. }.
aec0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d }. z[j] =
aed0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 0;. sqlite3I
aee0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e oTrace("SQL %s\n
aef0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e ", z);. }.}.#en
af00: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f dif /* !SQLITE_O
af10: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c MIT_TRACE && SQL
af20: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 ITE_ENABLE_IOTRA
af30: 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c CE */../*.** All
af40: 6f 63 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d ocate space from
af50: 20 61 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 a fixed size bu
af60: 66 66 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 ffer and return
af70: 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 a pointer to.**
af80: 74 68 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 that space. If
af90: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 insufficient spa
afa0: 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c ce is available,
afb0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a return NULL..**
afc0: 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 .** The pBuf par
afd0: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 69 6e ameter is the in
afe0: 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 itial value of a
aff0: 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 pointer which w
b000: 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 ill.** receive t
b010: 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 he new memory.
b020: 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 pBuf is normally
b030: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 NULL. If pBuf
b040: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 is not.** NULL,
b050: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 it means that me
b060: 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73 20 61 mory space has a
b070: 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f lready been allo
b080: 63 61 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a cated and that.*
b090: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 * this routine s
b0a0: 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 hould not alloca
b0b0: 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 te any new memor
b0c0: 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 y. When pBuf is
b0d0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d not.** NULL sim
b0e0: 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e ply return pBuf.
b0f0: 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 Only allocate
b100: 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 new memory space
b110: 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 when pBuf.** is
b120: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 NULL..**.** nBy
b130: 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 te is the number
b140: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 of bytes of spa
b150: 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a ce needed..**.**
b160: 20 2a 70 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20 *ppFrom points
b170: 74 6f 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 to available spa
b180: 63 65 20 61 6e 64 20 70 45 6e 64 20 70 6f 69 6e ce and pEnd poin
b190: 74 73 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 ts to the end of
b1a0: 20 74 68 65 0a 2a 2a 20 61 76 61 69 6c 61 62 6c the.** availabl
b1b0: 65 20 73 70 61 63 65 2e 20 20 57 68 65 6e 20 73 e space. When s
b1c0: 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 pace is allocate
b1d0: 64 2c 20 2a 70 70 46 72 6f 6d 20 69 73 20 61 64 d, *ppFrom is ad
b1e0: 76 61 6e 63 65 64 20 70 61 73 74 0a 2a 2a 20 74 vanced past.** t
b1f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 61 6c he end of the al
b200: 6c 6f 63 61 74 65 64 20 73 70 61 63 65 2e 0a 2a located space..*
b210: 2a 0a 2a 2a 20 2a 70 6e 42 79 74 65 20 69 73 20 *.** *pnByte is
b220: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65 a counter of the
b230: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 number of bytes
b240: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68 of space that h
b250: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f ave failed.** to
b260: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74 allocate. If t
b270: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63 here is insuffic
b280: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 2a 70 ient space in *p
b290: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 pFrom to satisfy
b2a0: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c the.** request,
b2b0: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 then increment
b2c0: 2a 70 6e 42 79 74 65 20 62 79 20 74 68 65 20 61 *pnByte by the a
b2d0: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71 mount of the req
b2e0: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 uest..*/.static
b2f0: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 void *allocSpace
b300: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 (. void *pBuf,
b310: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 /* Wher
b320: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 e return pointer
b330: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20 will be stored
b340: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 */. int nByte,
b350: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
b360: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 ber of bytes to
b370: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38 allocate */. u8
b380: 20 2a 2a 70 70 46 72 6f 6d 2c 20 20 20 20 20 20 **ppFrom,
b390: 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c /* IN/OUT: Al
b3a0: 6c 6f 63 61 74 65 20 66 72 6f 6d 20 2a 70 70 46 locate from *ppF
b3b0: 72 6f 6d 20 2a 2f 0a 20 20 75 38 20 2a 70 45 6e rom */. u8 *pEn
b3c0: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a d, /*
b3d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 31 20 62 79 Pointer to 1 by
b3e0: 74 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 te past the end
b3f0: 6f 66 20 2a 70 70 46 72 6f 6d 20 62 75 66 66 65 of *ppFrom buffe
b400: 72 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 42 79 r */. int *pnBy
b410: 74 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 te /* I
b420: 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e f allocation can
b430: 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 not be made, inc
b440: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a rement *pnByte *
b450: 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 /.){. assert( E
b460: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d IGHT_BYTE_ALIGNM
b470: 45 4e 54 28 2a 70 70 46 72 6f 6d 29 20 29 3b 0a ENT(*ppFrom) );.
b480: 20 20 69 66 28 20 70 42 75 66 20 29 20 72 65 74 if( pBuf ) ret
b490: 75 72 6e 20 70 42 75 66 3b 0a 20 20 6e 42 79 74 urn pBuf;. nByt
b4a0: 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 e = ROUND8(nByte
b4b0: 29 3b 0a 20 20 69 66 28 20 26 28 2a 70 70 46 72 );. if( &(*ppFr
b4c0: 6f 6d 29 5b 6e 42 79 74 65 5d 20 3c 3d 20 70 45 om)[nByte] <= pE
b4d0: 6e 64 20 29 7b 0a 20 20 20 20 70 42 75 66 20 3d nd ){. pBuf =
b4e0: 20 28 76 6f 69 64 2a 29 2a 70 70 46 72 6f 6d 3b (void*)*ppFrom;
b4f0: 0a 20 20 20 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 . *ppFrom +=
b500: 6e 42 79 74 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a nByte;. }else{.
b510: 20 20 20 20 2a 70 6e 42 79 74 65 20 2b 3d 20 6e *pnByte += n
b520: 42 79 74 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 Byte;. }. retu
b530: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a rn pBuf;.}../*.*
b540: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42 * Rewind the VDB
b550: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65 E back to the be
b560: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 ginning in prepa
b570: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 ration for.** ru
b580: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 nning it..*/.voi
b590: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 d sqlite3VdbeRew
b5a0: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 ind(Vdbe *p){.#i
b5b0: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 f defined(SQLITE
b5c0: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e _DEBUG) || defin
b5d0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 ed(VDBE_PROFILE)
b5e0: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 . int i;.#endif
b5f0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 . assert( p!=0
b600: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
b610: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
b620: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 C_INIT );.. /*
b630: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 There should be
b640: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 at least one opc
b650: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 ode.. */. asse
b660: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a rt( p->nOp>0 );.
b670: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 . /* Set the ma
b680: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 gic to VDBE_MAGI
b690: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 C_RUN sooner rat
b6a0: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 her than later.
b6b0: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 */. p->magic =
b6c0: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a VDBE_MAGIC_RUN;.
b6d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
b6e0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 EBUG. for(i=1;
b6f0: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b i<p->nMem; i++){
b700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e . assert( p->
b710: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 aMem[i].db==p->d
b720: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a b );. }.#endif.
b730: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 p->pc = -1;.
b740: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f p->rc = SQLITE_O
b750: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 K;. p->errorAct
b760: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a ion = OE_Abort;.
b770: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 p->magic = VDB
b780: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 E_MAGIC_RUN;. p
b790: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 ->nChange = 0;.
b7a0: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 p->cacheCtr = 1
b7b0: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 ;. p->minWriteF
b7c0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b ileFormat = 255;
b7d0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 . p->iStatement
b7e0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f = 0;. p->nFkCo
b7f0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 nstraint = 0;.#i
b800: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c fdef VDBE_PROFIL
b810: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 E. for(i=0; i<p
b820: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 ->nOp; i++){.
b830: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d p->aOp[i].cnt =
b840: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 0;. p->aOp[i
b850: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 ].cycles = 0;.
b860: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a }.#endif.}../*.*
b870: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74 * Prepare a virt
b880: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 ual machine for
b890: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 execution for th
b8a0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 e first time aft
b8b0: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 er.** creating t
b8c0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 he virtual machi
b8d0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 ne. This involv
b8e0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a es things such.*
b8f0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 * as allocating
b900: 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e 64 20 stack space and
b910: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 initializing the
b920: 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 program counter
b930: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 ..** After the V
b940: 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70 70 DBE has be prepp
b950: 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 ed, it can be ex
b960: 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 ecuted by one or
b970: 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 more.** calls t
b980: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 o sqlite3VdbeExe
b990: 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 c(). .**.** Thi
b9a0: 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 s function may b
b9b0: 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 e called exactly
b9c0: 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 once on each vi
b9d0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a rtual machine..*
b9e0: 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 * After this rou
b9f0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 tine is called t
ba00: 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 he VM has been "
ba10: 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 packaged" and is
ba20: 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e ready.** to run
ba30: 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72 6f . After this ro
ba40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c utine is called,
ba50: 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 further calls t
ba60: 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 o .** sqlite3Vdb
ba70: 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f eAddOp() functio
ba80: 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 ns are prohibite
ba90: 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 d. This routine
baa0: 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 disconnects.**
bab0: 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 the Vdbe from th
bac0: 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 e Parse object t
bad0: 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 hat helped gener
bae0: 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 ate it so that t
baf0: 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 he.** the Vdbe b
bb00: 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 ecomes an indepe
bb10: 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 ndent entity and
bb20: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 the Parse objec
bb30: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 t can be.** dest
bb40: 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 royed..**.** Use
bb50: 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 the sqlite3Vdbe
bb60: 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 Rewind() procedu
bb70: 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 re to restore a
bb80: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 virtual machine
bb90: 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 back.** to its i
bba0: 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 nitial state aft
bbb0: 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 er it has been r
bbc0: 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 un..*/.void sqli
bbd0: 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 te3VdbeMakeReady
bbe0: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 (. Vdbe *p,
bbf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bc00: 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a /* The VDBE *
bc10: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 /. Parse *pPars
bc20: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
bc30: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f /* Parsing co
bc40: 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 ntext */.){. sq
bc50: 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 lite3 *db;
bc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
bc70: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e The database con
bc80: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 nection */. int
bc90: 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 nVar;
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
bcb0: 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 umber of paramet
bcc0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 ers */. int nMe
bcd0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 m;
bce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
bcf0: 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 r of VM memory r
bd00: 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e egisters */. in
bd10: 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 t nCursor;
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
bd30: 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 Number of cursor
bd40: 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 s required */.
bd50: 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 int nArg;
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
bd70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
bd80: 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 ments in subprog
bd90: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f rams */. int nO
bda0: 6e 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 nce;
bdb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
bdc0: 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e er of OP_Once in
bdd0: 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 structions */.
bde0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 int n;
bdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
be00: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
be10: 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 20 /. u8 *zCsr;
be20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
be30: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 /* Memory ava
be40: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 ilable for alloc
be50: 61 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 2a 7a ation */. u8 *z
be60: 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 End;
be70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 /* Fir
be80: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 6c 6c st byte past all
be90: 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 20 2a 2f ocated memory */
bea0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 . int nByte;
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bec0: 20 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 /* How much ex
bed0: 74 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 tra memory is ne
bee0: 65 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 eded */.. asser
bef0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 t( p!=0 );. ass
bf00: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b ert( p->nOp>0 );
bf10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
bf20: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 e!=0 );. assert
bf30: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
bf40: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
bf50: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d assert( pParse=
bf60: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 =p->pParse );.
bf70: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 db = p->db;. as
bf80: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 sert( db->malloc
bf90: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e Failed==0 );. n
bfa0: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 Var = pParse->nV
bfb0: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 ar;. nMem = pPa
bfc0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 rse->nMem;. nCu
bfd0: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e rsor = pParse->n
bfe0: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 Tab;. nArg = pP
bff0: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 arse->nMaxArg;.
c000: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d nOnce = pParse-
c010: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f >nOnce;. if( nO
c020: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d nce==0 ) nOnce =
c030: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 1; /* Ensure at
c040: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 least one byte
c050: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b in p->aOnceFlag[
c060: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 ] */. . /* For
c070: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 each cursor req
c080: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f uired, also allo
c090: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 cate a memory ce
c0a0: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 ll. Memory. **
c0b0: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 cells (nMem+1-nC
c0c0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e ursor)..nMem, in
c0d0: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 clusive, will ne
c0e0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 ver be used by.
c0f0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f ** the vdbe pro
c100: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 gram. Instead th
c110: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 ey are used to a
c120: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f llocate space fo
c130: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f r. ** VdbeCurso
c140: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 r/BtCursor struc
c150: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 tures. The blob
c160: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 of memory associ
c170: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 ated with . **
c180: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 cursor 0 is stor
c190: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c ed in memory cel
c1a0: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 l nMem. Memory c
c1b0: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a ell (nMem-1). *
c1c0: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f * stores the blo
c1d0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f b of memory asso
c1e0: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 ciated with curs
c1f0: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a or 1, etc.. **.
c200: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 ** See also: a
c210: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e llocateCursor().
c220: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 . */. nMem +=
c230: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 nCursor;.. /* A
c240: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f llocate space fo
c250: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 r memory registe
c260: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 rs, SQL variable
c270: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 s, VDBE cursors
c280: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 and . ** an arr
c290: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 ay to marshal SQ
c2a0: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d L function argum
c2b0: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 ents in.. */.
c2c0: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e zCsr = (u8*)&p->
c2d0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 aOp[p->nOp];
c2e0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 /* Memor
c2f0: 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 20 y avaliable for
c300: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 allocation */.
c310: 7a 45 6e 64 20 3d 20 28 75 38 2a 29 26 70 2d 3e zEnd = (u8*)&p->
c320: 61 4f 70 5b 70 50 61 72 73 65 2d 3e 6e 4f 70 41 aOp[pParse->nOpA
c330: 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 73 74 lloc]; /* First
c340: 20 62 79 74 65 20 70 61 73 74 20 65 6e 64 20 6f byte past end o
c350: 66 20 7a 43 73 72 5b 5d 20 2a 2f 0a 0a 20 20 72 f zCsr[] */.. r
c360: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 esolveP2Values(p
c370: 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 , &nArg);. p->u
c380: 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d sesStmtJournal =
c390: 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69 73 (u8)(pParse->is
c3a0: 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70 50 MultiWrite && pP
c3b0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b arse->mayAbort);
c3c0: 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 . if( pParse->e
c3d0: 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 xplain && nMem<1
c3e0: 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 0 ){. nMem =
c3f0: 31 30 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 10;. }. memset
c400: 28 7a 43 73 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a (zCsr, 0, zEnd-z
c410: 43 73 72 29 3b 0a 20 20 7a 43 73 72 20 2b 3d 20 Csr);. zCsr +=
c420: 28 7a 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 (zCsr - (u8*)0)&
c430: 37 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 7;. assert( EIG
c440: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e HT_BYTE_ALIGNMEN
c450: 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 70 2d 3e T(zCsr) );. p->
c460: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 expired = 0;..
c470: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 /* Memory for re
c480: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 gisters, paramet
c490: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 ers, cursor, etc
c4a0: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 , is allocated i
c4b0: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 n two. ** passe
c4c0: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 s. On the first
c4d0: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f pass, we try to
c4e0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 reuse unused sp
c4f0: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a ace at the . **
c500: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f end of the opco
c510: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 de array. If we
c520: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 are unable to s
c530: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 atisfy all memor
c540: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 y. ** requireme
c550: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 nts by reusing t
c560: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 he opcode array
c570: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 tail, then the s
c580: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 econd. ** pass
c590: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 will fill in the
c5a0: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 rest using a fr
c5b0: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 esh allocation.
c5c0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 . **. ** This
c5d0: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 two-pass approa
c5e0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61 ch that reuses a
c5f0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 s much memory as
c600: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 possible from.
c610: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 ** the leftover
c620: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e space at the en
c630: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 d of the opcode
c640: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 array can signif
c650: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 icantly. ** red
c660: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f uce the amount o
c670: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 f memory held by
c680: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 a prepared stat
c690: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f ement.. */. do
c6a0: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 {. nByte = 0
c6b0: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 ;. p->aMem =
c6c0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d allocSpace(p->aM
c6d0: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 em, nMem*sizeof(
c6e0: 4d 65 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e Mem), &zCsr, zEn
c6f0: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 d, &nByte);.
c700: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 p->aVar = allocS
c710: 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 pace(p->aVar, nV
c720: 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 ar*sizeof(Mem),
c730: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 &zCsr, zEnd, &nB
c740: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 yte);. p->apA
c750: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 rg = allocSpace(
c760: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 p->apArg, nArg*s
c770: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 izeof(Mem*), &zC
c780: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 sr, zEnd, &nByte
c790: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 );. p->azVar
c7a0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e = allocSpace(p->
c7b0: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 azVar, nVar*size
c7c0: 6f 66 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 of(char*), &zCsr
c7d0: 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b , zEnd, &nByte);
c7e0: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 . p->apCsr =
c7f0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 allocSpace(p->ap
c800: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a Csr, nCursor*siz
c810: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 eof(VdbeCursor*)
c820: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
c830: 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 43 73 &zCs
c840: 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 r, zEnd, &nByte)
c850: 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c ;. p->aOnceFl
c860: 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 ag = allocSpace(
c870: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f p->aOnceFlag, nO
c880: 6e 63 65 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 nce, &zCsr, zEnd
c890: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 , &nByte);. i
c8a0: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 f( nByte ){.
c8b0: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c p->pFree = sql
c8c0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f ite3DbMallocZero
c8d0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 (db, nByte);.
c8e0: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d }. zCsr = p-
c8f0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 >pFree;. zEnd
c900: 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b = &zCsr[nByte];
c910: 0a 20 20 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 . }while( nByte
c920: 20 26 26 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 && !db->mallocF
c930: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e ailed );.. p->n
c940: 43 75 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 Cursor = nCursor
c950: 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 ;. p->nOnceFlag
c960: 20 3d 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 = nOnce;. if(
c970: 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 p->aVar ){. p
c980: 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 ->nVar = (ynVar)
c990: 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d nVar;. for(n=
c9a0: 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0; n<nVar; n++){
c9b0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e . p->aVar[n
c9c0: 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 ].flags = MEM_Nu
c9d0: 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 ll;. p->aVa
c9e0: 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 r[n].db = db;.
c9f0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d }. }. if( p-
ca00: 3e 61 7a 56 61 72 20 29 7b 0a 20 20 20 20 70 2d >azVar ){. p-
ca10: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d >nzVar = pParse-
ca20: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 >nzVar;. memc
ca30: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 py(p->azVar, pPa
ca40: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e rse->azVar, p->n
ca50: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 zVar*sizeof(p->a
ca60: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d zVar[0]));. m
ca70: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a emset(pParse->az
ca80: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e Var, 0, pParse->
ca90: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 nzVar*sizeof(pPa
caa0: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b rse->azVar[0]));
cab0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d . }. if( p->aM
cac0: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 em ){. p->aMe
cad0: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 m--;
cae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 /* aMe
caf0: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e m[] goes from 1.
cb00: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e .nMem */. p->
cb10: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 nMem = nMem;
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
cb30: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 not from 0
cb40: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 ..nMem-1 */.
cb50: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d for(n=1; n<=nMem
cb60: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d ; n++){. p-
cb70: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d >aMem[n].flags =
cb80: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a MEM_Undefined;.
cb90: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d p->aMem[n]
cba0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a .db = db;. }.
cbb0: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e }. p->explain
cbc0: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 = pParse->expla
cbd0: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 in;. sqlite3Vdb
cbe0: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f eRewind(p);.}../
cbf0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 *.** Close a VDB
cc00: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c E cursor and rel
cc10: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 ease all the res
cc20: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 ources that curs
cc30: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 or .** happens t
cc40: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 o hold..*/.void
cc50: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 sqlite3VdbeFreeC
cc60: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 ursor(Vdbe *p, V
cc70: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b dbeCursor *pCx){
cc80: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b . if( pCx==0 ){
cc90: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
cca0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f . sqlite3VdbeSo
ccb0: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c rterClose(p->db,
ccc0: 20 70 43 78 29 3b 0a 20 20 69 66 28 20 70 43 78 pCx);. if( pCx
ccd0: 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 71 6c ->pBt ){. sql
cce0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 ite3BtreeClose(p
ccf0: 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a Cx->pBt);. /*
cd00: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f The pCx->pCurso
cd10: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 r will be close
cd20: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 automatically, i
cd30: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a f it exists, by.
cd40: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 ** the call
cd50: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 above. */. }els
cd60: 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 72 73 e if( pCx->pCurs
cd70: 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 or ){. sqlite
cd80: 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 3BtreeCloseCurso
cd90: 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b r(pCx->pCursor);
cda0: 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c . }.#ifndef SQL
cdb0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c ITE_OMIT_VIRTUAL
cdc0: 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 78 2d TABLE. if( pCx-
cdd0: 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b 0a >pVtabCursor ){.
cde0: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 sqlite3_vtab
cdf0: 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43 75 _cursor *pVtabCu
ce00: 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 rsor = pCx->pVta
ce10: 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e bCursor;. con
ce20: 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c st sqlite3_modul
ce30: 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 e *pModule = pVt
ce40: 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d abCursor->pVtab-
ce50: 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d >pModule;. p-
ce60: 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 >inVtabMethod =
ce70: 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 1;. pModule->
ce80: 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 xClose(pVtabCurs
ce90: 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 or);. p->inVt
cea0: 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 abMethod = 0;.
ceb0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a }.#endif.}../*.*
cec0: 2a 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 * Copy the value
ced0: 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 s stored in the
cee0: 56 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 VdbeFrame struct
cef0: 75 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e ure to its Vdbe.
cf00: 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 This.** is used
cf10: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 , for example, w
cf20: 68 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 hen a trigger su
cf30: 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c b-program is hal
cf40: 74 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a ted to restore.*
cf50: 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 * control to the
cf60: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a main program..*
cf70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
cf80: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 eFrameRestore(Vd
cf90: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 beFrame *pFrame)
cfa0: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 {. Vdbe *v = pF
cfb0: 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f rame->v;. v->aO
cfc0: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 nceFlag = pFrame
cfd0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 ->aOnceFlag;. v
cfe0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 ->nOnceFlag = pF
cff0: 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b rame->nOnceFlag;
d000: 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 . v->aOp = pFra
d010: 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f me->aOp;. v->nO
d020: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b p = pFrame->nOp;
d030: 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 . v->aMem = pFr
d040: 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e ame->aMem;. v->
d050: 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e nMem = pFrame->n
d060: 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 Mem;. v->apCsr
d070: 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b = pFrame->apCsr;
d080: 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 . v->nCursor =
d090: 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b pFrame->nCursor;
d0a0: 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f . v->db->lastRo
d0b0: 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 wid = pFrame->la
d0c0: 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 stRowid;. v->nC
d0d0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e hange = pFrame->
d0e0: 6e 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 nChange;. retur
d0f0: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a n pFrame->pc;.}.
d100: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c ./*.** Close all
d110: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 cursors..**.**
d120: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 Also release any
d130: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 dynamic memory
d140: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 held by the VM i
d150: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 n the Vdbe.aMem
d160: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 memory .** cell
d170: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e array. This is n
d180: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 ecessary as the
d190: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 memory cell arra
d1a0: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a y may contain.**
d1b0: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 pointers to Vdb
d1c0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 eFrame objects,
d1d0: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 which may in tur
d1e0: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 n contain pointe
d1f0: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 rs to.** open cu
d200: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 rsors..*/.static
d210: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 void closeAllCu
d220: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a rsors(Vdbe *p){.
d230: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 if( p->pFrame
d240: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 ){. VdbeFrame
d250: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f *pFrame;. fo
d260: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 r(pFrame=p->pFra
d270: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 me; pFrame->pPar
d280: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 ent; pFrame=pFra
d290: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 me->pParent);.
d2a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 sqlite3VdbeFra
d2b0: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 meRestore(pFrame
d2c0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 );. }. p->pFra
d2d0: 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 me = 0;. p->nFr
d2e0: 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 ame = 0;.. if(
d2f0: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 p->apCsr ){.
d300: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 int i;. for(i
d310: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 =0; i<p->nCursor
d320: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 ; i++){. Vd
d330: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 beCursor *pC = p
d340: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 ->apCsr[i];.
d350: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 if( pC ){.
d360: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 sqlite3VdbeF
d370: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 reeCursor(p, pC)
d380: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 ;. p->apC
d390: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 sr[i] = 0;.
d3a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 }. }. }. i
d3b0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 f( p->aMem ){.
d3c0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 releaseMemArra
d3d0: 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 y(&p->aMem[1], p
d3e0: 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 ->nMem);. }. w
d3f0: 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 hile( p->pDelFra
d400: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 me ){. VdbeFr
d410: 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 ame *pDel = p->p
d420: 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d DelFrame;. p-
d430: 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 >pDelFrame = pDe
d440: 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 l->pParent;.
d450: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 sqlite3VdbeFrame
d460: 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 Delete(pDel);.
d470: 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 }.. /* Delete a
d480: 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 ny auxdata alloc
d490: 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 ations made by t
d4a0: 68 65 20 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 he VM */. sqlit
d4b0: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 e3VdbeDeleteAuxD
d4c0: 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 ata(p, -1, 0);.
d4d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 assert( p->pAux
d4e0: 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a Data==0 );.}../*
d4f0: 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 .** Clean up the
d500: 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 75 74 VM after execut
d510: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ion..**.** This
d520: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 routine will aut
d530: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 omatically close
d540: 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 any cursors, li
d550: 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 sts, and/or.** s
d560: 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 72 65 orters that were
d570: 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 left open. It
d580: 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 68 65 also deletes the
d590: 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 values of.** va
d5a0: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 20 61 riables in the a
d5b0: 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a Var[] array..*/.
d5c0: 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 static void Clea
d5d0: 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 nup(Vdbe *p){.
d5e0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d sqlite3 *db = p-
d5f0: 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c >db;..#ifdef SQL
d600: 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 ITE_DEBUG. /* E
d610: 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 xecute assert()
d620: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e statements to en
d630: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 sure that the Vd
d640: 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a be.apCsr[] and .
d650: 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d ** Vdbe.aMem[]
d660: 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 arrays have alr
d670: 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 eady been cleane
d680: 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 d up. */. int
d690: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 i;. if( p->apCs
d6a0: 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 r ) for(i=0; i<p
d6b0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 ->nCursor; i++)
d6c0: 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 assert( p->apCsr
d6d0: 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 [i]==0 );. if(
d6e0: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 p->aMem ){. f
d6f0: 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d or(i=1; i<=p->nM
d700: 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 em; i++) assert(
d710: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 p->aMem[i].flag
d720: 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 s==MEM_Undefined
d730: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a );. }.#endif..
d740: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
d750: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b db, p->zErrMsg);
d760: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 . p->zErrMsg =
d770: 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 0;. p->pResultS
d780: 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a et = 0;.}../*.**
d790: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 Set the number
d7a0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e of result column
d7b0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 s that will be r
d7c0: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 eturned by this
d7d0: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 SQL.** statement
d7e0: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 . This is now se
d7f0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d t at compile tim
d800: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 e, rather than d
d810: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 uring.** executi
d820: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 on of the vdbe p
d830: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 rogram so that s
d840: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f qlite3_column_co
d850: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 unt() can.** be
d860: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c called on an SQL
d870: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 statement befor
d880: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 e sqlite3_step()
d890: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
d8a0: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 3VdbeSetNumCols(
d8b0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 Vdbe *p, int nRe
d8c0: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 sColumn){. Mem
d8d0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 *pColName;. int
d8e0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 n;. sqlite3 *d
d8f0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 b = p->db;.. re
d900: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d leaseMemArray(p-
d910: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 >aColName, p->nR
d920: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 esColumn*COLNAME
d930: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 _N);. sqlite3Db
d940: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c Free(db, p->aCol
d950: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 Name);. n = nRe
d960: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f sColumn*COLNAME_
d970: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 N;. p->nResColu
d980: 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f mn = (u16)nResCo
d990: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e lumn;. p->aColN
d9a0: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d ame = pColName =
d9b0: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 (Mem*)sqlite3Db
d9c0: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 MallocZero(db, s
d9d0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a izeof(Mem)*n );.
d9e0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d if( p->aColNam
d9f0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 e==0 ) return;.
da00: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 while( n-- > 0
da10: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d ){. pColName-
da20: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c >flags = MEM_Nul
da30: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d l;. pColName-
da40: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 >db = p->db;.
da50: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d pColName++;. }
da60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 .}../*.** Set th
da70: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 e name of the id
da80: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 x'th column to b
da90: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 e returned by th
daa0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e e SQL statement.
dab0: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 .** zName must b
dac0: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 e a pointer to a
dad0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 nul terminated
dae0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 string..**.** Th
daf0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 is call must be
db00: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c made after a cal
db10: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 l to sqlite3Vdbe
db20: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a SetNumCols()..**
db30: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 .** The final pa
db40: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d rameter, xDel, m
db50: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 ust be one of SQ
db60: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 LITE_DYNAMIC, SQ
db70: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f LITE_STATIC.** o
db80: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 r SQLITE_TRANSIE
db90: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c NT. If it is SQL
dba0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 ITE_DYNAMIC, the
dbb0: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 n the buffer poi
dbc0: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e nted.** to by zN
dbd0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 ame will be free
dbe0: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 d by sqlite3DbFr
dbf0: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 ee() when the vd
dc00: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e be is destroyed.
dc10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
dc20: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 dbeSetColName(.
dc30: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 Vdbe *p,
dc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
dc50: 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 /* Vdbe being
dc60: 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 configured */.
dc70: 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 int idx,
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
dc90: 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c /* Index of col
dca0: 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 umn zName applie
dcb0: 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 s to */. int va
dcc0: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r,
dcd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e /* On
dce0: 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 e of the COLNAME
dcf0: 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a _* constants */.
dd00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e const char *zN
dd10: 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ame,
dd20: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f /* Pointer to
dd30: 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 buffer containi
dd40: 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 ng name */. voi
dd50: 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 d (*xDel)(void*)
dd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
dd70: 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 Memory manageme
dd80: 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 nt strategy for
dd90: 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e zName */.){. in
dda0: 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f t rc;. Mem *pCo
ddb0: 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 lName;. assert(
ddc0: 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 idx<p->nResColu
ddd0: 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 mn );. assert(
dde0: 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b var<COLNAME_N );
ddf0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 . if( p->db->ma
de00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 llocFailed ){.
de10: 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 assert( !zName
de20: 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 || xDel!=SQLITE
de30: 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 _DYNAMIC );.
de40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f return SQLITE_NO
de50: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 MEM;. }. asser
de60: 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d t( p->aColName!=
de70: 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 0 );. pColName
de80: 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b = &(p->aColName[
de90: 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 idx+var*p->nResC
dea0: 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 olumn]);. rc =
deb0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
dec0: 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a tStr(pColName, z
ded0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 Name, -1, SQLITE
dee0: 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 _UTF8, xDel);.
def0: 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c assert( rc!=0 ||
df00: 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c !zName || (pCol
df10: 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f Name->flags&MEM_
df20: 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 Term)!=0 );. re
df30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
df40: 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 * A read or writ
df50: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 e transaction ma
df60: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 y or may not be
df70: 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 active on databa
df80: 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e se handle.** db.
df90: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f If a transactio
dfa0: 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d n is active, com
dfb0: 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 mit it. If there
dfc0: 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 is a.** write-t
dfd0: 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e ransaction spann
dfe0: 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e ing more than on
dff0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c e database file,
e000: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a this routine.**
e010: 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 takes care of t
e020: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
e030: 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 l trickery..*/.s
e040: 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f tatic int vdbeCo
e050: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 mmit(sqlite3 *db
e060: 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e , Vdbe *p){. in
e070: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e t i;. int nTran
e080: 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 s = 0; /* Numbe
e090: 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 r of databases w
e0a0: 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 ith an active wr
e0b0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 ite-transaction
e0c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 */. int rc = SQ
e0d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e LITE_OK;. int n
e0e0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a eedXcommit = 0;.
e0f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
e100: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
e110: 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 . /* With this
e120: 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 option, sqlite3V
e130: 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 tabSync() is def
e140: 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c ined to be simpl
e150: 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f y . ** SQLITE_O
e160: 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 K so p is not us
e170: 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 ed. . */. UNUS
e180: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b ED_PARAMETER(p);
e190: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 .#endif.. /* Be
e1a0: 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 fore doing anyth
e1b0: 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 ing else, call t
e1c0: 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 he xSync() callb
e1d0: 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a ack for any. **
e1e0: 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 virtual module
e1f0: 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 tables written i
e200: 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 n this transacti
e210: 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a on. This has to.
e220: 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 ** be done bef
e230: 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 ore determining
e240: 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 whether a master
e250: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 journal file is
e260: 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c . ** required,
e270: 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 as an xSync() c
e280: 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 allback may add
e290: 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 an attached data
e2a0: 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 base. ** to the
e2b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 transaction..
e2c0: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 */. rc = sqlite
e2d0: 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3VtabSync(db, p)
e2e0: 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f ;.. /* This loo
e2f0: 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 p determines (a)
e300: 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 if the commit h
e310: 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e ook should be in
e320: 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 voked and. ** (
e330: 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 b) how many data
e340: 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 base files have
e350: 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 open write trans
e360: 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 actions, not .
e370: 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 ** including the
e380: 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 temp database.
e390: 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 (b) is important
e3a0: 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 because if more
e3b0: 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 than . ** one
e3c0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 database file ha
e3d0: 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 s an open write
e3e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d transaction, a m
e3f0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 aster journal.
e400: 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 ** file is requi
e410: 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 red for an atomi
e420: 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a c commit.. */ .
e430: 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 for(i=0; rc==S
e440: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 QLITE_OK && i<db
e450: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 ->nDb; i++){ .
e460: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 Btree *pBt = d
e470: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 b->aDb[i].pBt;.
e480: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 if( sqlite3Bt
e490: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 reeIsInTrans(pBt
e4a0: 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 ) ){. needX
e4b0: 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 commit = 1;.
e4c0: 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 if( i!=1 ) nTr
e4d0: 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c ans++;. sql
e4e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 ite3BtreeEnter(p
e4f0: 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 Bt);. rc =
e500: 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c sqlite3PagerExcl
e510: 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 usiveLock(sqlite
e520: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3BtreePager(pBt)
e530: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
e540: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b BtreeLeave(pBt);
e550: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 . }. }. if(
e560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
e570: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b {. return rc;
e580: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 . }.. /* If th
e590: 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 ere are any writ
e5a0: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 e-transactions a
e5b0: 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 t all, invoke th
e5c0: 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f e commit hook */
e5d0: 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d . if( needXcomm
e5e0: 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 it && db->xCommi
e5f0: 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 tCallback ){.
e600: 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 rc = db->xCommi
e610: 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 tCallback(db->pC
e620: 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 ommitArg);. i
e630: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 f( rc ){. r
e640: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e eturn SQLITE_CON
e650: 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f STRAINT_COMMITHO
e660: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 OK;. }. }..
e670: 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 /* The simple c
e680: 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 ase - no more th
e690: 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 an one database
e6a0: 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 file (not counti
e6b0: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 ng the. ** TEMP
e6c0: 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 database) has a
e6d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 transaction act
e6e0: 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 ive. There is
e6f0: 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a no need for the.
e700: 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 ** master-jour
e710: 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 nal.. **. ** I
e720: 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c f the return val
e730: 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 ue of sqlite3Btr
e740: 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 eeGetFilename()
e750: 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 is a zero length
e760: 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 . ** string, it
e770: 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 means the main
e780: 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d database is :mem
e790: 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 ory: or a temp f
e7a0: 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 ile. In . ** t
e7b0: 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e hat case we do n
e7c0: 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 ot support atomi
e7d0: 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d c multi-file com
e7e0: 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 mits, so use the
e7f0: 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 . ** simple ca
e800: 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a se then too.. *
e810: 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 /. if( 0==sqlit
e820: 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 e3Strlen30(sqlit
e830: 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 e3BtreeGetFilena
e840: 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 me(db->aDb[0].pB
e850: 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 t)). || nTrans
e860: 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 <=1. ){. for
e870: 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 (i=0; rc==SQLITE
e880: 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 _OK && i<db->nDb
e890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 ; i++){. Bt
e8a0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 ree *pBt = db->a
e8b0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 Db[i].pBt;.
e8c0: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 if( pBt ){.
e8d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
e8e0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
e8f0: 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 One(pBt, 0);.
e900: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
e910: 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 /* Do the commit
e920: 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 only if all dat
e930: 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 abases successfu
e940: 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 lly complete pha
e950: 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 se 1. . ** If
e960: 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 one of the Btre
e970: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 eCommitPhaseOne(
e980: 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 ) calls fails, t
e990: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e his indicates an
e9a0: 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 . ** IO error
e9b0: 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 while deleting
e9c0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 or truncating a
e9d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 journal file. It
e9e0: 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 is unlikely,.
e9f0: 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 ** but could h
ea00: 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 appen. In this c
ea10: 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 ase abandon proc
ea20: 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 essing and retur
ea30: 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 n the error..
ea40: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b */. for(i=0;
ea50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 rc==SQLITE_OK &
ea60: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b & i<db->nDb; i++
ea70: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a ){. Btree *
ea80: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d pBt = db->aDb[i]
ea90: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 .pBt;. if(
eaa0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 pBt ){. r
eab0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 c = sqlite3Btree
eac0: 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 CommitPhaseTwo(p
ead0: 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a Bt, 0);. }.
eae0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 }. if( rc
eaf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
eb00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 sqlite3Vtab
eb10: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 Commit(db);.
eb20: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 }. }.. /* The
eb30: 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 complex case - T
eb40: 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d here is a multi-
eb50: 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 file write-trans
eb60: 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 action active..
eb70: 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 ** This require
eb80: 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e s a master journ
eb90: 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 al file to ensur
eba0: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f e the transactio
ebb0: 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 n is. ** commit
ebc0: 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a ted atomically..
ebd0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c */.#ifndef SQL
ebe0: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a ITE_OMIT_DISKIO.
ebf0: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 else{. sqli
ec00: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 te3_vfs *pVfs =
ec10: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e db->pVfs;. in
ec20: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a t needSync = 0;.
ec30: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 char *zMaste
ec40: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 r = 0; /* File
ec50: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 -name for the ma
ec60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a ster journal */.
ec70: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a char const *
ec80: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 zMainFile = sqli
ec90: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e te3BtreeGetFilen
eca0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 ame(db->aDb[0].p
ecb0: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 Bt);. sqlite3
ecc0: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d _file *pMaster =
ecd0: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 0;. i64 offs
ece0: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 et = 0;. int
ecf0: 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 res;. int ret
ed00: 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 ryCount = 0;.
ed10: 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a int nMainFile;.
ed20: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 . /* Select a
ed30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
ed40: 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 file name */.
ed50: 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c nMainFile = sql
ed60: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 ite3Strlen30(zMa
ed70: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 inFile);. zMa
ed80: 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 ster = sqlite3MP
ed90: 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a rintf(db, "%s-mj
eda0: 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 XXXXXX9XXz", zMa
edb0: 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 inFile);. if(
edc0: 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 zMaster==0 ) re
edd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 turn SQLITE_NOME
ede0: 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 M;. do {.
edf0: 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 u32 iRandom;.
ee00: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f if( retryCo
ee10: 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 unt ){. i
ee20: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 f( retryCount>10
ee30: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 0 ){. s
ee40: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 qlite3_log(SQLIT
ee50: 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 E_FULL, "MJ dele
ee60: 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 te: %s", zMaster
ee70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c );. sql
ee80: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 ite3OsDelete(pVf
ee90: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a s, zMaster, 0);.
eea0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
eeb0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 . }else i
eec0: 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 f( retryCount==1
eed0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
eee0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 lite3_log(SQLITE
eef0: 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 _FULL, "MJ colli
ef00: 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 de: %s", zMaster
ef10: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
ef20: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 }. retry
ef30: 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 Count++;. s
ef40: 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 qlite3_randomnes
ef50: 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d s(sizeof(iRandom
ef60: 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 ), &iRandom);.
ef70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
ef80: 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 intf(13, &zMaste
ef90: 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d r[nMainFile], "-
efa0: 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 mj%06X9%02X",.
efb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 (iR
efd0: 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 andom>>8)&0xffff
efe0: 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 ff, iRandom&0xff
eff0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 );. /* The
f000: 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 antipenultimate
f010: 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 character of the
f020: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
f030: 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 name must.
f040: 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f ** be "9" to avo
f050: 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f id name collisio
f060: 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b ns when using 8+
f070: 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 3 filenames. */.
f080: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d assert( zM
f090: 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 aster[sqlite3Str
f0a0: 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 len30(zMaster)-3
f0b0: 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 ]=='9' );.
f0c0: 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 sqlite3FileSuffi
f0d0: 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d x3(zMainFile, zM
f0e0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 aster);. rc
f0f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 = sqlite3OsAcce
f100: 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 ss(pVfs, zMaster
f110: 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f , SQLITE_ACCESS_
f120: 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 EXISTS, &res);.
f130: 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 }while( rc==S
f140: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 QLITE_OK && res
f150: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 );. if( rc==S
f160: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
f170: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 /* Open the ma
f180: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f ster journal. */
f190: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 . rc = sqli
f1a0: 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 te3OsOpenMalloc(
f1b0: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 pVfs, zMaster, &
f1c0: 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 pMaster, .
f1d0: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f SQLITE_OPEN_
f1e0: 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 READWRITE|SQLITE
f1f0: 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 _OPEN_CREATE|.
f200: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f SQLITE_O
f210: 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 PEN_EXCLUSIVE|SQ
f220: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 LITE_OPEN_MASTER
f230: 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 _JOURNAL, 0.
f240: 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 );. }. i
f250: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
f260: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
f270: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 3DbFree(db, zMas
f280: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 ter);. retu
f290: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 rn rc;. }. .
f2a0: 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 /* Write the
f2b0: 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 name of each dat
f2c0: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 abase file in th
f2d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e e transaction in
f2e0: 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a to the new. *
f2f0: 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c * master journal
f300: 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 file. If an err
f310: 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 or occurs at thi
f320: 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 s point close.
f330: 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 ** and delete
f340: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
f350: 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 al file. All the
f360: 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 individual jour
f370: 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a nal files. **
f380: 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c still have 'nul
f390: 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 l' as the master
f3a0: 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 journal pointer
f3b0: 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 , so they will r
f3c0: 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 oll. ** back
f3d0: 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 independently if
f3e0: 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 a failure occur
f3f0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f s.. */. fo
f400: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 r(i=0; i<db->nDb
f410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 ; i++){. Bt
f420: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 ree *pBt = db->a
f430: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 Db[i].pBt;.
f440: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 if( sqlite3Btre
f450: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 eIsInTrans(pBt)
f460: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 ){. char
f470: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 const *zFile = s
f480: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f qlite3BtreeGetJo
f490: 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a urnalname(pBt);.
f4a0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c if( zFil
f4b0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 e==0 ){.
f4c0: 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 continue; /*
f4d0: 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 Ignore TEMP and
f4e0: 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 :memory: databas
f4f0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a es */. }.
f500: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
f510: 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 zFile[0]!=0 );.
f520: 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 if( !need
f530: 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 Sync && !sqlite3
f540: 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 BtreeSyncDisable
f550: 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 d(pBt) ){.
f560: 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 needSync = 1
f570: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
f580: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
f590: 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c OsWrite(pMaster,
f5a0: 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 zFile, sqlite3S
f5b0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 trlen30(zFile)+1
f5c0: 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 , offset);.
f5d0: 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c offset += sql
f5e0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 ite3Strlen30(zFi
f5f0: 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 le)+1;. i
f600: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
f610: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
f620: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 lite3OsCloseFree
f630: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 (pMaster);.
f640: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 sqlite3OsDe
f650: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 lete(pVfs, zMast
f660: 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 er, 0);.
f670: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
f680: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 db, zMaster);.
f690: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 return r
f6a0: 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 c;. }.
f6b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
f6c0: 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 /* Sync the mast
f6d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e er journal file.
f6e0: 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 If the IOCAP_SE
f6f0: 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a QUENTIAL device.
f700: 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 ** flag is s
f710: 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 et this is not r
f720: 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a equired.. */.
f730: 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 if( needSync
f740: 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 . && 0==(sq
f750: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 lite3OsDeviceCha
f760: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 racteristics(pMa
f770: 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 ster)&SQLITE_IOC
f780: 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 AP_SEQUENTIAL).
f790: 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b && SQLITE_OK
f7a0: 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f !=(rc = sqlite3O
f7b0: 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 sSync(pMaster, S
f7c0: 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 QLITE_SYNC_NORMA
f7d0: 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 L)). ){.
f7e0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 sqlite3OsCloseF
f7f0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 ree(pMaster);.
f800: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c sqlite3OsDel
f810: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 ete(pVfs, zMaste
f820: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c r, 0);. sql
f830: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a ite3DbFree(db, z
f840: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 Master);. r
f850: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a eturn rc;. }.
f860: 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c . /* Sync all
f870: 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e the db files in
f880: 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 volved in the tr
f890: 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 ansaction. The s
f8a0: 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 ame call. **
f8b0: 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 sets the master
f8c0: 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 journal pointer
f8d0: 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 in each individu
f8e0: 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 al journal. If.
f8f0: 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f ** an error o
f900: 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e ccurs here, do n
f910: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 ot delete the ma
f920: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c ster journal fil
f930: 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a e.. **. **
f940: 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 If the error oc
f950: 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 curs during the
f960: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 first call to.
f970: 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 ** sqlite3Btre
f980: 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 eCommitPhaseOne(
f990: 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 ), then there is
f9a0: 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 a chance that t
f9b0: 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 he. ** master
f9c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 journal file wi
f9d0: 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 ll be orphaned.
f9e0: 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 But we cannot de
f9f0: 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 lete it,. **
fa00: 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 in case the mast
fa10: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 er journal file
fa20: 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e name was written
fa30: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 into the journa
fa40: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 l. ** file be
fa50: 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 fore the failure
fa60: 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a occurred.. *
fa70: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 /. for(i=0; r
fa80: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
fa90: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
faa0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 . Btree *p
fab0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e Bt = db->aDb[i].
fac0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 pBt;. if( p
fad0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 Bt ){. rc
fae0: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 = sqlite3BtreeC
faf0: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 ommitPhaseOne(pB
fb00: 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 t, zMaster);.
fb10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 }. }. s
fb20: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 qlite3OsCloseFre
fb30: 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 e(pMaster);.
fb40: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 assert( rc!=SQLI
fb50: 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 TE_BUSY );. i
fb60: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
fb70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
fb80: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 3DbFree(db, zMas
fb90: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 ter);. retu
fba0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 rn rc;. }..
fbb0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 /* Delete the
fbc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
fbd0: 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 ile. This commit
fbe0: 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f s the transactio
fbf0: 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 n. After. **
fc00: 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 doing this the d
fc10: 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 irectory is sync
fc20: 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 ed again before
fc30: 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 any individual.
fc40: 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f ** transactio
fc50: 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 n files are dele
fc60: 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ted.. */.
fc70: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 rc = sqlite3OsDe
fc80: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 lete(pVfs, zMast
fc90: 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 er, 1);. sqli
fca0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d te3DbFree(db, zM
fcb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 aster);. zMas
fcc0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 ter = 0;. if(
fcd0: 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 rc ){. ret
fce0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 urn rc;. }..
fcf0: 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 /* All files
fd00: 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 and directories
fd10: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 have already bee
fd20: 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 n synced, so the
fd30: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a following. *
fd40: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 * calls to sqlit
fd50: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 e3BtreeCommitPha
fd60: 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 seTwo() are only
fd70: 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 closing files a
fd80: 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 nd. ** deleti
fd90: 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 ng or truncating
fda0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f journals. If so
fdb0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f mething goes wro
fdc0: 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 ng while. **
fdd0: 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e this is happenin
fde0: 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c g we don't reall
fdf0: 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 y care. The inte
fe00: 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 grity of the.
fe10: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ** transaction
fe20: 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 is already guara
fe30: 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 nteed, but some
fe40: 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 stray 'cold' jou
fe50: 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 rnals. ** may
fe60: 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 be lying around
fe70: 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 . Returning an e
fe80: 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 rror code won't
fe90: 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 help matters..
fea0: 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 */. disable
feb0: 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 _simulated_io_er
fec0: 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 rors();. sqli
fed0: 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 te3BeginBenignMa
fee0: 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 lloc();. for(
fef0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 i=0; i<db->nDb;
ff00: 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 i++){ . Btr
ff10: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
ff20: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 b[i].pBt;.
ff30: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 if( pBt ){.
ff40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 sqlite3BtreeC
ff50: 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 ommitPhaseTwo(pB
ff60: 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 t, 1);. }.
ff70: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
ff80: 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 EndBenignMalloc(
ff90: 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 );. enable_si
ffa0: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 mulated_io_error
ffb0: 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 s();.. sqlite
ffc0: 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 3VtabCommit(db);
ffd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 . }.#endif.. r
ffe0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 eturn rc;.}../*
fff0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
10000 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 checks that the
10010 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 sqlite3.nVdbeAc
10020 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 tive count varia
10030 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 ble.** matches t
10040 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 he number of vdb
10050 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 e's in the list
10060 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 sqlite3.pVdbe th
10070 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e at are.** curren
10080 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 tly active. An a
10090 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 ssertion fails i
100a0 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 f the two counts
100b0 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a do not match..*
100c0 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 * This is an int
100d0 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b ernal self-check
100e0 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f only - it is no
100f0 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 t an essential p
10100 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 rocessing.** ste
10110 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 p..**.** This is
10120 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 a no-op if NDEB
10130 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a UG is defined..*
10140 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 /.#ifndef NDEBUG
10150 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 .static void che
10160 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 ckActiveVdbeCnt(
10170 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 sqlite3 *db){.
10180 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 Vdbe *p;. int c
10190 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 nt = 0;. int nW
101a0 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 rite = 0;. int
101b0 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d nRead = 0;. p =
101c0 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 db->pVdbe;. wh
101d0 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 ile( p ){. if
101e0 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 ( sqlite3_stmt_b
101f0 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d usy((sqlite3_stm
10200 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 t*)p) ){. c
10210 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 nt++;. if(
10220 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 p->readOnly==0 )
10230 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 nWrite++;.
10240 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 if( p->bIsReade
10250 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 r ) nRead++;.
10260 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e }. p = p->pN
10270 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 ext;. }. asser
10280 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 t( cnt==db->nVdb
10290 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 eActive );. ass
102a0 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d ert( nWrite==db-
102b0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 >nVdbeWrite );.
102c0 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d assert( nRead==
102d0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b db->nVdbeRead );
102e0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 .}.#else.#define
102f0 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 checkActiveVdbe
10300 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f Cnt(x).#endif../
10310 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 *.** If the Vdbe
10320 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 passed as the f
10330 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 irst argument op
10340 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 ened a statement
10350 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a -transaction,.**
10360 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 close it now. A
10370 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 rgument eOp must
10380 20 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 be either SAVEP
10390 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 OINT_ROLLBACK or
103a0 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 .** SAVEPOINT_RE
103b0 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 LEASE. If it is
103c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
103d0 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 CK, then the sta
103e0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 tement.** transa
103f0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 ction is rolled
10400 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 back. If eOp is
10410 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
10420 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 E, then the .**
10430 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 statement transa
10440 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 ction is committ
10450 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 ed..**.** If an
10460 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c IO error occurs,
10470 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 an SQLITE_IOERR
10480 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 _XXX error code
10490 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a is returned. .**
104a0 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 Otherwise SQLIT
104b0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c E_OK..*/.int sql
104c0 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 ite3VdbeCloseSta
104d0 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 tement(Vdbe *p,
104e0 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 int eOp){. sqli
104f0 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 te3 *const db =
10500 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 p->db;. int rc
10510 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 = SQLITE_OK;..
10520 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d /* If p->iStatem
10530 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 ent is greater t
10540 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 han zero, then t
10550 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 his Vdbe opened
10560 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e a . ** statemen
10570 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 t transaction th
10580 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f at should be clo
10590 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e sed here. The on
105a0 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a ly exception. *
105b0 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 * is that an IO
105c0 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f error may have o
105d0 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 ccurred, causing
105e0 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f an emergency ro
105f0 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 llback.. ** In
10600 74 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e this case (db->n
10610 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 Statement==0), a
10620 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 nd there is noth
10630 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a ing to do.. */.
10640 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 if( db->nState
10650 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 ment && p->iStat
10660 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 ement ){. int
10670 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e i;. const in
10680 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 t iSavepoint = p
10690 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a ->iStatement-1;.
106a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 . assert( eOp
106b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c ==SAVEPOINT_ROLL
106c0 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 BACK || eOp==SAV
106d0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b EPOINT_RELEASE);
106e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d . assert( db-
106f0 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b >nStatement>0 );
10700 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e . assert( p->
10710 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d iStatement==(db-
10720 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e >nStatement+db->
10730 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a nSavepoint) );..
10740 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 for(i=0; i<d
10750 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 b->nDb; i++){ .
10760 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 int rc2 = S
10770 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 QLITE_OK;.
10780 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d Btree *pBt = db-
10790 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 >aDb[i].pBt;.
107a0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 if( pBt ){.
107b0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 if( eOp==S
107c0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
107d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 K ){. r
107e0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 c2 = sqlite3Btre
107f0 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 eSavepoint(pBt,
10800 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
10810 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b CK, iSavepoint);
10820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
10830 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 if( rc2==SQLI
10840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 TE_OK ){.
10850 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 rc2 = sqlite3
10860 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 BtreeSavepoint(p
10870 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 Bt, SAVEPOINT_RE
10880 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e LEASE, iSavepoin
10890 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 t);. }.
108a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 if( rc==SQ
108b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
108c0 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 rc = rc2;.
108d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
108e0 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e . }. db->n
108f0 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 Statement--;.
10900 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d p->iStatement =
10910 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 0;.. if( rc=
10920 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
10930 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 if( eOp==SAV
10940 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 EPOINT_ROLLBACK
10950 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
10960 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 sqlite3VtabSavep
10970 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 oint(db, SAVEPOI
10980 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 NT_ROLLBACK, iSa
10990 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 vepoint);.
109a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d }. if( rc==
109b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
109c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
109d0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 3VtabSavepoint(d
109e0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c b, SAVEPOINT_REL
109f0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 EASE, iSavepoint
10a00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
10a10 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 .. /* If the
10a20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 statement transa
10a30 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 ction is being r
10a40 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f olled back, also
10a50 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 restore the .
10a60 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 ** database ha
10a70 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 ndles deferred c
10a80 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 onstraint counte
10a90 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 r to the value i
10aa0 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 t had when .
10ab0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 ** the statement
10ac0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 transaction was
10ad0 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 opened. */.
10ae0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f if( eOp==SAVEPO
10af0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a INT_ROLLBACK ){.
10b00 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 db->nDefer
10b10 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 redCons = p->nSt
10b20 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 mtDefCons;.
10b30 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d db->nDeferredIm
10b40 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 mCons = p->nStmt
10b50 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 DefImmCons;.
10b60 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 }. }. return r
10b70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 c;.}../*.** This
10b80 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c function is cal
10b90 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 led when a trans
10ba0 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 action opened by
10bb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a the database .*
10bc0 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 * handle associa
10bd0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 ted with the VM
10be0 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 passed as an arg
10bf0 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 ument is about t
10c00 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 o be .** committ
10c10 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 ed. If there are
10c20 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 outstanding def
10c30 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 erred foreign ke
10c40 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 y constraint.**
10c50 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 violations, retu
10c60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e rn SQLITE_ERROR.
10c70 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 Otherwise, SQLI
10c80 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 TE_OK..**.** If
10c90 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 there are outsta
10ca0 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 nding FK violati
10cb0 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e ons and this fun
10cc0 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a ction returns .*
10cd0 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 * SQLITE_ERROR,
10ce0 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f set the result o
10cf0 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 f the VM to SQLI
10d00 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f TE_CONSTRAINT_FO
10d10 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 REIGNKEY.** and
10d20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d write an error m
10d30 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 essage to it. Th
10d40 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 en return SQLITE
10d50 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 _ERROR..*/.#ifnd
10d60 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 ef SQLITE_OMIT_F
10d70 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 OREIGN_KEY.int s
10d80 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 qlite3VdbeCheckF
10d90 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 k(Vdbe *p, int d
10da0 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 eferred){. sqli
10db0 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b te3 *db = p->db;
10dc0 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 . if( (deferred
10dd0 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 && (db->nDeferr
10de0 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 edCons+db->nDefe
10df0 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 rredImmCons)>0)
10e00 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 . || (!deferre
10e10 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 d && p->nFkConst
10e20 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 raint>0) . ){.
10e30 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 p->rc = SQLIT
10e40 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 E_CONSTRAINT_FOR
10e50 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e EIGNKEY;. p->
10e60 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 errorAction = OE
10e70 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 _Abort;. sqli
10e80 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d te3SetString(&p-
10e90 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 46 >zErrMsg, db, "F
10ea0 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 OREIGN KEY const
10eb0 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a raint failed");.
10ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
10ed0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 E_ERROR;. }. r
10ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
10ef0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a .}.#endif../*.**
10f00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
10f10 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e called the when
10f20 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f a VDBE tries to
10f30 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 halt. If the V
10f40 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 DBE.** has made
10f50 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 changes and is i
10f60 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 n autocommit mod
10f70 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 e, then commit t
10f80 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e hose.** changes.
10f90 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 If a rollback
10fa0 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 is needed, then
10fb0 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e do the rollback.
10fc0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 .**.** This rout
10fd0 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 ine is the only
10fe0 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 way to move the
10ff0 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 state of a VM fr
11000 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 om.** SQLITE_MAG
11010 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 IC_RUN to SQLITE
11020 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 _MAGIC_HALT. It
11030 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a is harmless to.
11040 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 ** call this on
11050 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 a VM that is in
11060 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 the SQLITE_MAGIC
11070 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a _HALT state..**.
11080 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 ** Return an err
11090 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 or code. If the
110a0 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f commit could no
110b0 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 t complete becau
110c0 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f se of.** lock co
110d0 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e ntention, return
110e0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 SQLITE_BUSY. I
110f0 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 f SQLITE_BUSY is
11100 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a returned, it.**
11110 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 means the close
11120 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 did not happen
11130 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 and needs to be
11140 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 repeated..*/.int
11150 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 sqlite3VdbeHalt
11160 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 (Vdbe *p){. int
11170 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 rc;
11180 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
11190 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 Used to store tr
111a0 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 ansient return c
111b0 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 odes */. sqlite
111c0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 3 *db = p->db;..
111d0 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 /* This functi
111e0 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 on contains the
111f0 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 logic that deter
11200 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 mines if a state
11210 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 ment or. ** tra
11220 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 nsaction will be
11230 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f committed or ro
11240 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 lled back as a r
11250 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a esult of the. *
11260 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 * execution of t
11270 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 his virtual mach
11280 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 ine. . **. **
11290 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f If any of the fo
112a0 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f llowing errors o
112b0 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 ccur:. **. **
112c0 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d SQLITE_NOMEM
112d0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 . ** SQLITE
112e0 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 _IOERR. **
112f0 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a SQLITE_FULL. **
11300 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 SQLITE_INTE
11310 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 RRUPT. **. **
11320 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 Then the interna
11330 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 l cache might ha
11340 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 ve been left in
11350 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a an inconsistent.
11360 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 ** state. We
11370 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b need to rollback
11380 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 the statement t
11390 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 ransaction, if t
113a0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 here is. ** one
113b0 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 , or the complet
113c0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 e transaction if
113d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 there is no sta
113e0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 tement transacti
113f0 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 on.. */.. if(
11400 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
11410 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 led ){. p->rc
11420 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
11430 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f . }. if( p->aO
11440 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 nceFlag ) memset
11450 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 (p->aOnceFlag, 0
11460 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b , p->nOnceFlag);
11470 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f . closeAllCurso
11480 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e rs(p);. if( p->
11490 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 magic!=VDBE_MAGI
114a0 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 C_RUN ){. ret
114b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
114c0 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 }. checkActive
114d0 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 VdbeCnt(db);..
114e0 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 /* No commit or
114f0 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 rollback needed
11500 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e if the program n
11510 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 ever started or
11520 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 if the. ** SQL
11530 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e statement does n
11540 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 ot read or write
11550 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 a database file
11560 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 . */. if( p->p
11570 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 c>=0 && p->bIsRe
11580 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 ader ){. int
11590 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 mrc; /* Primar
115a0 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f y error code fro
115b0 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 m p->rc */. i
115c0 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 nt eStatementOp
115d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 = 0;. int isS
115e0 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 pecialError;
115f0 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 /* Set t
11600 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65 o true if a 'spe
11610 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a cial' error */..
11620 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 /* Lock all
11630 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74 btrees used by t
11640 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a he statement */.
11650 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 sqlite3VdbeE
11660 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a nter(p);.. /*
11670 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f Check for one o
11680 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 f the special er
11690 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 rors */. mrc
116a0 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a = p->rc & 0xff;.
116b0 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 isSpecialErr
116c0 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 or = mrc==SQLITE
116d0 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 _NOMEM || mrc==S
116e0 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 QLITE_IOERR.
116f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11700 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f || mrc==SQLITE_
11710 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 INTERRUPT || mrc
11720 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 ==SQLITE_FULL;.
11730 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c if( isSpecial
11740 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f Error ){. /
11750 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77 * If the query w
11760 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 as read-only and
11770 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 the error code
11780 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 is SQLITE_INTERR
11790 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e UPT, . ** n
117a0 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 o rollback is ne
117b0 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 cessary. Otherwi
117c0 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 se, at least a s
117d0 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 avepoint .
117e0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d ** transaction m
117f0 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 ust be rolled ba
11800 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 ck to restore th
11810 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 e database to a
11820 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 . ** consis
11830 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 tent state..
11840 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 **. ** Ev
11850 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d en if the statem
11860 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 ent is read-only
11870 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e , it is importan
11880 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 t to perform.
11890 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e ** a statemen
118a0 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e t or transaction
118b0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 rollback operat
118c0 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f ion. If the erro
118d0 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 r . ** occu
118e0 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 rred while writi
118f0 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 ng to the journa
11900 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f l, sub-journal o
11910 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 r database.
11920 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 ** file as part
11930 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f of an effort to
11940 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73 free up cache s
11950 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 pace (see functi
11960 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 on. ** page
11970 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 rStress() in pag
11980 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 er.c), the rollb
11990 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 ack is required
119a0 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 to restore .
119b0 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 ** the pager t
119c0 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 o a consistent s
119d0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 tate.. */.
119e0 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 if( !p->rea
119f0 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 dOnly || mrc!=SQ
11a00 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 LITE_INTERRUPT )
11a10 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d {. if( (m
11a20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d rc==SQLITE_NOMEM
11a30 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f || mrc==SQLITE_
11a40 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 FULL) && p->uses
11a50 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 StmtJournal ){.
11a60 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d eStatem
11a70 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e entOp = SAVEPOIN
11a80 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 T_ROLLBACK;.
11a90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
11aa0 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 /* We are f
11ab0 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 orced to roll ba
11ac0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72 ck the active tr
11ad0 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 ansaction. Befor
11ae0 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 e doing.
11af0 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 ** so, abort a
11b00 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 ny other stateme
11b10 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 nts this handle
11b20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 currently has ac
11b30 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 tive..
11b40 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c */. sql
11b50 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 ite3RollbackAll(
11b60 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 db, SQLITE_ABORT
11b70 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 _ROLLBACK);.
11b80 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f sqlite3Clo
11b90 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 seSavepoints(db)
11ba0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e ;. db->
11bb0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a autoCommit = 1;.
11bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
11bd0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
11be0 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 Check for immedi
11bf0 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 ate foreign key
11c00 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 violations. */.
11c10 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 if( p->rc==SQ
11c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
11c30 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 sqlite3VdbeChec
11c40 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d kFk(p, 0);. }
11c50 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 . . /* If th
11c60 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c e auto-commit fl
11c70 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 ag is set and th
11c80 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 is is the only a
11c90 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 ctive writer .
11ca0 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 ** VM, then we
11cb0 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d do either a com
11cc0 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 mit or rollback
11cd0 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 of the current t
11ce0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 ransaction. .
11cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a **. ** Note:
11d00 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f This block also
11d10 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 runs if one of
11d20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f the special erro
11d30 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 rs handled .
11d40 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 ** above has occ
11d50 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 urred. . */.
11d60 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 if( !sqlite3V
11d70 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 tabInSync(db) .
11d80 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 && db->autoC
11d90 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 ommit . && d
11da0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 b->nVdbeWrite==(
11db0 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 p->readOnly==0)
11dc0 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 . ){. if
11dd0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
11de0 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 OK || (p->errorA
11df0 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 ction==OE_Fail &
11e00 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f & !isSpecialErro
11e10 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 r) ){. rc
11e20 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 = sqlite3VdbeCh
11e30 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 eckFk(p, 1);.
11e40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c if( rc!=SQL
11e50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
11e60 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d if( NEVER(p-
11e70 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 >readOnly) ){.
11e80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
11e90 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 3VdbeLeave(p);.
11ea0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
11eb0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a n SQLITE_ERROR;.
11ec0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
11ed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
11ee0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 E_CONSTRAINT_FOR
11ef0 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 EIGNKEY;.
11f00 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 }else{ .
11f10 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 /* The auto-c
11f20 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 ommit flag is tr
11f30 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f ue, the vdbe pro
11f40 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 gram was success
11f50 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a ful . *
11f60 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 * or hit an 'OR
11f70 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 FAIL' constraint
11f80 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e and there are n
11f90 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 o deferred forei
11fa0 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 gn. **
11fb0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 key constraints
11fc0 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 to hold up the t
11fd0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 ransaction. This
11fe0 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 means a commit
11ff0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 . ** is
12000 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 required. */.
12010 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 rc = vdb
12020 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a eCommit(db, p);.
12030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
12040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
12050 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 _BUSY && p->read
12060 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 Only ){.
12070 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 sqlite3VdbeLea
12080 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 ve(p);.
12090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 return SQLITE_B
120a0 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c USY;. }el
120b0 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 se if( rc!=SQLIT
120c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
120d0 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 p->rc = rc;.
120e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 sqlite3R
120f0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 ollbackAll(db, S
12100 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 QLITE_OK);.
12110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
12120 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 db->nDeferre
12130 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 dCons = 0;.
12140 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 db->nDeferr
12150 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 edImmCons = 0;.
12160 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 db->fla
12170 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 gs &= ~SQLITE_De
12180 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 ferFKs;.
12190 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 sqlite3CommitI
121a0 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 nternalChanges(d
121b0 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 b);. }.
121c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
121d0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 sqlite3Rollba
121e0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 ckAll(db, SQLITE
121f0 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 _OK);. }.
12200 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 db->nStateme
12210 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 nt = 0;. }els
12220 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 e if( eStatement
12230 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 Op==0 ){. i
12240 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 f( p->rc==SQLITE
12250 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 _OK || p->errorA
12260 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 ction==OE_Fail )
12270 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 {. eState
12280 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 mentOp = SAVEPOI
12290 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 NT_RELEASE;.
122a0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 }else if( p->e
122b0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 rrorAction==OE_A
122c0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 bort ){.
122d0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 eStatementOp = S
122e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
122f0 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a K;. }else{.
12300 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 sqlite3R
12310 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 ollbackAll(db, S
12320 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c QLITE_ABORT_ROLL
12330 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 BACK);. s
12340 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 qlite3CloseSavep
12350 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 oints(db);.
12360 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 db->autoCommi
12370 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 t = 1;. }.
12380 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 }. . /* I
12390 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 f eStatementOp i
123a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e s non-zero, then
123b0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 a statement tra
123c0 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 nsaction needs t
123d0 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d o. ** be comm
123e0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 itted or rolled
123f0 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 back. Call sqlit
12400 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 e3VdbeCloseState
12410 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a ment() to. **
12420 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 do so. If this
12430 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e operation return
12440 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 s an error, and
12450 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 the current stat
12460 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 ement. ** err
12470 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 or code is SQLIT
12480 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 E_OK or SQLITE_C
12490 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 ONSTRAINT, then
124a0 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 promote the.
124b0 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 ** current state
124c0 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e ment error code.
124d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
124e0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a eStatementOp ){.
124f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
12500 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 e3VdbeCloseState
12510 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 ment(p, eStateme
12520 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 ntOp);. if(
12530 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 rc ){. i
12540 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 f( p->rc==SQLITE
12550 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 _OK || (p->rc&0x
12560 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 ff)==SQLITE_CONS
12570 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 TRAINT ){.
12580 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a p->rc = rc;.
12590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
125a0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 3DbFree(db, p->z
125b0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 ErrMsg);.
125c0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 p->zErrMsg =
125d0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 0;. }.
125e0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c sqlite3Roll
125f0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 backAll(db, SQLI
12600 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 TE_ABORT_ROLLBAC
12610 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 K);. sqli
12620 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e te3CloseSavepoin
12630 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 ts(db);.
12640 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d db->autoCommit =
12650 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 1;. }.
12660 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 }. . /* If t
12670 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 his was an INSER
12680 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c T, UPDATE or DEL
12690 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 ETE and no state
126a0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
126b0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e . ** has been
126c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 rolled back, up
126d0 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 date the databas
126e0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 e connection cha
126f0 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 nge-counter. .
12700 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e */. if( p->
12710 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 changeCntOn ){.
12720 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d if( eStatem
12730 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 entOp!=SAVEPOINT
12740 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 _ROLLBACK ){.
12750 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 sqlite3Vdbe
12760 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 SetChanges(db, p
12770 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 ->nChange);.
12780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
12790 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 sqlite3VdbeSetC
127a0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 hanges(db, 0);.
127b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e }. p->
127c0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 nChange = 0;.
127d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 }.. /* Relea
127e0 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a se the locks */.
127f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c sqlite3VdbeL
12800 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 eave(p);. }..
12810 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 /* We have succe
12820 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 ssfully halted a
12830 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d nd closed the VM
12840 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 . Record this f
12850 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d act. */. if( p-
12860 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 >pc>=0 ){. db
12870 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b ->nVdbeActive--;
12880 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 . if( !p->rea
12890 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 dOnly ) db->nVdb
128a0 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 eWrite--;. if
128b0 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 ( p->bIsReader )
128c0 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d db->nVdbeRead--
128d0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 ;. assert( db
128e0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 ->nVdbeActive>=d
128f0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a b->nVdbeRead );.
12900 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e assert( db->
12910 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e nVdbeRead>=db->n
12920 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 VdbeWrite );.
12930 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 assert( db->nVd
12940 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 beWrite>=0 );.
12950 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 }. p->magic = V
12960 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a DBE_MAGIC_HALT;.
12970 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 checkActiveVdb
12980 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 eCnt(db);. if(
12990 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
129a0 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 led ){. p->rc
129b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b = SQLITE_NOMEM;
129c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 . }.. /* If th
129d0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c e auto-commit fl
129e0 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 ag is set to tru
129f0 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b e, then any lock
12a00 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 s that were held
12a10 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 . ** by connect
12a20 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 ion db have now
12a30 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 been released. C
12a40 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 all sqlite3Conne
12a50 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 ctionUnlocked()
12a60 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 . ** to invoke
12a70 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c any required unl
12a80 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 ock-notify callb
12a90 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 acks.. */. if(
12aa0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 db->autoCommit
12ab0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f ){. sqlite3Co
12ac0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 nnectionUnlocked
12ad0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 (db);. }.. ass
12ae0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 ert( db->nVdbeAc
12af0 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 tive>0 || db->au
12b00 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 toCommit==0 || d
12b10 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 b->nStatement==0
12b20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d );. return (p-
12b30 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 >rc==SQLITE_BUSY
12b40 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a ? SQLITE_BUSY :
12b50 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a SQLITE_OK);.}..
12b60 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 ./*.** Each VDBE
12b70 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c holds the resul
12b80 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 t of the most re
12b90 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 cent sqlite3_ste
12ba0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 p() call.** in p
12bb0 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 ->rc. This rout
12bc0 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 ine sets that re
12bd0 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c sult back to SQL
12be0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 ITE_OK..*/.void
12bf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 sqlite3VdbeReset
12c00 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 StepResult(Vdbe
12c10 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 *p){. p->rc = S
12c20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a QLITE_OK;.}../*.
12c30 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f ** Copy the erro
12c40 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 r code and error
12c50 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 message belongi
12c60 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 ng to the VDBE p
12c70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 assed.** as the
12c80 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 first argument t
12c90 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 o its database h
12ca0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 andle (so that t
12cb0 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 hey will be .**
12cc0 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c returned by call
12cd0 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 s to sqlite3_err
12ce0 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 code() and sqlit
12cf0 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a e3_errmsg())..**
12d00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
12d10 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 n does not clear
12d20 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 the VDBE error
12d30 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c code or message,
12d40 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 just.** copies
12d50 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 them to the data
12d60 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a base handle..*/.
12d70 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 int sqlite3VdbeT
12d80 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 ransferError(Vdb
12d90 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 e *p){. sqlite3
12da0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 *db = p->db;.
12db0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a int rc = p->rc;.
12dc0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 if( p->zErrMsg
12dd0 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f ){. u8 mallo
12de0 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 cFailed = db->ma
12df0 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 llocFailed;.
12e00 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 sqlite3BeginBeni
12e10 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 gnMalloc();.
12e20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 if( db->pErr==0
12e30 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c ) db->pErr = sql
12e40 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 ite3ValueNew(db)
12e50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c ;. sqlite3Val
12e60 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 ueSetStr(db->pEr
12e70 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 r, -1, p->zErrMs
12e80 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 g, SQLITE_UTF8,
12e90 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 SQLITE_TRANSIENT
12ea0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e );. sqlite3En
12eb0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b dBenignMalloc();
12ec0 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 . db->mallocF
12ed0 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 46 61 ailed = mallocFa
12ee0 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e 65 72 iled;. db->er
12ef0 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65 rCode = rc;. }e
12f00 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 lse{. sqlite3
12f10 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20 Error(db, rc);.
12f20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a }. return rc;.
12f30 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }..#ifdef SQLITE
12f40 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f _ENABLE_SQLLOG./
12f50 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54 *.** If an SQLIT
12f60 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 E_CONFIG_SQLLOG
12f70 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72 hook is register
12f80 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61 ed and the VM ha
12f90 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 s been run, .**
12fa0 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 invoke it..*/.st
12fb0 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e atic void vdbeIn
12fc0 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20 vokeSqllog(Vdbe
12fd0 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 *v){. if( sqlit
12fe0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 e3GlobalConfig.x
12ff0 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d Sqllog && v->rc=
13000 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d =SQLITE_OK && v-
13010 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d >zSql && v->pc>=
13020 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 0 ){. char *z
13030 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74 Expanded = sqlit
13040 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28 e3VdbeExpandSql(
13050 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 v, v->zSql);.
13060 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e assert( v->db->
13070 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a init.busy==0 );.
13080 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65 if( zExpande
13090 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 d ){. sqlit
130a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 e3GlobalConfig.x
130b0 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20 Sqllog(.
130c0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 sqlite3GlobalC
130d0 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 onfig.pSqllogArg
130e0 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 , v->db, zExpand
130f0 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20 ed, 1. );.
13100 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
13110 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e ee(v->db, zExpan
13120 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a ded);. }. }.
13130 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 }.#else.# define
13140 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f vdbeInvokeSqllo
13150 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a g(x).#endif../*.
13160 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44 ** Clean up a VD
13170 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 BE after executi
13180 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 on but do not de
13190 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75 lete the VDBE ju
131a0 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 st yet..** Write
131b0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 any error messa
131c0 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d ges into *pzErrM
131d0 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 sg. Return the
131e0 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a result code..**.
131f0 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f ** After this ro
13200 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 utine is run, th
13210 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65 e VDBE should be
13220 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65 ready to be exe
13230 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a cuted.** again..
13240 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 **.** To look at
13250 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c it another way,
13260 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 this routine re
13270 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f sets the state o
13280 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c f the.** virtual
13290 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 machine from VD
132a0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 BE_MAGIC_RUN or
132b0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 VDBE_MAGIC_HALT
132c0 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f back to.** VDBE_
132d0 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 MAGIC_INIT..*/.i
132e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 nt sqlite3VdbeRe
132f0 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 set(Vdbe *p){.
13300 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 sqlite3 *db;. d
13310 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a b = p->db;.. /*
13320 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e If the VM did n
13330 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 ot run to comple
13340 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e tion or if it en
13350 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a countered an. *
13360 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 * error, then it
13370 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 might not have
13380 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 been halted prop
13390 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 erly. So halt.
133a0 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f ** it now.. */
133b0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 . sqlite3VdbeHa
133c0 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 lt(p);.. /* If
133d0 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 the VDBE has be
133e0 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c run even partial
133f0 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 ly, then transfe
13400 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 r the error code
13410 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 . ** and error
13420 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 message from the
13430 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d VDBE into the m
13440 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 ain database str
13450 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a ucture. But. *
13460 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 * if the VDBE ha
13470 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 s just been set
13480 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e to run but has n
13490 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 ot actually exec
134a0 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e uted any. ** in
134b0 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 structions yet,
134c0 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 leave the main d
134d0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e atabase error in
134e0 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e formation unchan
134f0 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ged.. */. if(
13500 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 p->pc>=0 ){.
13510 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 vdbeInvokeSqllog
13520 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 (p);. sqlite3
13530 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f VdbeTransferErro
13540 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 r(p);. sqlite
13550 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 3DbFree(db, p->z
13560 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e ErrMsg);. p->
13570 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 zErrMsg = 0;.
13580 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f if( p->runOnlyO
13590 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64 nce ) p->expired
135a0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 = 1;. }else if
135b0 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78 ( p->rc && p->ex
135c0 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 pired ){. /*
135d0 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67 The expired flag
135e0 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20 was set on the
135f0 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20 VDBE before the
13600 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a first call. *
13610 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 * to sqlite3_ste
13620 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74 p(). For consist
13630 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69 ency (since sqli
13640 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20 te3_step() was.
13650 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73 ** called), s
13660 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 et the database
13670 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61 error in this ca
13680 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20 se as well..
13690 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 */. sqlite3Er
136a0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70 rorWithMsg(db, p
136b0 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 ->rc, p->zErrMsg
136c0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e ? "%s" : 0, p->
136d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 zErrMsg);. sq
136e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
136f0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 p->zErrMsg);.
13700 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b p->zErrMsg = 0;
13710 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 . }.. /* Recla
13720 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 im all memory us
13730 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 ed by the VDBE.
13740 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 */. Cleanup(p)
13750 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f ;.. /* Save pro
13760 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 filing informati
13770 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 on from this VDB
13780 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 E run.. */.#ifd
13790 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a ef VDBE_PROFILE.
137a0 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 {. FILE *ou
137b0 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f t = fopen("vdbe_
137c0 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 profile.out", "a
137d0 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 ");. if( out
137e0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a ){. int i;.
137f0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 fprintf(ou
13800 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 t, "---- ");.
13810 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d for(i=0; i<p-
13820 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nOp; i++){.
13830 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c fprintf(out,
13840 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b "%02x", p->aOp[
13850 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 i].opcode);.
13860 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 }. fprint
13870 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 f(out, "\n");.
13880 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 if( p->zSql
13890 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 ){. char
138a0 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 c, pc = 0;.
138b0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 fprintf(out,
138c0 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 "-- ");.
138d0 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d for(i=0; (c = p-
138e0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b >zSql[i])!=0; i+
138f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 +){. if
13900 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 ( pc=='\n' ) fpr
13910 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 intf(out, "-- ")
13920 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 ;. putc
13930 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 (c, out);.
13940 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 pc = c;.
13950 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
13960 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 ( pc!='\n' ) fpr
13970 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b intf(out, "\n");
13980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 . }. f
13990 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 or(i=0; i<p->nOp
139a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; i++){.
139b0 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a char zHdr[100];.
139c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
139d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 snprintf(sizeof(
139e0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 zHdr), zHdr, "%6
139f0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 u %12llu %8llu "
13a00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e ,. p->
13a10 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 aOp[i].cnt,.
13a20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d p->aOp[i]
13a30 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 .cycles,.
13a40 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e p->aOp[i].cn
13a50 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e t>0 ? p->aOp[i].
13a60 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d cycles/p->aOp[i]
13a70 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 .cnt : 0.
13a80 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 );. fpri
13a90 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a ntf(out, "%s", z
13aa0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 Hdr);. sq
13ab0 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 lite3VdbePrintOp
13ac0 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 (out, i, &p->aOp
13ad0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 [i]);. }.
13ae0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b fclose(out);
13af0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 . }. }.#endi
13b00 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54 f. p->iCurrentT
13b10 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61 ime = 0;. p->ma
13b20 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
13b30 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 _INIT;. return
13b40 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d p->rc & db->errM
13b50 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 ask;.}. ./*.** C
13b60 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 lean up and dele
13b70 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 te a VDBE after
13b80 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 execution. Retu
13b90 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 rn an integer wh
13ba0 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 ich is.** the re
13bb0 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 sult code. Writ
13bc0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 e any error mess
13bd0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 age text into *p
13be0 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 zErrMsg..*/.int
13bf0 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c sqlite3VdbeFinal
13c00 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ize(Vdbe *p){.
13c10 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
13c20 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 OK;. if( p->mag
13c30 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 ic==VDBE_MAGIC_R
13c40 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d UN || p->magic==
13c50 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 VDBE_MAGIC_HALT
13c60 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 ){. rc = sqli
13c70 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b te3VdbeReset(p);
13c80 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 . assert( (rc
13c90 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 & p->db->errMas
13ca0 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 k)==rc );. }.
13cb0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 sqlite3VdbeDelet
13cc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 e(p);. return r
13cd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 c;.}../*.** If p
13ce0 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 arameter iOp is
13cf0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 less than zero,
13d00 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 then invoke the
13d10 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a destructor for.*
13d20 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 * all auxiliary
13d30 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 data pointers cu
13d40 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 rrently cached b
13d50 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 y the VM passed
13d60 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 as.** the first
13d70 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 argument..**.**
13d80 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 Or, if iOp is gr
13d90 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 eater than or eq
13da0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 ual to zero, the
13db0 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 n the destructor
13dc0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f is.** only invo
13dd0 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 ked for those au
13de0 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 xiliary data poi
13df0 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 nters created by
13e00 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 the user .** fu
13e10 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 nction invoked b
13e20 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f y the OP_Functio
13e30 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 n opcode at inst
13e40 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a ruction iOp of .
13e50 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 ** VM pVdbe, and
13e60 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a only then if:.*
13e70 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 *.** * the as
13e80 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f sociated functio
13e90 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 n parameter is t
13ea0 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 he 32nd or later
13eb0 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 (counting.**
13ec0 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 from left to
13ed0 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a right), or.**.**
13ee0 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 * the corres
13ef0 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 ponding bit in a
13f00 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 rgument mask is
13f10 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 clear (where the
13f20 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 first.** f
13f30 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 unction paramete
13f40 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f r corresponds to
13f50 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f bit 0 etc.)..*/
13f60 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
13f70 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 56 eDeleteAuxData(V
13f80 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e 74 20 dbe *pVdbe, int
13f90 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a iOp, int mask){.
13fa0 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70 20 3d AuxData **pp =
13fb0 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44 61 74 &pVdbe->pAuxDat
13fc0 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 a;. while( *pp
13fd0 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a ){. AuxData *
13fe0 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 pAux = *pp;.
13ff0 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 if( (iOp<0).
14000 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d || (pAux->iOp==
14010 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 iOp && (pAux->iA
14020 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 rg>31 || !(mask
14030 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 & MASKBIT32(pAux
14040 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 ->iArg)))). )
14050 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 {. testcase
14060 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 ( pAux->iArg==31
14070 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 );. if( pA
14080 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 ux->xDelete ){.
14090 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 pAux->xDe
140a0 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 lete(pAux->pAux)
140b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
140c0 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 *pp = pAux->pNex
140d0 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 t;. sqlite3
140e0 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e 64 62 DbFree(pVdbe->db
140f0 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c , pAux);. }el
14100 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 se{. pp= &p
14110 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 Aux->pNext;.
14120 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 }. }.}../*.** F
14130 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 ree all memory a
14140 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
14150 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 he Vdbe passed a
14160 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 s the second arg
14170 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 ument,.** except
14180 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 for object itse
14190 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 lf, which is pre
141a0 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 served..**.** Th
141b0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 e difference bet
141c0 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 ween this functi
141d0 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 on and sqlite3Vd
141e0 62 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 beDelete() is th
141f0 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 at.** VdbeDelete
14200 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 () also unlinks
14210 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 the Vdbe from th
14220 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 e list of VMs as
14230 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a sociated with.**
14240 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f the database co
14250 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 nnection and fre
14260 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 es the object it
14270 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 self..*/.void sq
14280 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 lite3VdbeClearOb
14290 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 ject(sqlite3 *db
142a0 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 , Vdbe *p){. Su
142b0 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 bProgram *pSub,
142c0 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b *pNext;. int i;
142d0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 . assert( p->db
142e0 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 ==0 || p->db==db
142f0 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d );. releaseMem
14300 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 Array(p->aVar, p
14310 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 ->nVar);. relea
14320 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 seMemArray(p->aC
14330 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 olName, p->nResC
14340 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 olumn*COLNAME_N)
14350 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e ;. for(pSub=p->
14360 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 pProgram; pSub;
14370 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 pSub=pNext){.
14380 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 pNext = pSub->p
14390 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 Next;. vdbeFr
143a0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 eeOpArray(db, pS
143b0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e ub->aOp, pSub->n
143c0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 Op);. sqlite3
143d0 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 DbFree(db, pSub)
143e0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d ;. }. for(i=p-
143f0 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 >nzVar-1; i>=0;
14400 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 i--) sqlite3DbFr
14410 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b ee(db, p->azVar[
14420 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65 65 4f i]);. vdbeFreeO
14430 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f pArray(db, p->aO
14440 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 p, p->nOp);. sq
14450 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
14460 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 p->aColName);.
14470 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
14480 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 , p->zSql);. sq
14490 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
144a0 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 20 64 p->pFree);.#if d
144b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e efined(SQLITE_EN
144c0 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 ABLE_TREE_EXPLAI
144d0 4e 29 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 N). sqlite3DbFr
144e0 65 65 28 64 62 2c 20 70 2d 3e 7a 45 78 70 6c 61 ee(db, p->zExpla
144f0 69 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 in);. sqlite3Db
14500 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 45 78 70 Free(db, p->pExp
14510 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a lain);.#endif.}.
14520 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e ./*.** Delete an
14530 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f entire VDBE..*/
14540 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
14550 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 eDelete(Vdbe *p)
14560 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b {. sqlite3 *db;
14570 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d .. if( NEVER(p=
14580 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 =0) ) return;.
14590 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 db = p->db;. as
145a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
145b0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 tex_held(db->mut
145c0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 ex) );. sqlite3
145d0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 VdbeClearObject(
145e0 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d db, p);. if( p-
145f0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d >pPrev ){. p-
14600 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 >pPrev->pNext =
14610 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 p->pNext;. }els
14620 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 e{. assert( d
14630 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 b->pVdbe==p );.
14640 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 db->pVdbe = p
14650 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 ->pNext;. }. i
14660 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 f( p->pNext ){.
14670 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 p->pNext->pPr
14680 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 ev = p->pPrev;.
14690 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 }. p->magic =
146a0 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b VDBE_MAGIC_DEAD;
146b0 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 . p->db = 0;.
146c0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
146d0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 , p);.}../*.** T
146e0 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 he cursor "p" ha
146f0 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b s a pending seek
14700 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 operation that
14710 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e has not yet been
14720 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e .** carried out.
14730 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f Seek the curso
14740 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 r now. If an er
14750 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 ror occurs, retu
14760 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 rn.** the approp
14770 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 riate error code
14780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 ..*/.static int
14790 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 SQLITE_NOINLINE
147a0 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f handleDeferredMo
147b0 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 veto(VdbeCursor
147c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 *p){. int res,
147d0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 rc;.#ifdef SQLIT
147e0 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 E_TEST. extern
147f0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 int sqlite3_sear
14800 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 ch_count;.#endif
14810 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 . assert( p->de
14820 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a ferredMoveto );.
14830 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 assert( p->isT
14840 61 62 6c 65 20 29 3b 0a 20 20 72 63 20 3d 20 73 able );. rc = s
14850 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 qlite3BtreeMovet
14860 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 43 75 oUnpacked(p->pCu
14870 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 rsor, 0, p->move
14880 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 toTarget, 0, &re
14890 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 s);. if( rc ) r
148a0 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 2d 3e 6c eturn rc;. p->l
148b0 61 73 74 52 6f 77 69 64 20 3d 20 70 2d 3e 6d 6f astRowid = p->mo
148c0 76 65 74 6f 54 61 72 67 65 74 3b 0a 20 20 69 66 vetoTarget;. if
148d0 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 ( res!=0 ) retur
148e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 n SQLITE_CORRUPT
148f0 5f 42 4b 50 54 3b 0a 20 20 70 2d 3e 72 6f 77 69 _BKPT;. p->rowi
14900 64 49 73 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 dIsValid = 1;.#i
14910 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 fdef SQLITE_TEST
14920 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 . sqlite3_searc
14930 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 h_count++;.#endi
14940 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d f. p->deferredM
14950 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e oveto = 0;. p->
14960 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 cacheStatus = CA
14970 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 CHE_STALE;. ret
14980 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
14990 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e ../*.** Somethin
149a0 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 g has moved curs
149b0 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c or "p" out of pl
149c0 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 ace. Maybe the
149d0 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f row it was.** po
149e0 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c inted to was del
149f0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e eted out from un
14a00 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 der it. Or mayb
14a10 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73 0a e the btree was.
14a20 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 ** rebalanced.
14a30 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61 75 Whatever the cau
14a40 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f se, try to resto
14a50 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c re "p" to the pl
14a60 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 ace it.** is sup
14a70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e posed to be poin
14a80 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f ting. If the ro
14a90 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 w was deleted ou
14aa0 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 t from under the
14ab0 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 .** cursor, set
14ac0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f the cursor to po
14ad0 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f int to a NULL ro
14ae0 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 w..*/.static int
14af0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 SQLITE_NOINLINE
14b00 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 handleMovedCurs
14b10 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 or(VdbeCursor *p
14b20 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 ){. int isDiffe
14b30 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 rentRow, rc;. a
14b40 73 73 65 72 74 28 20 70 2d 3e 70 43 75 72 73 6f ssert( p->pCurso
14b50 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 r!=0 );. assert
14b60 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 ( sqlite3BtreeCu
14b70 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e rsorHasMoved(p->
14b80 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 pCursor) );. rc
14b90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 = sqlite3BtreeC
14ba0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e ursorRestore(p->
14bb0 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 pCursor, &isDiff
14bc0 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e erentRow);. p->
14bd0 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 cacheStatus = CA
14be0 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 CHE_STALE;. if(
14bf0 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 isDifferentRow
14c00 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 ) p->nullRow = 1
14c10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d ;. return rc;.}
14c20 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 ../*.** Make sur
14c30 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 e the cursor p i
14c40 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 s ready to read
14c50 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 or write the row
14c60 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 to which it.**
14c70 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f was last positio
14c80 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 ned. Return an
14c90 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e error code if an
14ca0 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f OOM fault or I/
14cb0 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 O error.** preve
14cc0 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 nts us from posi
14cd0 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 tioning the curs
14ce0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 or to its correc
14cf0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a t position..**.*
14d00 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 * If a MoveTo op
14d10 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 eration is pendi
14d20 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 ng on the given
14d30 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 cursor, then do
14d40 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e that.** MoveTo n
14d50 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 ow. If no move
14d60 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 is pending, chec
14d70 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 k to see if the
14d80 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 row has been.**
14d90 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d deleted out from
14da0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f under the curso
14db0 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c r and if it has,
14dc0 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 mark the row as
14dd0 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a .** a NULL row..
14de0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 **.** If the cur
14df0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 sor is already p
14e00 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 ointing to the c
14e10 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 orrect row and t
14e20 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e hat row has.** n
14e30 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 ot been deleted
14e40 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 out from under t
14e50 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 he cursor, then
14e60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
14e70 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 a no-op..*/.int
14e80 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f sqlite3VdbeCurso
14e90 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 rMoveto(VdbeCurs
14ea0 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d or *p){. if( p-
14eb0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 >deferredMoveto
14ec0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 ){. return ha
14ed0 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 ndleDeferredMove
14ee0 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 to(p);. }. if(
14ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 sqlite3BtreeCur
14f00 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 sorHasMoved(p->p
14f10 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 Cursor) ){. r
14f20 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 eturn handleMove
14f30 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a dCursor(p);. }.
14f40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
14f50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 OK;.}../*.** The
14f60 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 following funct
14f70 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 ions:.**.** sqli
14f80 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 te3VdbeSerialTyp
14f90 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 e().** sqlite3Vd
14fa0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
14fb0 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 ).** sqlite3Vdbe
14fc0 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 SerialLen().** s
14fd0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
14fe0 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 Put().** sqlite3
14ff0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a VdbeSerialGet().
15000 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 **.** encapsulat
15010 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 e the code that
15020 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 serializes value
15030 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e s for storage in
15040 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 SQLite.** data
15050 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 and index record
15060 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a s. Each serializ
15070 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 ed value consist
15080 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 s of a.** 'seria
15090 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c l-type' and a bl
150a0 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 ob of data. The
150b0 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 serial type is a
150c0 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 n 8-byte unsigne
150d0 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 d.** integer, st
150e0 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 ored as a varint
150f0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 ..**.** In an SQ
15100 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 Lite index recor
15110 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 d, the serial ty
15120 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 pe is stored dir
15130 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 ectly before.**
15140 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 the blob of data
15150 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 that it corresp
15160 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 onds to. In a ta
15170 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 ble record, all
15180 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 serial.** types
15190 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 are stored at th
151a0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 e start of the r
151b0 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 ecord, and the b
151c0 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a lobs of data at.
151d0 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 ** the end. Henc
151e0 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e e these function
151f0 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c s allow the call
15200 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 er to handle the
15210 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 .** serial-type
15220 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 and data blob se
15230 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 parately..**.**
15240 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 The following ta
15250 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 ble describes th
15260 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 e various storag
15270 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 e classes for da
15280 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 ta:.**.** seri
15290 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 al type b
152a0 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 ytes of data
152b0 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d type.** ----
152c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d ---------- -
152d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 --------------
152e0 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d --------------
152f0 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 -.** 0
15300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15310 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 0 NUL
15320 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 L.** 1
15330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15340 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 1 sig
15350 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 ned integer.**
15360 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 2
15370 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 2
15380 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e signed in
15390 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 teger.** 3
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
153b0 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 3
153c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a signed integer.
153d0 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 ** 4
153e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 4
153f0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 signe
15400 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 d integer.**
15410 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 5
15420 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 6
15430 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 signed inte
15440 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 ger.** 6
15450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15460 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 8 s
15470 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a igned integer.**
15480 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 7
15490 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 8
154a0 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c IEEE fl
154b0 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 oat.** 8
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
154d0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 0 I
154e0 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 nteger constant
154f0 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 0.** 9
15500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15510 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 0 Int
15520 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a eger constant 1.
15530 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 ** 10,11
15540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15550 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 reser
15560 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f ved for expansio
15570 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e n.** N>=12 an
15580 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d d even (N-
15590 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 12)/2 BLO
155a0 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e B.** N>=13 an
155b0 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d d odd (N-
155c0 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 13)/2 tex
155d0 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e t.**.** The 8 an
155e0 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 d 9 types were a
155f0 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 dded in 3.3.0, f
15600 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 ile format 4. P
15610 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a rior versions.**
15620 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 of SQLite will
15630 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 not understand t
15640 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 hose serial type
15650 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 s..*/../*.** Ret
15660 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 urn the serial-t
15670 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 ype for the valu
15680 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d e stored in pMem
15690 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 ..*/.u32 sqlite3
156a0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d VdbeSerialType(M
156b0 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 em *pMem, int fi
156c0 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e le_format){. in
156d0 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e t flags = pMem->
156e0 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a flags;. u32 n;.
156f0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d . if( flags&MEM
15700 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 _Null ){. ret
15710 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 urn 0;. }. if(
15720 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 flags&MEM_Int )
15730 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 {. /* Figure
15740 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 out whether to u
15750 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 se 1, 2, 4, 6 or
15760 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 8 bytes. */.#
15770 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 define MAX_6BYT
15780 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 E ((((i64)0x0000
15790 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 8000)<<32)-1).
157a0 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e i64 i = pMem->
157b0 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a u.i;. u64 u;.
157c0 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 if( i<0 ){.
157d0 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d 41 58 if( i<(-MAX
157e0 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 72 6e _6BYTE) ) return
157f0 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 72 65 6;. /* Pre
15800 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 76 65 vious test preve
15810 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 32 32 nts: u = -(-922
15820 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38 3372036854775808
15830 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 20 2d ) */. u = -
15840 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 i;. }else{.
15850 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d u = i;. }
15860 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 . if( u<=127
15870 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ){. return
15880 28 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c ((i&1)==i && fil
15890 65 5f 66 6f 72 6d 61 74 3e 3d 34 29 20 3f 20 38 e_format>=4) ? 8
158a0 2b 28 75 33 32 29 75 20 3a 20 31 3b 0a 20 20 20 +(u32)u : 1;.
158b0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 }. if( u<=32
158c0 37 36 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 767 ) return 2;.
158d0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 if( u<=83886
158e0 30 37 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 07 ) return 3;.
158f0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 if( u<=214748
15900 33 36 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 3647 ) return 4;
15910 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f . if( u<=MAX_
15920 36 42 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 6BYTE ) return 5
15930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a ;. return 6;.
15940 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 }. if( flags&
15950 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 MEM_Real ){.
15960 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 return 7;. }.
15970 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 assert( pMem->db
15980 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c ->mallocFailed |
15990 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 | flags&(MEM_Str
159a0 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 |MEM_Blob) );.
159b0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e assert( pMem->n>
159c0 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 =0 );. n = (u32
159d0 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 )pMem->n;. if(
159e0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f flags & MEM_Zero
159f0 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 ){. n += pMe
15a00 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a m->u.nZero;. }.
15a10 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 return ((n*2)
15a20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d + 12 + ((flags&M
15a30 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a EM_Str)!=0));.}.
15a40 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th
15a50 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 e length of the
15a60 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 data correspondi
15a70 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 ng to the suppli
15a80 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a ed serial-type..
15a90 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 */.u32 sqlite3Vd
15aa0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
15ab0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 u32 serial_type)
15ac0 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 {. if( serial_t
15ad0 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 ype>=12 ){. r
15ae0 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 eturn (serial_ty
15af0 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 pe-12)/2;. }els
15b00 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f e{. static co
15b10 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d nst u8 aSize[] =
15b20 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 { 0, 1, 2, 3, 4
15b30 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c , 6, 8, 8, 0, 0,
15b40 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 0, 0 };. ret
15b50 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c urn aSize[serial
15b60 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f _type];. }.}../
15b70 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f *.** If we are o
15b80 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 n an architectur
15b90 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 e with mixed-end
15ba0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a ian floating .**
15bb0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d points (ex: ARM
15bc0 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 7) then swap the
15bd0 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 lower 4 bytes w
15be0 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 ith the .** uppe
15bf0 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 r 4 bytes. Retu
15c00 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a rn the result..*
15c10 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 *.** For most ar
15c20 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 chitectures, thi
15c30 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a s is a no-op..**
15c40 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 .** (later): It
15c50 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 is reported to
15c60 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 me that the mixe
15c70 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d d-endian problem
15c80 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 .** on ARM7 is a
15c90 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 n issue with GCC
15ca0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 , not with the A
15cb0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 RM7 chip. It se
15cc0 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c ems.** that earl
15cd0 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 y versions of GC
15ce0 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f C stored the two
15cf0 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 words of a 64-b
15d00 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 it.** float in t
15d10 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 he wrong order.
15d20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 And that error
15d30 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 has been propaga
15d40 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 ted.** ever sinc
15d50 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 e. The blame is
15d60 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 not necessarily
15d70 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 with GCC, thoug
15d80 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 h..** GCC might
15d90 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e have just copyin
15da0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 g the problem fr
15db0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 om a prior compi
15dc0 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 ler..** I am als
15dd0 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 o told that newe
15de0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 r versions of GC
15df0 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 C that follow a
15e00 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 different.** ABI
15e10 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 get the byte or
15e20 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a der right..**.**
15e30 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e Developers usin
15e40 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 g SQLite on an A
15e50 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 RM7 should compi
15e60 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 le and run their
15e70 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 .** application
15e80 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 using -DSQLITE_D
15e90 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 EBUG=1 at least
15ea0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 once. With DEBU
15eb0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f G.** enabled, so
15ec0 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 me asserts below
15ed0 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 will ensure tha
15ee0 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 t the byte order
15ef0 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 of.** floating
15f00 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 point values is
15f10 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 correct..**.** (
15f20 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 2007-08-30) Fra
15f30 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 nk van Vugt has
15f40 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f studied this pro
15f50 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 blem closely.**
15f60 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 and has send his
15f70 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 findings to the
15f80 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 SQLite develope
15f90 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 rs. Frank.** wr
15fa0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c ites that some L
15fb0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 inux kernels off
15fc0 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e er floating poin
15fd0 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d t hardware.** em
15fe0 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 ulation that use
15ff0 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 s only 32-bit ma
16000 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 ntissas instead
16010 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 of a full .** 48
16020 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 -bits as require
16030 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 d by the IEEE st
16040 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 andard. (This i
16050 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f s the.** CONFIG_
16060 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 FPE_FASTFPE opti
16070 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 on.) On such sy
16080 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 stems, floating
16090 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 point.** byte sw
160a0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 apping becomes v
160b0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e ery complicated.
160c0 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c To avoid probl
160d0 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 ems,.** the nece
160e0 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 ssary byte swapp
160f0 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f ing is carried o
16100 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 ut using a 64-bi
16110 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 t integer.** rat
16120 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 her than a 64-bi
16130 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 t float. Frank
16140 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 assures us that
16150 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a the code here.**
16160 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 works for him.
16170 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 We, the develop
16180 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 ers, have no way
16190 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c to independentl
161a0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 y.** verify this
161b0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d , but Frank seem
161c0 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 s to know what h
161d0 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f e is talking abo
161e0 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 ut.** so we trus
161f0 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 t him..*/.#ifdef
16200 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e SQLITE_MIXED_EN
16210 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 DIAN_64BIT_FLOAT
16220 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 .static u64 floa
16230 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 tSwap(u64 in){.
16240 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 union {. u64
16250 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d r;. u32 i[2]
16260 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 ;. } u;. u32 t
16270 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 ;.. u.r = in;.
16280 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 t = u.i[0];. u
16290 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a .i[0] = u.i[1];.
162a0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 u.i[1] = t;.
162b0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 return u.r;.}.#
162c0 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 define swapMixed
162d0 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 EndianFloat(X)
162e0 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 X = floatSwap(X)
162f0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 .#else.# define
16300 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 swapMixedEndianF
16310 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a loat(X).#endif..
16320 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 /*.** Write the
16330 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 serialized data
16340 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c blob for the val
16350 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 ue stored in pMe
16360 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 m into .** buf.
16370 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 It is assumed th
16380 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 at the caller ha
16390 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 s allocated suff
163a0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a icient space..**
163b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 Return the numb
163c0 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 er of bytes writ
163d0 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 ten..**.** nBuf
163e0 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 is the amount of
163f0 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 space left in b
16400 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 uf[]. The calle
16410 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 r is responsible
16420 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 .** for allocati
16430 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 ng enough space
16440 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 to buf[] to hold
16450 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c the entire fiel
16460 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 d, exclusive.**
16470 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e of the pMem->u.n
16480 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 Zero bytes for a
16490 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e MEM_Zero value.
164a0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 .**.** Return th
164b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 e number of byte
164c0 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 s actually writt
164d0 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 en into buf[].
164e0 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 The number.** of
164f0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 bytes in the ze
16500 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 ro-filled tail i
16510 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 s included in th
16520 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f e return value o
16530 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 nly.** if those
16540 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 bytes were zeroe
16550 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a d in buf[]..*/ .
16560 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 u32 sqlite3VdbeS
16570 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 erialPut(u8 *buf
16580 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 , Mem *pMem, u32
16590 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 serial_type){.
165a0 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 u32 len;.. /*
165b0 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c Integer and Real
165c0 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c */. if( serial
165d0 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 _type<=7 && seri
165e0 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 al_type>0 ){.
165f0 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 u64 v;. u32
16600 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 i;. if( seria
16610 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 l_type==7 ){.
16620 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f assert( sizeo
16630 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 f(v)==sizeof(pMe
16640 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d m->r) );. m
16650 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d emcpy(&v, &pMem-
16660 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a >r, sizeof(v));.
16670 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 swapMixedE
16680 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 ndianFloat(v);.
16690 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
166a0 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 v = pMem->u.i;.
166b0 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 }. len = i
166c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 = sqlite3VdbeSe
166d0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 rialTypeLen(seri
166e0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 al_type);. as
166f0 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 sert( i>0 );.
16700 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d do{. buf[-
16710 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 -i] = (u8)(v&0xF
16720 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 F);. v >>=
16730 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 8;. }while( i
16740 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c );. return l
16750 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 en;. }.. /* St
16760 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a ring or blob */.
16770 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 if( serial_typ
16780 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 e>=12 ){. ass
16790 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 ert( pMem->n + (
167a0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d (pMem->flags & M
167b0 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 EM_Zero)?pMem->u
167c0 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 .nZero:0).
167d0 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 == (int)s
167e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
167f0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 TypeLen(serial_t
16800 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 ype) );. len
16810 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d = pMem->n;. m
16820 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d emcpy(buf, pMem-
16830 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 >z, len);. re
16840 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 turn len;. }..
16850 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 /* NULL or cons
16860 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a tants 0 or 1 */.
16870 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
16880 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 * Input "x" is a
16890 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 sequence of uns
168a0 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 igned characters
168b0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 that represent
168c0 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 a.** big-endian
168d0 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e integer. Return
168e0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 the equivalent
168f0 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a native integer.*
16900 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 /.#define ONE_BY
16910 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 TE_INT(x) ((i
16920 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 8)(x)[0]).#defin
16930 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 e TWO_BYTE_INT(x
16940 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 ) (256*(i8)((
16950 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 x)[0])|(x)[1]).#
16960 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 define THREE_BYT
16970 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 E_INT(x) (65536
16980 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 *(i8)((x)[0])|((
16990 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d x)[1]<<8)|(x)[2]
169a0 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 ).#define FOUR_B
169b0 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 YTE_UINT(x) (((
169c0 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c u32)(x)[0]<<24)|
169d0 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 ((x)[1]<<16)|((x
169e0 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 )[2]<<8)|(x)[3])
169f0 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 .#define FOUR_BY
16a00 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 TE_INT(x) (16777
16a10 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 216*(i8)((x)[0])
16a20 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 |((x)[1]<<16)|((
16a30 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d x)[2]<<8)|(x)[3]
16a40 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 )../*.** Deseria
16a50 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c lize the data bl
16a60 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 ob pointed to by
16a70 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 buf as serial t
16a80 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a ype serial_type.
16a90 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 ** and store the
16aa0 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e result in pMem.
16ab0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d Return the num
16ac0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 ber of bytes rea
16ad0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 d..**.** This fu
16ae0 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d nction is implem
16af0 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 ented as two sep
16b00 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 arate routines f
16b10 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a or performance..
16b20 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73 ** The few cases
16b30 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f that require lo
16b40 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 cal variables ar
16b50 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 e broken out int
16b60 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 o a separate.**
16b70 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 routine so that
16b80 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 in most cases th
16b90 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f e overhead of mo
16ba0 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 ving the stack p
16bb0 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f ointer.** is avo
16bc0 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 ided..*/ .static
16bd0 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e u32 SQLITE_NOIN
16be0 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a LINE serialGet(.
16bf0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
16c00 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 char *buf,
16c10 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 /* Buffer to des
16c20 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f erialize from */
16c30 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 . u32 serial_ty
16c40 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 pe,
16c50 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 /* Serial type
16c60 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a to deserialize *
16c70 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 /. Mem *pMem
16c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16c90 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c /* Memory cell
16ca0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 to write value
16cb0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 into */.){. u64
16cc0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 x = FOUR_BYTE_U
16cd0 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 INT(buf);. u32
16ce0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 y = FOUR_BYTE_UI
16cf0 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d NT(buf+4);. x =
16d00 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 (x<<32) + y;.
16d10 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d if( serial_type=
16d20 3d 36 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e =6 ){. pMem->
16d30 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b u.i = *(i64*)&x;
16d40 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 . pMem->flags
16d50 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
16d60 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e testcase( pMem->
16d70 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 u.i<0 );. }else
16d80 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e {.#if !defined(N
16d90 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e DEBUG) && !defin
16da0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 ed(SQLITE_OMIT_F
16db0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 LOATING_POINT).
16dc0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 /* Verify tha
16dd0 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 t integers and f
16de0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 loating point va
16df0 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d lues use the sam
16e00 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 e. ** byte or
16e10 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 der. Or, that i
16e20 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 f SQLITE_MIXED_E
16e30 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 NDIAN_64BIT_FLOA
16e40 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 T is. ** defi
16e50 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 ned that 64-bit
16e60 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 floating point v
16e70 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 alues really are
16e80 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e mixed. ** en
16e90 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 dian.. */.
16ea0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 static const u6
16eb0 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 4 t1 = ((u64)0x3
16ec0 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 ff00000)<<32;.
16ed0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 static const d
16ee0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a ouble r1 = 1.0;.
16ef0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b u64 t2 = t1;
16f00 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e . swapMixedEn
16f10 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 dianFloat(t2);.
16f20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f assert( sizeo
16f30 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 f(r1)==sizeof(t2
16f40 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c ) && memcmp(&r1,
16f50 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 &t2, sizeof(r1)
16f60 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 )==0 );.#endif.
16f70 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f assert( sizeo
16f80 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f f(x)==8 && sizeo
16f90 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 3b f(pMem->r)==8 );
16fa0 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e . swapMixedEn
16fb0 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 dianFloat(x);.
16fc0 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e memcpy(&pMem->
16fd0 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 r, &x, sizeof(x)
16fe0 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 );. pMem->fla
16ff0 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 gs = sqlite3IsNa
17000 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d N(pMem->r) ? MEM
17010 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c _Null : MEM_Real
17020 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 ;. }. return 8
17030 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 ;.}.u32 sqlite3V
17040 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 dbeSerialGet(.
17050 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
17060 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a har *buf, /*
17070 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 Buffer to deser
17080 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 ialize from */.
17090 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 u32 serial_type
170a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
170b0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f * Serial type to
170c0 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a deserialize */.
170d0 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 Mem *pMem
170e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
170f0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 /* Memory cell t
17100 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e o write value in
17110 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 to */.){. switc
17120 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 h( serial_type )
17130 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 {. case 10:
17140 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 /* Reserved for
17150 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 future use */.
17160 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a case 11: /*
17170 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 Reserved for fu
17180 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 ture use */.
17190 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 case 0: { /* NU
171a0 4c 4c 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d LL */. pMem
171b0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 ->flags = MEM_Nu
171c0 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b ll;. break;
171d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
171e0 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 1: { /* 1-byte s
171f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
17200 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 . pMem->u.i
17210 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 = ONE_BYTE_INT(
17220 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d buf);. pMem
17230 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e ->flags = MEM_In
17240 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 t;. testcas
17250 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 e( pMem->u.i<0 )
17260 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 ;. return 1
17270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
17280 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 2: { /* 2-byte
17290 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a signed integer *
172a0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e /. pMem->u.
172b0 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 i = TWO_BYTE_INT
172c0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 (buf);. pMe
172d0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 m->flags = MEM_I
172e0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 nt;. testca
172f0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 se( pMem->u.i<0
17300 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
17310 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 2;. }. cas
17320 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 e 3: { /* 3-byte
17330 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 signed integer
17340 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 */. pMem->u
17350 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f .i = THREE_BYTE_
17360 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 INT(buf);.
17370 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
17380 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 M_Int;. tes
17390 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 tcase( pMem->u.i
173a0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 <0 );. retu
173b0 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 3;. }.
173c0 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 case 4: { /* 4-b
173d0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
173e0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d er */. pMem
173f0 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 ->u.i = FOUR_BYT
17400 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 E_INT(buf);.
17410 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
17420 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 MEM_Int;. t
17430 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 estcase( pMem->u
17440 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 .i<0 );. re
17450 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 turn 4;. }.
17460 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 case 5: { /* 6
17470 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 -byte signed int
17480 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d eger */. pM
17490 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 em->u.i = FOUR_B
174a0 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 YTE_UINT(buf+2)
174b0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 + (((i64)1)<<32)
174c0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 *TWO_BYTE_INT(bu
174d0 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e f);. pMem->
174e0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
174f0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 . testcase(
17500 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a pMem->u.i<0 );.
17510 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a return 6;.
17520 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 }. case 6
17530 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 : /* 8-byte si
17540 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a gned integer */.
17550 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a case 7: { /*
17560 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 IEEE floating p
17570 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a oint */. /*
17580 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c These use local
17590 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 variables, so d
175a0 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 o them in a sepa
175b0 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 rate routine.
175c0 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 ** to avoid h
175d0 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 aving to move th
175e0 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 e frame pointer
175f0 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 in the common ca
17600 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 se */. retu
17610 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 rn serialGet(buf
17620 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 ,serial_type,pMe
17630 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 m);. }. ca
17640 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 se 8: /* Inte
17650 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 ger 0 */. cas
17660 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 e 9: { /* Integ
17670 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 70 4d er 1 */. pM
17680 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c em->u.i = serial
17690 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 _type-8;. p
176a0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
176b0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 _Int;. retu
176c0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 0;. }.
176d0 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 default: {.
176e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 static const u1
176f0 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 6 aFlag[] = { ME
17700 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d M_Blob|MEM_Ephem
17710 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 , MEM_Str|MEM_Ep
17720 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 hem };. pMe
17730 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 m->z = (char *)b
17740 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e uf;. pMem->
17750 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 n = (serial_type
17760 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d -12)/2;. pM
17770 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 em->flags = aFla
17780 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d g[serial_type&1]
17790 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 ;. return p
177a0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 Mem->n;. }.
177b0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a }. return 0;.}.
177c0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
177d0 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c ne is used to al
177e0 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 6e locate sufficien
177f0 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 t space for an U
17800 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a npackedRecord.**
17810 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 structure large
17820 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 enough to be us
17830 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 ed with sqlite3V
17840 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 dbeRecordUnpack(
17850 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 ) if.** the firs
17860 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 t argument is a
17870 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e pointer to KeyIn
17880 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 fo structure pKe
17890 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 yInfo..**.** The
178a0 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 72 space is either
178b0 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 allocated using
178c0 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 sqlite3DbMalloc
178d0 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 Raw() or from wi
178e0 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c thin.** the unal
178f0 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 igned buffer pas
17900 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 6f sed via the seco
17910 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 nd and third arg
17920 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 uments (presumab
17930 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 ly.** stack spac
17940 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 e). If the forme
17950 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 r, then *ppFree
17960 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e is set to a poin
17970 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a ter that should.
17980 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 ** be eventually
17990 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 freed by the ca
179a0 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 ller using sqlit
179b0 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 e3DbFree(). Or,
179c0 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 if the .** alloc
179d0 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d ation comes from
179e0 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 the pSpace/szSp
179f0 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 ace buffer, *ppF
17a00 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 ree is set to NU
17a10 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 LL.** before ret
17a20 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 urning..**.** If
17a30 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 an OOM error oc
17a40 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 curs, NULL is re
17a50 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 turned..*/.Unpac
17a60 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 kedRecord *sqlit
17a70 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 e3VdbeAllocUnpac
17a80 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 kedRecord(. Key
17a90 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 Info *pKeyInfo,
17aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
17ab0 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 Description of t
17ac0 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 he record */. c
17ad0 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 har *pSpace,
17ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
17af0 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 * Unaligned spac
17b00 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 e available */.
17b10 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 int szSpace,
17b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17b30 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 /* Size of pSpa
17b40 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f ce[] in bytes */
17b50 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 . char **ppFree
17b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17b70 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 /* OUT: Calle
17b80 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 r should free th
17b90 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b is pointer */.){
17ba0 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 . UnpackedRecor
17bb0 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 d *p;
17bc0 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 /* Unpacked r
17bd0 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 ecord to return
17be0 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 */. int nOff;
17bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c00 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e /* Incremen
17c10 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 t pSpace by nOff
17c20 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a to align it */.
17c30 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 int nByte;
17c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 /* Number of b
17c60 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 6f ytes required fo
17c70 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 r *p */.. /* We
17c80 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 want to shift t
17c90 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 he pointer pSpac
17ca0 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 69 e up such that i
17cb0 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 t is 8-byte alig
17cc0 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 ned.. ** Thus,
17cd0 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 we need to calcu
17ce0 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f late a value, nO
17cf0 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e ff, between 0 an
17d00 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 d 7, to shift .
17d10 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 ** it by. If p
17d20 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 Space is already
17d30 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 8-byte aligned,
17d40 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 nOff should be
17d50 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 zero.. */. nOf
17d60 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 f = (8 - (SQLITE
17d70 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 _PTR_TO_INT(pSpa
17d80 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 ce) & 7)) & 7;.
17d90 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 nByte = ROUND8(
17da0 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 sizeof(UnpackedR
17db0 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 ecord)) + sizeof
17dc0 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d (Mem)*(pKeyInfo-
17dd0 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 >nField+1);. if
17de0 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b ( nByte>szSpace+
17df0 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 nOff ){. p =
17e00 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 (UnpackedRecord
17e10 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f *)sqlite3DbMallo
17e20 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 cRaw(pKeyInfo->d
17e30 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a b, nByte);. *
17e40 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a ppFree = (char *
17e50 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 )p;. if( !p )
17e60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c return 0;. }el
17e70 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 se{. p = (Unp
17e80 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 ackedRecord*)&pS
17e90 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 pace[nOff];.
17ea0 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d *ppFree = 0;. }
17eb0 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d .. p->aMem = (M
17ec0 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b em*)&((char*)p)[
17ed0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e ROUND8(sizeof(Un
17ee0 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b packedRecord))];
17ef0 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 . assert( pKeyI
17f00 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 nfo->aSortOrder!
17f10 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 =0 );. p->pKeyI
17f20 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a nfo = pKeyInfo;.
17f30 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b p->nField = pK
17f40 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b eyInfo->nField +
17f50 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 1;. return p;.
17f60 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 }../*.** Given t
17f70 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 he nKey-byte enc
17f80 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 oding of a recor
17f90 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 d in pKey[], pop
17fa0 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e ulate the .** Un
17fb0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 packedRecord str
17fc0 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 ucture indicated
17fd0 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 by the fourth a
17fe0 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 rgument with the
17ff0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 .** contents of
18000 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f the decoded reco
18010 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c rd..*/ .void sql
18020 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e ite3VdbeRecordUn
18030 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 pack(. KeyInfo
18040 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f *pKeyInfo, /
18050 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 * Information ab
18060 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 out the record f
18070 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e ormat */. int n
18080 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 Key,
18090 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 /* Size of the
180a0 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a binary record *
180b0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a /. const void *
180c0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 pKey, /* Th
180d0 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 e binary record
180e0 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 */. UnpackedRec
180f0 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 ord *p /* P
18100 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 opulate this str
18110 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 ucture before re
18120 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 turning. */.){.
18130 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
18140 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f char *aKey = (co
18150 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
18160 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 r *)pKey;. int
18170 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 d; . u32 idx;
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18190 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 /* Offset
181a0 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 in aKey[] to rea
181b0 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 d from */. u16
181c0 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 u;
181d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 /* U
181e0 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 nsigned loop cou
181f0 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a nter */. u32 sz
18200 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d Hdr;. Mem *pMem
18210 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 = p->aMem;.. p
18220 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 ->default_rc = 0
18230 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 ;. assert( EIGH
18240 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 T_BYTE_ALIGNMENT
18250 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 (pMem) );. idx
18260 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b = getVarint32(aK
18270 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 ey, szHdr);. d
18280 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 = szHdr;. u = 0
18290 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 ;. while( idx<s
182a0 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 zHdr && d<=nKey
182b0 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 ){. u32 seria
182c0 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 l_type;.. idx
182d0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 += getVarint32(
182e0 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 &aKey[idx], seri
182f0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d al_type);. pM
18300 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e em->enc = pKeyIn
18310 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 fo->enc;. pMe
18320 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f m->db = pKeyInfo
18330 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 ->db;. /* pMe
18340 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f m->flags = 0; //
18350 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
18360 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 alGet() will set
18370 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a this for us */.
18380 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f pMem->zMallo
18390 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 c = 0;. d +=
183a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
183b0 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 lGet(&aKey[d], s
183c0 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d erial_type, pMem
183d0 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 );. pMem++;.
183e0 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d if( (++u)>=p-
183f0 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b >nField ) break;
18400 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 . }. assert( u
18410 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 <=pKeyInfo->nFie
18420 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e ld + 1 );. p->n
18430 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 Field = u;.}..#i
18440 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f f SQLITE_DEBUG./
18450 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
18460 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 on compares two
18470 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 index or table r
18480 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 ecord keys in th
18490 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 e same way.** as
184a0 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 the sqlite3Vdbe
184b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 RecordCompare()
184c0 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 routine. Unlike
184d0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
184e0 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e e(),.** this fun
184f0 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a ction deserializ
18500 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 es and compares
18510 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 values using the
18520 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 .** sqlite3VdbeS
18530 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 erialGet() and s
18540 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 qlite3MemCompare
18550 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 () functions. It
18560 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 is used.** in a
18570 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e ssert() statemen
18580 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 ts to ensure tha
18590 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 t the optimized
185a0 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 code in.** sqlit
185b0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e3VdbeRecordComp
185c0 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 are() returns re
185d0 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 sults with these
185e0 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e two primitives.
185f0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 .**.** Return tr
18600 75 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 ue if the result
18610 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 of comparison i
18620 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 s equivalent to
18630 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a desiredResult..*
18640 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 * Return false i
18650 66 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73 f there is a dis
18660 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 agreement..*/.st
18670 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 atic int vdbeRec
18680 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 ordCompareDebug(
18690 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f . int nKey1, co
186a0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c nst void *pKey1,
186b0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a /* Left key */.
186c0 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 const Unpacked
186d0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 Record *pPKey2,
186e0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a /* Right key */.
186f0 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 int desiredRes
18700 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 ult
18710 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 /* Correct answe
18720 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 r */.){. u32 d1
18730 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
18740 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 Offset into aKey
18750 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 [] of next data
18760 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 element */. u32
18770 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 idx1;
18780 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 /* Offset into a
18790 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 Key[] of next he
187a0 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a ader element */.
187b0 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 u32 szHdr1;
187c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
187d0 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 f bytes in heade
187e0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 r */. int i = 0
187f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a ;. int rc = 0;.
18800 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
18810 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 char *aKey1 = (
18820 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
18830 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b har *)pKey1;. K
18840 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
18850 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 ;. Mem mem1;..
18860 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 pKeyInfo = pPKe
18870 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 y2->pKeyInfo;.
18880 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 if( pKeyInfo->db
18890 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a ==0 ) return 1;.
188a0 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 mem1.enc = pKe
188b0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 yInfo->enc;. me
188c0 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f m1.db = pKeyInfo
188d0 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e ->db;. /* mem1.
188e0 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 flags = 0; // W
188f0 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a ill be initializ
18900 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 ed by sqlite3Vdb
18910 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a eSerialGet() */.
18920 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 VVA_ONLY( mem1
18930 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 .zMalloc = 0; )
18940 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 /* Only needed b
18950 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 y assert() state
18960 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 ments */.. /* C
18970 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d ompilers may com
18980 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e plain that mem1.
18990 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c u.i is potential
189a0 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 ly uninitialized
189b0 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 .. ** We could
189c0 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 initialize it, a
189d0 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f s shown here, to
189e0 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 silence those c
189f0 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 omplaints.. **
18a00 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d But in fact, mem
18a10 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 1.u.i will never
18a20 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 actually be use
18a30 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c d uninitialized,
18a40 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a and doing . **
18a50 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 the unnecessary
18a60 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
18a70 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 has a measurable
18a80 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 negative perfor
18a90 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 mance. ** impac
18aa0 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f t, since this ro
18ab0 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 utine is a very
18ac0 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e high runner. An
18ad0 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a d so, we choose.
18ae0 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 ** to ignore t
18af0 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e he compiler warn
18b00 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 ings and leave t
18b10 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 his variable uni
18b20 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f nitialized.. */
18b30 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 . /* mem1.u.i
18b40 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 = 0; // not nee
18b50 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c ded, here to sil
18b60 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 ence compiler wa
18b70 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 rning */. . id
18b80 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 x1 = getVarint32
18b90 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b (aKey1, szHdr1);
18ba0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a . d1 = szHdr1;.
18bb0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e assert( pKeyIn
18bc0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 fo->nField+pKeyI
18bd0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 nfo->nXField>=pP
18be0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 Key2->nField ||
18bf0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 CORRUPT_DB );.
18c00 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f assert( pKeyInfo
18c10 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 ->aSortOrder!=0
18c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 );. assert( pKe
18c30 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 yInfo->nField>0
18c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 );. assert( idx
18c50 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 1<=szHdr1 || COR
18c60 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b RUPT_DB );. do{
18c70 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f . u32 serial_
18c80 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 type1;.. /* R
18c90 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 ead the serial t
18ca0 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 ypes for the nex
18cb0 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 t element in eac
18cc0 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 h key. */. id
18cd0 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 x1 += getVarint3
18ce0 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 2( aKey1+idx1, s
18cf0 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a erial_type1 );..
18d00 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
18d10 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 at there is enou
18d20 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d gh key space rem
18d30 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a aining to avoid.
18d40 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 ** a buffer
18d50 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 overread. The "
18d60 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b d1+serial_type1+
18d70 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 2" subexpression
18d80 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 will. ** alw
18d90 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 ays be greater t
18da0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 han or equal to
18db0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 the amount of re
18dc0 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 quired key space
18dd0 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 .. ** Use tha
18de0 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 t approximation
18df0 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 to avoid the mor
18e00 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c e expensive call
18e10 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 to. ** sqlit
18e20 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
18e30 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d Len() in the com
18e40 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f mon case.. */
18e50 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 . if( d1+seri
18e60 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 al_type1+2>(u32)
18e70 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 nKey1. && d1
18e80 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 +sqlite3VdbeSeri
18e90 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c alTypeLen(serial
18ea0 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 _type1)>(u32)nKe
18eb0 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 y1 . ){.
18ec0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
18ed0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 /* Extract th
18ee0 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 e values to be c
18ef0 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a ompared.. */.
18f00 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 d1 += sqlite
18f10 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 3VdbeSerialGet(&
18f20 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 aKey1[d1], seria
18f30 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b l_type1, &mem1);
18f40 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 .. /* Do the
18f50 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a comparison. *
18f60 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 /. rc = sqlit
18f70 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 e3MemCompare(&me
18f80 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 m1, &pPKey2->aMe
18f90 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e m[i], pKeyInfo->
18fa0 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 aColl[i]);. i
18fb0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 f( rc!=0 ){.
18fc0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a assert( mem1.z
18fd0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a Malloc==0 ); /*
18fe0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c See comment bel
18ff0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 ow */. if(
19000 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f pKeyInfo->aSortO
19010 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 rder[i] ){.
19020 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a rc = -rc; /*
19030 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 Invert the resu
19040 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74 lt for DESC sort
19050 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 order. */.
19060 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 }. goto de
19070 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 bugCompareEnd;.
19080 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 }. i++;.
19090 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 }while( idx1<szH
190a0 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d dr1 && i<pPKey2-
190b0 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a >nField );.. /*
190c0 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 No memory alloc
190d0 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 ation is ever us
190e0 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f ed on mem1. Pro
190f0 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 ve this using.
19100 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** the following
19110 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 assert(). If t
19120 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c he assert() fail
19130 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 s, it indicates
19140 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 a. ** memory le
19150 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f ak and a need to
19160 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 call sqlite3Vdb
19170 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d eMemRelease(&mem
19180 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 1).. */. asser
19190 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d t( mem1.zMalloc=
191a0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d =0 );.. /* rc==
191b0 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 0 here means tha
191c0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 t one of the key
191d0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 s ran out of fie
191e0 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c lds and. ** all
191f0 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 the fields up t
19200 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 o that point wer
19210 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 e equal. Return
19220 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 the default_rc.
19230 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 ** value. */.
19240 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 rc = pPKey2->de
19250 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 fault_rc;..debug
19260 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 CompareEnd:. if
19270 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d ( desiredResult=
19280 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 =0 && rc==0 ) re
19290 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 turn 1;. if( de
192a0 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 siredResult<0 &&
192b0 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 rc<0 ) return 1
192c0 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 ;. if( desiredR
192d0 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 esult>0 && rc>0
192e0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 ) return 1;. if
192f0 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 ( CORRUPT_DB ) r
19300 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 eturn 1;. if( p
19310 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c KeyInfo->db->mal
19320 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 locFailed ) retu
19330 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 rn 1;. return 0
19340 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a ;.}.#endif../*.*
19350 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e * Both *pMem1 an
19360 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e d *pMem2 contain
19370 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 string values.
19380 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 Compare the two
19390 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 values.** using
193a0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 the collation se
193b0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 quence pColl. As
193c0 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 usual, return a
193d0 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f negative , zero
193e0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 .** or positive
193f0 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 value if *pMem1
19400 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 is less than, eq
19410 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 ual to or greate
19420 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d r than .** *pMem
19430 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 2, respectively.
19440 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 Similar in spir
19450 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d it to "rc = (*pM
19460 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b em1) - (*pMem2);
19470 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 "..*/.static int
19480 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 vdbeCompareMemS
19490 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d tring(. const M
194a0 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e em *pMem1,. con
194b0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 st Mem *pMem2,.
194c0 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a const CollSeq *
194d0 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 pColl,. u8 *prc
194e0 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 Err
194f0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 /* If a
19500 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 n OOM occurs, se
19510 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 t to SQLITE_NOME
19520 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d M */.){. if( pM
19530 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d em1->enc==pColl-
19540 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 >enc ){. /* T
19550 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 he strings are a
19560 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f lready in the co
19570 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 rrect encoding.
19580 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a Call the. *
19590 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e * comparison fun
195a0 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a ction directly *
195b0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f /. return pCo
195c0 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e ll->xCmp(pColl->
195d0 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 pUser,pMem1->n,p
195e0 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e Mem1->z,pMem2->n
195f0 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 ,pMem2->z);. }e
19600 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b lse{. int rc;
19610 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 . const void
19620 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e *v1, *v2;. in
19630 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 t n1, n2;. Me
19640 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 m c1;. Mem c2
19650 3b 0a 20 20 20 20 63 31 2e 64 62 20 3d 20 63 32 ;. c1.db = c2
19660 2e 64 62 20 3d 20 70 4d 65 6d 31 2d 3e 64 62 3b .db = pMem1->db;
19670 0a 20 20 20 20 63 31 2e 66 6c 61 67 73 20 3d 20 . c1.flags =
19680 63 32 2e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 c2.flags = 0;.
19690 20 20 63 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 63 c1.zMalloc = c
196a0 32 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 2.zMalloc = 0;.
196b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
196c0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 mShallowCopy(&c1
196d0 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 , pMem1, MEM_Eph
196e0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 em);. sqlite3
196f0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f VdbeMemShallowCo
19700 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d py(&c2, pMem2, M
19710 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 EM_Ephem);. v
19720 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 1 = sqlite3Value
19730 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 Text((sqlite3_va
19740 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d lue*)&c1, pColl-
19750 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 >enc);. n1 =
19760 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e v1==0 ? 0 : c1.n
19770 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74 ;. v2 = sqlit
19780 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c e3ValueText((sql
19790 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c ite3_value*)&c2,
197a0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 pColl->enc);.
197b0 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 n2 = v2==0 ? 0
197c0 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 : c2.n;. rc
197d0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 = pColl->xCmp(pC
197e0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 oll->pUser, n1,
197f0 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 v1, n2, v2);.
19800 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 sqlite3VdbeMemR
19810 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 elease(&c1);.
19820 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 sqlite3VdbeMemR
19830 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 elease(&c2);.
19840 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 if( (v1==0 || v
19850 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20 2==0) && prcErr
19860 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 ) *prcErr = SQLI
19870 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 TE_NOMEM;. re
19880 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a turn rc;. }.}..
19890 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 /*.** Compare tw
198a0 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e o blobs. Return
198b0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c negative, zero,
198c0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 or positive if
198d0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 the first.** is
198e0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c less than, equal
198f0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 to, or greater
19900 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c than the second,
19910 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a respectively..*
19920 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 * If one blob is
19930 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 a prefix of the
19940 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 other, then the
19950 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 shorter is the
19960 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 lessor..*/.stati
19970 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e c SQLITE_NOINLIN
19980 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f E int sqlite3Blo
19990 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d bCompare(const M
199a0 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d em *pB1, const M
199b0 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 em *pB2){. int
199c0 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e c = memcmp(pB1->
199d0 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e z, pB2->z, pB1->
199e0 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e n>pB2->n ? pB2->
199f0 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 n : pB1->n);. i
19a00 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b f( c ) return c;
19a10 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e . return pB1->n
19a20 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f - pB2->n;.}.../
19a30 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 *.** Compare the
19a40 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 values containe
19a50 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d d by the two mem
19a60 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 ory cells, retur
19a70 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 ning.** negative
19a80 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 , zero or positi
19a90 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c ve if pMem1 is l
19aa0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 ess than, equal
19ab0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a to, or greater.*
19ac0 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f * than pMem2. So
19ad0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e rting order is N
19ae0 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c ULL's first, fol
19af0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 lowed by numbers
19b00 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e (integers.** an
19b10 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 d reals) sorted
19b20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c numerically, fol
19b30 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 lowed by text or
19b40 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c dered by the col
19b50 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e lating.** sequen
19b60 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e ce pColl and fin
19b70 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 ally blob's orde
19b80 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e red by memcmp().
19b90 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 .**.** Two NULL
19ba0 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 values are consi
19bb0 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 dered equal by t
19bc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f his function..*/
19bd0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 .int sqlite3MemC
19be0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d ompare(const Mem
19bf0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d *pMem1, const M
19c00 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 em *pMem2, const
19c10 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 CollSeq *pColl)
19c20 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a {. int f1, f2;.
19c30 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 int combined_f
19c40 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d lags;.. f1 = pM
19c50 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 em1->flags;. f2
19c60 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b = pMem2->flags;
19c70 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 . combined_flag
19c80 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 s = f1|f2;. ass
19c90 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 ert( (combined_f
19ca0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 lags & MEM_RowSe
19cb0 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 t)==0 );. . /*
19cc0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 If one value is
19cd0 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 NULL, it is less
19ce0 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e than the other.
19cf0 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a If both values.
19d00 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 ** are NULL, r
19d10 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 eturn 0.. */.
19d20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 if( combined_fla
19d30 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 gs&MEM_Null ){.
19d40 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 return (f2&ME
19d50 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 M_Null) - (f1&ME
19d60 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 M_Null);. }..
19d70 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 /* If one value
19d80 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20 is a number and
19d90 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 the other is not
19da0 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20 , the number is
19db0 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f less.. ** If bo
19dc0 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20 th are numbers,
19dd0 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73 compare as reals
19de0 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61 if one is a rea
19df0 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72 l, or as integer
19e00 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76 s. ** if both v
19e10 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67 65 alues are intege
19e20 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 rs.. */. if( c
19e30 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d ombined_flags&(M
19e40 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 EM_Int|MEM_Real)
19e50 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 ){. double r
19e60 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28 1, r2;. if( (
19e70 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e f1 & f2 & MEM_In
19e80 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 t)!=0 ){. i
19e90 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 f( pMem1->u.i <
19ea0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 pMem2->u.i ) ret
19eb0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 urn -1;. if
19ec0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 ( pMem1->u.i > p
19ed0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 Mem2->u.i ) retu
19ee0 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75 rn 1;. retu
19ef0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 0;. }.
19f00 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c if( (f1&MEM_Real
19f10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 )!=0 ){. r1
19f20 20 3d 20 70 4d 65 6d 31 2d 3e 72 3b 0a 20 20 20 = pMem1->r;.
19f30 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31 26 4d }else if( (f1&M
19f40 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 EM_Int)!=0 ){.
19f50 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62 6c 65 r1 = (double
19f60 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20 20 20 )pMem1->u.i;.
19f70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 }else{. re
19f80 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 turn 1;. }.
19f90 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 if( (f2&MEM_Re
19fa0 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 al)!=0 ){.
19fb0 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 72 3b 0a 20 r2 = pMem2->r;.
19fc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 32 }else if( (f2
19fd0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a &MEM_Int)!=0 ){.
19fe0 20 20 20 20 20 20 72 32 20 3d 20 28 64 6f 75 62 r2 = (doub
19ff0 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 le)pMem2->u.i;.
1a000 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1a010 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d return -1;. }
1a020 0a 20 20 20 20 69 66 28 20 72 31 3c 72 32 20 29 . if( r1<r2 )
1a030 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
1a040 69 66 28 20 72 31 3e 72 32 20 29 20 72 65 74 75 if( r1>r2 ) retu
1a050 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e rn 1;. return
1a060 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 0;. }.. /* If
1a070 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 one value is a
1a080 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f string and the o
1a090 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 ther is a blob,
1a0a0 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 the string is le
1a0b0 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 ss.. ** If both
1a0c0 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f are strings, co
1a0d0 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 mpare using the
1a0e0 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 collating functi
1a0f0 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ons.. */. if(
1a100 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d combined_flags&M
1a110 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 EM_Str ){. if
1a120 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 ( (f1 & MEM_Str)
1a130 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 ==0 ){. ret
1a140 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 1;. }.
1a150 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 if( (f2 & MEM_S
1a160 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 tr)==0 ){.
1a170 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d return -1;. }
1a180 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d .. assert( pM
1a190 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d em1->enc==pMem2-
1a1a0 3e 65 6e 63 20 29 3b 0a 20 20 20 20 61 73 73 65 >enc );. asse
1a1b0 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d rt( pMem1->enc==
1a1c0 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a SQLITE_UTF8 || .
1a1d0 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d pMem
1a1e0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 1->enc==SQLITE_U
1a1f0 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d TF16LE || pMem1-
1a200 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 >enc==SQLITE_UTF
1a210 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 16BE );.. /*
1a220 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 The collation se
1a230 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 quence must be d
1a240 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 efined at this p
1a250 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 oint, even if.
1a260 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 ** the user de
1a270 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 letes the collat
1a280 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 ion sequence aft
1a290 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 er the vdbe prog
1a2a0 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f ram is. ** co
1a2b0 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 mpiled (this was
1a2c0 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 not always the
1a2d0 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 case).. */.
1a2e0 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c assert( !pColl
1a2f0 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 || pColl->xCmp
1a300 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c );.. if( pCol
1a310 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 l ){. retur
1a320 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d n vdbeCompareMem
1a330 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d String(pMem1, pM
1a340 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a em2, pColl, 0);.
1a350 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 }. /* If
1a360 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 a NULL pointer w
1a370 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 as passed as the
1a380 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f collate functio
1a390 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a n, fall through.
1a3a0 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c ** to the bl
1a3b0 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 ob case and use
1a3c0 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 memcmp(). */.
1a3d0 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 }. . /* Both va
1a3e0 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f lues must be blo
1a3f0 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 bs. Compare usi
1a400 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f ng memcmp(). */
1a410 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
1a420 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 3BlobCompare(pMe
1a430 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a m1, pMem2);.}...
1a440 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 /*.** The first
1a450 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 argument passed
1a460 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e to this function
1a470 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 is a serial-typ
1a480 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 e that.** corres
1a490 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 ponds to an inte
1a4a0 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 ger - all values
1a4b0 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 between 1 and 9
1a4c0 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 inclusive .** e
1a4d0 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 xcept 7. The sec
1a4e0 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 ond points to a
1a4f0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e buffer containin
1a500 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c g an integer val
1a510 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 ue.** serialized
1a520 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 according to se
1a530 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 rial_type. This
1a540 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 function deseria
1a550 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 lizes.** and ret
1a560 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a urns the value..
1a570 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 */.static i64 vd
1a580 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e beRecordDecodeIn
1a590 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 t(u32 serial_typ
1a5a0 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 e, const u8 *aKe
1a5b0 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 y){. u32 y;. a
1a5c0 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 ssert( CORRUPT_D
1a5d0 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 B || (serial_typ
1a5e0 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 e>=1 && serial_t
1a5f0 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c ype<=9 && serial
1a600 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 _type!=7) );. s
1a610 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 witch( serial_ty
1a620 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 pe ){. case 0
1a630 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 :. case 1:.
1a640 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b testcase( aK
1a650 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 ey[0]&0x80 );.
1a660 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 return ONE_B
1a670 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 YTE_INT(aKey);.
1a680 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 case 2:.
1a690 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b testcase( aKey[
1a6a0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 0]&0x80 );.
1a6b0 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 return TWO_BYTE
1a6c0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 _INT(aKey);.
1a6d0 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 case 3:. te
1a6e0 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 stcase( aKey[0]&
1a6f0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 0x80 );. re
1a700 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f turn THREE_BYTE_
1a710 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 INT(aKey);. c
1a720 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 ase 4: {. t
1a730 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d estcase( aKey[0]
1a740 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 &0x80 );. y
1a750 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e = FOUR_BYTE_UIN
1a760 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 T(aKey);. r
1a770 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 eturn (i64)*(int
1a780 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 *)&y;. }.
1a790 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 case 5: {.
1a7a0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 testcase( aKey[0
1a7b0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 ]&0x80 );.
1a7c0 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 return FOUR_BYTE
1a7d0 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 _UINT(aKey+2) +
1a7e0 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 (((i64)1)<<32)*T
1a7f0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 WO_BYTE_INT(aKey
1a800 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 );. }. cas
1a810 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 e 6: {. u64
1a820 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 x = FOUR_BYTE_U
1a830 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 INT(aKey);.
1a840 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b testcase( aKey[
1a850 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 0]&0x80 );.
1a860 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 x = (x<<32) | F
1a870 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b OUR_BYTE_UINT(aK
1a880 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 ey+4);. ret
1a890 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 urn (i64)*(i64*)
1a8a0 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 &x;. }. }..
1a8b0 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f return (serial_
1a8c0 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a type - 8);.}../*
1a8d0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
1a8e0 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 n compares the t
1a8f0 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 wo table rows or
1a900 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a index records.*
1a910 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b * specified by {
1a920 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e nKey1, pKey1} an
1a930 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 d pPKey2. It re
1a940 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 turns a negative
1a950 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 , zero.** or pos
1a960 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 itive integer if
1a970 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 key1 is less th
1a980 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 an, equal to or
1a990 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e .** greater than
1a9a0 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 key2. The {nKe
1a9b0 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d y1, pKey1} key m
1a9c0 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a ust be a blob.**
1a9d0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 created by the
1a9e0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 OP_MakeRecord op
1a9f0 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 code of the VDBE
1aa00 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a . The pPKey2.**
1aa10 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 key must be a p
1aa20 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 arsed key such a
1aa30 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a s obtained from.
1aa40 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 ** sqlite3VdbePa
1aa50 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a rseRecord..**.**
1aa60 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b If argument bSk
1aa70 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 ip is non-zero,
1aa80 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 it is assumed th
1aa90 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 at the caller ha
1aaa0 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 s already.** det
1aab0 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 ermined that the
1aac0 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 first fields of
1aad0 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 the keys are eq
1aae0 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 ual..**.** Key1
1aaf0 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 and Key2 do not
1ab00 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 have to contain
1ab10 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 the same number
1ab20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c of fields. If al
1ab30 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 l .** fields tha
1ab40 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 t appear in both
1ab50 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c keys are equal,
1ab60 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 then pPKey2->de
1ab70 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 fault_rc is .**
1ab80 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 returned..**.**
1ab90 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 If database corr
1aba0 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 uption is discov
1abb0 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 ered, set pPKey2
1abc0 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a ->errCode to .**
1abd0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 SQLITE_CORRUPT
1abe0 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 and return 0. If
1abf0 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 an OOM error is
1ac00 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a encountered, .*
1ac10 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 * pPKey2->errCod
1ac20 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 e is set to SQLI
1ac30 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 TE_NOMEM and, if
1ac40 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c it is not NULL,
1ac50 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 the.** malloc-f
1ac60 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f ailed flag set o
1ac70 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c n database handl
1ac80 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 e (pPKey2->pKeyI
1ac90 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 73 74 61 nfo->db)..*/.sta
1aca0 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f tic int vdbeReco
1acb0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 rdCompareWithSki
1acc0 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 p(. int nKey1,
1acd0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
1ace0 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 1, /* Left key
1acf0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 */. UnpackedRe
1ad00 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 cord *pPKey2,
1ad10 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b /* Right k
1ad20 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 ey */. int bSki
1ad30 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p
1ad40 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 /* If tr
1ad50 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 ue, skip the fir
1ad60 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 st field */.){.
1ad70 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 u32 d1;
1ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ad90 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 /* Offset into
1ada0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 aKey[] of next d
1adb0 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 ata element */.
1adc0 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 int i;
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ade0 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 /* Index of nex
1adf0 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 t field to compa
1ae00 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 re */. u32 szHd
1ae10 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 r1;
1ae20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 /* Size
1ae30 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 of record header
1ae40 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 in bytes */. u
1ae50 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 32 idx1;
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1ae70 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 * Offset of firs
1ae80 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 t type in header
1ae90 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 */. int rc = 0
1aea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1aeb0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 /* Return
1aec0 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a value */. Mem *
1aed0 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 pRhs = pPKey2->a
1aee0 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 Mem; /* Ne
1aef0 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 xt field of pPKe
1af00 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f y2 to compare */
1af10 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 . KeyInfo *pKey
1af20 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 Info = pPKey2->p
1af30 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 KeyInfo;. const
1af40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1af50 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 aKey1 = (const u
1af60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 nsigned char *)p
1af70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 Key1;. Mem mem1
1af80 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 ;.. /* If bSkip
1af90 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 is true, then t
1afa0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c he caller has al
1afb0 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 ready determined
1afc0 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a that the first.
1afd0 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 ** two element
1afe0 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 s in the keys ar
1aff0 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 e equal. Fix the
1b000 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 various stack v
1b010 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a ariables so. **
1b020 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 that this routi
1b030 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 ne begins compar
1b040 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e ing at the secon
1b050 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 d field. */. if
1b060 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 ( bSkip ){. u
1b070 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 32 s1;. idx1
1b080 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 = 1 + getVarint3
1b090 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 2(&aKey1[1], s1)
1b0a0 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 ;. szHdr1 = a
1b0b0 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 Key1[0];. d1
1b0c0 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 = szHdr1 + sqlit
1b0d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
1b0e0 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d Len(s1);. i =
1b0f0 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 1;. pRhs++;.
1b100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 }else{. idx
1b110 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 1 = getVarint32(
1b120 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a aKey1, szHdr1);.
1b130 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b d1 = szHdr1;
1b140 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 . if( d1>(uns
1b150 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a igned)nKey1 ){ .
1b160 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 pPKey2->er
1b170 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 rCode = (u8)SQLI
1b180 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
1b190 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b . return 0;
1b1a0 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 /* Corruption
1b1b0 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d */. }. i =
1b1c0 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 0;. }.. VVA_O
1b1d0 4e 4c 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f NLY( mem1.zMallo
1b1e0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 c = 0; ) /* Only
1b1f0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72 needed by asser
1b200 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a t() statements *
1b210 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 /. assert( pPKe
1b220 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 y2->pKeyInfo->nF
1b230 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 ield+pPKey2->pKe
1b240 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d yInfo->nXField>=
1b250 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a pPKey2->nField .
1b260 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 || CORRUP
1b270 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 T_DB );. assert
1b280 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e ( pPKey2->pKeyIn
1b290 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d fo->aSortOrder!=
1b2a0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
1b2b0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1b2c0 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 >nField>0 );. a
1b2d0 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 ssert( idx1<=szH
1b2e0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 dr1 || CORRUPT_D
1b2f0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 B );. do{. u
1b300 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 32 serial_type;.
1b310 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 . /* RHS is a
1b320 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 n integer */.
1b330 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 if( pRhs->flags
1b340 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 & MEM_Int ){.
1b350 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 serial_type
1b360 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 = aKey1[idx1];.
1b370 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 testcase( s
1b380 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 erial_type==12 )
1b390 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 ;. if( seri
1b3a0 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 al_type>=12 ){.
1b3b0 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a rc = +1;.
1b3c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
1b3d0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 serial_type==0 )
1b3e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d {. rc = -
1b3f0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 1;. }else i
1b400 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d f( serial_type==
1b410 37 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 7 ){. dou
1b420 62 6c 65 20 72 68 73 20 3d 20 28 64 6f 75 62 6c ble rhs = (doubl
1b430 65 29 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 e)pRhs->u.i;.
1b440 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 sqlite3Vdbe
1b450 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 SerialGet(&aKey1
1b460 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 [d1], serial_typ
1b470 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 e, &mem1);.
1b480 20 20 20 69 66 28 20 6d 65 6d 31 2e 72 3c 72 68 if( mem1.r<rh
1b490 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 s ){. r
1b4a0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 c = -1;.
1b4b0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 72 }else if( mem1.r
1b4c0 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 >rhs ){.
1b4d0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 rc = +1;.
1b4e0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 }. }else
1b4f0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 {. i64 lh
1b500 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 s = vdbeRecordDe
1b510 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 codeInt(serial_t
1b520 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 ype, &aKey1[d1])
1b530 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 ;. i64 rh
1b540 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 s = pRhs->u.i;.
1b550 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 if( lhs<r
1b560 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 hs ){.
1b570 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 rc = -1;.
1b580 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 }else if( lhs>r
1b590 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 hs ){.
1b5a0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 rc = +1;.
1b5b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
1b5c0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 .. /* RHS is
1b5d0 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 real */. else
1b5e0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 if( pRhs->flags
1b5f0 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 & MEM_Real ){.
1b600 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 serial_type
1b610 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a = aKey1[idx1];.
1b620 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c if( serial
1b630 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 _type>=12 ){.
1b640 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 rc = +1;.
1b650 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 }else if( se
1b660 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a rial_type==0 ){.
1b670 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b rc = -1;
1b680 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
1b690 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 73 double rhs
1b6a0 20 3d 20 70 52 68 73 2d 3e 72 3b 0a 20 20 20 20 = pRhs->r;.
1b6b0 20 20 20 20 64 6f 75 62 6c 65 20 6c 68 73 3b 0a double lhs;.
1b6c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
1b6d0 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b dbeSerialGet(&aK
1b6e0 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f ey1[d1], serial_
1b6f0 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 type, &mem1);.
1b700 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c if( serial
1b710 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 _type==7 ){.
1b720 20 20 20 20 20 20 6c 68 73 20 3d 20 6d 65 6d 31 lhs = mem1
1b730 2e 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 .r;. }els
1b740 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 68 73 e{. lhs
1b750 20 3d 20 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e = (double)mem1.
1b760 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 u.i;. }.
1b770 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 if( lhs<r
1b780 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 hs ){.
1b790 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 rc = -1;.
1b7a0 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 }else if( lhs>r
1b7b0 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 hs ){.
1b7c0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 rc = +1;.
1b7d0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
1b7e0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 .. /* RHS is
1b7f0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 a string */.
1b800 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 else if( pRhs->f
1b810 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 lags & MEM_Str )
1b820 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e {. getVarin
1b830 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d t32(&aKey1[idx1]
1b840 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a , serial_type);.
1b850 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1b860 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 serial_type==12
1b870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 );. if( ser
1b880 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 ial_type<12 ){.
1b890 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a rc = -1;.
1b8a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
1b8b0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 !(serial_type &
1b8c0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 0x01) ){.
1b8d0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 rc = +1;.
1b8e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d }else{. m
1b8f0 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f em1.n = (serial_
1b900 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a type - 12) / 2;.
1b910 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
1b920 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 ( (d1+mem1.n)==(
1b930 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 unsigned)nKey1 )
1b940 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1b950 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 se( (d1+mem1.n+1
1b960 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 )==(unsigned)nKe
1b970 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 y1 );. if
1b980 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 ( (d1+mem1.n) >
1b990 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 (unsigned)nKey1
1b9a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b ){. pPK
1b9b0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 ey2->errCode = (
1b9c0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 u8)SQLITE_CORRUP
1b9d0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 T_BKPT;.
1b9e0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 return 0;
1b9f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
1ba00 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 rruption */.
1ba10 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b }else if( pK
1ba20 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d eyInfo->aColl[i]
1ba30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 ){. me
1ba40 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 m1.enc = pKeyInf
1ba50 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 o->enc;.
1ba60 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 mem1.db = pKey
1ba70 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 Info->db;.
1ba80 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d mem1.flags =
1ba90 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 MEM_Str;.
1baa0 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 mem1.z = (ch
1bab0 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a ar*)&aKey1[d1];.
1bac0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 rc = v
1bad0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 dbeCompareMemStr
1bae0 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 ing(.
1baf0 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 &mem1, pRhs,
1bb00 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b pKeyInfo->aColl[
1bb10 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 i], &pPKey2->err
1bb20 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 Code. )
1bb30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
1bb40 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e . int n
1bb50 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e Cmp = MIN(mem1.n
1bb60 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 , pRhs->n);.
1bb70 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d rc = memcm
1bb80 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 p(&aKey1[d1], pR
1bb90 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 hs->z, nCmp);.
1bba0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
1bbb0 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 0 ) rc = mem1.n
1bbc0 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 - pRhs->n; .
1bbd0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
1bbe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 }.. /* RHS
1bbf0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 is a blob */.
1bc00 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e else if( pRhs->
1bc10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 flags & MEM_Blob
1bc20 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 ){. getVar
1bc30 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 int32(&aKey1[idx
1bc40 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 1], serial_type)
1bc50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
1bc60 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 ( serial_type==1
1bc70 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 2 );. if( s
1bc80 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c erial_type<12 ||
1bc90 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 (serial_type &
1bca0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 0x01) ){.
1bcb0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 rc = -1;.
1bcc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 }else{. i
1bcd0 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 nt nStr = (seria
1bce0 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 l_type - 12) / 2
1bcf0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1bd00 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 se( (d1+nStr)==(
1bd10 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 unsigned)nKey1 )
1bd20 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1bd30 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d se( (d1+nStr+1)=
1bd40 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 =(unsigned)nKey1
1bd50 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 );. if(
1bd60 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 (d1+nStr) > (uns
1bd70 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 igned)nKey1 ){.
1bd80 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d pPKey2-
1bd90 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 >errCode = (u8)S
1bda0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1bdb0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 PT;. re
1bdc0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 turn 0;
1bdd0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 /* Corrup
1bde0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 tion */.
1bdf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
1be00 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 int nCmp = MIN(
1be10 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a nStr, pRhs->n);.
1be20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d rc = m
1be30 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d emcmp(&aKey1[d1]
1be40 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 , pRhs->z, nCmp)
1be50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 ;. if(
1be60 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 rc==0 ) rc = nSt
1be70 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 r - pRhs->n;.
1be80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
1be90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 }.. /* RHS
1bea0 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 is null */.
1beb0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 else{. seri
1bec0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b al_type = aKey1[
1bed0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 idx1];. rc
1bee0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d = (serial_type!=
1bef0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 0);. }.. i
1bf00 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 f( rc!=0 ){.
1bf10 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e if( pKeyInfo->
1bf20 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b aSortOrder[i] ){
1bf30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 . rc = -r
1bf40 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 c;. }.
1bf50 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 assert( vdbeRec
1bf60 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 ordCompareDebug(
1bf70 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
1bf80 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 Key2, rc) );.
1bf90 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e assert( mem1.
1bfa0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f zMalloc==0 ); /
1bfb0 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 * See comment be
1bfc0 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 low */. ret
1bfd0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 urn rc;. }..
1bfe0 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 i++;. pRhs
1bff0 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 ++;. d1 += sq
1c000 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
1c010 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 ypeLen(serial_ty
1c020 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d pe);. idx1 +=
1c030 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 sqlite3VarintLe
1c040 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a n(serial_type);.
1c050 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 }while( idx1<(
1c060 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 unsigned)szHdr1
1c070 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 && i<pPKey2->nFi
1c080 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 eld && d1<=(unsi
1c090 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 gned)nKey1 );..
1c0a0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c /* No memory al
1c0b0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 location is ever
1c0c0 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 used on mem1.
1c0d0 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 Prove this using
1c0e0 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 . ** the follow
1c0f0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 ing assert(). I
1c100 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 f the assert() f
1c110 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 ails, it indicat
1c120 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 es a. ** memory
1c130 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 leak and a need
1c140 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 to call sqlite3
1c150 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 VdbeMemRelease(&
1c160 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 mem1). */. ass
1c170 65 72 74 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f ert( mem1.zMallo
1c180 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 c==0 );.. /* rc
1c190 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 ==0 here means t
1c1a0 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 hat one or both
1c1b0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 of the keys ran
1c1c0 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e out of fields an
1c1d0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 d. ** all the f
1c1e0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 ields up to that
1c1f0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 point were equa
1c200 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 l. Return the de
1c210 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 fault_rc. ** va
1c220 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 lue. */. asser
1c230 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 t( CORRUPT_DB .
1c240 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 || vdbeRec
1c250 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 ordCompareDebug(
1c260 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
1c270 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 Key2, pPKey2->de
1c280 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 fault_rc) .
1c290 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 || pKeyInfo->d
1c2a0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a b->mallocFailed.
1c2b0 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 );. return pP
1c2c0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 Key2->default_rc
1c2d0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 ;.}.int sqlite3V
1c2e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1c2f0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 (. int nKey1, c
1c300 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 onst void *pKey1
1c310 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 , /* Left key
1c320 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 */. UnpackedRec
1c330 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 ord *pPKey2
1c340 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 /* Right ke
1c350 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e y */.){. return
1c360 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 vdbeRecordCompa
1c370 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 reWithSkip(nKey1
1c380 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c , pKey1, pPKey2,
1c390 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 0);.}.../*.** T
1c3a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
1c3b0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 an optimized ver
1c3c0 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 sion of sqlite3V
1c3d0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1c3e0 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 () .** that (a)
1c3f0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 the first field
1c400 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 of pPKey2 is an
1c410 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 integer, and (b)
1c420 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 the .** size-of
1c430 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 -header varint a
1c440 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 t the start of (
1c450 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 pKey1/nKey1) fit
1c460 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a s in a single.**
1c470 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c byte (i.e. is l
1c480 65 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a ess than 128)..*
1c490 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f *.** To avoid co
1c4a0 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 ncerns about buf
1c4b0 66 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 fer overreads, t
1c4c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f his routine is o
1c4d0 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 nly used.** on s
1c4e0 63 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 chemas where the
1c4f0 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 maximum valid h
1c500 65 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 eader size is 63
1c510 20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a bytes or less..
1c520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 */.static int vd
1c530 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 beRecordCompareI
1c540 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c nt(. int nKey1,
1c550 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 const void *pKe
1c560 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 y1, /* Left key
1c570 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 */. UnpackedRec
1c580 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 ord *pPKey2
1c590 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 /* Right key
1c5a0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 */.){. const u8
1c5b0 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 *aKey = &((cons
1c5c0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 t u8*)pKey1)[*(c
1c5d0 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 onst u8*)pKey1 &
1c5e0 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 0x3F];. int se
1c5f0 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f rial_type = ((co
1c600 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 nst u8*)pKey1)[1
1c610 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 ];. int res;.
1c620 75 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a u32 y;. u64 x;.
1c630 20 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 i64 v = pPKey2
1c640 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 ->aMem[0].u.i;.
1c650 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 61 73 73 i64 lhs;.. ass
1c660 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 ert( (*(u8*)pKey
1c670 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 1)<=0x3F || CORR
1c680 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 UPT_DB );. swit
1c690 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 ch( serial_type
1c6a0 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b ){. case 1: {
1c6b0 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 /* 1-byte signe
1c6c0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 d integer */.
1c6d0 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 lhs = ONE_BYT
1c6e0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 E_INT(aKey);.
1c6f0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 testcase( lhs
1c700 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 <0 );. brea
1c710 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
1c720 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 e 2: { /* 2-byte
1c730 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 signed integer
1c740 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 */. lhs = T
1c750 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 WO_BYTE_INT(aKey
1c760 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 );. testcas
1c770 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 e( lhs<0 );.
1c780 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
1c790 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 case 3: { /*
1c7a0 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 3-byte signed in
1c7b0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c teger */. l
1c7c0 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f hs = THREE_BYTE_
1c7d0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 INT(aKey);.
1c7e0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 testcase( lhs<0
1c7f0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b );. break;
1c800 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
1c810 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 4: { /* 4-byte s
1c820 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
1c830 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f . y = FOUR_
1c840 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b BYTE_UINT(aKey);
1c850 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 . lhs = (i6
1c860 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 4)*(int*)&y;.
1c870 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 testcase( lhs
1c880 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 <0 );. brea
1c890 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
1c8a0 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 e 5: { /* 6-byte
1c8b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 signed integer
1c8c0 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 */. lhs = F
1c8d0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b OUR_BYTE_UINT(aK
1c8e0 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 ey+2) + (((i64)1
1c8f0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f )<<32)*TWO_BYTE_
1c900 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 INT(aKey);.
1c910 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 testcase( lhs<0
1c920 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b );. break;
1c930 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
1c940 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 6: { /* 8-byte s
1c950 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
1c960 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f . x = FOUR_
1c970 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b BYTE_UINT(aKey);
1c980 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 . x = (x<<3
1c990 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 2) | FOUR_BYTE_U
1c9a0 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 INT(aKey+4);.
1c9b0 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 lhs = *(i64*)
1c9c0 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 &x;. testca
1c9d0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 se( lhs<0 );.
1c9e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
1c9f0 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 case 8: .
1ca00 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 lhs = 0;.
1ca10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
1ca20 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d e 9:. lhs =
1ca30 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 1;. break;
1ca40 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 .. /* This ca
1ca50 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f se could be remo
1ca60 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e ved without chan
1ca70 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 ging the results
1ca80 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 of running.
1ca90 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e ** this code. In
1caa0 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 cluding it cause
1cab0 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 s gcc to generat
1cac0 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 e a faster switc
1cad0 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d h . ** statem
1cae0 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 ent (since the r
1caf0 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 ange of switch t
1cb00 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 argets now start
1cb10 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 s at zero and.
1cb20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f ** is contiguo
1cb30 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 us) but does not
1cb40 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 cause any dupli
1cb50 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 cate code to be
1cb60 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a generated. **
1cb70 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 (as gcc is clev
1cb80 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d er enough to com
1cb90 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b bine the two lik
1cba0 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 e cases). Other
1cbb0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 . ** compiler
1cbc0 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c s might be simil
1cbd0 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 ar. */ . cas
1cbe0 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 e 0: case 7:.
1cbf0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 return sqlite
1cc00 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 3VdbeRecordCompa
1cc10 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c re(nKey1, pKey1,
1cc20 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 pPKey2);.. d
1cc30 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 efault:. re
1cc40 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 turn sqlite3Vdbe
1cc50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b RecordCompare(nK
1cc60 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 ey1, pKey1, pPKe
1cc70 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 y2);. }.. if(
1cc80 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 v>lhs ){. res
1cc90 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 = pPKey2->r1;.
1cca0 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 }else if( v<lhs
1ccb0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 ){. res = pP
1ccc0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 Key2->r2;. }els
1ccd0 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 e if( pPKey2->nF
1cce0 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a ield>1 ){. /*
1ccf0 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 The first field
1cd00 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 s of the two key
1cd10 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d s are equal. Com
1cd20 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e pare the trailin
1cd30 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 g . ** fields
1cd40 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 . */. res =
1cd50 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 vdbeRecordCompar
1cd60 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c eWithSkip(nKey1,
1cd70 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 pKey1, pPKey2,
1cd80 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 1);. }else{.
1cd90 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 /* The first fi
1cda0 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 elds of the two
1cdb0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 keys are equal a
1cdc0 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 nd there are no
1cdd0 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 trailing. **
1cde0 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 fields. Return p
1cdf0 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 PKey2->default_r
1ce00 63 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 c in this case.
1ce10 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b */. res = pPK
1ce20 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b ey2->default_rc;
1ce30 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 . }.. assert(
1ce40 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 vdbeRecordCompar
1ce50 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b eDebug(nKey1, pK
1ce60 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 ey1, pPKey2, res
1ce70 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 ) );. return re
1ce80 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 s;.}../*.** This
1ce90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 function is an
1cea0 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f optimized versio
1ceb0 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 n of sqlite3Vdbe
1cec0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 RecordCompare()
1ced0 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 .** that (a) the
1cee0 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 first field of
1cef0 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 pPKey2 is a stri
1cf00 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 ng, that (b) the
1cf10 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 first field.**
1cf20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 uses the collati
1cf30 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 on sequence BINA
1cf40 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 RY and (c) that
1cf50 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 the size-of-head
1cf60 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 er varint .** at
1cf70 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 the start of (p
1cf80 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 Key1/nKey1) fits
1cf90 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 in a single byt
1cfa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
1cfb0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 vdbeRecordCompa
1cfc0 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 reString(. int
1cfd0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 nKey1, const voi
1cfe0 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 d *pKey1, /* Lef
1cff0 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 t key */. Unpac
1d000 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 kedRecord *pPKey
1d010 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 2 /* Righ
1d020 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f t key */.){. co
1d030 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 nst u8 *aKey1 =
1d040 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 (const u8*)pKey1
1d050 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 ;. int serial_t
1d060 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a ype;. int res;.
1d070 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 . getVarint32(&
1d080 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c aKey1[1], serial
1d090 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 _type);. if( se
1d0a0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a rial_type<12 ){.
1d0b0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 res = pPKey2
1d0c0 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 ->r1; /* (p
1d0d0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 Key1/nKey1) is a
1d0e0 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c number or a nul
1d0f0 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 l */. }else if(
1d100 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 !(serial_type &
1d110 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 0x01) ){ . r
1d120 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b es = pPKey2->r2;
1d130 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f /* (pKey1/
1d140 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 nKey1) is a blob
1d150 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 */. }else{.
1d160 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 int nCmp;. i
1d170 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 nt nStr;. int
1d180 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 szHdr = aKey1[0
1d190 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 ];.. nStr = (
1d1a0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 serial_type-12)
1d1b0 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a / 2;. if( (sz
1d1c0 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b Hdr + nStr) > nK
1d1d0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b ey1 ){. pPK
1d1e0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 ey2->errCode = (
1d1f0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 u8)SQLITE_CORRUP
1d200 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 T_BKPT;. re
1d210 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f turn 0; /* Co
1d220 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 rruption */.
1d230 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e }. nCmp = MIN
1d240 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 ( pPKey2->aMem[0
1d250 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 ].n, nStr );.
1d260 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 res = memcmp(&a
1d270 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b Key1[szHdr], pPK
1d280 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 ey2->aMem[0].z,
1d290 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 nCmp);.. if(
1d2a0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 res==0 ){.
1d2b0 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b res = nStr - pPK
1d2c0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a ey2->aMem[0].n;.
1d2d0 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 if( res==0
1d2e0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
1d2f0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 pPKey2->nField>1
1d300 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 ){. re
1d310 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43 6f s = vdbeRecordCo
1d320 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b mpareWithSkip(nK
1d330 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 ey1, pKey1, pPKe
1d340 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 y2, 1);.
1d350 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
1d360 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 res = pPKey2->d
1d370 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 efault_rc;.
1d380 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 }. }else
1d390 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 if( res>0 ){.
1d3a0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 res = pPKe
1d3b0 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 y2->r2;. }e
1d3c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 lse{. res
1d3d0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 = pPKey2->r1;.
1d3e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 }. }else
1d3f0 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 if( res>0 ){.
1d400 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 res = pPKey2
1d410 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b ->r2;. }else{
1d420 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b . res = pPK
1d430 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 ey2->r1;. }.
1d440 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 }.. assert( vd
1d450 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 beRecordCompareD
1d460 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 ebug(nKey1, pKey
1d470 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 1, pPKey2, res).
1d480 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 || CORRUP
1d490 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 T_DB. || p
1d4a0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1d4b0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
1d4c0 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 d. );. return
1d4d0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 res;.}../*.** Re
1d4e0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 turn a pointer t
1d4f0 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 o an sqlite3Vdbe
1d500 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 RecordCompare()
1d510 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 compatible funct
1d520 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 ion.** suitable
1d530 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 for comparing se
1d540 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 rialized records
1d550 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 to the unpacked
1d560 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a record passed.*
1d570 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 * as the only ar
1d580 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 gument..*/.Recor
1d590 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 dCompare sqlite3
1d5a0 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 VdbeFindCompare(
1d5b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a UnpackedRecord *
1d5c0 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 p){. /* varintR
1d5d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 ecordCompareInt(
1d5e0 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f ) and varintReco
1d5f0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 rdCompareString(
1d600 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 ) both assume.
1d610 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 ** that the size
1d620 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e -of-header varin
1d630 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 t that occurs at
1d640 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 the start of ea
1d650 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 ch record. ** f
1d660 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 its in a single
1d670 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 byte (i.e. is 12
1d680 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 7 or less). vari
1d690 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 ntRecordCompareI
1d6a0 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 nt(). ** also a
1d6b0 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 ssumes that it i
1d6c0 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 s safe to overre
1d6d0 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 ad a buffer by a
1d6e0 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a t least the . *
1d6f0 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 * maximum possib
1d700 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 le legal header
1d710 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 size plus 8 byte
1d720 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 s. Because there
1d730 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 is. ** guarant
1d740 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 eed to be at lea
1d750 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 st 74 (but not 1
1d760 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 36) bytes of pad
1d770 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 ding following e
1d780 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 ach. ** buffer
1d790 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 passed to varint
1d7a0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 RecordCompareInt
1d7b0 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 () this makes it
1d7c0 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 convenient to.
1d7d0 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 ** limit the si
1d7e0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 ze of the header
1d7f0 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 to 64 bytes in
1d800 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 cases where the
1d810 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a first field. **
1d820 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a is an integer..
1d830 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 **. ** The ea
1d840 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 siest way to enf
1d850 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 orce this limit
1d860 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f is to consider o
1d870 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 nly records with
1d880 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 . ** 13 fields
1d890 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 or less. If the
1d8a0 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 first field is a
1d8b0 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d n integer, the m
1d8c0 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a aximum legal. *
1d8d0 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 * header size is
1d8e0 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 (12*5 + 1 + 1)
1d8f0 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 bytes. */. if(
1d900 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e (p->pKeyInfo->n
1d910 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 Field + p->pKeyI
1d920 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 nfo->nXField)<=1
1d930 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 3 ){. int fla
1d940 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e gs = p->aMem[0].
1d950 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 flags;. if( p
1d960 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 ->pKeyInfo->aSor
1d970 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 tOrder[0] ){.
1d980 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 p->r1 = 1;.
1d990 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a p->r2 = -1;.
1d9a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1d9b0 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 p->r1 = -1;.
1d9c0 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 p->r2 = 1;.
1d9d0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 }. if( (fla
1d9e0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b gs & MEM_Int) ){
1d9f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 . return vd
1da00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 beRecordCompareI
1da10 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 nt;. }. te
1da20 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 stcase( flags &
1da30 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 MEM_Real );.
1da40 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 testcase( flags
1da50 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 & MEM_Null );.
1da60 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 testcase( flag
1da70 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a s & MEM_Blob );.
1da80 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 if( (flags &
1da90 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e (MEM_Real|MEM_N
1daa0 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d ull|MEM_Blob))==
1dab0 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 0 && p->pKeyInfo
1dac0 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b ->aColl[0]==0 ){
1dad0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 . assert( f
1dae0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 lags & MEM_Str )
1daf0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 ;. return v
1db00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1db10 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 String;. }.
1db20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 }.. return sqli
1db30 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d te3VdbeRecordCom
1db40 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 pare;.}../*.** p
1db50 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e Cur points at an
1db60 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 index entry cre
1db70 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f ated using the O
1db80 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 P_MakeRecord opc
1db90 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 ode..** Read the
1dba0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 rowid (the last
1dbb0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 field in the re
1dbc0 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 cord) and store
1dbd0 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a it in *rowid..**
1dbe0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f Return SQLITE_O
1dbf0 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 K if everything
1dc00 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 works, or an err
1dc10 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 or code otherwis
1dc20 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 e..**.** pCur mi
1dc30 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 ght be pointing
1dc40 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 to text obtained
1dc50 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 from a corrupt
1dc60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a database file..*
1dc70 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 * So the content
1dc80 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 cannot be trust
1dc90 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 ed. Do appropri
1dca0 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 ate checks on th
1dcb0 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e e content..*/.in
1dcc0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 t sqlite3VdbeIdx
1dcd0 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 Rowid(sqlite3 *d
1dce0 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 b, BtCursor *pCu
1dcf0 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a r, i64 *rowid){.
1dd00 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d i64 nCellKey =
1dd10 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0;. int rc;.
1dd20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 u32 szHdr;
1dd30 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 /* Size of the
1dd40 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 header */. u32
1dd50 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f typeRowid; /
1dd60 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 * Serial type of
1dd70 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 the rowid */.
1dd80 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 u32 lenRowid;
1dd90 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 /* Size of the
1dda0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 rowid */. Mem
1ddb0 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 m, v;.. /* Get
1ddc0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 the size of the
1ddd0 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e index entry. On
1dde0 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 ly indices entri
1ddf0 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 es of less. **
1de00 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 than 2GiB are su
1de10 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 pport - anything
1de20 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 large must be d
1de30 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 atabase corrupti
1de40 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 on.. ** Any cor
1de50 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 ruption is detec
1de60 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 ted in sqlite3Bt
1de70 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 reeParseCellPtr(
1de80 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 ), though, so.
1de90 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e ** this code can
1dea0 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 safely assume t
1deb0 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 hat nCellKey is
1dec0 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 32-bits . */.
1ded0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 assert( sqlite3
1dee0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c BtreeCursorIsVal
1def0 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 id(pCur) );. VV
1df00 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c A_ONLY(rc =) sql
1df10 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 ite3BtreeKeySize
1df20 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 (pCur, &nCellKey
1df30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d );. assert( rc=
1df40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 =SQLITE_OK );
1df50 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 /* pCur is alw
1df60 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 ays valid so Key
1df70 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c Size cannot fail
1df80 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e */. assert( (n
1df90 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 CellKey & SQLITE
1dfa0 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 _MAX_U32)==(u64)
1dfb0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f nCellKey );.. /
1dfc0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f * Read in the co
1dfd0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f mplete content o
1dfe0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 f the index entr
1dff0 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 y */. sqlite3Vd
1e000 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 beMemInit(&m, db
1e010 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c , 0);. rc = sql
1e020 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 ite3VdbeMemFromB
1e030 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 tree(pCur, 0, (u
1e040 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 32)nCellKey, 1,
1e050 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b &m);. if( rc ){
1e060 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a . return rc;.
1e070 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e }.. /* The in
1e080 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 dex entry must b
1e090 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 egin with a head
1e0a0 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f er size */. (vo
1e0b0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 id)getVarint32((
1e0c0 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b u8*)m.z, szHdr);
1e0d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 . testcase( szH
1e0e0 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 dr==3 );. testc
1e0f0 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 ase( szHdr==m.n
1e100 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c );. if( unlikel
1e110 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e y(szHdr<3 || (in
1e120 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a t)szHdr>m.n) ){.
1e130 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 goto idx_row
1e140 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 id_corruption;.
1e150 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 }.. /* The las
1e160 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 t field of the i
1e170 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 ndex should be a
1e180 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 n integer - the
1e190 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 ROWID.. ** Veri
1e1a0 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 fy that the last
1e1b0 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 entry really is
1e1c0 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a an integer. */.
1e1d0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e (void)getVarin
1e1e0 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a t32((u8*)&m.z[sz
1e1f0 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 Hdr-1], typeRowi
1e200 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 d);. testcase(
1e210 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a typeRowid==1 );.
1e220 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
1e230 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 Rowid==2 );. te
1e240 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
1e250 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 d==3 );. testca
1e260 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 se( typeRowid==4
1e270 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
1e280 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a typeRowid==5 );.
1e290 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
1e2a0 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 Rowid==6 );. te
1e2b0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
1e2c0 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 d==8 );. testca
1e2d0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 se( typeRowid==9
1e2e0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 );. if( unlike
1e2f0 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c ly(typeRowid<1 |
1e300 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c | typeRowid>9 ||
1e310 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 typeRowid==7) )
1e320 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 {. goto idx_r
1e330 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b owid_corruption;
1e340 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 . }. lenRowid
1e350 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 = sqlite3VdbeSer
1e360 69 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 ialTypeLen(typeR
1e370 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 owid);. testcas
1e380 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 e( (u32)m.n==szH
1e390 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 dr+lenRowid );.
1e3a0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 if( unlikely((u
1e3b0 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 32)m.n<szHdr+len
1e3c0 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f Rowid) ){. go
1e3d0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 to idx_rowid_cor
1e3e0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 ruption;. }..
1e3f0 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 /* Fetch the int
1e400 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 eger off the end
1e410 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 of the index re
1e420 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 cord */. sqlite
1e430 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 3VdbeSerialGet((
1e440 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e u8*)&m.z[m.n-len
1e450 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 Rowid], typeRowi
1e460 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 d, &v);. *rowid
1e470 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 = v.u.i;. sqli
1e480 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
1e490 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 e(&m);. return
1e4a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a SQLITE_OK;.. /*
1e4b0 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 Jump here if da
1e4c0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f tabase corruptio
1e4d0 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 n is detected af
1e4e0 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 ter m has been.
1e4f0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 ** allocated.
1e500 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 Free the m objec
1e510 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c t and return SQL
1e520 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a ITE_CORRUPT. */.
1e530 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 idx_rowid_corrup
1e540 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 tion:. testcase
1e550 28 20 6d 2e 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 ( m.zMalloc!=0 )
1e560 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d ;. sqlite3VdbeM
1e570 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 emRelease(&m);.
1e580 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
1e590 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a ORRUPT_BKPT;.}..
1e5a0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 /*.** Compare th
1e5b0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 e key of the ind
1e5c0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 ex entry that cu
1e5d0 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 rsor pC is point
1e5e0 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a ing to against.*
1e5f0 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 * the key string
1e600 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 in pUnpacked.
1e610 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 Write into *pRes
1e620 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 a number.** tha
1e630 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a t is negative, z
1e640 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 ero, or positive
1e650 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 if pC is less t
1e660 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a han, equal to,.*
1e670 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 * or greater tha
1e680 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 n pUnpacked. Re
1e690 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f turn SQLITE_OK o
1e6a0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a n success..**.**
1e6b0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 pUnpacked is ei
1e6c0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 ther created wit
1e6d0 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 hout a rowid or
1e6e0 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 is truncated so
1e6f0 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 that it.** omits
1e700 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 the rowid at th
1e710 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 e end. The rowi
1e720 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 d at the end of
1e730 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a the index entry.
1e740 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 ** is ignored as
1e750 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 well. Hence, t
1e760 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 his routine only
1e770 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 compares the pr
1e780 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 efixes .** of th
1e790 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 e keys prior to
1e7a0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c the final rowid,
1e7b0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 not the entire
1e7c0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 key..*/.int sqli
1e7d0 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d te3VdbeIdxKeyCom
1e7e0 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 pare(. sqlite3
1e7f0 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 *db,
1e800 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 /* Data
1e810 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
1e820 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 */. VdbeCursor
1e830 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 *pC,
1e840 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 /* The cur
1e850 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 sor to compare a
1e860 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 gainst */. Unpa
1e870 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 ckedRecord *pUnp
1e880 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 acked, /*
1e890 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e Unpacked version
1e8a0 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 of key */. int
1e8b0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 *res
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1e8d0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 Write the compa
1e8e0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 rison result her
1e8f0 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 e */.){. i64 nC
1e900 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e ellKey = 0;. in
1e910 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 t rc;. BtCursor
1e920 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75 *pCur = pC->pCu
1e930 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a rsor;. Mem m;..
1e940 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
1e950 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 3BtreeCursorIsVa
1e960 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 lid(pCur) );. V
1e970 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 VA_ONLY(rc =) sq
1e980 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a lite3BtreeKeySiz
1e990 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 e(pCur, &nCellKe
1e9a0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 y);. assert( rc
1e9b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 ==SQLITE_OK );
1e9c0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 /* pCur is alw
1e9d0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 ays valid so Key
1e9e0 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c Size cannot fail
1e9f0 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 */. /* nCellKe
1ea00 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 y will always be
1ea10 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 between 0 and 0
1ea20 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73 xffffffff becaus
1ea30 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a e of the way. *
1ea40 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73 * that btreePars
1ea50 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 eCellPtr() and s
1ea60 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 qlite3GetVarint3
1ea70 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 2() are implemen
1ea80 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 ted */. if( nCe
1ea90 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c llKey<=0 || nCel
1eaa0 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 lKey>0x7fffffff
1eab0 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b ){. *res = 0;
1eac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
1ead0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
1eae0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 . }. sqlite3Vd
1eaf0 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 beMemInit(&m, db
1eb00 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c , 0);. rc = sql
1eb10 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 ite3VdbeMemFromB
1eb20 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72 tree(pC->pCursor
1eb30 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b , 0, (u32)nCellK
1eb40 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 ey, 1, &m);. if
1eb50 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 ( rc ){. retu
1eb60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 rn rc;. }. *re
1eb70 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 s = sqlite3VdbeR
1eb80 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e ecordCompare(m.n
1eb90 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 , m.z, pUnpacked
1eba0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
1ebb0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a MemRelease(&m);.
1ebc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
1ebd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 OK;.}../*.** Thi
1ebe0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 s routine sets t
1ebf0 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 he value to be r
1ec00 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 eturned by subse
1ec10 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a quent calls to.*
1ec20 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 * sqlite3_change
1ec30 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 s() on the datab
1ec40 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e ase handle 'db'.
1ec50 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 .*/.void sqlite
1ec60 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 3VdbeSetChanges(
1ec70 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 sqlite3 *db, int
1ec80 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 nChange){. ass
1ec90 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 ert( sqlite3_mut
1eca0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 ex_held(db->mute
1ecb0 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 x) );. db->nCha
1ecc0 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 nge = nChange;.
1ecd0 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 db->nTotalChang
1ece0 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a e += nChange;.}.
1ecf0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 ./*.** Set a fla
1ed00 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f g in the vdbe to
1ed10 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e update the chan
1ed20 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 ge counter when
1ed30 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a it is finalised.
1ed40 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a ** or reset..*/.
1ed50 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
1ed60 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 CountChanges(Vdb
1ed70 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e e *v){. v->chan
1ed80 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a geCntOn = 1;.}..
1ed90 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 /*.** Mark every
1eda0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d prepared statem
1edb0 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 ent associated w
1edc0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 ith a database c
1edd0 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 onnection.** as
1ede0 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 expired..**.** A
1edf0 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d n expired statem
1ee00 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 ent means that r
1ee10 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 ecompilation of
1ee20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 the statement is
1ee30 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 .** recommend.
1ee40 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 Statements expir
1ee50 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 e when things ha
1ee60 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 ppen that make t
1ee70 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 heir.** programs
1ee80 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f obsolete. Remo
1ee90 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 ving user-define
1eea0 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 d functions or c
1eeb0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 ollating.** sequ
1eec0 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 ences, or changi
1eed0 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 ng an authorizat
1eee0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 ion function are
1eef0 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a the types of.**
1ef00 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b things that mak
1ef10 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 e prepared state
1ef20 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a ments obsolete..
1ef30 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 */.void sqlite3E
1ef40 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 xpirePreparedSta
1ef50 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 tements(sqlite3
1ef60 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b *db){. Vdbe *p;
1ef70 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 . for(p = db->p
1ef80 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e Vdbe; p; p=p->pN
1ef90 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 ext){. p->exp
1efa0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a ired = 1;. }.}.
1efb0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th
1efc0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 e database assoc
1efd0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 iated with the V
1efe0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 dbe..*/.sqlite3
1eff0 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 *sqlite3VdbeDb(V
1f000 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 dbe *v){. retur
1f010 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a n v->db;.}../*.*
1f020 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 * Return a point
1f030 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 er to an sqlite3
1f040 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 _value structure
1f050 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 containing the
1f060 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 value bound.** p
1f070 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 arameter iVar of
1f080 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 VM v. Except, i
1f090 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 f the value is a
1f0a0 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 n SQL NULL, retu
1f0b0 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 rn .** 0 instead
1f0c0 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e . Unless it is N
1f0d0 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e ULL, apply affin
1f0e0 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 ity aff (one of
1f0f0 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a the SQLITE_AFF_*
1f100 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 .** constants) t
1f110 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f o the value befo
1f120 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e re returning it.
1f130 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 .**.** The retur
1f140 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 ned value must b
1f150 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 e freed by the c
1f160 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 aller using sqli
1f170 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a te3ValueFree()..
1f180 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 */.sqlite3_value
1f190 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 *sqlite3VdbeGet
1f1a0 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 BoundValue(Vdbe
1f1b0 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 *v, int iVar, u8
1f1c0 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 aff){. assert(
1f1d0 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 iVar>0 );. if(
1f1e0 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 v ){. Mem *p
1f1f0 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 Mem = &v->aVar[i
1f200 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 Var-1];. if(
1f210 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 0==(pMem->flags
1f220 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 & MEM_Null) ){.
1f230 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c sqlite3_val
1f240 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 ue *pRet = sqlit
1f250 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 e3ValueNew(v->db
1f260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 );. if( pRe
1f270 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c t ){. sql
1f280 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 ite3VdbeMemCopy(
1f290 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 (Mem *)pRet, pMe
1f2a0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 m);. sqli
1f2b0 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 te3ValueApplyAff
1f2c0 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c inity(pRet, aff,
1f2d0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 SQLITE_UTF8);.
1f2e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 }. ret
1f2f0 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a urn pRet;. }.
1f300 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a }. return 0;.
1f310 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 }../*.** Configu
1f320 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 re SQL variable
1f330 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e iVar so that bin
1f340 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 ding a new value
1f350 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a to it signals.*
1f360 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f * to sqlite3_reo
1f370 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 ptimize() that r
1f380 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 e-preparing the
1f390 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 statement may re
1f3a0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 sult.** in a bet
1f3b0 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a ter query plan..
1f3c0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
1f3d0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 dbeSetVarmask(Vd
1f3e0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 be *v, int iVar)
1f3f0 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 {. assert( iVar
1f400 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 >0 );. if( iVar
1f410 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 >32 ){. v->ex
1f420 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 pmask = 0xffffff
1f430 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ff;. }else{.
1f440 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 v->expmask |= (
1f450 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d (u32)1 << (iVar-
1f460 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 1));. }.}..#ifn
1f470 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
1f480 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a VIRTUALTABLE./*.
1f490 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f ** Transfer erro
1f4a0 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 r message text f
1f4b0 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 rom an sqlite3_v
1f4c0 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 tab.zErrMsg (tex
1f4d0 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d t stored.** in m
1f4e0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 emory obtained f
1f4f0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c rom sqlite3_mall
1f500 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e oc) into a Vdbe.
1f510 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 zErrMsg (text st
1f520 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 ored.** in memor
1f530 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 y obtained from
1f540 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 sqlite3DbMalloc)
1f550 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
1f560 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 3VtabImportErrms
1f570 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 g(Vdbe *p, sqlit
1f580 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b e3_vtab *pVtab){
1f590 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
1f5a0 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65 p->db;. sqlite
1f5b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 3DbFree(db, p->z
1f5c0 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 ErrMsg);. p->zE
1f5d0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44 rrMsg = sqlite3D
1f5e0 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61 bStrDup(db, pVta
1f5f0 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 b->zErrMsg);. s
1f600 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 qlite3_free(pVta
1f610 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 b->zErrMsg);. p
1f620 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 Vtab->zErrMsg =
1f630 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 0;.}.#endif /* S
1f640 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 QLITE_OMIT_VIRTU
1f650 41 4c 54 41 42 4c 45 20 2a 2f 0a ALTABLE */.