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 0a 2a 2f 0a 23 69 6e 63 6c 75 64 ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72 e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 se *pParse){. s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 rse->db;. Vdbe
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 *p;. p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 b, sizeof(Vdbe)
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 );. if( p==0 )
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 return 0;. mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73 et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73 izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 . p->db = db;.
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d {. db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a >pPrev = p;. }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 >pVdbe;. p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 ev = 0;. db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 dbe = p;. p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72 _INIT;. p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 se = pParse;. p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70 Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 ;. assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20 e->szOpAlloc==0
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69 AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75 t, 0, 1);. retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20 hange the error
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20 eError(Vdbe *p,
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f mat, ...){. va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 list ap;. sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 e3DbFree(p->db,
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76 p->zErrMsg);. v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d mat);. p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 mat, ap);. va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70 *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 repFlags){. if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66 prepFlags;. if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53 ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41 QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 VESQL)==0 ){.
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 . }. assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 ->zSql==0 );. p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 23 69 66 64 65 66 20 53 z, n);.#ifdef S
06f0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 QLITE_ENABLE_NOR
0700: 4d 41 4c 49 5a 45 0a 20 20 61 73 73 65 72 74 28 MALIZE. assert(
0710: 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 3d 3d 30 20 p->zNormSql==0
0720: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c );. if( p->zSql
0730: 20 26 26 20 28 70 72 65 70 46 6c 61 67 73 20 26 && (prepFlags &
0740: 20 53 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f SQLITE_PREPARE_
0750: 4e 4f 52 4d 41 4c 49 5a 45 29 21 3d 30 20 29 7b NORMALIZE)!=0 ){
0760: 0a 20 20 20 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c . p->zNormSql
0770: 20 3d 20 73 71 6c 69 74 65 33 4e 6f 72 6d 61 6c = sqlite3Normal
0780: 69 7a 65 28 70 2c 20 70 2d 3e 7a 53 71 6c 2c 20 ize(p, p->zSql,
0790: 6e 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 n);. assert(
07a0: 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 21 3d 30 20 7c p->zNormSql!=0 |
07b0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 | p->db->mallocF
07c0: 61 69 6c 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e ailed );. }.#en
07d0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 77 61 dif.}../*.** Swa
07e0: 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 65 p all content be
07f0: 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45 20 73 tween two VDBE s
0800: 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a 76 6f tructures..*/.vo
0810: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 77 id sqlite3VdbeSw
0820: 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56 64 62 ap(Vdbe *pA, Vdb
0830: 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65 20 74 e *pB){. Vdbe t
0840: 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63 68 61 mp, *pTmp;. cha
0850: 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73 65 72 r *zTmp;. asser
0860: 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d 3e 64 t( pA->db==pB->d
0870: 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a 70 41 b );. tmp = *pA
0880: 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 ;. *pA = *pB;.
0890: 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20 70 54 *pB = tmp;. pT
08a0: 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74 3b 0a mp = pA->pNext;.
08b0: 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20 70 42 pA->pNext = pB
08c0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d 3e 70 ->pNext;. pB->p
08d0: 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20 20 70 Next = pTmp;. p
08e0: 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65 76 3b Tmp = pA->pPrev;
08f0: 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d 20 70 . pA->pPrev = p
0900: 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42 2d 3e B->pPrev;. pB->
0910: 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a 20 20 pPrev = pTmp;.
0920: 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b zTmp = pA->zSql;
0930: 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 . pA->zSql = pB
0940: 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 ->zSql;. pB->zS
0950: 71 6c 20 3d 20 7a 54 6d 70 3b 0a 23 69 66 64 65 ql = zTmp;.#ifde
0960: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
0970: 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 7a 54 6d 70 NORMALIZE. zTmp
0980: 20 3d 20 70 41 2d 3e 7a 4e 6f 72 6d 53 71 6c 3b = pA->zNormSql;
0990: 0a 20 20 70 41 2d 3e 7a 4e 6f 72 6d 53 71 6c 20 . pA->zNormSql
09a0: 3d 20 70 42 2d 3e 7a 4e 6f 72 6d 53 71 6c 3b 0a = pB->zNormSql;.
09b0: 20 20 70 42 2d 3e 7a 4e 6f 72 6d 53 71 6c 20 3d pB->zNormSql =
09c0: 20 7a 54 6d 70 3b 0a 23 65 6e 64 69 66 0a 20 20 zTmp;.#endif.
09d0: 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70 41 pB->expmask = pA
09e0: 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42 2d ->expmask;. pB-
09f0: 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41 2d >prepFlags = pA-
0a00: 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d 65 >prepFlags;. me
0a10: 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74 65 mcpy(pB->aCounte
0a20: 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72 2c r, pA->aCounter,
0a30: 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f 75 sizeof(pB->aCou
0a40: 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61 43 nter));. pB->aC
0a50: 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 54 ounter[SQLITE_ST
0a60: 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50 41 MTSTATUS_REPREPA
0a70: 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 RE]++;.}../*.**
0a80: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e Resize the Vdbe.
0a90: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 aOp array so tha
0aa0: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 t it is at least
0ab0: 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c 61 nOp elements la
0ac0: 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69 74 rger .** than it
0ad0: 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e 20 s current size.
0ae0: 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65 65 nOp is guarantee
0af0: 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 d to be less tha
0b00: 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f n or equal.** to
0b10: 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 1024/sizeof(Op)
0b20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 ..**.** If an ou
0b30: 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f t-of-memory erro
0b40: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 r occurs while r
0b50: 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 esizing the arra
0b60: 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c y, return.** SQL
0b70: 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 ITE_NOMEM. In th
0b80: 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 is case Vdbe.aOp
0b90: 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41 6c and Parse.nOpAl
0ba0: 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 loc remain .** u
0bb0: 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 nchanged (this i
0bc0: 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 s so that any op
0bd0: 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c codes already al
0be0: 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a located can be .
0bf0: 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 ** correctly dea
0c00: 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 llocated along w
0c10: 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 ith the rest of
0c20: 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 the Vdbe)..*/.st
0c30: 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 atic int growOpA
0c40: 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69 6e rray(Vdbe *v, in
0c50: 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f 70 t nOp){. VdbeOp
0c60: 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 *pNew;. Parse
0c70: 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a *p = v->pParse;.
0c80: 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 . /* The SQLITE
0c90: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 _TEST_REALLOC_ST
0ca0: 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69 6d RESS compile-tim
0cb0: 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73 69 e option is desi
0cc0: 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20 20 gned to force.
0cd0: 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e 74 ** more frequent
0ce0: 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68 65 reallocs and he
0cf0: 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72 65 nce provide more
0d00: 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 66 opportunities f
0d10: 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 74 or . ** simulat
0d20: 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 20 ed OOM faults.
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67 65 LOC_STRESS is ge
0d50: 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20 2a nerally used. *
0d60: 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 * during testing
0d70: 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51 4c only. With SQL
0d80: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 ITE_TEST_REALLOC
0d90: 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68 65 _STRESS grow the
0da0: 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20 62 op array. ** b
0db0: 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 61 y the minimum* a
0dc0: 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20 75 mount required u
0dd0: 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72 65 ntil the size re
0de0: 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72 6d aches 512. Norm
0df0: 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f al. ** operatio
0e00: 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49 54 n (without SQLIT
0e10: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 E_TEST_REALLOC_S
0e20: 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f 75 TRESS) is to dou
0e30: 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a ble the current.
0e40: 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 ** size of the
0e50: 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64 64 op array or add
0e60: 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20 77 1KB of space, w
0e70: 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c hichever is smal
0e80: 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 ler. */.#ifdef S
0e90: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c QLITE_TEST_REALL
0ea0: 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74 20 OC_STRESS. int
0eb0: 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c nNew = (p->nOpAl
0ec0: 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e 4f loc>=512 ? p->nO
0ed0: 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 4f pAlloc*2 : p->nO
0ee0: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 6c pAlloc+nOp);.#el
0ef0: 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 se. int nNew =
0f00: 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 (p->nOpAlloc ? p
0f10: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 ->nOpAlloc*2 : (
0f20: 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 int)(1024/sizeof
0f30: 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44 (Op)));. UNUSED
0f40: 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b _PARAMETER(nOp);
0f50: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e .#endif.. /* En
0f60: 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 69 sure that the si
0f70: 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f 65 ze of a VDBE doe
0f80: 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 6c s not grow too l
0f90: 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e 4e arge */. if( nN
0fa0: 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 6d ew > p->db->aLim
0fb0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f it[SQLITE_LIMIT_
0fc0: 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 20 VDBE_OP] ){.
0fd0: 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 sqlite3OomFault(
0fe0: 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 75 p->db);. retu
0ff0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b rn SQLITE_NOMEM;
1000: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 . }.. assert(
1010: 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f nOp<=(1024/sizeo
1020: 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65 f(Op)) );. asse
1030: 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e 4f rt( nNew>=(p->nO
1040: 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20 pAlloc+nOp) );.
1050: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 pNew = sqlite3D
1060: 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 bRealloc(p->db,
1070: 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a v->aOp, nNew*siz
1080: 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20 eof(Op));. if(
1090: 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73 pNew ){. p->s
10a0: 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 zOpAlloc = sqlit
10b0: 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 e3DbMallocSize(p
10c0: 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 ->db, pNew);.
10d0: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 p->nOpAlloc = p
10e0: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65 ->szOpAlloc/size
10f0: 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61 of(Op);. v->a
1100: 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 Op = pNew;. }.
1110: 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 return (pNew ?
1120: 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 SQLITE_OK : SQLI
1130: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a TE_NOMEM_BKPT);.
1140: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }..#ifdef SQLITE
1150: 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 _DEBUG./* This r
1160: 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 outine is just a
1170: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 convenient plac
1180: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b e to set a break
1190: 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a point that will.
11a0: 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61 ** fire after ea
11b0: 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 ch opcode is ins
11c0: 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 erted and displa
11d0: 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 yed using.** "PR
11e0: 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 AGMA vdbe_addopt
11f0: 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 race=on"..*/.sta
1200: 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 tic void test_ad
1210: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 dop_breakpoint(v
1220: 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 oid){. static i
1230: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b nt n = 0;. n++;
1240: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a .}.#endif../*.**
1250: 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 Add a new instr
1260: 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 uction to the li
1270: 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f st of instructio
1280: 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 ns current in th
1290: 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 e.** VDBE. Retu
12a0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f rn the address o
12b0: 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 f the new instru
12c0: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 ction..**.** Par
12d0: 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 ameters:.**.**
12e0: 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 p
12f0: 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 Pointer to the
1300: 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f VDBE.**.** o
1310: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 p T
1320: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 he opcode for th
1330: 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a is instruction.*
1340: 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 *.** p1, p2,
1350: 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 p3 Operands
1360: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 .**.** Use the s
1370: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 qlite3VdbeResolv
1380: 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f eLabel() functio
1390: 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 n to fix an addr
13a0: 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 ess and.** the s
13b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
13c0: 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f P4() function to
13d0: 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 change the valu
13e0: 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f e of the P4.** o
13f0: 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 perand..*/.stati
1400: 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e c SQLITE_NOINLIN
1410: 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64 E int growOp3(Vd
1420: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 be *p, int op, i
1430: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 nt p1, int p2, i
1440: 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74 nt p3){. assert
1450: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 ( p->pParse->nOp
1460: 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b Alloc<=p->nOp );
1470: 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72 . if( growOpArr
1480: 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72 ay(p, 1) ) retur
1490: 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 n 1;. assert( p
14a0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c ->pParse->nOpAll
14b0: 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 oc>p->nOp );. r
14c0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 eturn sqlite3Vdb
14d0: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 eAddOp3(p, op, p
14e0: 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e 1, p2, p3);.}.in
14f0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 t sqlite3VdbeAdd
1500: 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 Op3(Vdbe *p, int
1510: 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 op, int p1, int
1520: 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 p2, int p3){.
1530: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 int i;. VdbeOp
1540: 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e *pOp;.. i = p->
1550: 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 nOp;. assert( p
1560: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
1570: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 GIC_INIT );. as
1580: 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f sert( op>=0 && o
1590: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 p<0xff );. if(
15a0: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c p->pParse->nOpAl
15b0: 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 loc<=i ){. re
15c0: 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 turn growOp3(p,
15d0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b op, p1, p2, p3);
15e0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b . }. p->nOp++;
15f0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 . pOp = &p->aOp
1600: 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f [i];. pOp->opco
1610: 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 de = (u8)op;. p
1620: 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f Op->p5 = 0;. pO
1630: 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f p->p1 = p1;. pO
1640: 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f p->p2 = p2;. pO
1650: 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f p->p3 = p3;. pO
1660: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 p->p4.p = 0;. p
1670: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f Op->p4type = P4_
1680: 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 NOTUSED;.#ifdef
1690: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 SQLITE_ENABLE_EX
16a0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 PLAIN_COMMENTS.
16b0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d pOp->zComment =
16c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 0;.#endif.#ifde
16d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 f SQLITE_DEBUG.
16e0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 if( p->db->flag
16f0: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 s & SQLITE_VdbeA
1700: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 ddopTrace ){.
1710: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e sqlite3VdbePrin
1720: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f tOp(0, i, &p->aO
1730: 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f p[i]);. test_
1740: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 addop_breakpoint
1750: 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 ();. }.#endif.#
1760: 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 ifdef VDBE_PROFI
1770: 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 LE. pOp->cycles
1780: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 = 0;. pOp->cnt
1790: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
17a0: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f def SQLITE_VDBE_
17b0: 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e COVERAGE. pOp->
17c0: 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 iSrcLine = 0;.#e
17d0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b ndif. return i;
17e0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 .}.int sqlite3Vd
17f0: 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 beAddOp0(Vdbe *p
1800: 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 , int op){. ret
1810: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 urn sqlite3VdbeA
1820: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 ddOp3(p, op, 0,
1830: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 0, 0);.}.int sql
1840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 ite3VdbeAddOp1(V
1850: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 dbe *p, int op,
1860: 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 int p1){. retur
1870: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 n sqlite3VdbeAdd
1880: 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 Op3(p, op, p1, 0
1890: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 , 0);.}.int sqli
18a0: 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 te3VdbeAddOp2(Vd
18b0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 be *p, int op, i
18c0: 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a nt p1, int p2){.
18d0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
18e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 VdbeAddOp3(p, op
18f0: 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a , p1, p2, 0);.}.
1900: 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 ./* Generate cod
1910: 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 e for an uncondi
1920: 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 tional jump to i
1930: 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 nstruction iDest
1940: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
1950: 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c dbeGoto(Vdbe *p,
1960: 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 int iDest){. r
1970: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 eturn sqlite3Vdb
1980: 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f eAddOp3(p, OP_Go
1990: 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 to, 0, iDest, 0)
19a0: 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 ;.}../* Generate
19b0: 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 code to cause t
19c0: 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 he string zStr t
19d0: 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f o be loaded into
19e0: 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 .** register iDe
19f0: 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 st.*/.int sqlite
1a00: 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 3VdbeLoadString(
1a10: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 Vdbe *p, int iDe
1a20: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a st, const char *
1a30: 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 zStr){. return
1a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
1a50: 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 4(p, OP_String8,
1a60: 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 0, iDest, 0, zS
1a70: 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a tr, 0);.}../*.**
1a80: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 Generate code t
1a90: 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 hat initializes
1aa0: 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 multiple registe
1ab0: 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 rs to string or
1ac0: 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 integer.** const
1ad0: 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 ants. The regis
1ae0: 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 ters begin with
1af0: 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 iDest and increa
1b00: 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 se consecutively
1b10: 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 ..** One registe
1b20: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 r is initialized
1b30: 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 for each charac
1b40: 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d gter in zTypes[]
1b50: 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 . For each.** "
1b60: 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 s" character in
1b70: 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 zTypes[], the re
1b80: 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 gister is a stri
1b90: 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 ng if the argume
1ba0: 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c nt is.** not NUL
1bb0: 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 L, or OP_Null if
1bc0: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 the value is a
1bd0: 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 null pointer. F
1be0: 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 or each "i" char
1bf0: 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 acter.** in zTyp
1c00: 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 es[], the regist
1c10: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 er is initialize
1c20: 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e d to an integer.
1c30: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e .**.** If the in
1c40: 70 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73 20 put string does
1c50: 6e 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58 22 not end with "X"
1c60: 20 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 then an OP_Resu
1c70: 6c 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f ltRow instructio
1c80: 6e 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 n.** is generate
1c90: 64 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 73 d for the values
1ca0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f inserted..*/.vo
1cb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 id sqlite3VdbeMu
1cc0: 6c 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c ltiLoad(Vdbe *p,
1cd0: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 int iDest, cons
1ce0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 t char *zTypes,
1cf0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 ...){. va_list
1d00: 61 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 ap;. int i;. c
1d10: 68 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 har c;. va_star
1d20: 74 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 t(ap, zTypes);.
1d30: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a for(i=0; (c = z
1d40: 54 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b Types[i])!=0; i+
1d50: 2b 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 +){. if( c=='
1d60: 73 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 s' ){. cons
1d70: 74 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 t char *z = va_a
1d80: 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 rg(ap, const cha
1d90: 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 r*);. sqlit
1da0: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 e3VdbeAddOp4(p,
1db0: 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a z==0 ? OP_Null :
1dc0: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 OP_String8, 0,
1dd0: 69 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 iDest+i, 0, z, 0
1de0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 );. }else if(
1df0: 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 c=='i' ){.
1e00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
1e10: 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 p2(p, OP_Integer
1e20: 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 , va_arg(ap, int
1e30: 29 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 ), iDest+i);.
1e40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f }else{. go
1e50: 74 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c to skip_op_resul
1e60: 74 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a trow;. }. }.
1e70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
1e80: 4f 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 Op2(p, OP_Result
1e90: 52 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a Row, iDest, i);.
1ea0: 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f skip_op_resultro
1eb0: 77 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b w:. va_end(ap);
1ec0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
1ed0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 opcode that inc
1ee0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c ludes the p4 val
1ef0: 75 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e ue as a pointer.
1f00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
1f10: 64 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62 dbeAddOp4(. Vdb
1f20: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 e *p,
1f30: 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f /* Add the opco
1f40: 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f de to this VM */
1f50: 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 . int op,
1f60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 /* The ne
1f70: 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e w opcode */. in
1f80: 74 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 t p1,
1f90: 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 /* The P1 oper
1fa0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c and */. int p2,
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1fc0: 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a The P2 operand *
1fd0: 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 /. int p3,
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 /* The P
1ff0: 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 3 operand */. c
2000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 onst char *zP4,
2010: 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 /* The P4 ope
2020: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 rand */. int p4
2030: 74 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a type /*
2040: 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 P4 operand type
2050: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 */.){. int add
2060: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 r = sqlite3VdbeA
2070: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c ddOp3(p, op, p1,
2080: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 p2, p3);. sqli
2090: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 te3VdbeChangeP4(
20a0: 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 p, addr, zP4, p4
20b0: 74 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 type);. return
20c0: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 addr;.}../*.** A
20d0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 dd an opcode tha
20e0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 t includes the p
20f0: 34 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 50 4 value with a P
2100: 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 4_INT64 or.** P4
2110: 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 _REAL type..*/.i
2120: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
2130: 64 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62 65 dOp4Dup8(. Vdbe
2140: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
2150: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 /* Add the opcod
2160: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a e to this VM */.
2170: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 int op,
2180: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 /* The new
2190: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 opcode */. int
21a0: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 p1,
21b0: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 /* The P1 opera
21c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 nd */. int p2,
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
21e0: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f he P2 operand */
21f0: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 . int p3,
2200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 /* The P3
2210: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f operand */. co
2220: 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 nst u8 *zP4,
2230: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 /* The P4 oper
2240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 and */. int p4t
2250: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ype /*
2260: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 P4 operand type
2270: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 */.){. char *p4
2280: 63 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 copy = sqlite3Db
2290: 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 MallocRawNN(sqli
22a0: 74 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29 te3VdbeDb(p), 8)
22b0: 3b 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29 ;. if( p4copy )
22c0: 20 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 memcpy(p4copy,
22d0: 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 zP4, 8);. retur
22e0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 n sqlite3VdbeAdd
22f0: 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 Op4(p, op, p1, p
2300: 32 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 2, p3, p4copy, p
2310: 34 74 79 70 65 29 3b 0a 7d 0a 0a 23 69 66 6e 64 4type);.}..#ifnd
2320: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 ef SQLITE_OMIT_E
2330: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 52 65 74 XPLAIN./*.** Ret
2340: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 urn the address
2350: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 45 of the current E
2360: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 XPLAIN QUERY PLA
2370: 4e 20 62 61 73 65 6c 69 6e 65 2e 0a 2a 2a 20 30 N baseline..** 0
2380: 20 6d 65 61 6e 73 20 22 6e 6f 6e 65 22 2e 0a 2a means "none"..*
2390: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
23a0: 65 45 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 50 eExplainParent(P
23b0: 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 arse *pParse){.
23c0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 VdbeOp *pOp;.
23d0: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 64 64 72 if( pParse->addr
23e0: 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 Explain==0 ) ret
23f0: 75 72 6e 20 30 3b 0a 20 20 70 4f 70 20 3d 20 73 urn 0;. pOp = s
2400: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 qlite3VdbeGetOp(
2410: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 pParse->pVdbe, p
2420: 50 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 Parse->addrExpla
2430: 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f in);. return pO
2440: 70 2d 3e 70 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 p->p2;.}../*.**
2450: 41 64 64 20 61 20 6e 65 77 20 4f 50 5f 45 78 70 Add a new OP_Exp
2460: 6c 61 69 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a lain opcode..**.
2470: 2a 2a 20 49 66 20 74 68 65 20 62 50 75 73 68 20 ** If the bPush
2480: 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 flag is true, th
2490: 65 6e 20 6d 61 6b 65 20 74 68 69 73 20 6f 70 63 en make this opc
24a0: 6f 64 65 20 74 68 65 20 70 61 72 65 6e 74 20 66 ode the parent f
24b0: 6f 72 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 or.** subsequent
24c0: 20 45 78 70 6c 61 69 6e 73 20 75 6e 74 69 6c 20 Explains until
24d0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 sqlite3VdbeExpla
24e0: 69 6e 50 6f 70 28 29 20 69 73 20 63 61 6c 6c 65 inPop() is calle
24f0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 d..*/.void sqlit
2500: 65 33 56 64 62 65 45 78 70 6c 61 69 6e 28 50 61 e3VdbeExplain(Pa
2510: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 75 38 20 rse *pParse, u8
2520: 62 50 75 73 68 2c 20 63 6f 6e 73 74 20 63 68 61 bPush, const cha
2530: 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20 r *zFmt, ...){.
2540: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 if( pParse->exp
2550: 6c 61 69 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 63 lain==2 ){. c
2560: 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 20 20 56 har *zMsg;. V
2570: 64 62 65 20 2a 76 3b 0a 20 20 20 20 76 61 5f 6c dbe *v;. va_l
2580: 69 73 74 20 61 70 3b 0a 20 20 20 20 69 6e 74 20 ist ap;. int
2590: 69 54 68 69 73 3b 0a 20 20 20 20 76 61 5f 73 74 iThis;. va_st
25a0: 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 art(ap, zFmt);.
25b0: 20 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 zMsg = sqlite
25c0: 33 56 4d 50 72 69 6e 74 66 28 70 50 61 72 73 65 3VMPrintf(pParse
25d0: 2d 3e 64 62 2c 20 7a 46 6d 74 2c 20 61 70 29 3b ->db, zFmt, ap);
25e0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b . va_end(ap);
25f0: 0a 20 20 20 20 76 20 3d 20 70 50 61 72 73 65 2d . v = pParse-
2600: 3e 70 56 64 62 65 3b 0a 20 20 20 20 69 54 68 69 >pVdbe;. iThi
2610: 73 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 s = v->nOp;.
2620: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
2630: 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61 69 6e 2c 4(v, OP_Explain,
2640: 20 69 54 68 69 73 2c 20 70 50 61 72 73 65 2d 3e iThis, pParse->
2650: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 30 2c 0a addrExplain, 0,.
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2670: 20 20 20 20 20 20 7a 4d 73 67 2c 20 50 34 5f 44 zMsg, P4_D
2680: 59 4e 41 4d 49 43 29 3b 0a 20 20 20 20 69 66 28 YNAMIC);. if(
2690: 20 62 50 75 73 68 29 20 70 50 61 72 73 65 2d 3e bPush) pParse->
26a0: 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 69 54 addrExplain = iT
26b0: 68 69 73 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a his;. }.}../*.*
26c0: 2a 20 50 6f 70 20 74 68 65 20 45 58 50 4c 41 49 * Pop the EXPLAI
26d0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 73 74 61 N QUERY PLAN sta
26e0: 63 6b 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f ck one level..*/
26f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
2700: 65 45 78 70 6c 61 69 6e 50 6f 70 28 50 61 72 73 eExplainPop(Pars
2710: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 70 50 e *pParse){. pP
2720: 61 72 73 65 2d 3e 61 64 64 72 45 78 70 6c 61 69 arse->addrExplai
2730: 6e 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 n = sqlite3VdbeE
2740: 78 70 6c 61 69 6e 50 61 72 65 6e 74 28 70 50 61 xplainParent(pPa
2750: 72 73 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f rse);.}.#endif /
2760: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 * SQLITE_OMIT_EX
2770: 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 PLAIN */../*.**
2780: 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 Add an OP_ParseS
2790: 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 chema opcode. T
27a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 his routine is b
27b0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a roken out from.*
27c0: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 * sqlite3VdbeAdd
27d0: 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e Op4() since it n
27e0: 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 eeds to also nee
27f0: 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 ds to mark all b
2800: 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 trees.** as havi
2810: 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a ng been used..**
2820: 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 .** The zWhere s
2830: 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 tring must have
2840: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 been obtained fr
2850: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f om sqlite3_mallo
2860: 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 c()..** This rou
2870: 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f tine will take o
2880: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 wnership of the
2890: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 allocated memory
28a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
28b0: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 3VdbeAddParseSch
28c0: 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 emaOp(Vdbe *p, i
28d0: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 nt iDb, char *zW
28e0: 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a here){. int j;.
28f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
2900: 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 Op4(p, OP_ParseS
2910: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 chema, iDb, 0, 0
2920: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e , zWhere, P4_DYN
2930: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 AMIC);. for(j=0
2940: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 ; j<p->db->nDb;
2950: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 j++) sqlite3Vdbe
2960: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b UsesBtree(p, j);
2970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
2980: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 opcode that inc
2990: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c ludes the p4 val
29a0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 ue as an integer
29b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
29c0: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 VdbeAddOp4Int(.
29d0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 Vdbe *p,
29e0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 /* Add the
29f0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 opcode to this V
2a00: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 M */. int op,
2a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
2a20: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a e new opcode */.
2a30: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 int p1,
2a40: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 /* The P1
2a50: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
2a60: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 p2,
2a70: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 /* The P2 opera
2a80: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 nd */. int p3,
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
2aa0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f he P3 operand */
2ab0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 . int p4
2ac0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 /* The P4
2ad0: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 operand as an i
2ae0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 nteger */.){. i
2af0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 nt addr = sqlite
2b00: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 3VdbeAddOp3(p, o
2b10: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a p, p1, p2, p3);.
2b20: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c if( p->db->mal
2b30: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a locFailed==0 ){.
2b40: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 VdbeOp *pOp
2b50: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b = &p->aOp[addr];
2b60: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 . pOp->p4type
2b70: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 = P4_INT32;.
2b80: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b pOp->p4.i = p4;
2b90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 . }. return ad
2ba0: 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 dr;.}../* Insert
2bb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f the end of a co
2bc0: 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 -routine.*/.void
2bd0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 sqlite3VdbeEndC
2be0: 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 oroutine(Vdbe *v
2bf0: 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b , int regYield){
2c00: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 . sqlite3VdbeAd
2c10: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f dOp1(v, OP_EndCo
2c20: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c routine, regYiel
2c30: 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 d);.. /* Clear
2c40: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 the temporary re
2c50: 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 gister cache, th
2c60: 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 ereby ensuring t
2c70: 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f hat each. ** co
2c80: 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 -routine has its
2c90: 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 own independent
2ca0: 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 set of register
2cb0: 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f s, because co-ro
2cc0: 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 utines. ** migh
2cd0: 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72 t expect their r
2ce0: 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 egisters to be p
2cf0: 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 reserved across
2d00: 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 an OP_Yield, and
2d10: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 . ** that could
2d20: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 cause problems
2d30: 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 if two or more c
2d40: 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 o-routines are u
2d50: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 sing the same.
2d60: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 ** temporary reg
2d70: 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d ister.. */. v-
2d80: 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 >pParse->nTempRe
2d90: 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 g = 0;. v->pPar
2da0: 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 se->nRangeReg =
2db0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 0;.}../*.** Crea
2dc0: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 te a new symboli
2dd0: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 c label for an i
2de0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 nstruction that
2df0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a has yet to be.**
2e00: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d coded. The sym
2e10: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 bolic label is r
2e20: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 eally just a neg
2e30: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 ative number. T
2e40: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 he.** label can
2e50: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 be used as the P
2e60: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 2 value of an op
2e70: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c eration. Later,
2e80: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 when.** the lab
2e90: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 el is resolved t
2ea0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 o a specific add
2eb0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 ress, the VDBE w
2ec0: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f ill scan.** thro
2ed0: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f ugh its operatio
2ee0: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 n list and chang
2ef0: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 e all values of
2f00: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a P2 which match.*
2f10: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f * the label into
2f20: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 the resolved ad
2f30: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 dress..**.** The
2f40: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 VDBE knows that
2f50: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 a P2 value is a
2f60: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c label because l
2f70: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 abels are.** alw
2f80: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 ays negative and
2f90: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 P2 values are s
2fa0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e uppose to be non
2fb0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 -negative..** He
2fc0: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 nce, a negative
2fd0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 P2 value is a la
2fe0: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 bel that has yet
2ff0: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e to be resolved.
3000: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 .**.** Zero is r
3010: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c eturned if a mal
3020: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a loc() fails..*/.
3030: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d int sqlite3VdbeM
3040: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 akeLabel(Vdbe *v
3050: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 ){. Parse *p =
3060: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 v->pParse;. int
3070: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b i = p->nLabel++
3080: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d ;. assert( v->m
3090: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 agic==VDBE_MAGIC
30a0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 _INIT );. if( (
30b0: 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b i & (i-1))==0 ){
30c0: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d . p->aLabel =
30d0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f sqlite3DbReallo
30e0: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 cOrFree(p->db, p
30f0: 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 ->aLabel, .
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3120: 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 (i*2+1)*sizeof
3130: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b (p->aLabel[0]));
3140: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c . }. if( p->aL
3150: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 abel ){. p->a
3160: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 Label[i] = -1;.
3170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52 }. return ADDR
3180: 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 (i);.}../*.** Re
3190: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 solve label "x"
31a0: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 to be the addres
31b0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e s of the next in
31c0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 struction to.**
31d0: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 be inserted. Th
31e0: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 e parameter "x"
31f0: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f must have been o
3200: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 btained from.**
3210: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 a prior call to
3220: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c sqlite3VdbeMakeL
3230: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 abel()..*/.void
3240: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c sqlite3VdbeResol
3250: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c veLabel(Vdbe *v,
3260: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 int x){. Parse
3270: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b *p = v->pParse;
3280: 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 . int j = ADDR(
3290: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d x);. assert( v-
32a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
32b0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 IC_INIT );. ass
32c0: 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c ert( j<p->nLabel
32d0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e );. assert( j>
32e0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 =0 );. if( p->a
32f0: 4c 61 62 65 6c 20 29 7b 0a 23 69 66 64 65 66 20 Label ){.#ifdef
3300: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 SQLITE_DEBUG.
3310: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 if( p->db->flag
3320: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 s & SQLITE_VdbeA
3330: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 ddopTrace ){.
3340: 20 20 20 70 72 69 6e 74 66 28 22 52 45 53 4f 4c printf("RESOL
3350: 56 45 20 4c 41 42 45 4c 20 25 64 20 74 6f 20 25 VE LABEL %d to %
3360: 64 5c 6e 22 2c 20 78 2c 20 76 2d 3e 6e 4f 70 29 d\n", x, v->nOp)
3370: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
3380: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4c assert( p->aL
3390: 61 62 65 6c 5b 6a 5d 3d 3d 28 2d 31 29 20 29 3b abel[j]==(-1) );
33a0: 20 2f 2a 20 4c 61 62 65 6c 73 20 6d 61 79 20 6f /* Labels may o
33b0: 6e 6c 79 20 62 65 20 72 65 73 6f 6c 76 65 64 20 nly be resolved
33c0: 6f 6e 63 65 20 2a 2f 0a 20 20 20 20 70 2d 3e 61 once */. p->a
33d0: 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f Label[j] = v->nO
33e0: 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 p;. }.}../*.**
33f0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 Mark the VDBE as
3400: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e one that can on
3410: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 ly be run one ti
3420: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 me..*/.void sqli
3430: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e te3VdbeRunOnlyOn
3440: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 ce(Vdbe *p){. p
3450: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 ->runOnlyOnce =
3460: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 1;.}../*.** Mark
3470: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65 the VDBE as one
3480: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 that can only b
3490: 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 e run multiple t
34a0: 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 imes..*/.void sq
34b0: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c lite3VdbeReusabl
34c0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d e(Vdbe *p){. p-
34d0: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 >runOnlyOnce = 0
34e0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 ;.}..#ifdef SQLI
34f0: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 TE_DEBUG /* sqli
3500: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 te3AssertMayAbor
3510: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a t() logic */../*
3520: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin
3530: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 g type and funct
3540: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 ion are used to
3550: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 iterate through
3560: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 all opcodes.** i
3570: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 n a Vdbe main pr
3580: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f ogram and each o
3590: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 f the sub-progra
35a0: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 ms (triggers) it
35b0: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 may .** invoke
35c0: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 directly or indi
35d0: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c rectly. It shoul
35e0: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c d be used as fol
35f0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 lows:.**.** Op
3600: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 *pOp;.** Vdbe
3610: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a OpIter sIter;.**
3620: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 .** memset(&sI
3630: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 ter, 0, sizeof(s
3640: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 Iter));.** sIt
3650: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 er.v = v;
3660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3670: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 // v is of
3680: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 type Vdbe* .**
3690: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f while( (pOp = o
36a0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 pIterNext(&sIter
36b0: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 )) ){.** //
36c0: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 Do something wit
36d0: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 h pOp.** }.**
36e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
36f0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 v->db, sIter.apS
3700: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 ub);.** .*/.type
3710: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f def struct VdbeO
3720: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 pIter VdbeOpIter
3730: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 ;.struct VdbeOpI
3740: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b ter {. Vdbe *v;
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3760: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 /* Vdbe to it
3770: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 erate through th
3780: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a e opcodes of */.
3790: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 SubProgram **a
37a0: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 pSub; /*
37b0: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 Array of subprog
37c0: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 rams */. int nS
37d0: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ub;
37e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
37f0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 f entries in apS
3800: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 ub */. int iAdd
3810: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
3820: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 /* Address of
3830: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f next instructio
3840: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 n to return */.
3850: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 int iSub;
3860: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 /* 0
3870: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c = main program,
3880: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 1 = first sub-p
3890: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d rogram etc. */.}
38a0: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 ;.static Op *opI
38b0: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 terNext(VdbeOpIt
38c0: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a er *p){. Vdbe *
38d0: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a v = p->v;. Op *
38e0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a pRet = 0;. Op *
38f0: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a aOp;. int nOp;.
3900: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d . if( p->iSub<=
3910: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 p->nSub ){..
3920: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 if( p->iSub==0 )
3930: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d {. aOp = v-
3940: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 >aOp;. nOp
3950: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 = v->nOp;. }e
3960: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d lse{. aOp =
3970: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 p->apSub[p->iSu
3980: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 b-1]->aOp;.
3990: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b nOp = p->apSub[
39a0: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b p->iSub-1]->nOp;
39b0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 . }. asser
39c0: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 t( p->iAddr<nOp
39d0: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 );.. pRet = &
39e0: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 aOp[p->iAddr];.
39f0: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 p->iAddr++;.
3a00: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d if( p->iAddr=
3a10: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d =nOp ){. p-
3a20: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 >iSub++;. p
3a30: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 ->iAddr = 0;.
3a40: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 }. . if( pR
3a50: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 et->p4type==P4_S
3a60: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 UBPROGRAM ){.
3a70: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 int nByte = (
3a80: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f p->nSub+1)*sizeo
3a90: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a f(SubProgram*);.
3aa0: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 int j;.
3ab0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d for(j=0; j<p-
3ac0: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 >nSub; j++){.
3ad0: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 if( p->apSu
3ae0: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 b[j]==pRet->p4.p
3af0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b Program ) break;
3b00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
3b10: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b f( j==p->nSub ){
3b20: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 . p->apSu
3b30: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 b = sqlite3DbRea
3b40: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 llocOrFree(v->db
3b50: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 , p->apSub, nByt
3b60: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 e);. if(
3b70: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 !p->apSub ){.
3b80: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b pRet = 0;
3b90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
3ba0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 p->apS
3bb0: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 ub[p->nSub++] =
3bc0: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 pRet->p4.pProgra
3bd0: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 m;. }.
3be0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a }. }. }..
3bf0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d return pRet;.}
3c00: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 ../*.** Check if
3c10: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f the program sto
3c20: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 red in the VM as
3c30: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 sociated with pP
3c40: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f arse may.** thro
3c50: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 w an ABORT excep
3c60: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 tion (causing th
3c70: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 e statement, but
3c80: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e not entire tran
3c90: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 saction.** to be
3ca0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 rolled back). T
3cb0: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 his condition is
3cc0: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 true if the mai
3cd0: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 n program or any
3ce0: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 .** sub-programs
3cf0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 contains any of
3d00: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a the following:.
3d10: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 **.** * OP_Ha
3d20: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 lt with P1=SQLIT
3d30: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 E_CONSTRAINT and
3d40: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a P2=OE_Abort..**
3d50: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e * OP_HaltIfN
3d60: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 ull with P1=SQLI
3d70: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e TE_CONSTRAINT an
3d80: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a d P2=OE_Abort..*
3d90: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f * * OP_Destro
3da0: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 y.** * OP_VUp
3db0: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f date.** * OP_
3dc0: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 VRename.** *
3dd0: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 OP_FkCounter wit
3de0: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 h P2==0 (immedia
3df0: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 te foreign key c
3e00: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 onstraint).**
3e10: 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72 65 * OP_CreateBtre
3e20: 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 61 e/BTREE_INTKEY a
3e30: 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 nd OP_InitCorout
3e40: 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66 6f ine .** (fo
3e50: 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 41 r CREATE TABLE A
3e60: 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a S SELECT ...).**
3e70: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 .** Then check t
3e80: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 hat the value of
3e90: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 Parse.mayAbort
3ea0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a is true if an.**
3eb0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 ABORT may be th
3ec0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f rown, or false o
3ed0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e therwise. Return
3ee0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 true if it does
3ef0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 .** match, or fa
3f00: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 lse otherwise. T
3f10: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
3f20: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 intended to be u
3f30: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f sed as.** part o
3f40: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 f an assert stat
3f50: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d ement in the com
3f60: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 piler. Similar t
3f70: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 o:.**.** asser
3f80: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 t( sqlite3VdbeAs
3f90: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 sertMayAbort(pPa
3fa0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 rse->pVdbe, pPar
3fb0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b se->mayAbort) );
3fc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
3fd0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 dbeAssertMayAbor
3fe0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d t(Vdbe *v, int m
3ff0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 ayAbort){. int
4000: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 hasAbort = 0;.
4010: 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 int hasFkCounter
4020: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 = 0;. int hasC
4030: 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a reateTable = 0;.
4040: 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 int hasInitCor
4050: 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 outine = 0;. Op
4060: 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 *pOp;. VdbeOpI
4070: 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d ter sIter;. mem
4080: 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 set(&sIter, 0, s
4090: 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 izeof(sIter));.
40a0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 sIter.v = v;..
40b0: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f while( (pOp = o
40c0: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 pIterNext(&sIter
40d0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 ))!=0 ){. int
40e0: 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f opcode = pOp->o
40f0: 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f pcode;. if( o
4100: 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f pcode==OP_Destro
4110: 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f y || opcode==OP_
4120: 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 VUpdate || opcod
4130: 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 e==OP_VRename .
4140: 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d || ((opcode=
4150: 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f =OP_Halt || opco
4160: 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c de==OP_HaltIfNul
4170: 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 l) . && ((p
4180: 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 Op->p1&0xff)==SQ
4190: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 LITE_CONSTRAINT
41a0: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 && pOp->p2==OE_A
41b0: 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 bort)). ){.
41c0: 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 hasAbort = 1
41d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
41e0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 }. if( opc
41f0: 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 74 ode==OP_CreateBt
4200: 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d ree && pOp->p3==
4210: 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 68 BTREE_INTKEY ) h
4220: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 asCreateTable =
4230: 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 1;. if( opcod
4240: 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 e==OP_InitCorout
4250: 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 ine ) hasInitCor
4260: 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e outine = 1;.#ifn
4270: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
4280: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 FOREIGN_KEY.
4290: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 if( opcode==OP_F
42a0: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d kCounter && pOp-
42b0: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 >p1==0 && pOp->p
42c0: 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 2==1 ){. ha
42d0: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a sFkCounter = 1;.
42e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d }.#endif. }
42f0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 . sqlite3DbFree
4300: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 (v->db, sIter.ap
4310: 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 Sub);.. /* Retu
4320: 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 rn true if hasAb
4330: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f ort==mayAbort. O
4340: 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 r if a malloc fa
4350: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a ilure occurred..
4360: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 ** If malloc f
4370: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 ailed, then the
4380: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f while() loop abo
4390: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 ve may not have
43a0: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 iterated. ** th
43b0: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 rough all opcode
43c0: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d s and hasAbort m
43d0: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 ay be set incorr
43e0: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 ectly. Return.
43f0: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 ** true for this
4400: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 case to prevent
4410: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e the assert() in
4420: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 the callers fra
4430: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 me. ** from fai
4440: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 ling. */. retu
4450: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c rn ( v->db->mall
4460: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 ocFailed || hasA
4470: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c bort==mayAbort |
4480: 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 | hasFkCounter.
4490: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 ||
44a0: 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 (hasCreateTable
44b0: 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 && hasInitCorout
44c0: 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 ine) );.}.#endif
44d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 /* SQLITE_DEBUG
44e0: 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 - the sqlite3As
44f0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 sertMayAbort() f
4500: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 23 69 66 64 unction */..#ifd
4510: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
4520: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 /*.** Increment
4530: 74 68 65 20 6e 57 72 69 74 65 20 63 6f 75 6e 74 the nWrite count
4540: 65 72 20 69 6e 20 74 68 65 20 56 44 42 45 20 69 er in the VDBE i
4550: 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 f the cursor is
4560: 6e 6f 74 20 61 6e 0a 2a 2a 20 65 70 68 65 6d 65 not an.** epheme
4570: 72 61 6c 20 63 75 72 73 6f 72 2c 20 6f 72 20 69 ral cursor, or i
4580: 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 72 67 f the cursor arg
4590: 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2e 0a 2a ument is NULL..*
45a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
45b0: 62 65 49 6e 63 72 57 72 69 74 65 43 6f 75 6e 74 beIncrWriteCount
45c0: 65 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 er(Vdbe *p, Vdbe
45d0: 43 75 72 73 6f 72 20 2a 70 43 29 7b 0a 20 20 69 Cursor *pC){. i
45e0: 66 28 20 70 43 3d 3d 30 0a 20 20 20 7c 7c 20 28 f( pC==0. || (
45f0: 70 43 2d 3e 65 43 75 72 54 79 70 65 21 3d 43 55 pC->eCurType!=CU
4600: 52 54 59 50 45 5f 53 4f 52 54 45 52 0a 20 20 20 RTYPE_SORTER.
4610: 20 20 20 20 26 26 20 70 43 2d 3e 65 43 75 72 54 && pC->eCurT
4620: 79 70 65 21 3d 43 55 52 54 59 50 45 5f 50 53 45 ype!=CURTYPE_PSE
4630: 55 44 4f 0a 20 20 20 20 20 20 20 26 26 20 21 70 UDO. && !p
4640: 43 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 29 0a C->isEphemeral).
4650: 20 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 57 72 69 ){. p->nWri
4660: 74 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 te++;. }.}.#end
4670: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 if..#ifdef SQLIT
4680: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 41 73 E_DEBUG./*.** As
4690: 73 65 72 74 20 69 66 20 61 6e 20 41 62 6f 72 74 sert if an Abort
46a0: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 at this point i
46b0: 6e 20 74 69 6d 65 20 6d 69 67 68 74 20 72 65 73 n time might res
46c0: 75 6c 74 20 69 6e 20 61 20 63 6f 72 72 75 70 74 ult in a corrupt
46d0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f .** database..*/
46e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
46f0: 65 41 73 73 65 72 74 41 62 6f 72 74 61 62 6c 65 eAssertAbortable
4700: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 (Vdbe *p){. ass
4710: 65 72 74 28 20 70 2d 3e 6e 57 72 69 74 65 3d 3d ert( p->nWrite==
4720: 30 20 7c 7c 20 70 2d 3e 75 73 65 73 53 74 6d 74 0 || p->usesStmt
4730: 4a 6f 75 72 6e 61 6c 20 29 3b 0a 7d 0a 23 65 6e Journal );.}.#en
4740: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 dif../*.** This
4750: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
4760: 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f d after all opco
4770: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e des have been in
4780: 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 serted. It loop
4790: 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c s.** through all
47a0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 the opcodes and
47b0: 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64 fixes up some d
47c0: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 etails..**.** (1
47d0: 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 ) For each jump
47e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68 instruction with
47f0: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 a negative P2 v
4800: 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a alue (a label).*
4810: 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68 * resolve th
4820: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e e P2 value to an
4830: 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e actual address.
4840: 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 .**.** (2) Compu
4850: 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e te the maximum n
4860: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
4870: 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53 ts used by any S
4880: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 QL function.**
4890: 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61 and store tha
48a0: 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 t value in *pMax
48b0: 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 FuncArgs..**.**
48c0: 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56 (3) Update the V
48d0: 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 dbe.readOnly and
48e0: 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20 Vdbe.bIsReader
48f0: 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74 flags to accurat
4900: 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 ely.** indic
4910: 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65 ate what the pre
4920: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 pared statement
4930: 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a actually does..*
4940: 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c *.** (4) Initial
4950: 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61 ize the p4.xAdva
4960: 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f nce pointer on o
4970: 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20 pcodes that use
4980: 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 it..**.** (5) Re
4990: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 claim the memory
49a0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 allocated for s
49b0: 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a toring labels..*
49c0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
49d0: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 e will only func
49e0: 74 69 6f 6e 20 63 6f 72 72 65 63 74 6c 79 20 69 tion correctly i
49f0: 66 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e f the mkopcodeh.
4a00: 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 0a 2a 2a tcl generator.**
4a10: 20 73 63 72 69 70 74 20 6e 75 6d 62 65 72 73 20 script numbers
4a20: 74 68 65 20 6f 70 63 6f 64 65 73 20 63 6f 72 72 the opcodes corr
4a30: 65 63 74 6c 79 2e 20 20 43 68 61 6e 67 65 73 20 ectly. Changes
4a40: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 to this routine
4a50: 6d 75 73 74 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 must be.** coord
4a60: 69 6e 61 74 65 64 20 77 69 74 68 20 63 68 61 6e inated with chan
4a70: 67 65 73 20 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 ges to mkopcodeh
4a80: 2e 74 63 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 .tcl..*/.static
4a90: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 void resolveP2Va
4aa0: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e lues(Vdbe *p, in
4ab0: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 t *pMaxFuncArgs)
4ac0: 7b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 {. int nMaxArgs
4ad0: 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 = *pMaxFuncArgs
4ae0: 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 ;. Op *pOp;. P
4af0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 arse *pParse = p
4b00: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 ->pParse;. int
4b10: 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 *aLabel = pParse
4b20: 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 ->aLabel;. p->r
4b30: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 eadOnly = 1;. p
4b40: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b ->bIsReader = 0;
4b50: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 . pOp = &p->aOp
4b60: 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 [p->nOp-1];. wh
4b70: 69 6c 65 28 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 ile(1){.. /*
4b80: 4f 6e 6c 79 20 4a 55 4d 50 20 6f 70 63 6f 64 65 Only JUMP opcode
4b90: 73 20 61 6e 64 20 74 68 65 20 73 68 6f 72 74 20 s and the short
4ba0: 6c 69 73 74 20 6f 66 20 73 70 65 63 69 61 6c 20 list of special
4bb0: 6f 70 63 6f 64 65 73 20 69 6e 20 74 68 65 20 73 opcodes in the s
4bc0: 77 69 74 63 68 0a 20 20 20 20 2a 2a 20 62 65 6c witch. ** bel
4bd0: 6f 77 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6f ow need to be co
4be0: 6e 73 69 64 65 72 65 64 2e 20 20 54 68 65 20 6d nsidered. The m
4bf0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e kopcodeh.tcl gen
4c00: 65 72 61 74 6f 72 20 73 63 72 69 70 74 20 67 72 erator script gr
4c10: 6f 75 70 73 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 oups. ** all
4c20: 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 74 6f these opcodes to
4c30: 67 65 74 68 65 72 20 6e 65 61 72 20 74 68 65 20 gether near the
4c40: 66 72 6f 6e 74 20 6f 66 20 74 68 65 20 6f 70 63 front of the opc
4c50: 6f 64 65 20 6c 69 73 74 2e 20 20 53 6b 69 70 0a ode list. Skip.
4c60: 20 20 20 20 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 ** any opcod
4c70: 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 e that does not
4c80: 6e 65 65 64 20 70 72 6f 63 65 73 73 69 6e 67 20 need processing
4c90: 62 79 20 76 69 72 74 75 61 6c 20 6f 66 20 74 68 by virtual of th
4ca0: 65 20 66 61 63 74 20 74 68 61 74 0a 20 20 20 20 e fact that.
4cb0: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 ** it is larger
4cc0: 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 58 5f 4a than SQLITE_MX_J
4cd0: 55 4d 50 5f 4f 50 43 4f 44 45 2c 20 61 73 20 61 UMP_OPCODE, as a
4ce0: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 6f 70 74 performance opt
4cf0: 69 6d 69 7a 61 74 69 6f 6e 2e 0a 20 20 20 20 2a imization.. *
4d00: 2f 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f /. if( pOp->o
4d10: 70 63 6f 64 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 pcode<=SQLITE_MX
4d20: 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 20 29 7b 0a _JUMP_OPCODE ){.
4d30: 20 20 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 /* NOTE: B
4d40: 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 e sure to update
4d50: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77 mkopcodeh.tcl w
4d60: 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 hen adding or re
4d70: 6d 6f 76 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 moving. **
4d80: 63 61 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 cases from this
4d90: 73 77 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 20 switch! */.
4da0: 20 73 77 69 74 63 68 28 20 70 4f 70 2d 3e 6f 70 switch( pOp->op
4db0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 code ){.
4dc0: 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 case OP_Transact
4dd0: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 ion: {.
4de0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 if( pOp->p2!=0
4df0: 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 ) p->readOnly =
4e00: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 0;. /*
4e10: 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 fall thru */.
4e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 }. c
4e30: 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 ase OP_AutoCommi
4e40: 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 t:. case
4e50: 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a OP_Savepoint: {.
4e60: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 p->bIs
4e70: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 Reader = 1;.
4e80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
4e90: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 }.#ifndef S
4ea0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 QLITE_OMIT_WAL.
4eb0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 case OP_C
4ec0: 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 heckpoint:.#endi
4ed0: 66 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f f. case O
4ee0: 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 P_Vacuum:.
4ef0: 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 case OP_Journa
4f00: 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 lMode: {.
4f10: 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d p->readOnly =
4f20: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 0;. p-
4f30: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a >bIsReader = 1;.
4f40: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
4f50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
4f60: 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a case OP_Next:
4f70: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 . case OP
4f80: 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 _SorterNext: {.
4f90: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 pOp->p4
4fa0: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 .xAdvance = sqli
4fb0: 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 te3BtreeNext;.
4fc0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 pOp->p4t
4fd0: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 ype = P4_ADVANCE
4fe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 ;. /* T
4ff0: 68 65 20 63 6f 64 65 20 67 65 6e 65 72 61 74 6f he code generato
5000: 72 20 6e 65 76 65 72 20 63 6f 64 65 73 20 61 6e r never codes an
5010: 79 20 6f 66 20 74 68 65 73 65 20 6f 70 63 6f 64 y of these opcod
5020: 65 73 20 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 es as a jump.
5030: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c ** to a l
5040: 61 62 65 6c 2e 20 20 54 68 65 79 20 61 72 65 20 abel. They are
5050: 61 6c 77 61 79 73 20 63 6f 64 65 64 20 61 73 20 always coded as
5060: 61 20 6a 75 6d 70 20 62 61 63 6b 77 61 72 64 73 a jump backwards
5070: 20 74 6f 20 61 20 0a 20 20 20 20 20 20 20 20 20 to a .
5080: 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 ** known addres
5090: 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 s */. a
50a0: 73 73 65 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d ssert( pOp->p2>=
50b0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 0 );. b
50c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a reak;. }.
50d0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f case OP_
50e0: 50 72 65 76 3a 20 7b 0a 20 20 20 20 20 20 20 20 Prev: {.
50f0: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e pOp->p4.xAdvan
5100: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 ce = sqlite3Btre
5110: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 ePrevious;.
5120: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 pOp->p4type
5130: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 = P4_ADVANCE;.
5140: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
5150: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e code generator n
5160: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f ever codes any o
5170: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 f these opcodes
5180: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 as a jump.
5190: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 ** to a labe
51a0: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 l. They are alw
51b0: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a ays coded as a j
51c0: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f ump backwards to
51d0: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a a . **
51e0: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a known address *
51f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 /. asse
5200: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 rt( pOp->p2>=0 )
5210: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ;. brea
5220: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 k;. }.#if
5230: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
5240: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 _VIRTUALTABLE.
5250: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 case OP_VU
5260: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 pdate: {.
5270: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e if( pOp->p2>n
5280: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 MaxArgs ) nMaxAr
5290: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 gs = pOp->p2;.
52a0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
52b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
52c0: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 case OP_VFilter
52d0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e : {. in
52e0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 t n;. a
52f0: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d ssert( (pOp - p-
5300: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20 >aOp) >= 3 );.
5310: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
5320: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d pOp[-1].opcode==
5330: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 OP_Integer );.
5340: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b n = pOp[
5350: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 -1].p1;.
5360: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 if( n>nMaxArgs
5370: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b ) nMaxArgs = n;
5380: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 . /* Fa
5390: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 ll through into
53a0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65 the default case
53b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 */. }.#e
53c0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66 ndif. def
53d0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 ault: {.
53e0: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20 if( pOp->p2<0
53f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f ){. /
5400: 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e * The mkopcodeh.
5410: 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 tcl script has s
5420: 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 o arranged thing
5430: 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a s that the only.
5440: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e ** n
5450: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 on-jump opcodes
5460: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 less than SQLITE
5470: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 _MX_JUMP_CODE ar
5480: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a e guaranteed to.
5490: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 ** h
54a0: 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 ave non-negative
54b0: 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 values for P2.
54c0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 */. a
54d0: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f ssert( (sqlite3O
54e0: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f pcodeProperty[pO
54f0: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 p->opcode] & OPF
5500: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20 LG_JUMP)!=0 );.
5510: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 asser
5520: 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 t( ADDR(pOp->p2)
5530: 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 <pParse->nLabel
5540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 );. p
5550: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b Op->p2 = aLabel[
5560: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a ADDR(pOp->p2)];.
5570: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
5580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
5590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
55a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 /* The mkop
55b0: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 codeh.tcl script
55c0: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 has so arranged
55d0: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 things that the
55e0: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e only. ** n
55f0: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 on-jump opcodes
5600: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 less than SQLITE
5610: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 _MX_JUMP_CODE ar
5620: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a e guaranteed to.
5630: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f ** have no
5640: 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 n-negative value
5650: 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 s for P2. */.
5660: 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 assert( (sqli
5670: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 te3OpcodePropert
5680: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f y[pOp->opcode]&O
5690: 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c PFLG_JUMP)==0 ||
56a0: 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 pOp->p2>=0);.
56b0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d }. if( pOp=
56c0: 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b =p->aOp ) break;
56d0: 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a . pOp--;. }.
56e0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
56f0: 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 p->db, pParse->a
5700: 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 Label);. pParse
5710: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 ->aLabel = 0;.
5720: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d pParse->nLabel =
5730: 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 0;. *pMaxFuncA
5740: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a rgs = nMaxArgs;.
5750: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 assert( p->bIs
5760: 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d Reader!=0 || DbM
5770: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 askAllZero(p->bt
5780: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f reeMask) );.}../
5790: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
57a0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e address of the n
57b0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 ext instruction
57c0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a to be inserted..
57d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
57e0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 beCurrentAddr(Vd
57f0: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 be *p){. assert
5800: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
5810: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
5820: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a return p->nOp;.
5830: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 }../*.** Verify
5840: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 that at least N
5850: 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 opcode slots are
5860: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 available in p
5870: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e without.** havin
5880: 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 g to malloc for
5890: 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65 more space (exce
58a0: 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 pt when compiled
58b0: 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 using.** SQLITE
58c0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 _TEST_REALLOC_ST
58d0: 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 RESS). This int
58e0: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64 erface is used d
58f0: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a uring testing.**
5900: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 to verify that
5910: 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f certain calls to
5920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
5930: 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 pList() can neve
5940: 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f r.** fail due to
5950: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 a OOM fault and
5960: 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 hence that the
5970: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f return value fro
5980: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 m.** sqlite3Vdbe
5990: 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c AddOpList() will
59a0: 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e always be non-N
59b0: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 ULL..*/.#if defi
59c0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
59d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 ) && !defined(SQ
59e0: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f LITE_TEST_REALLO
59f0: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 C_STRESS).void s
5a00: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 qlite3VdbeVerify
5a10: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 NoMallocRequired
5a20: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 (Vdbe *p, int N)
5a30: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e {. assert( p->n
5a40: 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 Op + N <= p->pPa
5a50: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b rse->nOpAlloc );
5a60: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a .}.#endif../*.**
5a70: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 Verify that the
5a80: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68 VM passed as th
5a90: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 e only argument
5aa0: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e does not contain
5ab0: 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 .** an OP_Result
5ac0: 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c Row opcode. Fail
5ad0: 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20 an assert() if
5ae0: 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73 it does. This is
5af0: 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65 used.** by code
5b00: 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20 in pragma.c to
5b10: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 ensure that the
5b20: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f implementation o
5b30: 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61 f certain.** pra
5b40: 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69 gmas comports wi
5b50: 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65 th the flags spe
5b60: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b cified in the mk
5b70: 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a pragmatab.tcl.**
5b80: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20 script..*/.#if
5b90: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 defined(SQLITE_D
5ba0: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 EBUG) && !define
5bb0: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 d(SQLITE_TEST_RE
5bc0: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f ALLOC_STRESS).vo
5bd0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 id sqlite3VdbeVe
5be0: 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 rifyNoResultRow(
5bf0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 Vdbe *p){. int
5c00: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c i;. for(i=0; i<
5c10: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 p->nOp; i++){.
5c20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 assert( p->aOp
5c30: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 [i].opcode!=OP_R
5c40: 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a esultRow );. }.
5c50: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 }.#endif../*.**
5c60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 28 61 Generate code (a
5c70: 20 73 69 6e 67 6c 65 20 4f 50 5f 41 62 6f 72 74 single OP_Abort
5c80: 61 62 6c 65 20 6f 70 63 6f 64 65 29 20 74 68 61 able opcode) tha
5c90: 74 20 77 69 6c 6c 0a 2a 2a 20 76 65 72 69 66 79 t will.** verify
5ca0: 20 74 68 61 74 20 74 68 65 20 56 44 42 45 20 70 that the VDBE p
5cb0: 72 6f 67 72 61 6d 20 63 61 6e 20 73 61 66 65 6c rogram can safel
5cc0: 79 20 63 61 6c 6c 20 41 62 6f 72 74 20 69 6e 20 y call Abort in
5cd0: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 the current.** c
5ce0: 6f 6e 74 65 78 74 2e 0a 2a 2f 0a 23 69 66 20 64 ontext..*/.#if d
5cf0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 efined(SQLITE_DE
5d00: 42 55 47 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 BUG).void sqlite
5d10: 33 56 64 62 65 56 65 72 69 66 79 41 62 6f 72 74 3VdbeVerifyAbort
5d20: 61 62 6c 65 28 56 64 62 65 20 2a 70 2c 20 69 6e able(Vdbe *p, in
5d30: 74 20 6f 6e 45 72 72 6f 72 29 7b 0a 20 20 69 66 t onError){. if
5d40: 28 20 6f 6e 45 72 72 6f 72 3d 3d 4f 45 5f 41 62 ( onError==OE_Ab
5d50: 6f 72 74 20 29 20 73 71 6c 69 74 65 33 56 64 62 ort ) sqlite3Vdb
5d60: 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 41 62 eAddOp0(p, OP_Ab
5d70: 6f 72 74 61 62 6c 65 29 3b 0a 7d 0a 23 65 6e 64 ortable);.}.#end
5d80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 if../*.** This f
5d90: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 unction returns
5da0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 a pointer to the
5db0: 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 array of opcode
5dc0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 s associated wit
5dd0: 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 h.** the Vdbe pa
5de0: 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 ssed as the firs
5df0: 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 t argument. It i
5e00: 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 s the callers re
5e10: 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 sponsibility.**
5e20: 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 to arrange for t
5e30: 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 he returned arra
5e40: 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c y to be eventual
5e50: 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 ly freed using t
5e60: 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f he .** vdbeFreeO
5e70: 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f pArray() functio
5e80: 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 n..**.** Before
5e90: 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 returning, *pnOp
5ea0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e is set to the n
5eb0: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 umber of entries
5ec0: 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 in the returned
5ed0: 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c .** array. Also,
5ee0: 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 *pnMaxArg is se
5ef0: 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 t to the larger
5f00: 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 of its current v
5f10: 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 alue and .** the
5f20: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 number of entri
5f30: 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 es in the Vdbe.a
5f40: 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 pArg[] array req
5f50: 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 uired to execute
5f60: 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 the .** returne
5f70: 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 d program..*/.Vd
5f80: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 beOp *sqlite3Vdb
5f90: 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 eTakeOpArray(Vdb
5fa0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c e *p, int *pnOp,
5fb0: 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b int *pnMaxArg){
5fc0: 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d . VdbeOp *aOp =
5fd0: 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 p->aOp;. asser
5fe0: 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 t( aOp && !p->db
5ff0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
6000: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 ;.. /* Check th
6010: 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 at sqlite3VdbeUs
6020: 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f esBtree() was no
6030: 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 t called on this
6040: 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 VM */. assert(
6050: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 DbMaskAllZero(p
6060: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a ->btreeMask) );.
6070: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 . resolveP2Valu
6080: 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b es(p, pnMaxArg);
6090: 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f . *pnOp = p->nO
60a0: 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b p;. p->aOp = 0;
60b0: 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d . return aOp;.}
60c0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 ../*.** Add a wh
60d0: 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 ole list of oper
60e0: 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 ations to the op
60f0: 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 eration stack.
6100: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e Return a.** poin
6110: 74 65 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 ter to the first
6120: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 operation inser
6130: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a ted..**.** Non-z
6140: 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73 ero P2 arguments
6150: 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 to jump instruc
6160: 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61 tions are automa
6170: 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64 tically adjusted
6180: 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 .** so that the
6190: 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73 20 72 jump target is r
61a0: 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20 66 elative to the f
61b0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 irst operation i
61c0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 nserted..*/.Vdbe
61d0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 Op *sqlite3VdbeA
61e0: 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65 ddOpList(. Vdbe
61f0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
6200: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 /* Add
6210: 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70 opcodes to the p
6220: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
6230: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 t */. int nOp,
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6250: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
6260: 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20 opcodes to add
6270: 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20 */. VdbeOpList
6280: 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20 const *aOp,
6290: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 /* The opcodes
62a0: 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a to be added */.
62b0: 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20 int iLineno
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
62d0: 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69 * Source-file li
62e0: 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 ne number of fir
62f0: 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a st opcode */.){.
6300: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f int i;. VdbeO
6310: 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74 p *pOut, *pFirst
6320: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e ;. assert( nOp>
6330: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
6340: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
6350: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 GIC_INIT );. if
6360: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e ( p->nOp + nOp >
6370: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 p->pParse->nOpA
6380: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 lloc && growOpAr
6390: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 ray(p, nOp) ){.
63a0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
63b0: 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74 . pFirst = pOut
63c0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f = &p->aOp[p->nO
63d0: 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 p];. for(i=0; i
63e0: 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b <nOp; i++, aOp++
63f0: 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 , pOut++){. p
6400: 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f Out->opcode = aO
6410: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 p->opcode;. p
6420: 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 Out->p1 = aOp->p
6430: 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 1;. pOut->p2
6440: 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 = aOp->p2;. a
6450: 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d ssert( aOp->p2>=
6460: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 0 );. if( (sq
6470: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 lite3OpcodePrope
6480: 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d rty[aOp->opcode]
6490: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d & OPFLG_JUMP)!=
64a0: 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 0 && aOp->p2>0 )
64b0: 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 {. pOut->p2
64c0: 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 += p->nOp;.
64d0: 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d }. pOut->p3 =
64e0: 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f aOp->p3;. pO
64f0: 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f ut->p4type = P4_
6500: 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 NOTUSED;. pOu
6510: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 t->p4.p = 0;.
6520: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 pOut->p5 = 0;.#
6530: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
6540: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d BLE_EXPLAIN_COMM
6550: 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a ENTS. pOut->z
6560: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e Comment = 0;.#en
6570: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 dif.#ifdef SQLIT
6580: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a E_VDBE_COVERAGE.
6590: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 pOut->iSrcLi
65a0: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a ne = iLineno+i;.
65b0: 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 #else. (void)
65c0: 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a iLineno;.#endif.
65d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
65e0: 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 BUG. if( p->d
65f0: 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 b->flags & SQLIT
6600: 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 E_VdbeAddopTrace
6610: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
6620: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 3VdbePrintOp(0,
6630: 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f i+p->nOp, &p->aO
6640: 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 p[i+p->nOp]);.
6650: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 }.#endif. }.
6660: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a p->nOp += nOp;.
6670: 20 20 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b return pFirst;
6680: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 .}..#if defined(
6690: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 SQLITE_ENABLE_ST
66a0: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f MT_SCANSTATUS)./
66b0: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 *.** Add an entr
66c0: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f y to the array o
66d0: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 f counters manag
66e0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 ed by sqlite3_st
66f0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e mt_scanstatus().
6700: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
6710: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a VdbeScanStatus(.
6720: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 Vdbe *p,
6730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6740: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 /* VM to add s
6750: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a canstatus() to *
6760: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c /. int addrExpl
6770: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 ain,
6780: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f /* Address o
6790: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 f OP_Explain (or
67a0: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 0) */. int add
67b0: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 rLoop,
67c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 /* Addr
67d0: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e ess of loop coun
67e0: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 ter */ . int ad
67f0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 drVisit,
6800: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 /* Add
6810: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 ress of rows vis
6820: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a ited counter */.
6830: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 LogEst nEst,
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6850: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e /* Estimated n
6860: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 umber of output
6870: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 rows */. const
6880: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 char *zName
6890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d /* Nam
68a0: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e e of table or in
68b0: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 dex being scanne
68c0: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 d */.){. int nB
68d0: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b yte = (p->nScan+
68e0: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e 1) * sizeof(Scan
68f0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53 Status);. ScanS
6900: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61 tatus *aNew;. a
6910: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75 New = (ScanStatu
6920: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c s*)sqlite3DbReal
6930: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 loc(p->db, p->aS
6940: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 can, nByte);. i
6950: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53 f( aNew ){. S
6960: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20 canStatus *pNew
6970: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e = &aNew[p->nScan
6980: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 ++];. pNew->a
6990: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64 ddrExplain = add
69a0: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e rExplain;. pN
69b0: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61 ew->addrLoop = a
69c0: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 ddrLoop;. pNe
69d0: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61 w->addrVisit = a
69e0: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e ddrVisit;. pN
69f0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b ew->nEst = nEst;
6a00: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 . pNew->zName
6a10: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 = sqlite3DbStrD
6a20: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 up(p->db, zName)
6a30: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d ;. p->aScan =
6a40: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e aNew;. }.}.#en
6a50: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e dif.../*.** Chan
6a60: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 ge the value of
6a70: 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50 the opcode, or P
6a80: 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35 1, P2, P3, or P5
6a90: 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 operands.** for
6aa0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 a specific inst
6ab0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 ruction..*/.void
6ac0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
6ad0: 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 geOpcode(Vdbe *p
6ae0: 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38 20 69 , u32 addr, u8 i
6af0: 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71 NewOpcode){. sq
6b00: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 lite3VdbeGetOp(p
6b10: 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d ,addr)->opcode =
6b20: 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 iNewOpcode;.}.v
6b30: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 oid sqlite3VdbeC
6b40: 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c hangeP1(Vdbe *p,
6b50: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 u32 addr, int v
6b60: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 al){. sqlite3Vd
6b70: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d beGetOp(p,addr)-
6b80: 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 >p1 = val;.}.voi
6b90: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 d sqlite3VdbeCha
6ba0: 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 ngeP2(Vdbe *p, u
6bb0: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 32 addr, int val
6bc0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 ){. sqlite3Vdbe
6bd0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 GetOp(p,addr)->p
6be0: 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 2 = val;.}.void
6bf0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
6c00: 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 eP3(Vdbe *p, u32
6c10: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b addr, int val){
6c20: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 . sqlite3VdbeGe
6c30: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20 tOp(p,addr)->p3
6c40: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 = val;.}.void sq
6c50: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 lite3VdbeChangeP
6c60: 35 28 56 64 62 65 20 2a 70 2c 20 75 31 36 20 70 5(Vdbe *p, u16 p
6c70: 35 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 5){. assert( p-
6c80: 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 64 62 2d >nOp>0 || p->db-
6c90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b >mallocFailed );
6ca0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 . if( p->nOp>0
6cb0: 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d ) p->aOp[p->nOp-
6cc0: 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 1].p5 = p5;.}../
6cd0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 *.** Change the
6ce0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e P2 operand of in
6cf0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73 struction addr s
6d00: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 o that it points
6d10: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 to.** the addre
6d20: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 ss of the next i
6d30: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 nstruction to be
6d40: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 coded..*/.void
6d50: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48 sqlite3VdbeJumpH
6d60: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 ere(Vdbe *p, int
6d70: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65 addr){. sqlite
6d80: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 3VdbeChangeP2(p,
6d90: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a addr, p->nOp);.
6da0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 }.../*.** If the
6db0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 input FuncDef s
6dc0: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65 tructure is ephe
6dd0: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 meral, then free
6de0: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 it. If.** the
6df0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 FuncDef is not e
6e00: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f phermal, then do
6e10: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 nothing..*/.sta
6e20: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 tic void freeEph
6e30: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 emeralFunction(s
6e40: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 qlite3 *db, Func
6e50: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 Def *pDef){. if
6e60: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 ( (pDef->funcFla
6e70: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 gs & SQLITE_FUNC
6e80: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 _EPHEM)!=0 ){.
6e90: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e sqlite3DbFreeN
6ea0: 4e 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d N(db, pDef);. }
6eb0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .}..static void
6ec0: 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 vdbeFreeOpArray(
6ed0: 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c sqlite3 *, Op *,
6ee0: 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 int);../*.** De
6ef0: 6c 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 lete a P4 value
6f00: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f if necessary..*/
6f10: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e .static SQLITE_N
6f20: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 OINLINE void fre
6f30: 65 50 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a eP4Mem(sqlite3 *
6f40: 64 62 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 db, Mem *p){. i
6f50: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 f( p->szMalloc )
6f60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
6f70: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a b, p->zMalloc);.
6f80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e sqlite3DbFreeN
6f90: 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 N(db, p);.}.stat
6fa0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 ic SQLITE_NOINLI
6fb0: 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 46 75 NE void freeP4Fu
6fc0: 6e 63 43 74 78 28 73 71 6c 69 74 65 33 20 2a 64 ncCtx(sqlite3 *d
6fd0: 62 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 b, sqlite3_conte
6fe0: 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 45 70 xt *p){. freeEp
6ff0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 hemeralFunction(
7000: 64 62 2c 20 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 db, p->pFunc);.
7010: 73 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 sqlite3DbFreeNN(
7020: 64 62 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 db, p);.}.static
7030: 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c void freeP4(sql
7040: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 ite3 *db, int p4
7050: 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b type, void *p4){
7060: 0a 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b . assert( db );
7070: 0a 20 20 73 77 69 74 63 68 28 20 70 34 74 79 70 . switch( p4typ
7080: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 e ){. case P4
7090: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 _FUNCCTX: {.
70a0: 20 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 freeP4FuncCtx(
70b0: 64 62 2c 20 28 73 71 6c 69 74 65 33 5f 63 6f 6e db, (sqlite3_con
70c0: 74 65 78 74 2a 29 70 34 29 3b 0a 20 20 20 20 20 text*)p4);.
70d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
70e0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a case P4_REAL:.
70f0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 case P4_INT6
7100: 34 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 44 4:. case P4_D
7110: 59 4e 41 4d 49 43 3a 0a 20 20 20 20 63 61 73 65 YNAMIC:. case
7120: 20 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 P4_DYNBLOB:.
7130: 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 case P4_INTARRA
7140: 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 Y: {. sqlit
7150: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 e3DbFree(db, p4)
7160: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
7170: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 }. case P4
7180: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 _KEYINFO: {.
7190: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 if( db->pnByte
71a0: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 sFreed==0 ) sqli
71b0: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 te3KeyInfoUnref(
71c0: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 (KeyInfo*)p4);.
71d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
71e0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f }.#ifdef SQLITE_
71f0: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 ENABLE_CURSOR_HI
7200: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f NTS. case P4_
7210: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 EXPR: {. sq
7220: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 lite3ExprDelete(
7230: 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a db, (Expr*)p4);.
7240: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
7250: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 }.#endif. ca
7260: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b se P4_FUNCDEF: {
7270: 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d . freeEphem
7280: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c eralFunction(db,
7290: 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a (FuncDef*)p4);.
72a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
72b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d }. case P4_M
72c0: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 EM: {. if(
72d0: 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 db->pnBytesFreed
72e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 ==0 ){. s
72f0: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 qlite3ValueFree(
7300: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 (sqlite3_value*)
7310: 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 p4);. }else
7320: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34 {. freeP4
7330: 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 Mem(db, (Mem*)p4
7340: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
7350: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
7360: 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a case P4_VTAB :
7370: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d {. if( db-
7380: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 >pnBytesFreed==0
7390: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e ) sqlite3VtabUn
73a0: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 lock((VTable *)p
73b0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 4);. break;
73c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a . }. }.}../*
73d0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 .** Free the spa
73e0: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 ce allocated for
73f0: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 aOp and any p4
7400: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 values allocated
7410: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f for the.** opco
7420: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 des contained wi
7430: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 thin. If aOp is
7440: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 not NULL it is a
7450: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 ssumed to contai
7460: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 n .** nOp entrie
7470: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f s. .*/.static vo
7480: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 id vdbeFreeOpArr
7490: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 ay(sqlite3 *db,
74a0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 Op *aOp, int nOp
74b0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a ){. if( aOp ){.
74c0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 Op *pOp;.
74d0: 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e 4f for(pOp=&aOp[nO
74e0: 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b 20 p-1]; pOp>=aOp;
74f0: 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 pOp--){. if
7500: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c 3d ( pOp->p4type <=
7510: 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20 29 P4_FREE_IF_LE )
7520: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d freeP4(db, pOp-
7530: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 >p4type, pOp->p4
7540: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 .p);.#ifdef SQLI
7550: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 TE_ENABLE_EXPLAI
7560: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 N_COMMENTS.
7570: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
7580: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 b, pOp->zComment
7590: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 );.#endif .
75a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
75b0: 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f 70 DbFreeNN(db, aOp
75c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 );. }.}../*.**
75d0: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67 Link the SubProg
75e0: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65 ram object passe
75f0: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 d as the second
7600: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68 argument into th
7610: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 e linked.** list
7620: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f at Vdbe.pSubPro
7630: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20 gram. This list
7640: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74 is used to delet
7650: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61 e all sub-progra
7660: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65 m.** objects whe
7670: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c n the VM is no l
7680: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a onger required..
7690: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
76a0: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61 dbeLinkSubProgra
76b0: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53 m(Vdbe *pVdbe, S
76c0: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 ubProgram *p){.
76d0: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62 p->pNext = pVdb
76e0: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70 e->pProgram;. p
76f0: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d Vdbe->pProgram =
7700: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 p;.}../*.** Cha
7710: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61 nge the opcode a
7720: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e t addr into OP_N
7730: 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 oop.*/.int sqlit
7740: 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f e3VdbeChangeToNo
7750: 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 op(Vdbe *p, int
7760: 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 20 addr){. VdbeOp
7770: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 64 *pOp;. if( p->d
7780: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
7790: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 73 ) return 0;. as
77a0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 26 sert( addr>=0 &&
77b0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a addr<p->nOp );.
77c0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b pOp = &p->aOp[
77d0: 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 addr];. freeP4(
77e0: 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 p->db, pOp->p4ty
77f0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a pe, pOp->p4.p);.
7800: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 pOp->p4type =
7810: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 4f P4_NOTUSED;. pO
7820: 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 70 p->p4.z = 0;. p
7830: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f Op->opcode = OP_
7840: 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 31 Noop;. return 1
7850: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 ;.}../*.** If th
7860: 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 73 e last opcode is
7870: 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 20 "op" and it is
7880: 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 69 not a jump desti
7890: 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 nation,.** then
78a0: 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 75 remove it. Retu
78b0: 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 6f rn true if and o
78c0: 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 nly if an opcode
78d0: 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f was removed..*/
78e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
78f0: 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 DeletePriorOpcod
7900: 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 e(Vdbe *p, u8 op
7910: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e ){. if( p->nOp>
7920: 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 0 && p->aOp[p->n
7930: 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 Op-1].opcode==op
7940: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 ){. return s
7950: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
7960: 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 ToNoop(p, p->nOp
7970: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 -1);. }else{.
7980: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
7990: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 }../*.** Change
79a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 the value of the
79b0: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 P4 operand for
79c0: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 a specific instr
79d0: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 uction..** This
79e0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 routine is usefu
79f0: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 l when a large p
7a00: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 rogram is loaded
7a10: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 from a.** stati
7a20: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 c array using sq
7a30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 lite3VdbeAddOpLi
7a40: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 st but we want t
7a50: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 o make a.** few
7a60: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f minor changes to
7a70: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a the program..**
7a80: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e .** If n>=0 then
7a90: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 the P4 operand
7aa0: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e is dynamic, mean
7ab0: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 ing that a copy
7ac0: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 of.** the string
7ad0: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 is made into me
7ae0: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 mory obtained fr
7af0: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f om sqlite3_mallo
7b00: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 c()..** A value
7b10: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f of n==0 means co
7b20: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 py bytes of zP4
7b30: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 up to and includ
7b40: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 ing the.** first
7b50: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 null byte. If
7b60: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b n>0 then copy n+
7b70: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 1 bytes of zP4..
7b80: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c ** .** Other val
7b90: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 ues of n (P4_STA
7ba0: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 TIC, P4_COLLSEQ
7bb0: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 etc.) indicate t
7bc0: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a hat zP4 points.*
7bd0: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 * to a string or
7be0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 structure that
7bf0: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f is guaranteed to
7c00: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c exist for the l
7c10: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 ifetime of.** th
7c20: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 e Vdbe. In these
7c30: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 cases we can ju
7c40: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e st copy the poin
7c50: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 ter..**.** If ad
7c60: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 dr<0 then change
7c70: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 P4 on the most
7c80: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 recently inserte
7c90: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a d instruction..*
7ca0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 /.static void SQ
7cb0: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 LITE_NOINLINE vd
7cc0: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a beChangeP4Full(.
7cd0: 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 Vdbe *p,. Op
7ce0: 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 *pOp,. const ch
7cf0: 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e ar *zP4,. int n
7d00: 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 .){. if( pOp->p
7d10: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 4type ){. fre
7d20: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e eP4(p->db, pOp->
7d30: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e p4type, pOp->p4.
7d40: 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 p);. pOp->p4t
7d50: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 ype = 0;. pOp
7d60: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a ->p4.p = 0;. }.
7d70: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 if( n<0 ){.
7d80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
7d90: 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f geP4(p, (int)(pO
7da0: 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 p - p->aOp), zP4
7db0: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 , n);. }else{.
7dc0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 if( n==0 ) n
7dd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 = sqlite3Strlen3
7de0: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 0(zP4);. pOp-
7df0: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 >p4.z = sqlite3D
7e00: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 bStrNDup(p->db,
7e10: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 zP4, n);. pOp
7e20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 ->p4type = P4_DY
7e30: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 NAMIC;. }.}.voi
7e40: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 d sqlite3VdbeCha
7e50: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 ngeP4(Vdbe *p, i
7e60: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 nt addr, const c
7e70: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 har *zP4, int n)
7e80: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 {. Op *pOp;. s
7e90: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 qlite3 *db;. as
7ea0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 sert( p!=0 );.
7eb0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 db = p->db;. as
7ec0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
7ed0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
7ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
7ef0: 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 aOp!=0 || db->ma
7f00: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 llocFailed );.
7f10: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 if( db->mallocFa
7f20: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 iled ){. if(
7f30: 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 n!=P4_VTAB ) fre
7f40: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 eP4(db, n, (void
7f50: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 *)*(char**)&zP4)
7f60: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 ;. return;.
7f70: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e }. assert( p->n
7f80: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 Op>0 );. assert
7f90: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b ( addr<p->nOp );
7fa0: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b . if( addr<0 ){
7fb0: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e . addr = p->n
7fc0: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f Op - 1;. }. pO
7fd0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 p = &p->aOp[addr
7fe0: 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c ];. if( n>=0 ||
7ff0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a pOp->p4type ){.
8000: 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 vdbeChangeP4
8010: 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 Full(p, pOp, zP4
8020: 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e , n);. return
8030: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 ;. }. if( n==P
8040: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 4_INT32 ){. /
8050: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 * Note: this cas
8060: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 t is safe, becau
8070: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 se the origin da
8080: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 ta point was an
8090: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 int. ** that
80a0: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 was cast to a (c
80b0: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f onst char *). */
80c0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d . pOp->p4.i =
80d0: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 SQLITE_PTR_TO_I
80e0: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 NT(zP4);. pOp
80f0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e ->p4type = P4_IN
8100: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 T32;. }else if(
8110: 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 zP4!=0 ){. a
8120: 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 ssert( n<0 );.
8130: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 pOp->p4.p = (v
8140: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f oid*)zP4;. pO
8150: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 p->p4type = (sig
8160: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 ned char)n;.
8170: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 if( n==P4_VTAB )
8180: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b sqlite3VtabLock
8190: 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a ((VTable*)zP4);.
81a0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 }.}../*.** Cha
81b0: 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72 61 nge the P4 opera
81c0: 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 nd of the most r
81d0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e ecently coded in
81e0: 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 6f struction .** to
81f0: 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69 6e the value defin
8200: 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d 65 ed by the argume
8210: 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61 20 nts. This is a
8220: 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 65 high-speed.** ve
8230: 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 rsion of sqlite3
8240: 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e 0a VdbeChangeP4()..
8250: 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 65 **.** The P4 ope
8260: 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 61 rand must not ha
8270: 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 ve been previous
8280: 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e 64 ly defined. And
8290: 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 6d the new.** P4 m
82a0: 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 4e ust not be P4_IN
82b0: 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74 65 T32. Use sqlite
82c0: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 20 3VdbeChangeP4()
82d0: 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a 20 in either of.**
82e0: 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f 0a those cases..*/.
82f0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
8300: 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a 70 AppendP4(Vdbe *p
8310: 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e 74 , void *pP4, int
8320: 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 n){. VdbeOp *p
8330: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 21 Op;. assert( n!
8340: 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 3d =P4_INT32 && n!=
8350: 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 73 P4_VTAB );. ass
8360: 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 69 ert( n<=0 );. i
8370: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 f( p->db->malloc
8380: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 72 Failed ){. fr
8390: 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 70 eeP4(p->db, n, p
83a0: 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 P4);. }else{.
83b0: 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d 30 assert( pP4!=0
83c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
83d0: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 p->nOp>0 );.
83e0: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d pOp = &p->aOp[p-
83f0: 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 73 >nOp-1];. ass
8400: 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 ert( pOp->p4type
8410: 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b 0a ==P4_NOTUSED );.
8420: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 pOp->p4type
8430: 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 = n;. pOp->p4
8440: 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 0a .p = pP4;. }.}.
8450: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 ./*.** Set the P
8460: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 4 on the most re
8470: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 cently added opc
8480: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e ode to the KeyIn
8490: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e fo for the.** in
84a0: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f dex given..*/.vo
84b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 id sqlite3VdbeSe
84c0: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 tP4KeyInfo(Parse
84d0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 *pParse, Index
84e0: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a *pIdx){. Vdbe *
84f0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 v = pParse->pVdb
8500: 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b e;. KeyInfo *pK
8510: 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 74 eyInfo;. assert
8520: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 ( v!=0 );. asse
8530: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 rt( pIdx!=0 );.
8540: 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c 69 pKeyInfo = sqli
8550: 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 te3KeyInfoOfInde
8560: 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 3b x(pParse, pIdx);
8570: 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 . if( pKeyInfo
8580: 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 70 ) sqlite3VdbeApp
8590: 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e 66 endP4(v, pKeyInf
85a0: 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a o, P4_KEYINFO);.
85b0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }..#ifdef SQLITE
85c0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
85d0: 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 COMMENTS./*.** C
85e0: 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e hange the commen
85f0: 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 t on the most re
8600: 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 cently coded ins
8610: 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a truction. Or.**
8620: 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 insert a No-op
8630: 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d and add the comm
8640: 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 ent to that new
8650: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 instruction. Th
8660: 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 is.** makes the
8670: 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 code easier to r
8680: 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 ead during debug
8690: 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 ging. None of t
86a0: 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 his happens.** i
86b0: 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 n a production b
86c0: 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 uild..*/.static
86d0: 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e void vdbeVCommen
86e0: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 t(Vdbe *p, const
86f0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
8700: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 va_list ap){. a
8710: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 ssert( p->nOp>0
8720: 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a || p->aOp==0 );.
8730: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 assert( p->aOp
8740: 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d ==0 || p->aOp[p-
8750: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 >nOp-1].zComment
8760: 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 ==0 || p->db->ma
8770: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 llocFailed );.
8780: 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 if( p->nOp ){.
8790: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 assert( p->aOp
87a0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 );. sqlite3D
87b0: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e bFree(p->db, p->
87c0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 aOp[p->nOp-1].zC
87d0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e omment);. p->
87e0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 aOp[p->nOp-1].zC
87f0: 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 omment = sqlite3
8800: 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 VMPrintf(p->db,
8810: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 zFormat, ap);.
8820: 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 }.}.void sqlite3
8830: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 VdbeComment(Vdbe
8840: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 *p, const char
8850: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a *zFormat, ...){.
8860: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 va_list ap;.
8870: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f if( p ){. va_
8880: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
8890: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d t);. vdbeVCom
88a0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c ment(p, zFormat,
88b0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 ap);. va_end
88c0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 (ap);. }.}.void
88d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 sqlite3VdbeNoop
88e0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c Comment(Vdbe *p,
88f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f const char *zFo
8900: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 rmat, ...){. va
8910: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 _list ap;. if(
8920: 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 p ){. sqlite3
8930: 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 VdbeAddOp0(p, OP
8940: 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 _Noop);. va_s
8950: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 tart(ap, zFormat
8960: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d );. vdbeVComm
8970: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 ent(p, zFormat,
8980: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 ap);. va_end(
8990: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 ap);. }.}.#endi
89a0: 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a f /* NDEBUG */.
89b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 .#ifdef SQLITE_V
89c0: 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a DBE_COVERAGE./*.
89d0: 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 ** Set the value
89e0: 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 if the iSrcLine
89f0: 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 field for the p
8a00: 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 reviously coded
8a10: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a instruction..*/.
8a20: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
8a30: 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 SetLineNumber(Vd
8a40: 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 be *v, int iLine
8a50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 ){. sqlite3Vdbe
8a60: 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 GetOp(v,-1)->iSr
8a70: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d cLine = iLine;.}
8a80: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
8a90: 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 E_VDBE_COVERAGE
8aa0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e */../*.** Return
8ab0: 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 the opcode for
8ac0: 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e a given address.
8ad0: 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 If the address
8ae0: 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 is -1, then.**
8af0: 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 return the most
8b00: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 recently inserte
8b10: 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 d opcode..**.**
8b20: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f If a memory allo
8b30: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 cation error has
8b40: 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 occurred prior
8b50: 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f to the calling o
8b60: 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e f this.** routin
8b70: 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 e, then a pointe
8b80: 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 r to a dummy Vdb
8b90: 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 eOp will be retu
8ba0: 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f rned. That opco
8bb0: 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c de.** is readabl
8bc0: 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 e but not writab
8bd0: 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 le, though it is
8be0: 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 cast to a writa
8bf0: 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 ble value..** Th
8c00: 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 e return of a du
8c10: 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 mmy opcode allow
8c20: 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f s the call to co
8c30: 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 ntinue functioni
8c40: 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f ng.** after an O
8c50: 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 OM fault without
8c60: 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b having to check
8c70: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 to see if the r
8c80: 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 eturn from .** t
8c90: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 his routine is a
8ca0: 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 valid pointer.
8cb0: 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 But because the
8cc0: 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 dummy.opcode is
8cd0: 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 0,.** dummy wil
8ce0: 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 l never be writt
8cf0: 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 en to. This is
8d00: 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 verified by code
8d10: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a inspection and.
8d20: 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 ** by running wi
8d30: 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a th Valgrind..*/.
8d40: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 VdbeOp *sqlite3V
8d50: 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 dbeGetOp(Vdbe *p
8d60: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f , int addr){. /
8d70: 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 * C89 specifies
8d80: 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e that the constan
8d90: 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 t "dummy" will b
8da0: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f e initialized to
8db0: 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c all. ** zeros,
8dc0: 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 which is correc
8dd0: 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 t. MSVC generat
8de0: 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 es a warning, ne
8df0: 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 vertheless. */.
8e00: 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 static VdbeOp d
8e10: 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 ummy; /* Ignore
8e20: 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e the MSVC warnin
8e30: 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 g about no initi
8e40: 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 alizer */. asse
8e50: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 rt( p->magic==VD
8e60: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b BE_MAGIC_INIT );
8e70: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b . if( addr<0 ){
8e80: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e . addr = p->n
8e90: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 Op - 1;. }. as
8ea0: 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 sert( (addr>=0 &
8eb0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c & addr<p->nOp) |
8ec0: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 | p->db->mallocF
8ed0: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 ailed );. if( p
8ee0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ->db->mallocFail
8ef0: 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e ed ){. return
8f00: 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 (VdbeOp*)&dummy
8f10: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 ;. }else{. r
8f20: 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 eturn &p->aOp[ad
8f30: 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 dr];. }.}..#if
8f40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 defined(SQLITE_E
8f50: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f NABLE_EXPLAIN_CO
8f60: 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 MMENTS)./*.** Re
8f70: 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 turn an integer
8f80: 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 value for one of
8f90: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 the parameters
8fa0: 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f to the opcode pO
8fb0: 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 p.** determined
8fc0: 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a by character c..
8fd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 */.static int tr
8fe0: 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c anslateP(char c,
8ff0: 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b const Op *pOp){
9000: 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 . if( c=='1' )
9010: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a return pOp->p1;.
9020: 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 if( c=='2' ) r
9030: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 eturn pOp->p2;.
9040: 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 if( c=='3' ) re
9050: 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 turn pOp->p3;.
9060: 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 if( c=='4' ) ret
9070: 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 urn pOp->p4.i;.
9080: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b return pOp->p5;
9090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 .}../*.** Comput
90a0: 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 e a string for t
90b0: 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 he "comment" fie
90c0: 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 ld of a VDBE opc
90d0: 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a ode listing..**.
90e0: 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a ** The Synopsis:
90f0: 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e field in commen
9100: 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 ts in the vdbe.c
9110: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 source file get
9120: 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 s converted.** t
9130: 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e o an extra strin
9140: 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 g that is append
9150: 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 ed to the sqlite
9160: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 3OpcodeName().
9170: 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 In the.** absenc
9180: 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 e of other comme
9190: 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 nts, this synops
91a0: 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 is becomes the c
91b0: 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 omment on the op
91c0: 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 code..** Some tr
91d0: 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 anslation occurs
91e0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 :.**.** "P
91f0: 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 X" -> "r[X
9200: 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 ]".** "PX@
9210: 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e PY" -> "r[X..
9220: 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 X+Y-1]" or "r[x
9230: 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 ]" if y is 0 or
9240: 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 1.** "PX@P
9250: 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 Y+1" -> "r[X..X
9260: 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d +Y]" or "r[x]
9270: 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 " if y is 0.**
9280: 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d "PY..PY" -
9290: 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 > "r[X..Y]"
92a0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 or "r[x]" if y
92b0: 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e <=x.*/.static in
92c0: 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 t displayComment
92d0: 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f (. const Op *pO
92e0: 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 p, /* The op
92f0: 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 code to be comme
9300: 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 nted */. const
9310: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 char *zP4, /*
9320: 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 Previously obtai
9330: 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 ned value for P4
9340: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d */. char *zTem
9350: 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 p, /* Writ
9360: 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f e result here */
9370: 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 . int nTemp
9380: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 /* Space a
9390: 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d vailable in zTem
93a0: 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 p[] */.){. cons
93b0: 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b t char *zOpName;
93c0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
93d0: 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 Synopsis;. int
93e0: 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 nOpName;. int i
93f0: 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 i, jj;. char zA
9400: 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d lt[50];. zOpNam
9410: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 e = sqlite3Opcod
9420: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 eName(pOp->opcod
9430: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 e);. nOpName =
9440: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
9450: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 zOpName);. if(
9460: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b zOpName[nOpName+
9470: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 1] ){. int se
9480: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 enCom = 0;. c
9490: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f har c;. zSyno
94a0: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b psis = zOpName +
94b0: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 = nOpName + 1;.
94c0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a if( strncmp(z
94d0: 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 Synopsis,"IF ",3
94e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 )==0 ){. if
94f0: 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 ( pOp->p5 & SQLI
9500: 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 TE_STOREP2 ){.
9510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
9520: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 printf(sizeof(zA
9530: 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 32 lt), zAlt, "r[P2
9540: 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f ] = (%s)", zSyno
9550: 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d psis+3);. }
9560: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 else{. sq
9570: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
9580: 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c izeof(zAlt), zAl
9590: 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50 t, "if %s goto P
95a0: 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 2", zSynopsis+3)
95b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
95c0: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 zSynopsis = zAlt
95d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 ;. }. for(
95e0: 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d ii=jj=0; jj<nTem
95f0: 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e p-1 && (c = zSyn
9600: 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 opsis[ii])!=0; i
9610: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 i++){. if(
9620: 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 c=='P' ){.
9630: 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b c = zSynopsis[
9640: 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 ++ii];. i
9650: 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 f( c=='4' ){.
9660: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
9670: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a nprintf(nTemp-jj
9680: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 , zTemp+jj, "%s"
9690: 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 , zP4);.
96a0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 }else if( c=='X'
96b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
96c0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
96d0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a Temp-jj, zTemp+j
96e0: 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 j, "%s", pOp->zC
96f0: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 omment);.
9700: 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a seenCom = 1;.
9710: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
9720: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 int v1
9730: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 = translateP(c,
9740: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 pOp);.
9750: 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 int v2;.
9760: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
9770: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 tf(nTemp-jj, zTe
9780: 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 mp+jj, "%d", v1)
9790: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 ;. if(
97a0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 strncmp(zSynopsi
97b0: 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 s+ii+1, "@P", 2)
97c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
97d0: 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 ii += 3;.
97e0: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 jj += sq
97f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 lite3Strlen30(zT
9800: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 emp+jj);.
9810: 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c v2 = transl
9820: 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 ateP(zSynopsis[i
9830: 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 i], pOp);.
9840: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d if( strncm
9850: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 p(zSynopsis+ii+1
9860: 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 ,"+1",2)==0 ){.
9870: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 ii
9880: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 += 2;.
9890: 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 v2++;.
98a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
98b0: 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a if( v2>1 ){.
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 sq
98d0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
98e0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a Temp-jj, zTemp+j
98f0: 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 j, "..%d", v1+v2
9900: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 -1);.
9910: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c }. }el
9920: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a se if( strncmp(z
9930: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 Synopsis+ii+1, "
9940: 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 ..P3", 4)==0 &&
9950: 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 pOp->p3==0 ){.
9960: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 ii +=
9970: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 4;. }.
9980: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
9990: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 jj += sqlite3St
99a0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 rlen30(zTemp+jj)
99b0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
99c0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b zTemp[jj+
99d0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a +] = c;. }.
99e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 }. if( !s
99f0: 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 eenCom && jj<nTe
9a00: 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f mp-5 && pOp->zCo
9a10: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 mment ){. s
9a20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
9a30: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b nTemp-jj, zTemp+
9a40: 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d jj, "; %s", pOp-
9a50: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 >zComment);.
9a60: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 jj += sqlite3S
9a70: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a trlen30(zTemp+jj
9a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 );. }. if(
9a90: 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d jj<nTemp ) zTem
9aa0: 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c p[jj] = 0;. }el
9ab0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d se if( pOp->zCom
9ac0: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 ment ){. sqli
9ad0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 te3_snprintf(nTe
9ae0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c mp, zTemp, "%s",
9af0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b pOp->zComment);
9b00: 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 . jj = sqlite
9b10: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3Strlen30(zTemp)
9b20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a ;. }else{. z
9b30: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 Temp[0] = 0;.
9b40: 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 jj = 0;. }. r
9b50: 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 eturn jj;.}.#end
9b60: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 if /* SQLITE_DEB
9b70: 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f UG */..#if VDBE_
9b80: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 DISPLAY_P4 && de
9b90: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 fined(SQLITE_ENA
9ba0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 BLE_CURSOR_HINTS
9bb0: 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 )./*.** Translat
9bc0: 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 e the P4.pExpr v
9bd0: 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 alue for an OP_C
9be0: 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 ursorHint opcode
9bf0: 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 into text.** th
9c00: 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 at can be displa
9c10: 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f yed in the P4 co
9c20: 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 lumn of EXPLAIN
9c30: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 output..*/.stati
9c40: 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 c void displayP4
9c50: 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 Expr(StrAccum *p
9c60: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a , Expr *pExpr){.
9c70: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f const char *zO
9c80: 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 p = 0;. switch(
9c90: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 pExpr->op ){.
9ca0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 case TK_STRING
9cb0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f :. sqlite3_
9cc0: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 str_appendf(p, "
9cd0: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 %Q", pExpr->u.zT
9ce0: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 oken);. bre
9cf0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f ak;. case TK_
9d00: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 INTEGER:. s
9d10: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e qlite3_str_appen
9d20: 64 66 28 70 2c 20 22 25 64 22 2c 20 70 45 78 70 df(p, "%d", pExp
9d30: 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a 20 20 r->u.iValue);.
9d40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 break;. c
9d50: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 ase TK_NULL:.
9d60: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 sqlite3_str_a
9d70: 70 70 65 6e 64 66 28 70 2c 20 22 4e 55 4c 4c 22 ppendf(p, "NULL"
9d80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
9d90: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 case TK_REGI
9da0: 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 STER: {. sq
9db0: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 lite3_str_append
9dc0: 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 f(p, "r[%d]", pE
9dd0: 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 xpr->iTable);.
9de0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
9df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c . case TK_COL
9e00: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 UMN: {. if(
9e10: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c pExpr->iColumn<
9e20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 0 ){. sql
9e30: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 ite3_str_appendf
9e40: 28 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 (p, "rowid");.
9e50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
9e60: 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 sqlite3_str_a
9e70: 70 70 65 6e 64 66 28 70 2c 20 22 63 25 64 22 2c ppendf(p, "c%d",
9e80: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f (int)pExpr->iCo
9e90: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 lumn);. }.
9ea0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
9eb0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 }. case TK_LT
9ec0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 : zOp = "LT
9ed0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 "; break;.
9ee0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 case TK_LE:
9ef0: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 zOp = "LE";
9f00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
9f10: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 case TK_GT:
9f20: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 zOp = "GT";
9f30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
9f40: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f e TK_GE: zO
9f50: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62 p = "GE"; b
9f60: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
9f70: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d K_NE: zOp =
9f80: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61 "NE"; brea
9f90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 k;. case TK_E
9fa0: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 Q: zOp = "E
9fb0: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a Q"; break;.
9fc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 case TK_IS:
9fd0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b zOp = "IS";
9fe0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
9ff0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 case TK_ISNOT:
a000: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b zOp = "ISNOT";
a010: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
a020: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a se TK_AND: z
a030: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 Op = "AND";
a040: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
a050: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 TK_OR: zOp
a060: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65 = "OR"; bre
a070: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f ak;. case TK_
a080: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 PLUS: zOp = "
a090: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b ADD"; break;
a0a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 . case TK_STA
a0b0: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c R: zOp = "MUL
a0c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 "; break;.
a0d0: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a case TK_MINUS:
a0e0: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 zOp = "SUB";
a0f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 break;. c
a100: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 ase TK_REM:
a110: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 zOp = "REM";
a120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
a130: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 TK_BITAND: zOp
a140: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72 = "BITAND"; br
a150: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b eak;. case TK
a160: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 _BITOR: zOp =
a170: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b "BITOR"; break
a180: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c ;. case TK_SL
a190: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 ASH: zOp = "DI
a1a0: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 V"; break;.
a1b0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 case TK_LSHIF
a1c0: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 T: zOp = "LSHIF
a1d0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 T"; break;.
a1e0: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 case TK_RSHIFT:
a1f0: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b zOp = "RSHIFT";
a200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
a210: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f e TK_CONCAT: zO
a220: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 p = "CONCAT"; b
a230: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
a240: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d K_UMINUS: zOp =
a250: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61 "MINUS"; brea
a260: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 k;. case TK_U
a270: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 PLUS: zOp = "P
a280: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a LUS"; break;.
a290: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e case TK_BITN
a2a0: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e OT: zOp = "BITN
a2b0: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 OT"; break;.
a2c0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 case TK_NOT:
a2d0: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 zOp = "NOT";
a2e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
a2f0: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a se TK_ISNULL: z
a300: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 Op = "ISNULL";
a310: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
a320: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 TK_NOTNULL: zOp
a330: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 = "NOTNULL"; bre
a340: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 ak;.. default
a350: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f :. sqlite3_
a360: 73 74 72 5f 61 70 70 65 6e 64 66 28 70 2c 20 22 str_appendf(p, "
a370: 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 %s", "expr");.
a380: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a break;. }..
a390: 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 if( zOp ){.
a3a0: 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 sqlite3_str_app
a3b0: 65 6e 64 66 28 70 2c 20 22 25 73 28 22 2c 20 7a endf(p, "%s(", z
a3c0: 4f 70 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 Op);. display
a3d0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d P4Expr(p, pExpr-
a3e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 >pLeft);. if(
a3f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 pExpr->pRight )
a400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
a410: 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 2c str_append(p, ",
a420: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73 ", 1);. dis
a430: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 playP4Expr(p, pE
a440: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 xpr->pRight);.
a450: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f }. sqlite3_
a460: 73 74 72 5f 61 70 70 65 6e 64 28 70 2c 20 22 29 str_append(p, ")
a470: 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e ", 1);. }.}.#en
a480: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 dif /* VDBE_DISP
a490: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 LAY_P4 && define
a4a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f d(SQLITE_ENABLE_
a4b0: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f CURSOR_HINTS) */
a4c0: 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 ...#if VDBE_DISP
a4d0: 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d LAY_P4./*.** Com
a4e0: 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 pute a string th
a4f0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 at describes the
a500: 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f P4 parameter fo
a510: 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 r an opcode..**
a520: 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e Use zTemp for an
a530: 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f y required tempo
a540: 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 rary buffer spac
a550: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 e..*/.static cha
a560: 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 r *displayP4(Op
a570: 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d *pOp, char *zTem
a580: 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 p, int nTemp){.
a590: 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 char *zP4 = zTe
a5a0: 6d 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 mp;. StrAccum x
a5b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d ;. assert( nTem
a5c0: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 p>=20 );. sqlit
a5d0: 65 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 e3StrAccumInit(&
a5e0: 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 x, 0, zTemp, nTe
a5f0: 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 mp, 0);. switch
a600: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b ( pOp->p4type ){
a610: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 . case P4_KEY
a620: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e INFO: {. in
a630: 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e t j;. KeyIn
a640: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 fo *pKeyInfo = p
a650: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b Op->p4.pKeyInfo;
a660: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
a670: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 KeyInfo->aSortOr
a680: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 der!=0 );.
a690: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 sqlite3_str_appe
a6a0: 6e 64 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 ndf(&x, "k(%d",
a6b0: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 pKeyInfo->nKeyFi
a6c0: 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 eld);. for(
a6d0: 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d j=0; j<pKeyInfo-
a6e0: 3e 6e 4b 65 79 46 69 65 6c 64 3b 20 6a 2b 2b 29 >nKeyField; j++)
a6f0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 {. CollSe
a700: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 q *pColl = pKeyI
a710: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 nfo->aColl[j];.
a720: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 const cha
a730: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c r *zColl = pColl
a740: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 ? pColl->zName
a750: 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 : "";. if
a760: 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 ( strcmp(zColl,
a770: 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a "BINARY")==0 ) z
a780: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 Coll = "B";.
a790: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f sqlite3_str_
a7a0: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 73 appendf(&x, ",%s
a7b0: 25 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 %s", .
a7c0: 20 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 pKeyInfo->a
a7d0: 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 SortOrder[j] ? "
a7e0: 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b -" : "", zColl);
a7f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 . }. s
a800: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e qlite3_str_appen
a810: 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 d(&x, ")", 1);.
a820: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
a830: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f }.#ifdef SQLITE_
a840: 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 ENABLE_CURSOR_HI
a850: 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f NTS. case P4_
a860: 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 EXPR: {. di
a870: 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20 splayP4Expr(&x,
a880: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a pOp->p4.pExpr);.
a890: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
a8a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 }.#endif. ca
a8b0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b se P4_COLLSEQ: {
a8c0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a . CollSeq *
a8d0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e pColl = pOp->p4.
a8e0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c pColl;. sql
a8f0: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 ite3_str_appendf
a900: 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 (&x, "(%.20s)",
a910: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 pColl->zName);.
a920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
a930: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 }. case P4_FU
a940: 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 NCDEF: {. F
a950: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 uncDef *pDef = p
a960: 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 Op->p4.pFunc;.
a970: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f sqlite3_str_
a980: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 28 appendf(&x, "%s(
a990: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d %d)", pDef->zNam
a9a0: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a e, pDef->nArg);.
a9b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
a9c0: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 }.#if defined(S
a9d0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 QLITE_DEBUG) ||
a9e0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f defined(VDBE_PRO
a9f0: 46 49 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50 FILE). case P
aa00: 34 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 4_FUNCCTX: {.
aa10: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 FuncDef *pDef
aa20: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d = pOp->p4.pCtx-
aa30: 3e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 >pFunc;. sq
aa40: 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 lite3_str_append
aa50: 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 f(&x, "%s(%d)",
aa60: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 pDef->zName, pDe
aa70: 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 f->nArg);.
aa80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e break;. }.#en
aa90: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f dif. case P4_
aaa0: 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 INT64: {. s
aab0: 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e qlite3_str_appen
aac0: 64 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a df(&x, "%lld", *
aad0: 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 pOp->p4.pI64);.
aae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
aaf0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e }. case P4_IN
ab00: 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c T32: {. sql
ab10: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 66 ite3_str_appendf
ab20: 28 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e (&x, "%d", pOp->
ab30: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 p4.i);. bre
ab40: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
ab50: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 se P4_REAL: {.
ab60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f sqlite3_str_
ab70: 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e 31 appendf(&x, "%.1
ab80: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 6g", *pOp->p4.pR
ab90: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 eal);. brea
aba0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
abb0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 e P4_MEM: {.
abc0: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f Mem *pMem = pO
abd0: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 p->p4.pMem;.
abe0: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 if( pMem->flag
abf0: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 s & MEM_Str ){.
ac00: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 zP4 = pMe
ac10: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 m->z;. }els
ac20: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 e if( pMem->flag
ac30: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 s & MEM_Int ){.
ac40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
ac50: 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 tr_appendf(&x, "
ac60: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 %lld", pMem->u.i
ac70: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 );. }else i
ac80: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 f( pMem->flags &
ac90: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 MEM_Real ){.
aca0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 sqlite3_str
acb0: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 2e _appendf(&x, "%.
acc0: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 16g", pMem->u.r)
acd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 ;. }else if
ace0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 ( pMem->flags &
acf0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 MEM_Null ){.
ad00: 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 zP4 = "NULL"
ad10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
ad20: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
ad30: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
ad40: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 _Blob );.
ad50: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b zP4 = "(blob)";
ad60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 . }. b
ad70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e reak;. }.#ifn
ad80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
ad90: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 VIRTUALTABLE.
ada0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b case P4_VTAB: {
adb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 . sqlite3_v
adc0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 tab *pVtab = pOp
add0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 ->p4.pVtab->pVta
ade0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 b;. sqlite3
adf0: 5f 73 74 72 5f 61 70 70 65 6e 64 66 28 26 78 2c _str_appendf(&x,
ae00: 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 61 "vtab:%p", pVta
ae10: 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b b);. break;
ae20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
ae30: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 case P4_INTARR
ae40: 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 AY: {. int
ae50: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 69 i;. int *ai
ae60: 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a 20 = pOp->p4.ai;.
ae70: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 5b int n = ai[
ae80: 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 72 0]; /* The fir
ae90: 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 6e st element of an
aea0: 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c 77 INTARRAY is alw
aeb0: 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 ays the.
aec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a *
aed0: 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e * count of the n
aee0: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 umber of element
aef0: 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 s to follow */.
af00: 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c for(i=1; i<
af10: 3d 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 =n; i++){.
af20: 20 20 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 sqlite3_str_ap
af30: 70 65 6e 64 66 28 26 78 2c 20 22 2c 25 64 22 2c pendf(&x, ",%d",
af40: 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d ai[i]);. }
af50: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 . zTemp[0]
af60: 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c = '[';. sql
af70: 69 74 65 33 5f 73 74 72 5f 61 70 70 65 6e 64 28 ite3_str_append(
af80: 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 &x, "]", 1);.
af90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
afa0: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 case P4_SUBP
afb0: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 ROGRAM: {.
afc0: 73 71 6c 69 74 65 33 5f 73 74 72 5f 61 70 70 65 sqlite3_str_appe
afd0: 6e 64 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d ndf(&x, "program
afe0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b ");. break;
aff0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
b000: 50 34 5f 44 59 4e 42 4c 4f 42 3a 0a 20 20 20 20 P4_DYNBLOB:.
b010: 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a case P4_ADVANCE:
b020: 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 {. zTemp[0
b030: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 ] = 0;. bre
b040: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
b050: 73 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 se P4_TABLE: {.
b060: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 72 sqlite3_str
b070: 5f 61 70 70 65 6e 64 66 28 26 78 2c 20 22 25 73 _appendf(&x, "%s
b080: 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62 2d ", pOp->p4.pTab-
b090: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 >zName);. b
b0a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
b0b0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 default: {.
b0c0: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a zP4 = pOp->p4.z
b0d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d ;. if( zP4=
b0e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 =0 ){. zP
b0f0: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 4 = zTemp;.
b100: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b zTemp[0] = 0;
b110: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
b120: 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 }. sqlite3StrA
b130: 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b 0a ccumFinish(&x);.
b140: 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 assert( zP4!=0
b150: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 );. return zP4
b160: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 ;.}.#endif /* VD
b170: 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a 2f BE_DISPLAY_P4 */
b180: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 ../*.** Declare
b190: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 to the Vdbe that
b1a0: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 the BTree objec
b1b0: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 t at db->aDb[i]
b1c0: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 is used..**.** T
b1d0: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 he prepared stat
b1e0: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b ements need to k
b1f0: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 now in advance t
b200: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 he complete set
b210: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 of.** attached d
b220: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 atabases that wi
b230: 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 ll be use. A ma
b240: 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 sk of these data
b250: 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e bases.** is main
b260: 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 tained in p->btr
b270: 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e eeMask. The p->
b280: 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 lockMask value i
b290: 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a s the subset of.
b2a0: 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 ** p->btreeMask
b2b0: 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 of databases tha
b2c0: 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 t will require a
b2d0: 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 lock..*/.void s
b2e0: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 qlite3VdbeUsesBt
b2f0: 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 ree(Vdbe *p, int
b300: 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 i){. assert( i
b310: 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e >=0 && i<p->db->
b320: 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 nDb && i<(int)si
b330: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 zeof(yDbMask)*8
b340: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 );. assert( i<(
b350: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 int)sizeof(p->bt
b360: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 reeMask)*8 );.
b370: 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 DbMaskSet(p->btr
b380: 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 eeMask, i);. if
b390: 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 ( i!=1 && sqlite
b3a0: 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 3BtreeSharable(p
b3b0: 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 ->db->aDb[i].pBt
b3c0: 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 ) ){. DbMaskS
b3d0: 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 et(p->lockMask,
b3e0: 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 i);. }.}..#if !
b3f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
b400: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 MIT_SHARED_CACHE
b410: 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 )./*.** If SQLit
b420: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f e is compiled to
b430: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d support shared-
b440: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 cache mode and t
b450: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c o be threadsafe,
b460: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 .** this routine
b470: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 obtains the mut
b480: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ex associated wi
b490: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 th each BtShared
b4a0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 structure.** th
b4b0: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 at may be access
b4c0: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 ed by the VM pas
b4d0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 sed as an argume
b4e0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 nt. In doing so
b4f0: 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 it also.** sets
b500: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 the BtShared.db
b510: 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f member of each o
b520: 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 f the BtShared s
b530: 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 tructures, ensur
b540: 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 ing.** that the
b550: 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e correct busy-han
b560: 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 dler callback is
b570: 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 invoked if requ
b580: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 ired..**.** If S
b590: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 QLite is not thr
b5a0: 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 eadsafe but does
b5b0: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d support shared-
b5c0: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e cache mode, then
b5d0: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 .** sqlite3Btree
b5e0: 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b Enter() is invok
b5f0: 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 ed to set the Bt
b600: 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 Shared.db variab
b610: 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 les.** of all of
b620: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 BtShared struct
b630: 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 ures accessible
b640: 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 via the database
b650: 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f handle .** asso
b660: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 ciated with the
b670: 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c VM..**.** If SQL
b680: 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 ite is not threa
b690: 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e dsafe and does n
b6a0: 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 ot support share
b6b0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 d-cache mode, th
b6c0: 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 is.** function i
b6d0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a s a no-op..**.**
b6e0: 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 The p->btreeMas
b6f0: 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 k field is a bit
b700: 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 mask of all btre
b710: 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 es that the prep
b720: 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 ared .** stateme
b730: 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 nt p will ever u
b740: 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 se. Let N be th
b750: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 e number of bits
b760: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b in p->btreeMask
b770: 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e .** correspondin
b780: 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 g to btrees that
b790: 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 use shared cach
b7a0: 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e e. Then the run
b7b0: 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 time of.** this
b7c0: 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 routine is N*N.
b7d0: 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 But as N is rar
b7e0: 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c ely more than 1,
b7f0: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 this should not
b800: 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d .** be a problem
b810: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
b820: 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 3VdbeEnter(Vdbe
b830: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 *p){. int i;.
b840: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 sqlite3 *db;. D
b850: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 b *aDb;. int nD
b860: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 b;. if( DbMaskA
b870: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 llZero(p->lockMa
b880: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f sk) ) return; /
b890: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 * The common cas
b8a0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 e */. db = p->d
b8b0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 b;. aDb = db->a
b8c0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e Db;. nDb = db->
b8d0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 nDb;. for(i=0;
b8e0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 i<nDb; i++){.
b8f0: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d if( i!=1 && DbM
b900: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d askTest(p->lockM
b910: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 ask,i) && ALWAYS
b920: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 (aDb[i].pBt!=0)
b930: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
b940: 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 BtreeEnter(aDb[i
b950: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 ].pBt);. }.
b960: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 }.}.#endif..#if
b970: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
b980: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 OMIT_SHARED_CACH
b990: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 E) && SQLITE_THR
b9a0: 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 EADSAFE>0./*.**
b9b0: 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 Unlock all of th
b9c0: 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 e btrees previou
b9d0: 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 sly locked by a
b9e0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 call to sqlite3V
b9f0: 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 dbeEnter()..*/.s
ba00: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 tatic SQLITE_NOI
ba10: 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c NLINE void vdbeL
ba20: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 eave(Vdbe *p){.
ba30: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 int i;. sqlite
ba40: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3 *db;. Db *aDb
ba50: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 ;. int nDb;. d
ba60: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 b = p->db;. aDb
ba70: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 = db->aDb;. nD
ba80: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 b = db->nDb;. f
ba90: 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 or(i=0; i<nDb; i
baa0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d ++){. if( i!=
bab0: 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 1 && DbMaskTest(
bac0: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 p->lockMask,i) &
bad0: 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e & ALWAYS(aDb[i].
bae0: 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 pBt!=0) ){.
baf0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 sqlite3BtreeLea
bb00: 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a ve(aDb[i].pBt);.
bb10: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 }. }.}.void
bb20: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 sqlite3VdbeLeav
bb30: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 e(Vdbe *p){. if
bb40: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 ( DbMaskAllZero(
bb50: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 p->lockMask) ) r
bb60: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 eturn; /* The c
bb70: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 ommon case */.
bb80: 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a vdbeLeave(p);.}.
bb90: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 #endif..#if defi
bba0: 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 ned(VDBE_PROFILE
bbb0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c ) || defined(SQL
bbc0: 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a ITE_DEBUG)./*.**
bbd0: 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 Print a single
bbe0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f opcode. This ro
bbf0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f utine is used fo
bc00: 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 r debugging only
bc10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
bc20: 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 3VdbePrintOp(FIL
bc30: 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c E *pOut, int pc,
bc40: 20 56 64 62 65 4f 70 20 2a 70 4f 70 29 7b 0a 20 VdbeOp *pOp){.
bc50: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 char *zP4;. ch
bc60: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 ar zPtr[50];. c
bc70: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 har zCom[100];.
bc80: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 static const ch
bc90: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 ar *zFormat1 = "
bca0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 %4d %-13s %4d %4
bcb0: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 d %4d %-13s %.2X
bcc0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f %s\n";. if( pO
bcd0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 ut==0 ) pOut = s
bce0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 tdout;. zP4 = d
bcf0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 isplayP4(pOp, zP
bd00: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 tr, sizeof(zPtr)
bd10: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
bd20: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
bd30: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c COMMENTS. displ
bd40: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a ayComment(pOp, z
bd50: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 P4, zCom, sizeof
bd60: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 (zCom));.#else.
bd70: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 zCom[0] = 0;.#e
bd80: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 ndif. /* NB: T
bd90: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 he sqlite3Opcode
bda0: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 Name() function
bdb0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 is implemented b
bdc0: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 y code created.
bdd0: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 ** by the mkopc
bde0: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f odeh.awk and mko
bdf0: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 pcodec.awk scrip
be00: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 ts which extract
be10: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d the. ** inform
be20: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 ation from the v
be30: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 dbe.c source tex
be40: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 t */. fprintf(p
be50: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 Out, zFormat1, p
be60: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 c, . sqlite
be70: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3OpcodeName(pOp-
be80: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 >opcode), pOp->p
be90: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 1, pOp->p2, pOp-
bea0: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 >p3, zP4, pOp->p
beb0: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 5,. zCom.
bec0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 );. fflush(pOut
bed0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a );.}.#endif../*.
bee0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e ** Initialize an
bef0: 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 array of N Mem
bf00: 65 6c 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 element..*/.stat
bf10: 69 63 20 76 6f 69 64 20 69 6e 69 74 4d 65 6d 41 ic void initMemA
bf20: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 rray(Mem *p, int
bf30: 20 4e 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c N, sqlite3 *db,
bf40: 20 75 31 36 20 66 6c 61 67 73 29 7b 0a 20 20 77 u16 flags){. w
bf50: 68 69 6c 65 28 20 28 4e 2d 2d 29 3e 30 20 29 7b hile( (N--)>0 ){
bf60: 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b . p->db = db;
bf70: 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 . p->flags =
bf80: 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d 3e 73 7a flags;. p->sz
bf90: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 23 69 66 64 Malloc = 0;.#ifd
bfa0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
bfb0: 20 20 20 20 70 2d 3e 70 53 63 6f 70 79 46 72 6f p->pScopyFro
bfc0: 6d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 m = 0;.#endif.
bfd0: 20 20 70 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a p++;. }.}../*
bfe0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 .** Release an a
bff0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c rray of N Mem el
c000: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 ements.*/.static
c010: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d void releaseMem
c020: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e Array(Mem *p, in
c030: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 t N){. if( p &&
c040: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 N ){. Mem *p
c050: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 End = &p[N];.
c060: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 sqlite3 *db = p
c070: 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 ->db;. if( db
c080: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 ->pnBytesFreed )
c090: 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 {. do{.
c0a0: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c if( p->szMal
c0b0: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 loc ) sqlite3DbF
c0c0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c ree(db, p->zMall
c0d0: 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c oc);. }whil
c0e0: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b e( (++p)<pEnd );
c0f0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 . return;.
c100: 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 }. do{.
c110: 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 assert( (&p[1
c120: 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d ])==pEnd || p[0]
c130: 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a .db==p[1].db );.
c140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 assert( sq
c150: 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 lite3VdbeCheckMe
c160: 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 mInvariants(p) )
c170: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 ;.. /* This
c180: 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 block is really
c190: 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 an inlined vers
c1a0: 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 ion of sqlite3Vd
c1b0: 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 beMemRelease().
c1c0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b ** that tak
c1d0: 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 es advantage of
c1e0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 the fact that th
c1f0: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 e memory cell va
c200: 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a lue is . **
c210: 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 being set to NU
c220: 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 LL after releasi
c230: 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 ng any dynamic r
c240: 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 esources..
c250: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 **. ** The
c260: 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f justification fo
c270: 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f r duplicating co
c280: 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 de is that accor
c290: 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a ding to . *
c2a0: 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 * callgrind, thi
c2b0: 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 s causes a certa
c2c0: 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 in test case to
c2d0: 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 hit the CPU 4.7
c2e0: 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e . ** percen
c2f0: 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 t less (x86 linu
c300: 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 x, gcc version 4
c310: 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 .1.2, -O6) than
c320: 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c if . ** sql
c330: 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 ite3MemRelease()
c340: 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f were called fro
c350: 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 m here. With -O2
c360: 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 , this jumps.
c370: 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 ** to 6.6 per
c380: 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 cent. The test c
c390: 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 ase is inserting
c3a0: 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 1000 rows into
c3b0: 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a a table . *
c3c0: 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 * with no indexe
c3d0: 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 s using a single
c3e0: 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 prepared INSERT
c3f0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 statement, bind
c400: 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 () . ** and
c410: 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 reset(). Insert
c420: 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e s are grouped in
c430: 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e to a transaction
c440: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 .. */.
c450: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c testcase( p->fl
c460: 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b ags & MEM_Agg );
c470: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 . testcase(
c480: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f p->flags & MEM_
c490: 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 Dyn );. tes
c4a0: 74 63 61 73 65 28 20 70 2d 3e 78 44 65 6c 3d 3d tcase( p->xDel==
c4b0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 sqlite3VdbeFrame
c4c0: 4d 65 6d 44 65 6c 20 29 3b 0a 20 20 20 20 20 20 MemDel );.
c4d0: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 if( p->flags&(ME
c4e0: 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 29 20 29 M_Agg|MEM_Dyn) )
c4f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
c500: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
c510: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 p);. }else
c520: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 if( p->szMalloc
c530: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
c540: 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 e3DbFreeNN(db, p
c550: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 ->zMalloc);.
c560: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 p->szMalloc
c570: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 = 0;. }..
c580: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d p->flags = M
c590: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 EM_Undefined;.
c5a0: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c }while( (++p)<
c5b0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 pEnd );. }.}..#
c5c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
c5d0: 55 47 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 UG./*.** Verify
c5e0: 74 68 61 74 20 70 46 72 61 6d 65 20 69 73 20 61 that pFrame is a
c5f0: 20 76 61 6c 69 64 20 56 64 62 65 46 72 61 6d 65 valid VdbeFrame
c600: 20 70 6f 69 6e 74 65 72 2e 20 20 52 65 74 75 72 pointer. Retur
c610: 6e 20 74 72 75 65 20 69 66 20 69 74 20 69 73 0a n true if it is.
c620: 2a 2a 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 ** and false if
c630: 73 6f 6d 65 74 68 69 6e 67 20 69 73 20 77 72 6f something is wro
c640: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 ng..**.** This r
c650: 6f 75 74 69 6e 65 20 69 73 20 69 6e 74 65 6e 64 outine is intend
c660: 65 64 20 66 6f 72 20 75 73 65 20 69 6e 73 69 64 ed for use insid
c670: 65 20 6f 66 20 61 73 73 65 72 74 28 29 20 73 74 e of assert() st
c680: 61 74 65 6d 65 6e 74 73 20 6f 6e 6c 79 2e 0a 2a atements only..*
c690: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
c6a0: 65 46 72 61 6d 65 49 73 56 61 6c 69 64 28 56 64 eFrameIsValid(Vd
c6b0: 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 beFrame *pFrame)
c6c0: 7b 0a 20 20 69 66 28 20 70 46 72 61 6d 65 2d 3e {. if( pFrame->
c6d0: 69 46 72 61 6d 65 4d 61 67 69 63 21 3d 53 51 4c iFrameMagic!=SQL
c6e0: 49 54 45 5f 46 52 41 4d 45 5f 4d 41 47 49 43 20 ITE_FRAME_MAGIC
c6f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 ) return 0;. re
c700: 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 turn 1;.}.#endif
c710: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 .../*.** This is
c720: 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 6f 6e a destructor on
c730: 20 61 20 4d 65 6d 20 6f 62 6a 65 63 74 20 28 77 a Mem object (w
c740: 68 69 63 68 20 69 73 20 72 65 61 6c 6c 79 20 61 hich is really a
c750: 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 29 n sqlite3_value)
c760: 0a 2a 2a 20 74 68 61 74 20 64 65 6c 65 74 65 73 .** that deletes
c770: 20 74 68 65 20 46 72 61 6d 65 20 6f 62 6a 65 63 the Frame objec
c780: 74 20 74 68 61 74 20 69 73 20 61 74 74 61 63 68 t that is attach
c790: 65 64 20 74 6f 20 69 74 20 61 73 20 61 20 62 6c ed to it as a bl
c7a0: 6f 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 ob..**.** This r
c7b0: 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 outine does not
c7c0: 64 65 6c 65 74 65 20 74 68 65 20 46 72 61 6d 65 delete the Frame
c7d0: 20 72 69 67 68 74 20 61 77 61 79 2e 20 20 49 74 right away. It
c7e0: 20 6d 65 72 65 6c 79 20 61 64 64 73 20 74 68 65 merely adds the
c7f0: 0a 2a 2a 20 66 72 61 6d 65 20 74 6f 20 61 20 6c .** frame to a l
c800: 69 73 74 20 6f 66 20 66 72 61 6d 65 73 20 74 6f ist of frames to
c810: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e be deleted when
c820: 20 74 68 65 20 56 64 62 65 20 68 61 6c 74 73 2e the Vdbe halts.
c830: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
c840: 56 64 62 65 46 72 61 6d 65 4d 65 6d 44 65 6c 28 VdbeFrameMemDel(
c850: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 56 void *pArg){. V
c860: 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 dbeFrame *pFrame
c870: 20 3d 20 28 56 64 62 65 46 72 61 6d 65 2a 29 70 = (VdbeFrame*)p
c880: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 73 Arg;. assert( s
c890: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 49 qlite3VdbeFrameI
c8a0: 73 56 61 6c 69 64 28 70 46 72 61 6d 65 29 20 29 sValid(pFrame) )
c8b0: 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 ;. pFrame->pPar
c8c0: 65 6e 74 20 3d 20 70 46 72 61 6d 65 2d 3e 76 2d ent = pFrame->v-
c8d0: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 70 46 >pDelFrame;. pF
c8e0: 72 61 6d 65 2d 3e 76 2d 3e 70 44 65 6c 46 72 61 rame->v->pDelFra
c8f0: 6d 65 20 3d 20 70 46 72 61 6d 65 3b 0a 7d 0a 0a me = pFrame;.}..
c900: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 ./*.** Delete a
c910: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 VdbeFrame object
c920: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 and its content
c930: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a s. VdbeFrame obj
c940: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f ects are.** allo
c950: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f cated by the OP_
c960: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 Program opcode i
c970: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 n sqlite3VdbeExe
c980: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c c()..*/.void sql
c990: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c ite3VdbeFrameDel
c9a0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 ete(VdbeFrame *p
c9b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 ){. int i;. Me
c9c0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 m *aMem = VdbeFr
c9d0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 ameMem(p);. Vdb
c9e0: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 eCursor **apCsr
c9f0: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a = (VdbeCursor **
ca00: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 )&aMem[p->nChild
ca10: 4d 65 6d 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 Mem];. assert(
ca20: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 sqlite3VdbeFrame
ca30: 49 73 56 61 6c 69 64 28 70 29 20 29 3b 0a 20 20 IsValid(p) );.
ca40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 for(i=0; i<p->nC
ca50: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 hildCsr; i++){.
ca60: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 sqlite3VdbeFr
ca70: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 eeCursor(p->v, a
ca80: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 pCsr[i]);. }.
ca90: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 releaseMemArray(
caa0: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d aMem, p->nChildM
cab0: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 em);. sqlite3Vd
cac0: 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 beDeleteAuxData(
cad0: 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 p->v->db, &p->pA
cae0: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a uxData, -1, 0);.
caf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
cb00: 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a p->v->db, p);.}.
cb10: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
cb20: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a OMIT_EXPLAIN./*.
cb30: 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e ** Give a listin
cb40: 67 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d g of the program
cb50: 20 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 in the virtual
cb60: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 machine..**.** T
cb70: 68 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 he interface is
cb80: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 the same as sqli
cb90: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 te3VdbeExec().
cba0: 42 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a But instead of.*
cbb0: 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f * running the co
cbc0: 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 de, it invokes t
cbd0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 he callback once
cbe0: 20 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 for each instru
cbf0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 ction..** This f
cc00: 65 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 eature is used t
cc10: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 o implement "EXP
cc20: 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 LAIN"..**.** Whe
cc30: 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c n p->explain==1,
cc40: 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f each instructio
cc50: 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 n is listed. Wh
cc60: 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e en.** p->explain
cc70: 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 ==2, only OP_Exp
cc80: 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e lain instruction
cc90: 73 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 s are listed and
cca0: 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 these.** are sh
ccb0: 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 own in a differe
ccc0: 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 nt format. p->e
ccd0: 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 xplain==2 is use
cce0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a d to implement.*
ccf0: 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 * EXPLAIN QUERY
cd00: 50 4c 41 4e 2e 0a 2a 2a 20 32 30 31 38 2d 30 34 PLAN..** 2018-04
cd10: 2d 32 34 3a 20 20 49 6e 20 70 2d 3e 65 78 70 6c -24: In p->expl
cd20: 61 69 6e 3d 3d 32 20 6d 6f 64 65 2c 20 74 68 65 ain==2 mode, the
cd30: 20 4f 50 5f 49 6e 69 74 20 6f 70 63 6f 64 65 73 OP_Init opcodes
cd40: 20 6f 66 20 74 72 69 67 67 65 72 73 0a 2a 2a 20 of triggers.**
cd50: 61 72 65 20 61 6c 73 6f 20 73 68 6f 77 6e 2c 20 are also shown,
cd60: 73 6f 20 74 68 61 74 20 74 68 65 20 62 6f 75 6e so that the boun
cd70: 64 61 72 69 65 73 20 62 65 74 77 65 65 6e 20 74 daries between t
cd80: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 he main program
cd90: 61 6e 64 0a 2a 2a 20 65 61 63 68 20 74 72 69 67 and.** each trig
cda0: 67 65 72 20 61 72 65 20 63 6c 65 61 72 2e 0a 2a ger are clear..*
cdb0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 *.** When p->exp
cdc0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 lain==1, first t
cdd0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 he main program
cde0: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 is listed, then
cdf0: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 each of.** the t
ce00: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 rigger subprogra
ce10: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e ms are listed on
ce20: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 e by one..*/.int
ce30: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 sqlite3VdbeList
ce40: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 (. Vdbe *p
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
ce60: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a The VDBE */.){.
ce70: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 int nRow;
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ce90: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 /* Stop w
cea0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 hen row count re
ceb0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 aches this */.
cec0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 int nSub = 0;
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cee0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
cef0: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e f sub-vdbes seen
cf00: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 so far */. Sub
cf10: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 Program **apSub
cf20: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
cf30: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 /* Array of su
cf40: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d b-vdbes */. Mem
cf50: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 *pSub = 0;
cf60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cf70: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c /* Memory cell
cf80: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 hold array of s
cf90: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c ubprogs */. sql
cfa0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 ite3 *db = p->db
cfb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
cfc0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 /* The databas
cfd0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a e connection */.
cfe0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 int i;
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d000: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 /* Loop c
d010: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 ounter */. int
d020: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 rc = SQLITE_OK;
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d040: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
d050: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d */. Mem *pMem =
d060: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 &p->aMem[1];
d070: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 /* Fir
d080: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 st Mem of result
d090: 20 73 65 74 20 2a 2f 0a 20 20 69 6e 74 20 62 4c set */. int bL
d0a0: 69 73 74 53 75 62 70 72 6f 67 73 20 3d 20 28 70 istSubprogs = (p
d0b0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 7c 7c 20 ->explain==1 ||
d0c0: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c (db->flags & SQL
d0d0: 49 54 45 5f 54 72 69 67 67 65 72 45 51 50 29 21 ITE_TriggerEQP)!
d0e0: 3d 30 29 3b 0a 20 20 4f 70 20 2a 70 4f 70 20 3d =0);. Op *pOp =
d0f0: 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 0;.. assert( p
d100: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 ->explain );. a
d110: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d ssert( p->magic=
d120: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 =VDBE_MAGIC_RUN
d130: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
d140: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c rc==SQLITE_OK ||
d150: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 p->rc==SQLITE_B
d160: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 USY || p->rc==SQ
d170: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 LITE_NOMEM );..
d180: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 /* Even though
d190: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 this opcode does
d1a0: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 not use dynamic
d1b0: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a strings for. *
d1c0: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 * the result, re
d1d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 sult columns may
d1e0: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 become dynamic
d1f0: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c if the user call
d200: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 s. ** sqlite3_c
d210: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 olumn_text16(),
d220: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c causing a transl
d230: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 ation to UTF-16
d240: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 encoding.. */.
d250: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 releaseMemArray
d260: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e (pMem, 8);. p->
d270: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a pResultSet = 0;.
d280: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 . if( p->rc==SQ
d290: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 LITE_NOMEM ){.
d2a0: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e /* This happen
d2b0: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 s if a malloc()
d2c0: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f inside a call to
d2d0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
d2e0: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a text() or. **
d2f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
d300: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e text16() failed.
d310: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 */. sqlite3
d320: 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 OomFault(db);.
d330: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
d340: 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a ERROR;. }.. /*
d350: 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 When the number
d360: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 of output rows
d370: 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 reaches nRow, th
d380: 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a at means the. *
d390: 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 * listing has fi
d3a0: 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 nished and sqlit
d3b0: 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 e3_step() should
d3c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 return SQLITE_D
d3d0: 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 ONE.. ** nRow i
d3e0: 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 s the sum of the
d3f0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 number of rows
d400: 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 in the main prog
d410: 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 ram, plus. ** t
d420: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 he sum of the nu
d430: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 mber of rows in
d440: 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 all trigger subp
d450: 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 rograms encounte
d460: 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e red. ** so far.
d470: 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 The nRow value
d480: 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 will increase a
d490: 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 s new trigger su
d4a0: 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 bprograms are.
d4b0: 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 ** encountered,
d4c0: 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 but p->pc will e
d4d0: 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 ventually catch
d4e0: 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f up to nRow.. */
d4f0: 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 . nRow = p->nOp
d500: 3b 0a 20 20 69 66 28 20 62 4c 69 73 74 53 75 62 ;. if( bListSub
d510: 70 72 6f 67 73 20 29 7b 0a 20 20 20 20 2f 2a 20 progs ){. /*
d520: 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f The first 8 memo
d530: 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 ry cells are use
d540: 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 d for the result
d550: 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c set. So we wil
d560: 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 l. ** command
d570: 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c eer the 9th cell
d580: 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 to use as stora
d590: 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 ge for an array
d5a0: 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 of pointers.
d5b0: 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 ** to trigger su
d5c0: 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 bprograms. The
d5d0: 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 VDBE is guarante
d5e0: 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 ed to have at le
d5f0: 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c ast 9. ** cel
d600: 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 ls. */. asse
d610: 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b rt( p->nMem>9 );
d620: 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e . pSub = &p->
d630: 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 aMem[9];. if(
d640: 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d pSub->flags&MEM
d650: 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f _Blob ){. /
d660: 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 * On the first c
d670: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 all to sqlite3_s
d680: 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c tep(), pSub will
d690: 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 hold a NULL. I
d6a0: 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e t is. ** in
d6b0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 itialized to a B
d6c0: 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 LOB by the P4_SU
d6d0: 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 BPROGRAM process
d6e0: 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 ing logic below
d6f0: 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 */. nSub =
d700: 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 pSub->n/sizeof(V
d710: 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 dbe*);. apS
d720: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d ub = (SubProgram
d730: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 **)pSub->z;.
d740: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 }. for(i=0;
d750: 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 i<nSub; i++){.
d760: 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 nRow += apSu
d770: 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d b[i]->nOp;. }
d780: 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 31 29 . }.. while(1)
d790: 7b 20 20 2f 2a 20 4c 6f 6f 70 20 65 78 69 74 73 { /* Loop exits
d7a0: 20 76 69 61 20 62 72 65 61 6b 20 2a 2f 0a 20 20 via break */.
d7b0: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 i = p->pc++;.
d7c0: 20 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 if( i>=nRow )
d7d0: 7b 0a 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 {. p->rc =
d7e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 SQLITE_OK;.
d7f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e rc = SQLITE_DON
d800: 45 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a E;. break;.
d810: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c }. if( i<
d820: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 p->nOp ){.
d830: 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 /* The output li
d840: 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 ne number is sma
d850: 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 ll enough that w
d860: 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 e are still in t
d870: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e he. ** main
d880: 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 program. */.
d890: 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 pOp = &p->aOp
d8a0: 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a [i];. }else{.
d8b0: 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 /* We are
d8c0: 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e currently listin
d8d0: 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 g subprograms.
d8e0: 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 Figure out which
d8f0: 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a one and. *
d900: 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 * pick up the ap
d910: 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 propriate opcode
d920: 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a . */. int j
d930: 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e ;. i -= p->
d940: 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a nOp;. for(j
d950: 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d =0; i>=apSub[j]-
d960: 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 >nOp; j++){.
d970: 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a i -= apSub[j
d980: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a ]->nOp;. }.
d990: 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 pOp = &apS
d9a0: 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 ub[j]->aOp[i];.
d9b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 57 68 65 }.. /* Whe
d9c0: 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 n an OP_Program
d9d0: 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e opcode is encoun
d9e0: 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 ter (the only op
d9f0: 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 code that has.
da00: 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f ** a P4_SUBPRO
da10: 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 GRAM argument),
da20: 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 expand the size
da30: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 of the array of
da40: 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 subprograms.
da50: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d ** kept in p->aM
da60: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 em[9].z to hold
da70: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 the new program
da80: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 - assuming this
da90: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 2a subprogram. *
daa0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 * has not alread
dab0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 y been seen..
dac0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 62 4c 69 73 */. if( bLis
dad0: 74 53 75 62 70 72 6f 67 73 20 26 26 20 70 4f 70 tSubprogs && pOp
dae0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 ->p4type==P4_SUB
daf0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 PROGRAM ){.
db00: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 int nByte = (nS
db10: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 ub+1)*sizeof(Sub
db20: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 Program*);.
db30: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f int j;. fo
db40: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a r(j=0; j<nSub; j
db50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 ++){. if(
db60: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e apSub[j]==pOp->
db70: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 p4.pProgram ) br
db80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
db90: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 29 if( j==nSub )
dba0: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 {. p->rc
dbb0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d = sqlite3VdbeMem
dbc0: 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 Grow(pSub, nByte
dbd0: 2c 20 6e 53 75 62 21 3d 30 29 3b 0a 20 20 20 20 , nSub!=0);.
dbe0: 20 20 20 20 69 66 28 20 70 2d 3e 72 63 21 3d 53 if( p->rc!=S
dbf0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
dc00: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
dc10: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 E_ERROR;.
dc20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
dc30: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 53 75 }. apSu
dc40: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 b = (SubProgram
dc50: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 **)pSub->z;.
dc60: 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b apSub[nSub++
dc70: 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f ] = pOp->p4.pPro
dc80: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 70 53 gram;. pS
dc90: 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d ub->flags |= MEM
dca0: 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 70 _Blob;. p
dcb0: 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 Sub->n = nSub*si
dcc0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a zeof(SubProgram*
dcd0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 6f 77 20 );. nRow
dce0: 2b 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 += pOp->p4.pProg
dcf0: 72 61 6d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 ram->nOp;.
dd00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 }. }. if(
dd10: 70 2d 3e 65 78 70 6c 61 69 6e 3c 32 20 29 20 62 p->explain<2 ) b
dd20: 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 70 4f reak;. if( pO
dd30: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 45 78 p->opcode==OP_Ex
dd40: 70 6c 61 69 6e 20 29 20 62 72 65 61 6b 3b 0a 20 plain ) break;.
dd50: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f if( pOp->opco
dd60: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 de==OP_Init && p
dd70: 2d 3e 70 63 3e 31 20 29 20 62 72 65 61 6b 3b 0a ->pc>1 ) break;.
dd80: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 }.. if( rc==S
dd90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
dda0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 if( db->u1.isInt
ddb0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 errupted ){.
ddc0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 p->rc = SQLITE
ddd0: 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 _INTERRUPT;.
dde0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 rc = SQLITE_ER
ddf0: 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 ROR;. sqlit
de00: 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 e3VdbeError(p, s
de10: 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e qlite3ErrStr(p->
de20: 72 63 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b rc));. }else{
de30: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50 34 . char *zP4
de40: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 ;. if( p->e
de50: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 xplain==1 ){.
de60: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
de70: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
de80: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 pMem->u.i =
de90: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
deb0: 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 /* Program cou
dec0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 nter */.
ded0: 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 20 20 20 pMem++;. .
dee0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
def0: 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 = MEM_Static|ME
df00: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a M_Str|MEM_Term;.
df10: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 pMem->z
df20: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 = (char*)sqlite3
df30: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e OpcodeName(pOp->
df40: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f opcode); /* Opco
df50: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 de */. as
df60: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 sert( pMem->z!=0
df70: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d );. pMem
df80: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 ->n = sqlite3Str
df90: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a len30(pMem->z);.
dfa0: 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e pMem->en
dfb0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b c = SQLITE_UTF8;
dfc0: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b . pMem++;
dfd0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 . }..
dfe0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
dff0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 M_Int;. pMe
e000: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 m->u.i = pOp->p1
e010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
e020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 /* P1
e030: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b */. pMem++
e040: 3b 0a 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 ;.. pMem->f
e050: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
e060: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 pMem->u.i
e070: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 = pOp->p2;
e080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e090: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 /* P2 */.
e0a0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 pMem++;..
e0b0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
e0c0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 MEM_Int;. p
e0d0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e Mem->u.i = pOp->
e0e0: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 p3;
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
e100: 50 33 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d P3 */. pMem
e110: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 ++;.. if( s
e120: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 qlite3VdbeMemCle
e130: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d arAndResize(pMem
e140: 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 , 100) ){ /* P4
e150: 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 */. asser
e160: 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 t( p->db->malloc
e170: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 Failed );.
e180: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
e190: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 ERROR;. }.
e1a0: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
e1b0: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 = MEM_Str|MEM_T
e1c0: 65 72 6d 3b 0a 20 20 20 20 20 20 7a 50 34 20 3d erm;. zP4 =
e1d0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 displayP4(pOp,
e1e0: 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 pMem->z, pMem->s
e1f0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 zMalloc);.
e200: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a if( zP4!=pMem->z
e210: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d ){. pMem
e220: 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 ->n = 0;.
e230: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
e240: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c etStr(pMem, zP4,
e250: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 -1, SQLITE_UTF8
e260: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 , 0);. }els
e270: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 e{. asser
e280: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b t( pMem->z!=0 );
e290: 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e . pMem->n
e2a0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e = sqlite3Strlen
e2b0: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 30(pMem->z);.
e2c0: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d pMem->enc =
e2d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 SQLITE_UTF8;.
e2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d }. pMem
e2f0: 2b 2b 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 ++;.. if( p
e300: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a ->explain==1 ){.
e310: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 if( sqli
e320: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 te3VdbeMemClearA
e330: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 ndResize(pMem, 4
e340: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 ) ){. a
e350: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 ssert( p->db->ma
e360: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 llocFailed );.
e370: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
e380: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 QLITE_ERROR;.
e390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 }. p
e3a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
e3b0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 _Str|MEM_Term;.
e3c0: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d pMem->n =
e3d0: 20 32 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 2;. sqli
e3e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 te3_snprintf(3,
e3f0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c pMem->z, "%.2x",
e400: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 pOp->p5); /*
e410: 50 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 4d P5 */. pM
e420: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 em->enc = SQLITE
e430: 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 20 20 70 _UTF8;. p
e440: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 0a 23 69 66 64 Mem++;. .#ifd
e450: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
e460: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 _EXPLAIN_COMMENT
e470: 53 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 S. if( sq
e480: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 lite3VdbeMemClea
e490: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c rAndResize(pMem,
e4a0: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 500) ){.
e4b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 assert( p->db
e4c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
e4d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 ;. retu
e4e0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b rn SQLITE_ERROR;
e4f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
e500: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
e510: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 MEM_Str|MEM_Ter
e520: 6d 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d m;. pMem-
e530: 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d >n = displayComm
e540: 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d ent(pOp, zP4, pM
e550: 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 em->z, 500);.
e560: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d pMem->enc =
e570: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 SQLITE_UTF8;.#e
e580: 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4d 65 6d lse. pMem
e590: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 ->flags = MEM_Nu
e5a0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ll;
e5b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d /* Com
e5c0: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 ment */.#endif.
e5d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d }.. p-
e5e0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 >nResColumn = 8
e5f0: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d - 4*(p->explain-
e600: 31 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70 52 65 1);. p->pRe
e610: 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d sultSet = &p->aM
e620: 65 6d 5b 31 5d 3b 0a 20 20 20 20 20 20 70 2d 3e em[1];. p->
e630: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a rc = SQLITE_OK;.
e640: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 rc = SQLIT
e650: 45 5f 52 4f 57 3b 0a 20 20 20 20 7d 0a 20 20 7d E_ROW;. }. }
e660: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
e670: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 #endif /* SQLITE
e680: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f _OMIT_EXPLAIN */
e690: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
e6a0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e DEBUG./*.** Prin
e6b0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 t the SQL that w
e6c0: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 as used to gener
e6d0: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 ate a VDBE progr
e6e0: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 am..*/.void sqli
e6f0: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 te3VdbePrintSql(
e700: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 Vdbe *p){. cons
e710: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 t char *z = 0;.
e720: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a if( p->zSql ){.
e730: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b z = p->zSql;
e740: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e . }else if( p->
e750: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f nOp>=1 ){. co
e760: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 nst VdbeOp *pOp
e770: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 = &p->aOp[0];.
e780: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 if( pOp->opcod
e790: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f e==OP_Init && pO
e7a0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 p->p4.z!=0 ){.
e7b0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e z = pOp->p4.
e7c0: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 z;. while(
e7d0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a sqlite3Isspace(*
e7e0: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a z) ) z++;. }.
e7f0: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 }. if( z ) pr
e800: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c intf("SQL: [%s]\
e810: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 n", z);.}.#endif
e820: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 ..#if !defined(S
e830: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 QLITE_OMIT_TRACE
e840: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c ) && defined(SQL
e850: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 ITE_ENABLE_IOTRA
e860: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 CE)./*.** Print
e870: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 an IOTRACE messa
e880: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 ge showing SQL c
e890: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 ontent..*/.void
e8a0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 sqlite3VdbeIOTra
e8b0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a ceSql(Vdbe *p){.
e8c0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e int nOp = p->n
e8d0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f Op;. VdbeOp *pO
e8e0: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 p;. if( sqlite3
e8f0: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 IoTrace==0 ) ret
e900: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 urn;. if( nOp<1
e910: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 ) return;. pOp
e920: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 = &p->aOp[0];.
e930: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 if( pOp->opcode
e940: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 ==OP_Init && pOp
e950: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 ->p4.z!=0 ){.
e960: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 int i, j;. c
e970: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 har z[1000];.
e980: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
e990: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 f(sizeof(z), z,
e9a0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 "%s", pOp->p4.z)
e9b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 ;. for(i=0; s
e9c0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b qlite3Isspace(z[
e9d0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 i]); i++){}.
e9e0: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 for(j=0; z[i]; i
e9f0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 ++){. if( s
ea00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b qlite3Isspace(z[
ea10: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 i]) ){. i
ea20: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 f( z[i-1]!=' ' )
ea30: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b {. z[j+
ea40: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 +] = ' ';.
ea50: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b }. }else{
ea60: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 . z[j++]
ea70: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a = z[i];. }.
ea80: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d }. z[j] =
ea90: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 0;. sqlite3I
eaa0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e oTrace("SQL %s\n
eab0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e ", z);. }.}.#en
eac0: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f dif /* !SQLITE_O
ead0: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c MIT_TRACE && SQL
eae0: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 ITE_ENABLE_IOTRA
eaf0: 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 CE */../* An ins
eb00: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 tance of this ob
eb10: 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62 ject describes b
eb20: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c ulk memory avail
eb30: 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 able for use.**
eb40: 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 by subcomponents
eb50: 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73 of a prepared s
eb60: 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 tatement. Space
eb70: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 is allocated ou
eb80: 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 t.** of a Reusab
eb90: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 leSpace object b
eba0: 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 y the allocSpace
ebb0: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 () routine below
ebc0: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 ..*/.struct Reus
ebd0: 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 ableSpace {. u8
ebe0: 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 *pSpace;
ebf0: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 /* Available
ec00: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 memory */. int
ec10: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 nFree;
ec20: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 /* Bytes of ava
ec30: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f ilable memory */
ec40: 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 . int nNeeded;
ec50: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c /* Total
ec60: 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c bytes that coul
ec70: 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 d not be allocat
ec80: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 ed */.};../* Try
ec90: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 to allocate nBy
eca0: 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 te bytes of 8-by
ecb0: 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 te aligned bulk
ecc0: 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a memory for pBuf.
ecd0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 ** from the Reus
ece0: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 ableSpace object
ecf0: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e . Return a poin
ed00: 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 ter to the alloc
ed10: 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f ated.** memory o
ed20: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 n success. If i
ed30: 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f nsufficient memo
ed40: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 ry is available
ed50: 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 in the.** Reusab
ed60: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 leSpace object,
ed70: 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75 increase the Reu
ed80: 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 sableSpace.nNeed
ed90: 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 ed.** value by t
eda0: 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 he amount needed
edb0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c and return NULL
edc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 ..**.** If pBuf
edd0: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 is not initially
ede0: 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e NULL, that mean
edf0: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 s that the memor
ee00: 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a y has already.**
ee10: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 been allocated
ee20: 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 by a prior call
ee30: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c to this routine,
ee40: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 so just return
ee50: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 a copy.** of pBu
ee60: 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 f and leave Reus
ee70: 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e ableSpace unchan
ee80: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ged..**.** This
ee90: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 allocator is emp
eea0: 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f loyed to repurpo
eeb0: 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 se unused slots
eec0: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 at the end of th
eed0: 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 e.** opcode arra
eee0: 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 y of prepared st
eef0: 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 ate for other me
ef00: 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 mory needs of th
ef10: 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 e prepared.** st
ef20: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 atement..*/.stat
ef30: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 ic void *allocSp
ef40: 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 ace(. struct Re
ef50: 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 usableSpace *p,
ef60: 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 /* Bulk memory
ef70: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c available for al
ef80: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f location */. vo
ef90: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 id *pBuf,
efa0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 /* Point
efb0: 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c er to a prior al
efc0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e location */. in
efd0: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 t nByte
efe0: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 /* Bytes
eff0: 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 of memory neede
f000: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 d */.){. assert
f010: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 ( EIGHT_BYTE_ALI
f020: 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 GNMENT(p->pSpace
f030: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d ) );. if( pBuf=
f040: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 =0 ){. nByte
f050: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b = ROUND8(nByte);
f060: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c . if( nByte <
f070: 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 = p->nFree ){.
f080: 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 p->nFree -=
f090: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 nByte;. pBu
f0a0: 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 f = &p->pSpace[p
f0b0: 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 ->nFree];. }e
f0c0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e lse{. p->nN
f0d0: 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a eeded += nByte;.
f0e0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 }. }. asse
f0f0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 rt( EIGHT_BYTE_A
f100: 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 LIGNMENT(pBuf) )
f110: 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b ;. return pBuf;
f120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 .}../*.** Rewind
f130: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 the VDBE back t
f140: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 o the beginning
f150: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 in preparation f
f160: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 or.** running it
f170: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
f180: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 3VdbeRewind(Vdbe
f190: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 *p){.#if define
f1a0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 d(SQLITE_DEBUG)
f1b0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f || defined(VDBE_
f1c0: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 PROFILE). int i
f1d0: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 ;.#endif. asser
f1e0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 t( p!=0 );. ass
f1f0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
f200: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c DBE_MAGIC_INIT |
f210: 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 | p->magic==VDBE
f220: 5f 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a _MAGIC_RESET );.
f230: 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 . /* There shou
f240: 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f ld be at least o
f250: 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a ne opcode.. */.
f260: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 assert( p->nOp
f270: 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 >0 );.. /* Set
f280: 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 the magic to VDB
f290: 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e E_MAGIC_RUN soon
f2a0: 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c er rather than l
f2b0: 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 ater. */. p->ma
f2c0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
f2d0: 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 _RUN;..#ifdef SQ
f2e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 LITE_DEBUG. for
f2f0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b (i=0; i<p->nMem;
f300: 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 i++){. asser
f310: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 t( p->aMem[i].db
f320: 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 ==p->db );. }.#
f330: 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 endif. p->pc =
f340: 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 -1;. p->rc = SQ
f350: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 LITE_OK;. p->er
f360: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 rorAction = OE_A
f370: 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e bort;. p->nChan
f380: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 ge = 0;. p->cac
f390: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e heCtr = 1;. p->
f3a0: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d minWriteFileForm
f3b0: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 at = 255;. p->i
f3c0: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 Statement = 0;.
f3d0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e p->nFkConstrain
f3e0: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 t = 0;.#ifdef VD
f3f0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 BE_PROFILE. for
f400: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 (i=0; i<p->nOp;
f410: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 i++){. p->aOp
f420: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 [i].cnt = 0;.
f430: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 p->aOp[i].cycle
f440: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 s = 0;. }.#endi
f450: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 f.}../*.** Prepa
f460: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 re a virtual mac
f470: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 hine for executi
f480: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 on for the first
f490: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 time after.** c
f4a0: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 reating the virt
f4b0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 ual machine. Th
f4c0: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e is involves thin
f4d0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c gs such.** as al
f4e0: 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 locating registe
f4f0: 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a rs and initializ
f500: 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 ing the program
f510: 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 counter..** Afte
f520: 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 r the VDBE has b
f530: 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 e prepped, it ca
f540: 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 n be executed by
f550: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 one or more.**
f560: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 calls to sqlite3
f570: 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a VdbeExec(). .**
f580: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
f590: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 n may be called
f5a0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 exactly once on
f5b0: 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 each virtual mac
f5c0: 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 hine..** After t
f5d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 his routine is c
f5e0: 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 alled the VM has
f5f0: 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 been "packaged"
f600: 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a and is ready.**
f610: 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 to run. After
f620: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
f630: 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 called, further
f640: 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c calls to .** sql
f650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 ite3VdbeAddOp()
f660: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 functions are pr
f670: 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 ohibited. This
f680: 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 routine disconne
f690: 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 cts.** the Vdbe
f6a0: 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f from the Parse o
f6b0: 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 bject that helpe
f6c0: 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f d generate it so
f6d0: 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 that the.** the
f6e0: 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e Vdbe becomes an
f6f0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 independent ent
f700: 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 ity and the Pars
f710: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a e object can be.
f720: 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a ** destroyed..**
f730: 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 .** Use the sqli
f740: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 te3VdbeRewind()
f750: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 procedure to res
f760: 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d tore a virtual m
f770: 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 achine back.** t
f780: 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 o its initial st
f790: 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73 ate after it has
f7a0: 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f been run..*/.vo
f7b0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 id sqlite3VdbeMa
f7c0: 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 keReady(. Vdbe
f7d0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 *p,
f7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
f7f0: 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 VDBE */. Parse
f800: 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20 *pParse
f810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 /* Par
f820: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a sing context */.
f830: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 ){. sqlite3 *db
f840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
f850: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 /* The datab
f860: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a ase connection *
f870: 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 /. int nVar;
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f890: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
f8a0: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 parameters */.
f8b0: 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 int nMem;
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
f8d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d * Number of VM m
f8e0: 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 emory registers
f8f0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 */. int nCursor
f900: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
f910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
f920: 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 cursors require
f930: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b d */. int nArg;
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f950: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
f960: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 of arguments in
f970: 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 subprograms */.
f980: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 int n;
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f9a0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 /* Loop counter
f9b0: 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 */. struct Reus
f9c0: 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 ableSpace x;
f9d0: 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 /* Reusable
f9e0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a bulk memory */..
f9f0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 assert( p!=0 )
fa00: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e ;. assert( p->n
fa10: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 Op>0 );. assert
fa20: 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 ( pParse!=0 );.
fa30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 assert( p->magi
fa40: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e c==VDBE_MAGIC_IN
fa50: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 IT );. assert(
fa60: 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 pParse==p->pPars
fa70: 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 e );. db = p->d
fa80: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d b;. assert( db-
fa90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 >mallocFailed==0
faa0: 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 );. nVar = pPa
fab0: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 rse->nVar;. nMe
fac0: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d m = pParse->nMem
fad0: 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 ;. nCursor = pP
fae0: 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 arse->nTab;. nA
faf0: 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 rg = pParse->nMa
fb00: 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 xArg;. . /* Ea
fb10: 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 ch cursor uses a
fb20: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 memory cell. T
fb30: 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 he first cursor
fb40: 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 (cursor 0) can.
fb50: 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 ** use aMem[0]
fb60: 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 which is not oth
fb70: 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74 erwise used by t
fb80: 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e he VDBE program.
fb90: 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 Allocate. **
fba0: 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 space at the end
fbb0: 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 of aMem[] for c
fbc0: 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 ursors 1 and gre
fbd0: 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 ater.. ** See a
fbe0: 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 lso: allocateCur
fbf0: 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d sor().. */. nM
fc00: 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 em += nCursor;.
fc10: 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 if( nCursor==0
fc20: 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d && nMem>0 ) nMem
fc30: 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f ++; /* Space fo
fc40: 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 r aMem[0] even i
fc50: 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 f not used */..
fc60: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 /* Figure out h
fc70: 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 ow much reusable
fc80: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c memory is avail
fc90: 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 able at the end
fca0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f of the. ** opco
fcb0: 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 de array. This
fcc0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c extra memory wil
fcd0: 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 l be reallocated
fce0: 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 for other eleme
fcf0: 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 nts. ** of the
fd00: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
fd10: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 nt.. */. n = R
fd20: 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 OUND8(sizeof(Op)
fd30: 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 *p->nOp);
fd40: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 /* Bytes
fd50: 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 of opcode memory
fd60: 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 used */. x.pSp
fd70: 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e ace = &((u8*)p->
fd80: 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 aOp)[n];
fd90: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 /* Unused
fda0: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a opcode memory *
fdb0: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 /. assert( EIGH
fdc0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 T_BYTE_ALIGNMENT
fdd0: 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 (x.pSpace) );.
fde0: 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 x.nFree = ROUNDD
fdf0: 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f OWN8(pParse->szO
fe00: 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a pAlloc - n); /*
fe10: 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 Bytes of unused
fe20: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 memory */. ass
fe30: 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 ert( x.nFree>=0
fe40: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 );. assert( EIG
fe50: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e HT_BYTE_ALIGNMEN
fe60: 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 T(&x.pSpace[x.nF
fe70: 72 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f ree]) );.. reso
fe80: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 lveP2Values(p, &
fe90: 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 nArg);. p->uses
fea0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 StmtJournal = (u
feb0: 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 8)(pParse->isMul
fec0: 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 tiWrite && pPars
fed0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 e->mayAbort);.
fee0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c if( pParse->expl
fef0: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 ain && nMem<10 )
ff00: 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b {. nMem = 10;
ff10: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 . }. p->expire
ff20: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d d = 0;.. /* Mem
ff30: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 ory for register
ff40: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 s, parameters, c
ff50: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 ursor, etc, is a
ff60: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 llocated in one
ff70: 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 or two. ** pass
ff80: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 es. On the firs
ff90: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 t pass, we try t
ffa0: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d o reuse unused m
ffb0: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 emory at the .
ffc0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 ** end of the op
ffd0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 code array. If
ffe0: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f we are unable to
fff0: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d satisfy all mem
10000 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 ory. ** require
10010 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 ments by reusing
10020 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 the opcode arra
10030 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 y tail, then the
10040 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 second. ** pas
10050 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 s will fill in t
10060 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 he remainder usi
10070 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 ng a fresh memor
10080 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a y allocation. .
10090 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 **. ** This t
100a0 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 wo-pass approach
100b0 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 that reuses as
100c0 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 much memory as p
100d0 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a ossible from. *
100e0 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d * the leftover m
100f0 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 emory at the end
10100 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 of the opcode a
10110 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 rray. This can
10120 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 significantly.
10130 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d ** reduce the am
10140 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 ount of memory h
10150 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 eld by a prepare
10160 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a d statement.. *
10170 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e /. do {. x.n
10180 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 Needed = 0;.
10190 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 p->aMem = allocS
101a0 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d pace(&x, p->aMem
101b0 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 , nMem*sizeof(Me
101c0 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 m));. p->aVar
101d0 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 = allocSpace(&x
101e0 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a , p->aVar, nVar*
101f0 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 sizeof(Mem));.
10200 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c p->apArg = all
10210 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 ocSpace(&x, p->a
10220 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f pArg, nArg*sizeo
10230 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d f(Mem*));. p-
10240 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 >apCsr = allocSp
10250 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 ace(&x, p->apCsr
10260 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 , nCursor*sizeof
10270 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a (VdbeCursor*));.
10280 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e #ifdef SQLITE_EN
10290 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 ABLE_STMT_SCANST
102a0 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 ATUS. p->anEx
102b0 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 ec = allocSpace(
102c0 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 &x, p->anExec, p
102d0 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 ->nOp*sizeof(i64
102e0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 ));.#endif. i
102f0 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 f( x.nNeeded==0
10300 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 ) break;. x.p
10310 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 Space = p->pFree
10320 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c = sqlite3DbMall
10330 6f 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e ocRawNN(db, x.nN
10340 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 eeded);. x.nF
10350 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b ree = x.nNeeded;
10360 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e . }while( !db->
10370 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a mallocFailed );.
10380 0a 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 . p->pVList = p
10390 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 Parse->pVList;.
103a0 20 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 pParse->pVList
103b0 3d 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 = 0;. p->expla
103c0 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 in = pParse->exp
103d0 6c 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e lain;. if( db->
103e0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a mallocFailed ){.
103f0 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b p->nVar = 0;
10400 0a 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 . p->nCursor
10410 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d = 0;. p->nMem
10420 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 = 0;. }else{.
10430 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 p->nCursor =
10440 6e 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e nCursor;. p->
10450 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 nVar = (ynVar)nV
10460 61 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 ar;. initMemA
10470 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 rray(p->aVar, nV
10480 61 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c ar, db, MEM_Null
10490 29 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d );. p->nMem =
104a0 20 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d nMem;. initM
104b0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c emArray(p->aMem,
104c0 20 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 nMem, db, MEM_U
104d0 6e 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d ndefined);. m
104e0 65 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 emset(p->apCsr,
104f0 30 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 0, nCursor*sizeo
10500 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b f(VdbeCursor*));
10510 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
10520 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 NABLE_STMT_SCANS
10530 54 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 TATUS. memset
10540 28 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 (p->anExec, 0, p
10550 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 ->nOp*sizeof(i64
10560 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 ));.#endif. }.
10570 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 sqlite3VdbeRewi
10580 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nd(p);.}../*.**
10590 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 Close a VDBE cur
105a0 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 sor and release
105b0 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 all the resource
105c0 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a s that cursor .*
105d0 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c * happens to hol
105e0 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 d..*/.void sqlit
105f0 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 e3VdbeFreeCursor
10600 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 (Vdbe *p, VdbeCu
10610 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 rsor *pCx){. if
10620 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 ( pCx==0 ){.
10630 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 return;. }. as
10640 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d sert( pCx->pBtx=
10650 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 =0 || pCx->eCurT
10660 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 ype==CURTYPE_BTR
10670 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 EE );. switch(
10680 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b pCx->eCurType ){
10690 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 . case CURTYP
106a0 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 E_SORTER: {.
106b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 sqlite3VdbeSor
106c0 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 terClose(p->db,
106d0 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 pCx);. brea
106e0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
106f0 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a e CURTYPE_BTREE:
10700 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 {. if( pCx
10710 2d 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b ->isEphemeral ){
10720 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78 . if( pCx
10730 2d 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33 ->pBtx ) sqlite3
10740 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e BtreeClose(pCx->
10750 70 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f pBtx);. /
10760 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 * The pCx->pCurs
10770 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 or will be close
10780 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 automatically,
10790 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 if it exists, by
107a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 . ** the
107b0 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 call above. */.
107c0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
107d0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d assert( pCx-
107e0 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 >uc.pCursor!=0 )
107f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 ;. sqlite
10800 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 3BtreeCloseCurso
10810 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f r(pCx->uc.pCurso
10820 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 r);. }.
10830 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 break;. }.#
10840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
10850 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
10860 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 case CURTYPE
10870 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 _VTAB: {. s
10880 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 qlite3_vtab_curs
10890 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d or *pVCur = pCx-
108a0 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 >uc.pVCur;.
108b0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d const sqlite3_m
108c0 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d odule *pModule =
108d0 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 pVCur->pVtab->p
108e0 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 Module;. as
108f0 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74 sert( pVCur->pVt
10900 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 ab->nRef>0 );.
10910 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 pVCur->pVtab
10920 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 ->nRef--;.
10930 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 pModule->xClose(
10940 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72 pVCur);. br
10950 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 eak;. }.#endi
10960 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 f. }.}../*.** C
10970 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 lose all cursors
10980 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 in the current
10990 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 frame..*/.static
109a0 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f void closeCurso
109b0 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a rsInFrame(Vdbe *
109c0 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 p){. if( p->apC
109d0 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b sr ){. int i;
109e0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
109f0 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 p->nCursor; i++)
10a00 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 {. VdbeCurs
10a10 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 or *pC = p->apCs
10a20 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 r[i];. if(
10a30 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 pC ){. sq
10a40 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 lite3VdbeFreeCur
10a50 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 sor(p, pC);.
10a60 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 p->apCsr[i]
10a70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 0;. }.
10a80 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 }. }.}../*.**
10a90 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 Copy the values
10aa0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 stored in the Vd
10ab0 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 beFrame structur
10ac0 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 e to its Vdbe. T
10ad0 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 his.** is used,
10ae0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 for example, whe
10af0 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d n a trigger sub-
10b00 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 program is halte
10b10 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 d to restore.**
10b20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d control to the m
10b30 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a ain program..*/.
10b40 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 int sqlite3VdbeF
10b50 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 rameRestore(Vdbe
10b60 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a Frame *pFrame){.
10b70 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 Vdbe *v = pFra
10b80 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 me->v;. closeCu
10b90 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b rsorsInFrame(v);
10ba0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
10bb0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 NABLE_STMT_SCANS
10bc0 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 TATUS. v->anExe
10bd0 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 c = pFrame->anEx
10be0 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e ec;.#endif. v->
10bf0 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f aOp = pFrame->aO
10c00 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 p;. v->nOp = pF
10c10 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e rame->nOp;. v->
10c20 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 aMem = pFrame->a
10c30 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d Mem;. v->nMem =
10c40 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 pFrame->nMem;.
10c50 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 v->apCsr = pFra
10c60 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e me->apCsr;. v->
10c70 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 nCursor = pFrame
10c80 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e ->nCursor;. v->
10c90 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 db->lastRowid =
10ca0 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 pFrame->lastRowi
10cb0 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 d;. v->nChange
10cc0 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 = pFrame->nChang
10cd0 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 e;. v->db->nCha
10ce0 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 nge = pFrame->nD
10cf0 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 bChange;. sqlit
10d00 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 e3VdbeDeleteAuxD
10d10 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 ata(v->db, &v->p
10d20 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b AuxData, -1, 0);
10d30 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d . v->pAuxData =
10d40 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 pFrame->pAuxDat
10d50 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 a;. pFrame->pAu
10d60 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 xData = 0;. ret
10d70 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a urn pFrame->pc;.
10d80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 }../*.** Close a
10d90 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a ll cursors..**.*
10da0 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 * Also release a
10db0 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 ny dynamic memor
10dc0 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d y held by the VM
10dd0 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 in the Vdbe.aMe
10de0 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c m memory .** cel
10df0 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 l array. This is
10e00 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 necessary as th
10e10 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 e memory cell ar
10e20 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a ray may contain.
10e30 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 ** pointers to V
10e40 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 dbeFrame objects
10e50 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 , which may in t
10e60 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e urn contain poin
10e70 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 ters to.** open
10e80 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 cursors..*/.stat
10e90 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c ic void closeAll
10ea0 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 Cursors(Vdbe *p)
10eb0 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d {. if( p->pFram
10ec0 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 e ){. VdbeFra
10ed0 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 me *pFrame;.
10ee0 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 for(pFrame=p->pF
10ef0 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 rame; pFrame->pP
10f00 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 arent; pFrame=pF
10f10 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a rame->pParent);.
10f20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 sqlite3VdbeF
10f30 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 rameRestore(pFra
10f40 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 me);. p->pFra
10f50 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e me = 0;. p->n
10f60 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 Frame = 0;. }.
10f70 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 assert( p->nFra
10f80 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 me==0 );. close
10f90 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 CursorsInFrame(p
10fa0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d );. if( p->aMem
10fb0 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d ){. releaseM
10fc0 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c emArray(p->aMem,
10fd0 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 p->nMem);. }.
10fe0 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 while( p->pDelF
10ff0 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 rame ){. Vdbe
11000 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d Frame *pDel = p-
11010 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 >pDelFrame;.
11020 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 p->pDelFrame = p
11030 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 Del->pParent;.
11040 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 sqlite3VdbeFra
11050 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a meDelete(pDel);.
11060 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 }.. /* Delete
11070 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c any auxdata all
11080 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 ocations made by
11090 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 the VM */. if(
110a0 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 p->pAuxData ) s
110b0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
110c0 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 AuxData(p->db, &
110d0 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c p->pAuxData, -1,
110e0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0);. assert( p
110f0 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b ->pAuxData==0 );
11100 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 .}../*.** Set th
11110 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 e number of resu
11120 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 lt columns that
11130 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 will be returned
11140 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 by this SQL.**
11150 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 statement. This
11160 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f is now set at co
11170 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 mpile time, rath
11180 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a er than during.*
11190 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 * execution of t
111a0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 he vdbe program
111b0 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f so that sqlite3_
111c0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 column_count() c
111d0 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 an.** be called
111e0 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d on an SQL statem
111f0 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 ent before sqlit
11200 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f e3_step()..*/.vo
11210 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 id sqlite3VdbeSe
11220 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 tNumCols(Vdbe *p
11230 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e , int nResColumn
11240 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 ){. int n;. sq
11250 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
11260 62 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 b;.. if( p->nRe
11270 73 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 sColumn ){. r
11280 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 eleaseMemArray(p
11290 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e ->aColName, p->n
112a0 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d ResColumn*COLNAM
112b0 45 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 E_N);. sqlite
112c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 3DbFree(db, p->a
112d0 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 ColName);. }.
112e0 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 n = nResColumn*C
112f0 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e OLNAME_N;. p->n
11300 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 ResColumn = (u16
11310 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 )nResColumn;. p
11320 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 ->aColName = (Me
11330 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c m*)sqlite3DbMall
11340 6f 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 ocRawNN(db, size
11350 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 of(Mem)*n );. i
11360 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d f( p->aColName==
11370 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 0 ) return;. in
11380 69 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 itMemArray(p->aC
11390 6f 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d olName, n, db, M
113a0 45 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a EM_Null);.}../*.
113b0 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 ** Set the name
113c0 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f of the idx'th co
113d0 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 lumn to be retur
113e0 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 ned by the SQL s
113f0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 tatement..** zNa
11400 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 me must be a poi
11410 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 nter to a nul te
11420 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e rminated string.
11430 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c .**.** This call
11440 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 must be made af
11450 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 ter a call to sq
11460 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 lite3VdbeSetNumC
11470 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 ols()..**.** The
11480 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 final parameter
11490 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 , xDel, must be
114a0 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 one of SQLITE_DY
114b0 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 NAMIC, SQLITE_ST
114c0 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 ATIC.** or SQLIT
114d0 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 E_TRANSIENT. If
114e0 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e it is SQLITE_DYN
114f0 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 AMIC, then the b
11500 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a uffer pointed.**
11510 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c to by zName wil
11520 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 l be freed by sq
11530 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 lite3DbFree() wh
11540 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 en the vdbe is d
11550 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 estroyed..*/.int
11560 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 sqlite3VdbeSetC
11570 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a olName(. Vdbe *
11580 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p,
11590 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 /* Vd
115a0 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 be being configu
115b0 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 red */. int idx
115c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
115d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 /* Ind
115e0 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 ex of column zNa
115f0 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f me applies to */
11600 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 . int var,
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11620 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 /* One of th
11630 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 e COLNAME_* cons
11640 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 tants */. const
11650 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 char *zName,
11660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
11670 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 ointer to buffer
11680 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 containing name
11690 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 */. void (*xDe
116a0 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 l)(void*)
116b0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 /* Memory
116c0 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 management stra
116d0 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a tegy for zName *
116e0 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 /.){. int rc;.
116f0 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a Mem *pColName;.
11700 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d assert( idx<p-
11710 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 >nResColumn );.
11720 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c assert( var<COL
11730 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 NAME_N );. if(
11740 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
11750 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 led ){. asser
11760 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 t( !zName || xDe
11770 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 l!=SQLITE_DYNAMI
11780 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 C );. return
11790 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 SQLITE_NOMEM_BKP
117a0 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 T;. }. assert(
117b0 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 p->aColName!=0
117c0 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 );. pColName =
117d0 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 &(p->aColName[id
117e0 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c x+var*p->nResCol
117f0 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 umn]);. rc = sq
11800 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 lite3VdbeMemSetS
11810 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 tr(pColName, zNa
11820 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 me, -1, SQLITE_U
11830 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 TF8, xDel);. as
11840 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 sert( rc!=0 || !
11850 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 zName || (pColNa
11860 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 me->flags&MEM_Te
11870 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 rm)!=0 );. retu
11880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
11890 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 A read or write
118a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 transaction may
118b0 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 or may not be ac
118c0 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 tive on database
118d0 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 handle.** db. I
118e0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 f a transaction
118f0 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 is active, commi
11900 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 t it. If there i
11910 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 s a.** write-tra
11920 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e nsaction spannin
11930 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 g more than one
11940 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 database file, t
11950 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 his routine.** t
11960 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 akes care of the
11970 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
11980 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 trickery..*/.sta
11990 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d tic int vdbeComm
119a0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 it(sqlite3 *db,
119b0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 Vdbe *p){. int
119c0 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 i;. int nTrans
119d0 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 = 0; /* Number
119e0 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 of databases wit
119f0 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 h an active writ
11a00 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 e-transaction.
11a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11a20 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e ** that are can
11a30 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 didates for a tw
11a40 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 o-phase commit u
11a50 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 sing a.
11a60 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 ** mas
11a70 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 ter-journal */.
11a80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 int rc = SQLITE
11a90 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 _OK;. int needX
11aa0 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 commit = 0;..#if
11ab0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
11ac0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f VIRTUALTABLE. /
11ad0 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 * With this opti
11ae0 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 on, sqlite3VtabS
11af0 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 ync() is defined
11b00 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 to be simply .
11b10 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f ** SQLITE_OK so
11b20 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 p is not used.
11b30 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 . */. UNUSED_P
11b40 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e ARAMETER(p);.#en
11b50 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 dif.. /* Before
11b60 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 doing anything
11b70 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 else, call the x
11b80 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 Sync() callback
11b90 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 for any. ** vir
11ba0 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c tual module tabl
11bb0 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 es written in th
11bc0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 is transaction.
11bd0 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a This has to. **
11be0 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 be done before
11bf0 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 determining whet
11c00 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 her a master jou
11c10 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 rnal file is .
11c20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 ** required, as
11c30 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 an xSync() callb
11c40 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 ack may add an a
11c50 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 ttached database
11c60 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 . ** to the tra
11c70 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 nsaction.. */.
11c80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 rc = sqlite3Vta
11c90 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 bSync(db, p);..
11ca0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 /* This loop de
11cb0 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 termines (a) if
11cc0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 the commit hook
11cd0 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 should be invoke
11ce0 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 d and. ** (b) h
11cf0 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 ow many database
11d00 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e files have open
11d10 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 write transacti
11d20 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 ons, not . ** i
11d30 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d ncluding the tem
11d40 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 p database. (b)
11d50 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 is important bec
11d60 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 ause if more tha
11d70 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 n . ** one data
11d80 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e base file has an
11d90 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e open write tran
11da0 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 saction, a maste
11db0 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 r journal. ** f
11dc0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 ile is required
11dd0 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f for an atomic co
11de0 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f mmit.. */ . fo
11df0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 r(i=0; rc==SQLIT
11e00 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 E_OK && i<db->nD
11e10 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 b; i++){ . Bt
11e20 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 ree *pBt = db->a
11e30 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 Db[i].pBt;. i
11e40 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 f( sqlite3BtreeI
11e50 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b sInTrans(pBt) ){
11e60 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 . /* Whethe
11e70 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 r or not a datab
11e80 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 ase might need a
11e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
11ea0 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 depends upon.
11eb0 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 ** its journa
11ec0 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 l mode (among ot
11ed0 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 her things). Th
11ee0 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d is matrix determ
11ef0 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 ines which.
11f00 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 ** journal mode
11f10 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a s use a master j
11f20 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 ournal and which
11f30 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 do not */.
11f40 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 static const u8
11f50 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b aMJNeeded[] = {
11f60 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 . /* DELE
11f70 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 TE */ 1,.
11f80 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 /* PERSIST
11f90 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f */ 1,. /
11fa0 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 * OFF */ 0
11fb0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 ,. /* TRU
11fc0 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 NCATE */ 1,.
11fd0 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 /* MEMORY
11fe0 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 */ 0,.
11ff0 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 /* WAL */
12000 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 0. };.
12010 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 Pager *pPager;
12020 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 /* Pager assoc
12030 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a iated with pBt *
12040 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d /. needXcom
12050 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 mit = 1;. s
12060 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
12070 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 (pBt);. pPa
12080 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 ger = sqlite3Btr
12090 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 eePager(pBt);.
120a0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b if( db->aDb[
120b0 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 i].safety_level!
120c0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f =PAGER_SYNCHRONO
120d0 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 US_OFF. &&
120e0 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 aMJNeeded[sqlit
120f0 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 e3PagerGetJourna
12100 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 lMode(pPager)].
12110 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 && sqlite3
12120 50 61 67 65 72 49 73 4d 65 6d 64 62 28 70 50 61 PagerIsMemdb(pPa
12130 67 65 72 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b ger)==0. ){
12140 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 . assert
12150 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 ( i!=1 );.
12160 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 nTrans++;.
12170 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 }. rc = s
12180 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 qlite3PagerExclu
12190 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 siveLock(pPager)
121a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 ;. sqlite3B
121b0 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a treeLeave(pBt);.
121c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 }. }. if(
121d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
121e0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a . return rc;.
121f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 }.. /* If the
12200 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 re are any write
12210 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 -transactions at
12220 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 all, invoke the
12230 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a commit hook */.
12240 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 if( needXcommi
12250 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 t && db->xCommit
12260 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 Callback ){.
12270 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 rc = db->xCommit
12280 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f Callback(db->pCo
12290 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 mmitArg);. if
122a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 ( rc ){. re
122b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 turn SQLITE_CONS
122c0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f TRAINT_COMMITHOO
122d0 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 K;. }. }..
122e0 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 /* The simple ca
122f0 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 se - no more tha
12300 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 n one database f
12310 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e ile (not countin
12320 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 g the. ** TEMP
12330 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 database) has a
12340 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 transaction acti
12350 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e ve. There is n
12360 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 o need for the.
12370 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e ** master-journ
12380 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 al.. **. ** If
12390 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 the return valu
123a0 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 e of sqlite3Btre
123b0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 eGetFilename() i
123c0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a s a zero length.
123d0 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 ** string, it
123e0 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 means the main d
123f0 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f atabase is :memo
12400 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 ry: or a temp fi
12410 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 le. In . ** th
12420 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f at case we do no
12430 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 t support atomic
12440 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d multi-file comm
12450 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 its, so use the
12460 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 . ** simple cas
12470 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f e then too.. */
12480 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 . if( 0==sqlite
12490 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 3Strlen30(sqlite
124a0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 3BtreeGetFilenam
124b0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 e(db->aDb[0].pBt
124c0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c )). || nTrans<
124d0 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 =1. ){. for(
124e0 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f i=0; rc==SQLITE_
124f0 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b OK && i<db->nDb;
12500 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 i++){. Btr
12510 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
12520 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 b[i].pBt;.
12530 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 if( pBt ){.
12540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 rc = sqlite3B
12550 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f treeCommitPhaseO
12560 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 ne(pBt, 0);.
12570 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
12580 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 * Do the commit
12590 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 only if all data
125a0 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c bases successful
125b0 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 ly complete phas
125c0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 e 1. . ** If
125d0 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 one of the Btree
125e0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 CommitPhaseOne()
125f0 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 calls fails, th
12600 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a is indicates an.
12610 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 ** IO error
12620 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f while deleting o
12630 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a r truncating a j
12640 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 ournal file. It
12650 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 is unlikely,.
12660 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 ** but could ha
12670 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 ppen. In this ca
12680 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 se abandon proce
12690 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e ssing and return
126a0 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 the error..
126b0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 */. for(i=0;
126c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
126d0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 i<db->nDb; i++)
126e0 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 {. Btree *p
126f0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e Bt = db->aDb[i].
12700 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 pBt;. if( p
12710 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 Bt ){. rc
12720 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 = sqlite3BtreeC
12730 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 ommitPhaseTwo(pB
12740 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 t, 0);. }.
12750 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d }. if( rc=
12760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
12770 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 sqlite3VtabC
12780 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d ommit(db);. }
12790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 . }.. /* The c
127a0 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 omplex case - Th
127b0 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 ere is a multi-f
127c0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 ile write-transa
127d0 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 ction active..
127e0 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 ** This requires
127f0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 a master journa
12800 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 l file to ensure
12810 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
12820 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 is. ** committ
12830 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 ed atomically..
12840 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */.#ifndef SQLI
12850 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 TE_OMIT_DISKIO.
12860 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 else{. sqlit
12870 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 e3_vfs *pVfs = d
12880 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61 b->pVfs;. cha
12890 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 r *zMaster = 0;
128a0 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 /* File-name f
128b0 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f or the master jo
128c0 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 urnal */. cha
128d0 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 r const *zMainFi
128e0 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 le = sqlite3Btre
128f0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d eGetFilename(db-
12900 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 >aDb[0].pBt);.
12910 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a sqlite3_file *
12920 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 pMaster = 0;.
12930 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b i64 offset = 0;
12940 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 . int res;.
12950 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 int retryCount
12960 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d = 0;. int nM
12970 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a ainFile;.. /*
12980 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 Select a master
12990 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 journal file na
129a0 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 me */. nMainF
129b0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 ile = sqlite3Str
129c0 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 len30(zMainFile)
129d0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 ;. zMaster =
129e0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 sqlite3MPrintf(d
129f0 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 b, "%s-mjXXXXXX9
12a00 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 XXz", zMainFile)
12a10 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 ;. if( zMaste
12a20 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 r==0 ) return SQ
12a30 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b LITE_NOMEM_BKPT;
12a40 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 . do {.
12a50 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 u32 iRandom;.
12a60 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e if( retryCoun
12a70 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 t ){. if(
12a80 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 retryCount>100
12a90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c ){. sql
12aa0 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f ite3_log(SQLITE_
12ab0 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 FULL, "MJ delete
12ac0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b : %s", zMaster);
12ad0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
12ae0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c e3OsDelete(pVfs,
12af0 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 zMaster, 0);.
12b00 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
12b10 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
12b20 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 retryCount==1 )
12b30 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 {. sqli
12b40 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 te3_log(SQLITE_F
12b50 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 ULL, "MJ collide
12b60 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b : %s", zMaster);
12b70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
12b80 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f }. retryCo
12b90 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c unt++;. sql
12ba0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 ite3_randomness(
12bb0 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c sizeof(iRandom),
12bc0 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 &iRandom);.
12bd0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
12be0 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b tf(13, &zMaster[
12bf0 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a nMainFile], "-mj
12c00 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 %06X9%02X",.
12c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12c20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e (iRan
12c30 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 dom>>8)&0xffffff
12c40 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b , iRandom&0xff);
12c50 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e . /* The an
12c60 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 tipenultimate ch
12c70 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d aracter of the m
12c80 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 aster journal na
12c90 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a me must. **
12ca0 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 be "9" to avoid
12cb0 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 name collisions
12cc0 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 when using 8+3
12cd0 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 filenames. */.
12ce0 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 assert( zMas
12cf0 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 ter[sqlite3Strle
12d00 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d n30(zMaster)-3]=
12d10 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 ='9' );. sq
12d20 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 lite3FileSuffix3
12d30 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 (zMainFile, zMas
12d40 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d ter);. rc =
12d50 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 sqlite3OsAccess
12d60 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 (pVfs, zMaster,
12d70 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 SQLITE_ACCESS_EX
12d80 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 ISTS, &res);.
12d90 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c }while( rc==SQL
12da0 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b ITE_OK && res );
12db0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c . if( rc==SQL
12dc0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
12dd0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 /* Open the mast
12de0 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 er journal. */.
12df0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
12e00 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 3OsOpenMalloc(pV
12e10 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d fs, zMaster, &pM
12e20 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 aster, .
12e30 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 SQLITE_OPEN_RE
12e40 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f ADWRITE|SQLITE_O
12e50 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 PEN_CREATE|.
12e60 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 SQLITE_OPE
12e70 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 N_EXCLUSIVE|SQLI
12e80 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a TE_OPEN_MASTER_J
12e90 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 OURNAL, 0.
12ea0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 );. }. if(
12eb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
12ec0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 {. sqlite3D
12ed0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 bFree(db, zMaste
12ee0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e r);. return
12ef0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 rc;. }. .
12f00 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 /* Write the na
12f10 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 me of each datab
12f20 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 ase file in the
12f30 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f transaction into
12f40 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 the new. **
12f50 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
12f60 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 ile. If an error
12f70 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 occurs at this
12f80 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 point close.
12f90 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 ** and delete th
12fa0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
12fb0 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 file. All the i
12fc0 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 ndividual journa
12fd0 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 l files. ** s
12fe0 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 till have 'null'
12ff0 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a as the master j
13000 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 ournal pointer,
13010 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c so they will rol
13020 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e l. ** back in
13030 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 dependently if a
13040 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e failure occurs.
13050 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 . */. for(
13060 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 i=0; i<db->nDb;
13070 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 i++){. Btre
13080 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 e *pBt = db->aDb
13090 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 [i].pBt;. i
130a0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 f( sqlite3BtreeI
130b0 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b sInTrans(pBt) ){
130c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f . char co
130d0 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c nst *zFile = sql
130e0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 ite3BtreeGetJour
130f0 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 nalname(pBt);.
13100 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d if( zFile=
13110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
13120 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 continue; /* Ig
13130 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d nore TEMP and :m
13140 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 emory: databases
13150 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 */. }.
13160 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 assert( zF
13170 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 ile[0]!=0 );.
13180 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
13190 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 3OsWrite(pMaster
131a0 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 , zFile, sqlite3
131b0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b Strlen30(zFile)+
131c0 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 1, offset);.
131d0 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 offset += sq
131e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 lite3Strlen30(zF
131f0 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 ile)+1;.
13200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
13210 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 K ){. s
13220 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 qlite3OsCloseFre
13230 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 e(pMaster);.
13240 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 sqlite3OsD
13250 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 elete(pVfs, zMas
13260 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 ter, 0);.
13270 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
13280 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 (db, zMaster);.
13290 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
132a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 rc;. }.
132b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
132c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 /* Sync the mas
132d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
132e0 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 . If the IOCAP_S
132f0 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 EQUENTIAL device
13300 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 . ** flag is
13310 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 set this is not
13320 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f required.. */
13330 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c . if( 0==(sql
13340 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 ite3OsDeviceChar
13350 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 acteristics(pMas
13360 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 ter)&SQLITE_IOCA
13370 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 P_SEQUENTIAL).
13380 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 && SQLITE_OK!
13390 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 =(rc = sqlite3Os
133a0 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 Sync(pMaster, SQ
133b0 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c LITE_SYNC_NORMAL
133c0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 )). ){.
133d0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 sqlite3OsCloseFr
133e0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 ee(pMaster);.
133f0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 sqlite3OsDele
13400 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 te(pVfs, zMaster
13410 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 , 0);. sqli
13420 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d te3DbFree(db, zM
13430 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 aster);. re
13440 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a turn rc;. }..
13450 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 /* Sync all
13460 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 the db files inv
13470 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 olved in the tra
13480 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 nsaction. The sa
13490 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 me call. ** s
134a0 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a ets the master j
134b0 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 ournal pointer i
134c0 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 n each individua
134d0 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 l journal. If.
134e0 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 ** an error oc
134f0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f curs here, do no
13500 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 t delete the mas
13510 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
13520 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 .. **. **
13530 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 If the error occ
13540 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 urs during the f
13550 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 irst call to.
13560 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 ** sqlite3Btree
13570 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 CommitPhaseOne()
13580 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 , then there is
13590 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 a chance that th
135a0 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 e. ** master
135b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c journal file wil
135c0 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 l be orphaned. B
135d0 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c ut we cannot del
135e0 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 ete it,. ** i
135f0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 n case the maste
13600 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e r journal file n
13610 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 ame was written
13620 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c into the journal
13630 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 . ** file bef
13640 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 ore the failure
13650 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f occurred.. */
13660 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 . for(i=0; rc
13670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 ==SQLITE_OK && i
13680 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 <db->nDb; i++){
13690 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 . Btree *pB
136a0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 t = db->aDb[i].p
136b0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 Bt;. if( pB
136c0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 t ){. rc
136d0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f = sqlite3BtreeCo
136e0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 mmitPhaseOne(pBt
136f0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 , zMaster);.
13700 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 }. }. sq
13710 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 lite3OsCloseFree
13720 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 (pMaster);. a
13730 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 ssert( rc!=SQLIT
13740 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 E_BUSY );. if
13750 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
13760 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
13770 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 DbFree(db, zMast
13780 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 er);. retur
13790 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 n rc;. }..
137a0 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d /* Delete the m
137b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
137c0 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 le. This commits
137d0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
137e0 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 . After. ** d
137f0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 oing this the di
13800 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 rectory is synce
13810 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 d again before a
13820 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 ny individual.
13830 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e ** transaction
13840 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 files are delet
13850 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 ed.. */. r
13860 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c c = sqlite3OsDel
13870 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 ete(pVfs, zMaste
13880 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 r, 1);. sqlit
13890 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 e3DbFree(db, zMa
138a0 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 ster);. zMast
138b0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 er = 0;. if(
138c0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 rc ){. retu
138d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 rn rc;. }..
138e0 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 /* All files a
138f0 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 nd directories h
13900 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e ave already been
13910 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 synced, so the
13920 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a following. **
13930 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 calls to sqlite
13940 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 3BtreeCommitPhas
13950 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 eTwo() are only
13960 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e closing files an
13970 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e d. ** deletin
13980 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 g or truncating
13990 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d journals. If som
139a0 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e ething goes wron
139b0 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 g while. ** t
139c0 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 his is happening
139d0 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 we don't really
139e0 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 care. The integ
139f0 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 rity of the.
13a00 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 ** transaction i
13a10 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e s already guaran
13a20 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 teed, but some s
13a30 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 tray 'cold' jour
13a40 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 nals. ** may
13a50 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e be lying around.
13a60 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 Returning an er
13a70 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 ror code won't h
13a80 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 elp matters..
13a90 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f */. disable_
13aa0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 simulated_io_err
13ab0 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 ors();. sqlit
13ac0 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c e3BeginBenignMal
13ad0 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 loc();. for(i
13ae0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 =0; i<db->nDb; i
13af0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 ++){ . Btre
13b00 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 e *pBt = db->aDb
13b10 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 [i].pBt;. i
13b20 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 f( pBt ){.
13b30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f sqlite3BtreeCo
13b40 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 mmitPhaseTwo(pBt
13b50 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 , 1);. }.
13b60 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 }. sqlite3E
13b70 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 ndBenignMalloc()
13b80 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d ;. enable_sim
13b90 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 ulated_io_errors
13ba0 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 ();.. sqlite3
13bb0 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a VtabCommit(db);.
13bc0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 }.#endif.. re
13bd0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a turn rc;.}../* .
13be0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
13bf0 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 checks that the
13c00 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 sqlite3.nVdbeAct
13c10 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 ive count variab
13c20 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 le.** matches th
13c30 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 e number of vdbe
13c40 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 's in the list s
13c50 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 qlite3.pVdbe tha
13c60 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 t are.** current
13c70 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 ly active. An as
13c80 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 sertion fails if
13c90 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 the two counts
13ca0 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a do not match..**
13cb0 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 This is an inte
13cc0 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 rnal self-check
13cd0 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 only - it is not
13ce0 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 an essential pr
13cf0 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 ocessing.** step
13d00 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 ..**.** This is
13d10 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 a no-op if NDEBU
13d20 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f G is defined..*/
13d30 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
13d40 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 static void chec
13d50 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 kActiveVdbeCnt(s
13d60 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 qlite3 *db){. V
13d70 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e dbe *p;. int cn
13d80 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 t = 0;. int nWr
13d90 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e ite = 0;. int n
13da0 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 Read = 0;. p =
13db0 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 db->pVdbe;. whi
13dc0 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 le( p ){. if(
13dd0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 sqlite3_stmt_bu
13de0 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 sy((sqlite3_stmt
13df0 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e *)p) ){. cn
13e00 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 t++;. if( p
13e10 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 ->readOnly==0 )
13e20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 nWrite++;.
13e30 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 if( p->bIsReader
13e40 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 ) nRead++;.
13e50 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 }. p = p->pNe
13e60 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 xt;. }. assert
13e70 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 ( cnt==db->nVdbe
13e80 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 Active );. asse
13e90 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e rt( nWrite==db->
13ea0 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 nVdbeWrite );.
13eb0 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 assert( nRead==d
13ec0 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a b->nVdbeRead );.
13ed0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 }.#else.#define
13ee0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 checkActiveVdbeC
13ef0 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a nt(x).#endif../*
13f00 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 .** If the Vdbe
13f10 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 passed as the fi
13f20 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 rst argument ope
13f30 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d ned a statement-
13f40 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 transaction,.**
13f50 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 close it now. Ar
13f60 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 gument eOp must
13f70 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f be either SAVEPO
13f80 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a INT_ROLLBACK or.
13f90 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c ** SAVEPOINT_REL
13fa0 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 EASE. If it is S
13fb0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
13fc0 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 K, then the stat
13fd0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 ement.** transac
13fe0 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 tion is rolled b
13ff0 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 ack. If eOp is S
14000 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 AVEPOINT_RELEASE
14010 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 , then the .** s
14020 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 tatement transac
14030 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 tion is committe
14040 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 d..**.** If an I
14050 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 O error occurs,
14060 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f an SQLITE_IOERR_
14070 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 XXX error code i
14080 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 s returned. .**
14090 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 Otherwise SQLITE
140a0 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 _OK..*/.static S
140b0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 QLITE_NOINLINE i
140c0 6e 74 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 nt vdbeCloseStat
140d0 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 ement(Vdbe *p, i
140e0 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 nt eOp){. sqlit
140f0 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 e3 *const db = p
14100 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d ->db;. int rc =
14110 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e SQLITE_OK;. in
14120 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 69 6e 74 t i;. const int
14130 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d iSavepoint = p-
14140 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a >iStatement-1;..
14150 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 assert( eOp==S
14160 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
14170 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f K || eOp==SAVEPO
14180 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 INT_RELEASE);.
14190 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 assert( db->nSta
141a0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 61 73 tement>0 );. as
141b0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d sert( p->iStatem
141c0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 ent==(db->nState
141d0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f ment+db->nSavepo
141e0 69 6e 74 29 20 29 3b 0a 0a 20 20 66 6f 72 28 69 int) );.. for(i
141f0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 =0; i<db->nDb; i
14200 2b 2b 29 7b 20 0a 20 20 20 20 69 6e 74 20 72 63 ++){ . int rc
14210 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 2 = SQLITE_OK;.
14220 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
14230 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
14240 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 if( pBt ){.
14250 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 if( eOp==SA
14260 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b VEPOINT_ROLLBACK
14270 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 ){. rc2
14280 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 = sqlite3BtreeSa
14290 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 vepoint(pBt, SAV
142a0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c EPOINT_ROLLBACK,
142b0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 iSavepoint);.
142c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 }. if(
142d0 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc2==SQLITE_OK )
142e0 7b 0a 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 {. rc2 =
142f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 sqlite3BtreeSave
14300 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 point(pBt, SAVEP
14310 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 OINT_RELEASE, iS
14320 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 avepoint);.
14330 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d }. if( rc=
14340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
14350 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a rc = rc2;.
14360 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
14370 7d 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 }. db->nStateme
14380 6e 74 2d 2d 3b 0a 20 20 70 2d 3e 69 53 74 61 74 nt--;. p->iStat
14390 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 69 66 ement = 0;.. if
143a0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
143b0 29 7b 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d ){. if( eOp==
143c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
143d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d CK ){. rc =
143e0 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 sqlite3VtabSave
143f0 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f point(db, SAVEPO
14400 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 INT_ROLLBACK, iS
14410 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d avepoint);. }
14420 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c . if( rc==SQL
14430 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
14440 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 rc = sqlite3Vtab
14450 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 Savepoint(db, SA
14460 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c VEPOINT_RELEASE,
14470 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 iSavepoint);.
14480 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 }. }.. /* If
14490 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 the statement t
144a0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 ransaction is be
144b0 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c ing rolled back,
144c0 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 also restore th
144d0 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 e . ** database
144e0 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 handles deferre
144f0 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 d constraint cou
14500 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 nter to the valu
14510 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 e it had when .
14520 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e ** the statemen
14530 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 t transaction wa
14540 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 s opened. */.
14550 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 if( eOp==SAVEPOI
14560 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 NT_ROLLBACK ){.
14570 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 db->nDeferred
14580 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 Cons = p->nStmtD
14590 65 66 43 6f 6e 73 3b 0a 20 20 20 20 64 62 2d 3e efCons;. db->
145a0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 nDeferredImmCons
145b0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d = p->nStmtDefIm
145c0 6d 43 6f 6e 73 3b 0a 20 20 7d 0a 20 20 72 65 74 mCons;. }. ret
145d0 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 urn rc;.}.int sq
145e0 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 lite3VdbeCloseSt
145f0 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c atement(Vdbe *p,
14600 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 69 66 28 int eOp){. if(
14610 20 70 2d 3e 64 62 2d 3e 6e 53 74 61 74 65 6d 65 p->db->nStateme
14620 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d nt && p->iStatem
14630 65 6e 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ent ){. retur
14640 6e 20 76 64 62 65 43 6c 6f 73 65 53 74 61 74 65 n vdbeCloseState
14650 6d 65 6e 74 28 70 2c 20 65 4f 70 29 3b 0a 20 20 ment(p, eOp);.
14660 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 }. return SQLIT
14670 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 E_OK;.}.../*.**
14680 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
14690 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 called when a t
146a0 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 ransaction opene
146b0 64 20 62 79 20 74 68 65 20 64 61 74 61 62 61 73 d by the databas
146c0 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 e .** handle ass
146d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
146e0 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e VM passed as an
146f0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f argument is abo
14700 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d ut to be .** com
14710 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 mitted. If there
14720 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 are outstanding
14730 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 deferred foreig
14740 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 n key constraint
14750 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 .** violations,
14760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
14770 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ROR. Otherwise,
14780 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a SQLITE_OK..**.**
14790 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 If there are ou
147a0 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f tstanding FK vio
147b0 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 lations and this
147c0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
147d0 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 s .** SQLITE_ERR
147e0 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 OR, set the resu
147f0 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 lt of the VM to
14800 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e SQLITE_CONSTRAIN
14810 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 T_FOREIGNKEY.**
14820 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 and write an err
14830 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 or message to it
14840 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 . Then return SQ
14850 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 LITE_ERROR..*/.#
14860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
14870 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 IT_FOREIGN_KEY.i
14880 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 nt sqlite3VdbeCh
14890 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 eckFk(Vdbe *p, i
148a0 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 nt deferred){.
148b0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d sqlite3 *db = p-
148c0 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 >db;. if( (defe
148d0 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 rred && (db->nDe
148e0 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e ferredCons+db->n
148f0 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 DeferredImmCons)
14900 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 >0) . || (!def
14910 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 erred && p->nFkC
14920 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 onstraint>0) .
14930 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 ){. p->rc = S
14940 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
14950 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 _FOREIGNKEY;.
14960 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 p->errorAction
14970 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 = OE_Abort;.
14980 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 sqlite3VdbeError
14990 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 (p, "FOREIGN KEY
149a0 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c constraint fail
149b0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ed");. return
149c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 SQLITE_ERROR;.
149d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 }. return SQLI
149e0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a TE_OK;.}.#endif.
149f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 ./*.** This rout
14a00 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 ine is called th
14a10 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 e when a VDBE tr
14a20 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 ies to halt. If
14a30 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 the VDBE.** has
14a40 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e made changes an
14a50 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d d is in autocomm
14a60 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f it mode, then co
14a70 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 mmit those.** ch
14a80 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c anges. If a rol
14a90 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c lback is needed,
14aa0 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c then do the rol
14ab0 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 lback..**.** Thi
14ac0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 s routine is the
14ad0 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 only way to mov
14ae0 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 e the state of a
14af0 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 VM from.** SQLI
14b00 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 TE_MAGIC_RUN to
14b10 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c SQLITE_MAGIC_HAL
14b20 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 T. It is harmle
14b30 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 ss to.** call th
14b40 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 is on a VM that
14b50 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 is in the SQLITE
14b60 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 _MAGIC_HALT stat
14b70 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 e..**.** Return
14b80 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 an error code.
14b90 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f If the commit co
14ba0 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 uld not complete
14bb0 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c because of.** l
14bc0 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 ock contention,
14bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 return SQLITE_BU
14be0 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 SY. If SQLITE_B
14bf0 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c USY is returned,
14c00 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 it.** means the
14c10 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 close did not h
14c20 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 appen and needs
14c30 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a to be repeated..
14c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
14c50 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b beHalt(Vdbe *p){
14c60 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 . int rc;
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14c80 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 /* Used to st
14c90 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 ore transient re
14ca0 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 turn codes */.
14cb0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d sqlite3 *db = p-
14cc0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 >db;.. /* This
14cd0 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e function contain
14ce0 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 s the logic that
14cf0 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 determines if a
14d00 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 statement or.
14d10 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 ** transaction w
14d20 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 ill be committed
14d30 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 or rolled back
14d40 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 as a result of t
14d50 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f he. ** executio
14d60 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 n of this virtua
14d70 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a l machine. . **
14d80 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 . ** If any of
14d90 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 the following er
14da0 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a rors occur:. **
14db0 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 . ** SQLITE
14dc0 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 _NOMEM. **
14dd0 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a SQLITE_IOERR. *
14de0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c * SQLITE_FUL
14df0 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 L. ** SQLIT
14e00 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a E_INTERRUPT. **
14e10 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 . ** Then the i
14e20 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 nternal cache mi
14e30 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 ght have been le
14e40 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 ft in an inconsi
14e50 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 stent. ** state
14e60 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f . We need to ro
14e70 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 llback the state
14e80 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
14e90 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 , if there is.
14ea0 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 ** one, or the c
14eb0 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 omplete transact
14ec0 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 ion if there is
14ed0 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 no statement tra
14ee0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a nsaction.. */..
14ef0 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d if( p->magic!=
14f00 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 VDBE_MAGIC_RUN )
14f10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c {. return SQL
14f20 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 ITE_OK;. }. if
14f30 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ( db->mallocFail
14f40 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 ed ){. p->rc
14f50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 = SQLITE_NOMEM_B
14f60 4b 50 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 KPT;. }. close
14f70 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 AllCursors(p);.
14f80 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 checkActiveVdbe
14f90 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e Cnt(db);.. /* N
14fa0 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c o commit or roll
14fb0 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 back needed if t
14fc0 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 he program never
14fd0 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 started or if t
14fe0 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 he. ** SQL stat
14ff0 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 ement does not r
15000 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 ead or write a d
15010 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a atabase file. *
15020 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 /. if( p->pc>=0
15030 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 && p->bIsReader
15040 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b ){. int mrc;
15050 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 /* Primary er
15060 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d ror code from p-
15070 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 >rc */. int e
15080 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b StatementOp = 0;
15090 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 . int isSpeci
150a0 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 alError;
150b0 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 /* Set to tr
150c0 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c ue if a 'special
150d0 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 ' error */..
150e0 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 /* Lock all btre
150f0 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 es used by the s
15100 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 tatement */.
15110 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 sqlite3VdbeEnter
15120 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 (p);.. /* Che
15130 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 ck for one of th
15140 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 e special errors
15150 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d */. mrc = p-
15160 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 >rc & 0xff;.
15170 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d isSpecialError =
15180 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d mrc==SQLITE_NOM
15190 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 EM || mrc==SQLIT
151a0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 E_IOERR.
151b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 ||
151c0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 mrc==SQLITE_INTE
151d0 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 RRUPT || mrc==SQ
151e0 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 LITE_FULL;. i
151f0 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f f( isSpecialErro
15200 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 r ){. /* If
15210 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 the query was r
15220 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 ead-only and the
15230 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 error code is S
15240 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c QLITE_INTERRUPT,
15250 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f . ** no ro
15260 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 llback is necess
15270 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 ary. Otherwise,
15280 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 at least a savep
15290 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 oint . ** t
152a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 ransaction must
152b0 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 be rolled back t
152c0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 o restore the da
152d0 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 tabase to a .
152e0 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 ** consistent
152f0 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a state.. **
15300 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 . ** Even i
15310 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 f the statement
15320 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 is read-only, it
15330 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f is important to
15340 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a perform. *
15350 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 * a statement or
15360 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c transaction rol
15370 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e lback operation.
15380 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 If the error .
15390 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 ** occurred
153a0 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 while writing t
153b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 o the journal, s
153c0 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 ub-journal or da
153d0 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 tabase. **
153e0 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 file as part of
153f0 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 an effort to fre
15400 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 e up cache space
15410 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 (see function.
15420 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 ** pagerStr
15430 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 ess() in pager.c
15440 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 ), the rollback
15450 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 is required to r
15460 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a estore . **
15470 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 the pager to a
15480 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 consistent state
15490 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 .. */.
154a0 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c if( !p->readOnl
154b0 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 y || mrc!=SQLITE
154c0 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 _INTERRUPT ){.
154d0 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d if( (mrc==
154e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 SQLITE_NOMEM ||
154f0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c mrc==SQLITE_FULL
15500 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 ) && p->usesStmt
15510 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 Journal ){.
15520 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f eStatementO
15530 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f p = SAVEPOINT_RO
15540 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 LLBACK;.
15550 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
15560 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 /* We are force
15570 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 d to roll back t
15580 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 he active transa
15590 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f ction. Before do
155a0 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a ing. **
155b0 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f so, abort any o
155c0 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 ther statements
155d0 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 this handle curr
155e0 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 ently has active
155f0 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 .. */.
15600 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
15610 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 RollbackAll(db,
15620 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c SQLITE_ABORT_ROL
15630 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 LBACK);.
15640 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 sqlite3CloseSa
15650 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 vepoints(db);.
15660 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f db->auto
15670 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 Commit = 1;.
15680 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 p->nChange
15690 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a = 0;. }.
156a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 }. }..
156b0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 /* Check for
156c0 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 immediate foreig
156d0 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 n key violations
156e0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e . */. if( p->
156f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
15700 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 . sqlite3Vd
15710 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b beCheckFk(p, 0);
15720 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a . }. . /*
15730 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d If the auto-com
15740 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 mit flag is set
15750 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 and this is the
15760 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 only active writ
15770 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 er . ** VM, t
15780 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 hen we do either
15790 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c a commit or rol
157a0 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 lback of the cur
157b0 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e rent transaction
157c0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a . . **. **
157d0 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 Note: This bloc
157e0 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f k also runs if o
157f0 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 ne of the specia
15800 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 l errors handled
15810 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 . ** above h
15820 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 as occurred. .
15830 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 */. if( !sq
15840 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 lite3VtabInSync(
15850 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d db) . && db-
15860 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 >autoCommit .
15870 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 && db->nVdbeWr
15880 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c ite==(p->readOnl
15890 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 y==0) . ){.
158a0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 if( p->rc==S
158b0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e QLITE_OK || (p->
158c0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f errorAction==OE_
158d0 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 Fail && !isSpeci
158e0 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 alError) ){.
158f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
15900 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 VdbeCheckFk(p, 1
15910 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 );. if( r
15920 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c!=SQLITE_OK ){.
15930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 if( NE
15940 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 VER(p->readOnly)
15950 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
15960 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 sqlite3VdbeLeave
15970 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 (p);.
15980 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 return SQLITE_E
15990 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 RROR;.
159a0 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d }. rc =
159b0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
159c0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 NT_FOREIGNKEY;.
159d0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 }else{ .
159e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
159f0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 auto-commit flag
15a00 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 is true, the vd
15a10 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 be program was s
15a20 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 uccessful .
15a30 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 ** or hit a
15a40 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 n 'OR FAIL' cons
15a50 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 traint and there
15a60 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 are no deferred
15a70 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 foreign.
15a80 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 ** key constr
15a90 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 aints to hold up
15aa0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
15ab0 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 . This means a c
15ac0 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 ommit .
15ad0 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e ** is required.
15ae0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 */. rc
15af0 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 = vdbeCommit(db
15b00 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a , p);. }.
15b10 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
15b20 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 SQLITE_BUSY && p
15b30 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 ->readOnly ){.
15b40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
15b50 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 dbeLeave(p);.
15b60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 return SQ
15b70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 LITE_BUSY;.
15b80 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 }else if( rc!
15b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
15ba0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 p->rc =
15bb0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 rc;. sq
15bc0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c lite3RollbackAll
15bd0 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b (db, SQLITE_OK);
15be0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 . p->nC
15bf0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 hange = 0;.
15c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
15c10 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 db->nDeferre
15c20 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 dCons = 0;.
15c30 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 db->nDeferr
15c40 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 edImmCons = 0;.
15c50 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 db->fla
15c60 67 73 20 26 3d 20 7e 28 75 36 34 29 53 51 4c 49 gs &= ~(u64)SQLI
15c70 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 TE_DeferFKs;.
15c80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f sqlite3Co
15c90 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e mmitInternalChan
15ca0 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 ges(db);.
15cb0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a }. }else{.
15cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 sqlite3R
15cd0 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 ollbackAll(db, S
15ce0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 QLITE_OK);.
15cf0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 p->nChange =
15d00 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 0;. }.
15d10 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 db->nStatement
15d20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 = 0;. }else i
15d30 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d f( eStatementOp=
15d40 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 =0 ){. if(
15d50 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b p->rc==SQLITE_OK
15d60 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 || p->errorActi
15d70 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 on==OE_Fail ){.
15d80 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e eStatemen
15d90 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f tOp = SAVEPOINT_
15da0 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d RELEASE;. }
15db0 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f else if( p->erro
15dc0 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 rAction==OE_Abor
15dd0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 t ){. eSt
15de0 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 atementOp = SAVE
15df0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a POINT_ROLLBACK;.
15e00 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
15e10 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c sqlite3Roll
15e20 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 backAll(db, SQLI
15e30 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 TE_ABORT_ROLLBAC
15e40 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 K);. sqli
15e50 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e te3CloseSavepoin
15e60 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 ts(db);.
15e70 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d db->autoCommit =
15e80 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 1;. p->n
15e90 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 Change = 0;.
15ea0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 }. }. .
15eb0 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e /* If eStatemen
15ec0 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c tOp is non-zero,
15ed0 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e then a statemen
15ee0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 t transaction ne
15ef0 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 eds to. ** be
15f00 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f committed or ro
15f10 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 lled back. Call
15f20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 sqlite3VdbeClose
15f30 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 Statement() to.
15f40 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 ** do so. If
15f50 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 this operation r
15f60 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c eturns an error,
15f70 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 and the current
15f80 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a statement. *
15f90 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 * error code is
15fa0 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c SQLITE_OK or SQL
15fb0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 ITE_CONSTRAINT,
15fc0 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 then promote the
15fd0 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 . ** current
15fe0 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 statement error
15ff0 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 code.. */.
16000 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f if( eStatementO
16010 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 p ){. rc =
16020 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 sqlite3VdbeClose
16030 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 Statement(p, eSt
16040 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 atementOp);.
16050 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
16060 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 if( p->rc==S
16070 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e QLITE_OK || (p->
16080 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 rc&0xff)==SQLITE
16090 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 _CONSTRAINT ){.
160a0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d p->rc =
160b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 rc;. s
160c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
160d0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 p->zErrMsg);.
160e0 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d p->zErrM
160f0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 sg = 0;.
16100 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 }. sqlite
16110 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 3RollbackAll(db,
16120 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f SQLITE_ABORT_RO
16130 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 LLBACK);.
16140 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 sqlite3CloseSav
16150 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 epoints(db);.
16160 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d db->autoCom
16170 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 mit = 1;.
16180 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b p->nChange = 0;
16190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
161a0 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 . /* If this
161b0 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 was an INSERT,
161c0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 UPDATE or DELETE
161d0 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e and no statemen
161e0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 t transaction.
161f0 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f ** has been ro
16200 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 lled back, updat
16210 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 e the database c
16220 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 onnection change
16230 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a -counter. . *
16240 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 /. if( p->cha
16250 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 ngeCntOn ){.
16260 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 if( eStatement
16270 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f Op!=SAVEPOINT_RO
16280 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 LLBACK ){.
16290 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 sqlite3VdbeSet
162a0 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e Changes(db, p->n
162b0 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d Change);. }
162c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 else{. sq
162d0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e lite3VdbeSetChan
162e0 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 ges(db, 0);.
162f0 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 }. p->nCh
16300 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a ange = 0;. }.
16310 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 . /* Release
16320 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 the locks */.
16330 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 sqlite3VdbeLeav
16340 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 e(p);. }.. /*
16350 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 We have successf
16360 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 ully halted and
16370 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 closed the VM.
16380 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 Record this fact
16390 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 . */. if( p->pc
163a0 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e >=0 ){. db->n
163b0 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 VdbeActive--;.
163c0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e if( !p->readOn
163d0 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 ly ) db->nVdbeWr
163e0 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 ite--;. if( p
163f0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 ->bIsReader ) db
16400 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 ->nVdbeRead--;.
16410 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e assert( db->n
16420 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e VdbeActive>=db->
16430 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 nVdbeRead );.
16440 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 assert( db->nVd
16450 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 beRead>=db->nVdb
16460 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 eWrite );. as
16470 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 sert( db->nVdbeW
16480 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 rite>=0 );. }.
16490 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 p->magic = VDBE
164a0 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 _MAGIC_HALT;. c
164b0 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e heckActiveVdbeCn
164c0 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d t(db);. if( db-
164d0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b >mallocFailed ){
164e0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c . p->rc = SQL
164f0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a ITE_NOMEM_BKPT;.
16500 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 }.. /* If the
16510 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 auto-commit fla
16520 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 g is set to true
16530 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 , then any locks
16540 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a that were held.
16550 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 ** by connecti
16560 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 on db have now b
16570 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 een released. Ca
16580 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 ll sqlite3Connec
16590 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a tionUnlocked() .
165a0 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 ** to invoke a
165b0 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f ny required unlo
165c0 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 ck-notify callba
165d0 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 cks.. */. if(
165e0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 db->autoCommit )
165f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e {. sqlite3Con
16600 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 nectionUnlocked(
16610 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 db);. }.. asse
16620 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 rt( db->nVdbeAct
16630 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 ive>0 || db->aut
16640 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 oCommit==0 || db
16650 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 ->nStatement==0
16660 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e );. return (p->
16670 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 rc==SQLITE_BUSY
16680 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 ? SQLITE_BUSY :
16690 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a SQLITE_OK);.}...
166a0 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 /*.** Each VDBE
166b0 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 holds the result
166c0 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 of the most rec
166d0 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 ent sqlite3_step
166e0 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d () call.** in p-
166f0 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 >rc. This routi
16700 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 ne sets that res
16710 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 ult back to SQLI
16720 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 TE_OK..*/.void s
16730 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 qlite3VdbeResetS
16740 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a tepResult(Vdbe *
16750 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 p){. p->rc = SQ
16760 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
16770 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 * Copy the error
16780 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 code and error
16790 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e message belongin
167a0 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 g to the VDBE pa
167b0 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 ssed.** as the f
167c0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f irst argument to
167d0 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 its database ha
167e0 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 ndle (so that th
167f0 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 ey will be .** r
16800 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 eturned by calls
16810 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 to sqlite3_errc
16820 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 ode() and sqlite
16830 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 3_errmsg())..**.
16840 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
16850 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 does not clear
16860 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 the VDBE error c
16870 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 ode or message,
16880 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 just.** copies t
16890 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 hem to the datab
168a0 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 ase handle..*/.i
168b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 nt sqlite3VdbeTr
168c0 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 ansferError(Vdbe
168d0 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 *p){. sqlite3
168e0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 *db = p->db;. i
168f0 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 nt rc = p->rc;.
16900 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 if( p->zErrMsg
16910 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 ){. db->bBeni
16920 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 gnMalloc++;.
16930 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 sqlite3BeginBeni
16940 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 gnMalloc();.
16950 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 if( db->pErr==0
16960 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c ) db->pErr = sql
16970 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 ite3ValueNew(db)
16980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c ;. sqlite3Val
16990 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 ueSetStr(db->pEr
169a0 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 r, -1, p->zErrMs
169b0 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 g, SQLITE_UTF8,
169c0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 SQLITE_TRANSIENT
169d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e );. sqlite3En
169e0 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b dBenignMalloc();
169f0 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e . db->bBenign
16a00 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c 73 Malloc--;. }els
16a10 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 e if( db->pErr )
16a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c {. sqlite3Val
16a30 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 45 ueSetNull(db->pE
16a40 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 65 rr);. }. db->e
16a50 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 72 rrCode = rc;. r
16a60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 eturn rc;.}..#if
16a70 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
16a80 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 E_SQLLOG./*.** I
16a90 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 f an SQLITE_CONF
16aa0 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 IG_SQLLOG hook i
16ab0 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 s registered and
16ac0 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e the VM has been
16ad0 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 run, .** invoke
16ae0 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 it..*/.static v
16af0 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 oid vdbeInvokeSq
16b00 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 llog(Vdbe *v){.
16b10 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 if( sqlite3Glob
16b20 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 alConfig.xSqllog
16b30 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 && v->rc==SQLIT
16b40 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 E_OK && v->zSql
16b50 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 && v->pc>=0 ){.
16b60 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 char *zExpand
16b70 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 ed = sqlite3Vdbe
16b80 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e ExpandSql(v, v->
16b90 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 zSql);. asser
16ba0 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 t( v->db->init.b
16bb0 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 usy==0 );. if
16bc0 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 ( zExpanded ){.
16bd0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 sqlite3Glob
16be0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 alConfig.xSqllog
16bf0 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 (. sqli
16c00 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e te3GlobalConfig.
16c10 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 pSqllogArg, v->d
16c20 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a b, zExpanded, 1.
16c30 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 );. s
16c40 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e qlite3DbFree(v->
16c50 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a db, zExpanded);.
16c60 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 }. }.}.#els
16c70 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 e.# define vdbeI
16c80 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 nvokeSqllog(x).#
16c90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 endif../*.** Cle
16ca0 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 an up a VDBE aft
16cb0 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 er execution but
16cc0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 do not delete t
16cd0 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 he VDBE just yet
16ce0 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 ..** Write any e
16cf0 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e rror messages in
16d00 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 to *pzErrMsg. R
16d10 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 eturn the result
16d20 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 code..**.** Aft
16d30 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 er this routine
16d40 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 is run, the VDBE
16d50 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 should be ready
16d60 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a to be executed.
16d70 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 ** again..**.**
16d80 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e To look at it an
16d90 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 other way, this
16da0 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 routine resets t
16db0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a he state of the.
16dc0 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 ** virtual machi
16dd0 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 ne from VDBE_MAG
16de0 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d IC_RUN or VDBE_M
16df0 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 AGIC_HALT back t
16e00 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f o.** VDBE_MAGIC_
16e10 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c INIT..*/.int sql
16e20 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 ite3VdbeReset(Vd
16e30 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 be *p){.#if defi
16e40 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
16e50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 ) || defined(VDB
16e60 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 E_PROFILE). int
16e70 20 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 i;.#endif.. sq
16e80 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 lite3 *db;. db
16e90 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 = p->db;.. /* I
16ea0 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 f the VM did not
16eb0 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 run to completi
16ec0 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f on or if it enco
16ed0 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 untered an. **
16ee0 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d error, then it m
16ef0 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 ight not have be
16f00 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 en halted proper
16f10 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a ly. So halt. *
16f20 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 * it now.. */.
16f30 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 sqlite3VdbeHalt
16f40 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 (p);.. /* If th
16f50 65 20 56 44 42 45 20 68 61 73 20 62 65 65 6e 20 e VDBE has been
16f60 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c run even partial
16f70 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65 ly, then transfe
16f80 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 r the error code
16f90 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 . ** and error
16fa0 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65 message from the
16fb0 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d VDBE into the m
16fc0 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72 ain database str
16fd0 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a ucture. But. *
16fe0 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61 * if the VDBE ha
16ff0 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20 s just been set
17000 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e to run but has n
17010 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63 ot actually exec
17020 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e uted any. ** in
17030 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 structions yet,
17040 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64 leave the main d
17050 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e atabase error in
17060 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e formation unchan
17070 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 ged.. */. if(
17080 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 p->pc>=0 ){.
17090 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 vdbeInvokeSqllog
170a0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 (p);. sqlite3
170b0 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f VdbeTransferErro
170c0 72 28 70 29 3b 0a 20 20 20 20 69 66 28 20 70 2d r(p);. if( p-
170d0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 >runOnlyOnce ) p
170e0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 ->expired = 1;.
170f0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 }else if( p->rc
17100 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 && p->expired )
17110 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 {. /* The exp
17120 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 ired flag was se
17130 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 t on the VDBE be
17140 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 fore the first c
17150 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 all. ** to sq
17160 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f lite3_step(). Fo
17170 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 r consistency (s
17180 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 ince sqlite3_ste
17190 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 p() was. ** c
171a0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 alled), set the
171b0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 database error i
171c0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 n this case as w
171d0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ell.. */.
171e0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 sqlite3ErrorWith
171f0 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 Msg(db, p->rc, p
17200 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 ->zErrMsg ? "%s"
17210 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 : 0, p->zErrMsg
17220 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 );. }.. /* Res
17230 65 74 20 72 65 67 69 73 74 65 72 20 63 6f 6e 74 et register cont
17240 65 6e 74 73 20 61 6e 64 20 72 65 63 6c 61 69 6d ents and reclaim
17250 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d error message m
17260 65 6d 6f 72 79 2e 0a 20 20 2a 2f 0a 23 69 66 64 emory.. */.#ifd
17270 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
17280 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 /* Execute ass
17290 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 ert() statements
172a0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 to ensure that
172b0 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d the Vdbe.apCsr[]
172c0 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e and . ** Vdbe.
172d0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 aMem[] arrays ha
172e0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 ve already been
172f0 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a cleaned up. */.
17300 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 if( p->apCsr )
17310 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e for(i=0; i<p->n
17320 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 Cursor; i++) ass
17330 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d ert( p->apCsr[i]
17340 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e ==0 );. if( p->
17350 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 aMem ){. for(
17360 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 i=0; i<p->nMem;
17370 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e i++) assert( p->
17380 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d aMem[i].flags==M
17390 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a EM_Undefined );.
173a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c }.#endif. sql
173b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
173c0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d ->zErrMsg);. p-
173d0 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 >zErrMsg = 0;.
173e0 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 p->pResultSet =
173f0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 0;.#ifdef SQLITE
17400 5f 44 45 42 55 47 0a 20 20 70 2d 3e 6e 57 72 69 _DEBUG. p->nWri
17410 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a te = 0;.#endif..
17420 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 6c /* Save profil
17430 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 ing information
17440 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 72 from this VDBE r
17450 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 un.. */.#ifdef
17460 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b VDBE_PROFILE. {
17470 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d . FILE *out =
17480 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 6f fopen("vdbe_pro
17490 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b file.out", "a");
174a0 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b 0a . if( out ){.
174b0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 fprintf(ou
174c0 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 t, "---- ");.
174d0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d for(i=0; i<p-
174e0 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nOp; i++){.
174f0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c fprintf(out,
17500 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b "%02x", p->aOp[
17510 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 i].opcode);.
17520 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 }. fprint
17530 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 f(out, "\n");.
17540 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 if( p->zSql
17550 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 ){. char
17560 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20 c, pc = 0;.
17570 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 fprintf(out,
17580 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 "-- ");.
17590 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d for(i=0; (c = p-
175a0 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b >zSql[i])!=0; i+
175b0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 +){. if
175c0 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72 ( pc=='\n' ) fpr
175d0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 intf(out, "-- ")
175e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63 ;. putc
175f0 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 (c, out);.
17600 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 pc = c;.
17610 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
17620 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72 ( pc!='\n' ) fpr
17630 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b intf(out, "\n");
17640 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 . }. f
17650 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 or(i=0; i<p->nOp
17660 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; i++){.
17670 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a char zHdr[100];.
17680 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
17690 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 snprintf(sizeof(
176a0 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36 zHdr), zHdr, "%6
176b0 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22 u %12llu %8llu "
176c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e ,. p->
176d0 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20 aOp[i].cnt,.
176e0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d p->aOp[i]
176f0 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20 .cycles,.
17700 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e p->aOp[i].cn
17710 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e t>0 ? p->aOp[i].
17720 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d cycles/p->aOp[i]
17730 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20 .cnt : 0.
17740 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 );. fpri
17750 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a ntf(out, "%s", z
17760 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 Hdr);. sq
17770 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 lite3VdbePrintOp
17780 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 (out, i, &p->aOp
17790 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 [i]);. }.
177a0 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b fclose(out);
177b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 . }. }.#endi
177c0 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 f. p->magic = V
177d0 44 42 45 5f 4d 41 47 49 43 5f 52 45 53 45 54 3b DBE_MAGIC_RESET;
177e0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 . return p->rc
177f0 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d & db->errMask;.}
17800 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 . ./*.** Clean u
17810 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 p and delete a V
17820 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 DBE after execut
17830 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 ion. Return an
17840 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 integer which is
17850 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 .** the result c
17860 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 ode. Write any
17870 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 error message te
17880 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 xt into *pzErrMs
17890 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 g..*/.int sqlite
178a0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 3VdbeFinalize(Vd
178b0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 be *p){. int rc
178c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
178d0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 if( p->magic==VD
178e0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 BE_MAGIC_RUN ||
178f0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
17900 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 AGIC_HALT ){.
17910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 rc = sqlite3Vdb
17920 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 eReset(p);. a
17930 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e ssert( (rc & p->
17940 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 db->errMask)==rc
17950 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 );. }. sqlite
17960 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 3VdbeDelete(p);.
17970 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
17980 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 /*.** If paramet
17990 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 er iOp is less t
179a0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 han zero, then i
179b0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 nvoke the destru
179c0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 ctor for.** all
179d0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 auxiliary data p
179e0 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c ointers currentl
179f0 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 y cached by the
17a00 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 VM passed as.**
17a10 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 the first argume
17a20 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 nt..**.** Or, if
17a30 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 iOp is greater
17a40 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f than or equal to
17a50 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 zero, then the
17a60 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a destructor is.**
17a70 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f only invoked fo
17a80 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 r those auxiliar
17a90 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 y data pointers
17aa0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 created by the u
17ab0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e ser .** function
17ac0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 invoked by the
17ad0 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f OP_Function opco
17ae0 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f de at instructio
17af0 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 n iOp of .** VM
17b00 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 pVdbe, and only
17b10 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 then if:.**.**
17b20 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 * the associat
17b30 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 ed function para
17b40 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e meter is the 32n
17b50 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e d or later (coun
17b60 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f ting.** fro
17b70 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 m left to right)
17b80 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 , or.**.** *
17b90 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e the correspondin
17ba0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e g bit in argumen
17bb0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 t mask is clear
17bc0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 (where the first
17bd0 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f .** functio
17be0 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 n parameter corr
17bf0 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 esponds to bit 0
17c00 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 etc.)..*/.void
17c10 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 sqlite3VdbeDelet
17c20 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 eAuxData(sqlite3
17c30 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a *db, AuxData **
17c40 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 pp, int iOp, int
17c50 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 mask){. while(
17c60 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 *pp ){. AuxD
17c70 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b ata *pAux = *pp;
17c80 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 . if( (iOp<0)
17c90 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e . || (pAux->
17ca0 69 41 75 78 4f 70 3d 3d 69 4f 70 0a 20 20 20 20 iAuxOp==iOp.
17cb0 20 20 20 20 20 20 26 26 20 70 41 75 78 2d 3e 69 && pAux->i
17cc0 41 75 78 41 72 67 3e 3d 30 0a 20 20 20 20 20 20 AuxArg>=0.
17cd0 20 20 20 20 26 26 20 28 70 41 75 78 2d 3e 69 41 && (pAux->iA
17ce0 75 78 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 uxArg>31 || !(ma
17cf0 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 sk & MASKBIT32(p
17d00 41 75 78 2d 3e 69 41 75 78 41 72 67 29 29 29 29 Aux->iAuxArg))))
17d10 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 . ){. te
17d20 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 stcase( pAux->iA
17d30 75 78 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 uxArg==31 );.
17d40 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 if( pAux->xDe
17d50 6c 65 74 65 41 75 78 20 29 7b 0a 20 20 20 20 20 leteAux ){.
17d60 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 pAux->xDelete
17d70 41 75 78 28 70 41 75 78 2d 3e 70 41 75 78 29 3b Aux(pAux->pAux);
17d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a . }. *
17d90 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 pp = pAux->pNext
17da0 41 75 78 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 Aux;. sqlit
17db0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 e3DbFree(db, pAu
17dc0 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 x);. }else{.
17dd0 20 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e pp= &pAux->
17de0 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 7d 0a pNextAux;. }.
17df0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 }.}../*.** Fre
17e00 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 e all memory ass
17e10 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
17e20 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 Vdbe passed as
17e30 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d the second argum
17e40 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 ent,.** except f
17e50 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 or object itself
17e60 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 , which is prese
17e70 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 rved..**.** The
17e80 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 difference betwe
17e90 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e en this function
17ea0 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 and sqlite3Vdbe
17eb0 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 Delete() is that
17ec0 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 .** VdbeDelete()
17ed0 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 also unlinks th
17ee0 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 e Vdbe from the
17ef0 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f list of VMs asso
17f00 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 ciated with.** t
17f10 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e he database conn
17f20 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 ection and frees
17f30 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 the object itse
17f40 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 lf..*/.void sqli
17f50 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 te3VdbeClearObje
17f60 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 ct(sqlite3 *db,
17f70 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 Vdbe *p){. SubP
17f80 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 rogram *pSub, *p
17f90 4e 65 78 74 3b 0a 20 20 61 73 73 65 72 74 28 20 Next;. assert(
17fa0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 p->db==0 || p->d
17fb0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 b==db );. relea
17fc0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 seMemArray(p->aC
17fd0 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 olName, p->nResC
17fe0 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 olumn*COLNAME_N)
17ff0 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e ;. for(pSub=p->
18000 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 pProgram; pSub;
18010 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 pSub=pNext){.
18020 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 pNext = pSub->p
18030 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 Next;. vdbeFr
18040 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 eeOpArray(db, pS
18050 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e ub->aOp, pSub->n
18060 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 Op);. sqlite3
18070 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 DbFree(db, pSub)
18080 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6d ;. }. if( p->m
18090 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 agic!=VDBE_MAGIC
180a0 5f 49 4e 49 54 20 29 7b 0a 20 20 20 20 72 65 6c _INIT ){. rel
180b0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e easeMemArray(p->
180c0 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a aVar, p->nVar);.
180d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
180e0 65 28 64 62 2c 20 70 2d 3e 70 56 4c 69 73 74 29 e(db, p->pVList)
180f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 ;. sqlite3DbF
18100 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 ree(db, p->pFree
18110 29 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 );. }. vdbeFre
18120 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e eOpArray(db, p->
18130 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 aOp, p->nOp);.
18140 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
18150 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a , p->aColName);.
18160 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
18170 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 23 69 db, p->zSql);.#i
18180 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 fdef SQLITE_ENAB
18190 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 73 LE_NORMALIZE. s
181a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
181b0 20 70 2d 3e 7a 4e 6f 72 6d 53 71 6c 29 3b 0a 23 p->zNormSql);.#
181c0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c endif.#ifdef SQL
181d0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f ITE_ENABLE_STMT_
181e0 53 43 41 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 SCANSTATUS. {.
181f0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f int i;. fo
18200 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 r(i=0; i<p->nSca
18210 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 n; i++){. s
18220 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
18230 20 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 p->aScan[i].zNa
18240 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 me);. }. s
18250 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
18260 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a p->aScan);. }.
18270 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 #endif.}../*.**
18280 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 Delete an entire
18290 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 VDBE..*/.void s
182a0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
182b0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c (Vdbe *p){. sql
182c0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 61 73 73 ite3 *db;.. ass
182d0 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 ert( p!=0 );. d
182e0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 b = p->db;. ass
182f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 ert( sqlite3_mut
18300 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 ex_held(db->mute
18310 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 x) );. sqlite3V
18320 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 dbeClearObject(d
18330 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e b, p);. if( p->
18340 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e pPrev ){. p->
18350 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 pPrev->pNext = p
18360 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 ->pNext;. }else
18370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 {. assert( db
18380 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 ->pVdbe==p );.
18390 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d db->pVdbe = p-
183a0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 >pNext;. }. if
183b0 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 ( p->pNext ){.
183c0 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 p->pNext->pPre
183d0 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 v = p->pPrev;.
183e0 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 }. p->magic = V
183f0 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a DBE_MAGIC_DEAD;.
18400 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 p->db = 0;. s
18410 71 6c 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 qlite3DbFreeNN(d
18420 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 b, p);.}../*.**
18430 54 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 The cursor "p" h
18440 61 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 as a pending see
18450 6b 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 k operation that
18460 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 has not yet bee
18470 6e 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 n.** carried out
18480 2e 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 . Seek the curs
18490 6f 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 or now. If an e
184a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 rror occurs, ret
184b0 75 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f urn.** the appro
184c0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 priate error cod
184d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 e..*/.static int
184e0 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 SQLITE_NOINLINE
184f0 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d handleDeferredM
18500 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 oveto(VdbeCursor
18510 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c *p){. int res,
18520 20 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 rc;.#ifdef SQLI
18530 54 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e TE_TEST. extern
18540 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 int sqlite3_sea
18550 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 rch_count;.#endi
18560 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 f. assert( p->d
18570 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b eferredMoveto );
18580 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 . assert( p->is
18590 54 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 Table );. asser
185a0 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d t( p->eCurType==
185b0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b CURTYPE_BTREE );
185c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 . rc = sqlite3B
185d0 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b treeMovetoUnpack
185e0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 ed(p->uc.pCursor
185f0 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 , 0, p->movetoTa
18600 72 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a rget, 0, &res);.
18610 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 if( rc ) retur
18620 6e 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 n rc;. if( res!
18630 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 =0 ) return SQLI
18640 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
18650 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 .#ifdef SQLITE_T
18660 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 EST. sqlite3_se
18670 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 arch_count++;.#e
18680 6e 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 ndif. p->deferr
18690 65 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 edMoveto = 0;.
186a0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d p->cacheStatus =
186b0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 CACHE_STALE;.
186c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
186d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 ;.}../*.** Somet
186e0 68 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 hing has moved c
186f0 75 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 ursor "p" out of
18700 20 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 place. Maybe t
18710 68 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a he row it was.**
18720 20 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 pointed to was
18730 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d deleted out from
18740 20 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d under it. Or m
18750 61 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77 aybe the btree w
18760 61 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 as.** rebalanced
18770 2e 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20 . Whatever the
18780 63 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 cause, try to re
18790 73 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 store "p" to the
187a0 20 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 place it.** is
187b0 73 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 supposed to be p
187c0 6f 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 ointing. If the
187d0 20 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 row was deleted
187e0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 out from under
187f0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 the.** cursor, s
18800 65 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f et the cursor to
18810 20 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c point to a NULL
18820 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 row..*/.static
18830 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c int SQLITE_NOINL
18840 49 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 INE handleMovedC
18850 75 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 ursor(VdbeCursor
18860 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 *p){. int isDi
18870 66 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a fferentRow, rc;.
18880 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 assert( p->eCu
18890 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 rType==CURTYPE_B
188a0 54 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 TREE );. assert
188b0 28 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 ( p->uc.pCursor!
188c0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
188d0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 sqlite3BtreeCurs
188e0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 orHasMoved(p->uc
188f0 2e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 .pCursor) );. r
18900 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 c = sqlite3Btree
18910 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d CursorRestore(p-
18920 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 >uc.pCursor, &is
18930 44 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 DifferentRow);.
18940 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 p->cacheStatus
18950 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 = CACHE_STALE;.
18960 20 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 if( isDifferent
18970 52 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 Row ) p->nullRow
18980 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 = 1;. return r
18990 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 c;.}../*.** Chec
189a0 6b 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 k to ensure that
189b0 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 the cursor is v
189c0 61 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 alid. Restore t
189d0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 he cursor.** if
189e0 6e 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e need be. Return
189f0 20 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 any I/O error f
18a00 72 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 rom the restore
18a10 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e operation..*/.in
18a20 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 t sqlite3VdbeCur
18a30 73 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 sorRestore(VdbeC
18a40 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 ursor *p){. ass
18a50 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 ert( p->eCurType
18a60 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 ==CURTYPE_BTREE
18a70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 );. if( sqlite3
18a80 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f BtreeCursorHasMo
18a90 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f ved(p->uc.pCurso
18aa0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e r) ){. return
18ab0 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 handleMovedCurs
18ac0 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 or(p);. }. ret
18ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
18ae0 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 ../*.** Make sur
18af0 65 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 e the cursor p i
18b00 73 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 s ready to read
18b10 6f 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 or write the row
18b20 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 to which it.**
18b30 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f was last positio
18b40 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 ned. Return an
18b50 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e error code if an
18b60 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f OOM fault or I/
18b70 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 O error.** preve
18b80 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 nts us from posi
18b90 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 tioning the curs
18ba0 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 or to its correc
18bb0 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a t position..**.*
18bc0 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 * If a MoveTo op
18bd0 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 eration is pendi
18be0 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 ng on the given
18bf0 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 cursor, then do
18c00 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e that.** MoveTo n
18c10 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 ow. If no move
18c20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 is pending, chec
18c30 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 k to see if the
18c40 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 row has been.**
18c50 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d deleted out from
18c60 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f under the curso
18c70 72 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c r and if it has,
18c80 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 mark the row as
18c90 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a .** a NULL row..
18ca0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 **.** If the cur
18cb0 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 sor is already p
18cc0 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 ointing to the c
18cd0 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 orrect row and t
18ce0 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e hat row has.** n
18cf0 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 ot been deleted
18d00 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 out from under t
18d10 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 he cursor, then
18d20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
18d30 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 a no-op..*/.int
18d40 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f sqlite3VdbeCurso
18d50 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 rMoveto(VdbeCurs
18d60 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 or **pp, int *pi
18d70 43 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73 Col){. VdbeCurs
18d80 6f 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 61 or *p = *pp;. a
18d90 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 ssert( p->eCurTy
18da0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 pe==CURTYPE_BTRE
18db0 45 20 7c 7c 20 70 2d 3e 65 43 75 72 54 79 70 65 E || p->eCurType
18dc0 3d 3d 43 55 52 54 59 50 45 5f 50 53 45 55 44 4f ==CURTYPE_PSEUDO
18dd0 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 );. if( p->def
18de0 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 erredMoveto ){.
18df0 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20 int iMap;.
18e00 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 if( p->aAltMap
18e10 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 && (iMap = p->aA
18e20 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 ltMap[1+*piCol])
18e30 3e 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 >0 ){. *pp
18e40 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b = p->pAltCursor;
18e50 0a 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 . *piCol =
18e60 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 iMap - 1;.
18e70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
18e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
18e90 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 rn handleDeferre
18ea0 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a dMoveto(p);. }.
18eb0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 if( sqlite3Btr
18ec0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 eeCursorHasMoved
18ed0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 (p->uc.pCursor)
18ee0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 ){. return ha
18ef0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 ndleMovedCursor(
18f00 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e p);. }. return
18f10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f SQLITE_OK;.}../
18f20 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 *.** The followi
18f30 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a ng functions:.**
18f40 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 .** sqlite3VdbeS
18f50 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 erialType().** s
18f60 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
18f70 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c TypeLen().** sql
18f80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 ite3VdbeSerialLe
18f90 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 n().** sqlite3Vd
18fa0 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a beSerialPut().**
18fb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
18fc0 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e alGet().**.** en
18fd0 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f capsulate the co
18fe0 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a de that serializ
18ff0 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 es values for st
19000 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a orage in SQLite.
19010 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 ** data and inde
19020 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 x records. Each
19030 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 serialized value
19040 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a consists of a.*
19050 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 * 'serial-type'
19060 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 and a blob of da
19070 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 ta. The serial t
19080 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 ype is an 8-byte
19090 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 unsigned.** int
190a0 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 eger, stored as
190b0 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 a varint..**.**
190c0 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 In an SQLite ind
190d0 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 ex record, the s
190e0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 erial type is st
190f0 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 ored directly be
19100 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 fore.** the blob
19110 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 of data that it
19120 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e corresponds to.
19130 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f In a table reco
19140 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a rd, all serial.*
19150 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 * types are stor
19160 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 ed at the start
19170 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 of the record, a
19180 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 nd the blobs of
19190 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 data at.** the e
191a0 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 nd. Hence these
191b0 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 functions allow
191c0 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 the caller to ha
191d0 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 ndle the.** seri
191e0 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 al-type and data
191f0 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 blob separately
19200 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c ..**.** The foll
19210 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 owing table desc
19220 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 ribes the variou
19230 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 s storage classe
19240 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a s for data:.**.*
19250 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 * serial type
19260 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 bytes of
19270 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a data type.*
19280 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * ------------
19290 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d -- ---------
192a0 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d ------ ------
192b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 ---------.**
192c0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 0
192d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 0
192e0 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 NULL.**
192f0 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 1
19300 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 1
19310 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 signed inte
19320 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 ger.** 2
19330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19340 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 2 s
19350 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a igned integer.**
19360 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 3
19370 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 3
19380 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 signed
19390 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 integer.**
193a0 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4
193b0 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 4
193c0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 signed intege
193d0 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 r.** 5
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
193f0 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6 sig
19400 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 ned integer.**
19410 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 6
19420 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 8
19430 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e signed in
19440 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 teger.** 7
19450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19460 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 8
19470 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 IEEE float.**
19480 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 8
19490 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 0
194a0 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 Integer c
194b0 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 onstant 0.**
194c0 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 9
194d0 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 0
194e0 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e Integer con
194f0 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 stant 1.** 1
19500 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 0,11
19510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19520 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 reserved for
19530 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 expansion.**
19540 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 N>=12 and even
19550 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 (N-12)/2
19560 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 BLOB.**
19570 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 N>=13 and odd
19580 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 (N-13)/2
19590 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 text.**.**
195a0 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 The 8 and 9 type
195b0 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 s were added in
195c0 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 3.3.0, file form
195d0 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 at 4. Prior ver
195e0 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 sions.** of SQLi
195f0 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 te will not unde
19600 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 rstand those ser
19610 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f ial types..*/../
19620 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
19630 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 serial-type for
19640 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 the value stored
19650 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 in pMem..*/.u32
19660 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
19670 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d alType(Mem *pMem
19680 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 , int file_forma
19690 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 t, u32 *pLen){.
196a0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 int flags = pMe
196b0 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 m->flags;. u32
196c0 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c n;.. assert( pL
196d0 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 en!=0 );. if( f
196e0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b lags&MEM_Null ){
196f0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a . *pLen = 0;.
19700 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
19710 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 }. if( flags&ME
19720 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 M_Int ){. /*
19730 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 Figure out wheth
19740 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 er to use 1, 2,
19750 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 4, 6 or 8 bytes.
19760 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d */.# define M
19770 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 AX_6BYTE ((((i64
19780 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 )0x00008000)<<32
19790 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d )-1). i64 i =
197a0 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 pMem->u.i;.
197b0 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 u64 u;. if( i
197c0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 <0 ){. u =
197d0 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ~i;. }else{.
197e0 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 u = i;.
197f0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 }. if( u<=127
19800 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 ){. if( (i
19810 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 &1)==i && file_f
19820 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 ormat>=4 ){.
19830 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 *pLen = 0;.
19840 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b return 8+
19850 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 (u32)u;. }e
19860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c lse{. *pL
19870 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 en = 1;.
19880 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 return 1;.
19890 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 }. }. if(
198a0 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 u<=32767 ){ *pLe
198b0 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b n = 2; return 2;
198c0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 }. if( u<=83
198d0 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 88607 ){ *pLen =
198e0 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 3; return 3; }.
198f0 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 if( u<=21474
19900 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 83647 ){ *pLen =
19910 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 4; return 4; }.
19920 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 if( u<=MAX_6
19930 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 BYTE ){ *pLen =
19940 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 6; return 5; }.
19950 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 *pLen = 8;.
19960 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a return 6;. }.
19970 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f if( flags&MEM_
19980 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 Real ){. *pLe
19990 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 n = 8;. retur
199a0 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 n 7;. }. asser
199b0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c t( pMem->db->mal
199c0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 locFailed || fla
199d0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f gs&(MEM_Str|MEM_
199e0 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 Blob) );. asser
199f0 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b t( pMem->n>=0 );
19a00 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d . n = (u32)pMem
19a10 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 ->n;. if( flags
19a20 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 & MEM_Zero ){.
19a30 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e n += pMem->u.
19a40 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c nZero;. }. *pL
19a50 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e en = n;. return
19a60 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 ((n*2) + 12 + (
19a70 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 (flags&MEM_Str)!
19a80 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 =0));.}../*.** T
19a90 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72 he sizes for ser
19aa0 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74 ial types less t
19ab0 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 han 128.*/.stati
19ac0 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 c const u8 sqlit
19ad0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 e3SmallTypeSizes
19ae0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f [] = {. /
19af0 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33 * 0 1 2 3
19b00 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37 4 5 6 7
19b10 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 8 9 */ ./
19b20 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 * 0 */ 0, 1
19b30 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 , 2, 3, 4, 6
19b40 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 , 8, 8, 0, 0
19b50 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c ,./* 10 */ 0,
19b60 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 0, 0, 0, 1,
19b70 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 1, 2, 2, 3,
19b80 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 3,./* 20 */
19b90 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 4, 4, 5, 5,
19ba0 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 6, 6, 7, 7,
19bb0 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 8, 8,./* 30 *
19bc0 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 / 9, 9, 10, 1
19bd0 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 0, 11, 11, 12, 1
19be0 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 2, 13, 13,./* 4
19bf0 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 0 */ 14, 14, 15
19c00 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 , 15, 16, 16, 17
19c10 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a , 17, 18, 18,./*
19c20 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 50 */ 19, 19,
19c30 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20, 20, 21, 21,
19c40 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 22, 22, 23, 23,
19c50 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 ./* 60 */ 24,
19c60 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 24, 25, 25, 26,
19c70 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 26, 27, 27, 28,
19c80 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 28,./* 70 */ 2
19c90 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 9, 29, 30, 30, 3
19ca0 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 1, 31, 32, 32, 3
19cb0 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 3, 33,./* 80 */
19cc0 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 34, 34, 35, 35
19cd0 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 , 36, 36, 37, 37
19ce0 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 , 38, 38,./* 90
19cf0 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c */ 39, 39, 40,
19d00 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 40, 41, 41, 42,
19d10 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 42, 43, 43,./*
19d20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 100 */ 44, 44,
19d30 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 45, 45, 46, 46,
19d40 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 47, 47, 48, 48,.
19d50 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 /* 110 */ 49, 4
19d60 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 9, 50, 50, 51, 5
19d70 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 1, 52, 52, 53, 5
19d80 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 3,./* 120 */ 54
19d90 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 , 54, 55, 55, 56
19da0 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a , 56, 57, 57.};.
19db0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th
19dc0 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 e length of the
19dd0 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 data correspondi
19de0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 ng to the suppli
19df0 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a ed serial-type..
19e00 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 */.u32 sqlite3Vd
19e10 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
19e20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 u32 serial_type)
19e30 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 {. if( serial_t
19e40 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 ype>=128 ){.
19e50 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 return (serial_t
19e60 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c ype-12)/2;. }el
19e70 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 se{. assert(
19e80 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a serial_type<12 .
19e90 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 || s
19ea0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 qlite3SmallTypeS
19eb0 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 izes[serial_type
19ec0 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20 ]==(serial_type
19ed0 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 - 12)/2 );. r
19ee0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 eturn sqlite3Sma
19ef0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 llTypeSizes[seri
19f00 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a al_type];. }.}.
19f10 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e u8 sqlite3VdbeOn
19f20 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c eByteSerialTypeL
19f30 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70 en(u8 serial_typ
19f40 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65 e){. assert( se
19f50 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b rial_type<128 );
19f60 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
19f70 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 3SmallTypeSizes[
19f80 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a serial_type]; .
19f90 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 }../*.** If we a
19fa0 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 re on an archite
19fb0 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 cture with mixed
19fc0 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 -endian floating
19fd0 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a .** points (ex:
19fe0 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 ARM7) then swap
19ff0 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 the lower 4 byt
1a000 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 es with the .**
1a010 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 upper 4 bytes.
1a020 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c Return the resul
1a030 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 t..**.** For mos
1a040 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c t architectures,
1a050 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 this is a no-op
1a060 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a ..**.** (later):
1a070 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 It is reported
1a080 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 to me that the
1a090 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f mixed-endian pro
1a0a0 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 blem.** on ARM7
1a0b0 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 is an issue with
1a0c0 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 GCC, not with t
1a0d0 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 he ARM7 chip. I
1a0e0 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 t seems.** that
1a0f0 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f early versions o
1a100 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 f GCC stored the
1a110 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 two words of a
1a120 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 64-bit.** float
1a130 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 in the wrong ord
1a140 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 er. And that er
1a150 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f ror has been pro
1a160 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 pagated.** ever
1a170 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d since. The blam
1a180 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 e is not necessa
1a190 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 rily with GCC, t
1a1a0 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 hough..** GCC mi
1a1b0 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f ght have just co
1a1c0 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 pying the proble
1a1d0 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 m from a prior c
1a1e0 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d ompiler..** I am
1a1f0 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 also told that
1a200 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f newer versions o
1a210 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f f GCC that follo
1a220 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a w a different.**
1a230 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 ABI get the byt
1a240 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a e order right..*
1a250 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 *.** Developers
1a260 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 using SQLite on
1a270 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 an ARM7 should c
1a280 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 ompile and run t
1a290 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 heir.** applicat
1a2a0 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 ion using -DSQLI
1a2b0 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 TE_DEBUG=1 at le
1a2c0 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 ast once. With
1a2d0 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 DEBUG.** enabled
1a2e0 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 , some asserts b
1a2f0 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 elow will ensure
1a300 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f that the byte o
1a310 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 rder of.** float
1a320 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 ing point values
1a330 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a is correct..**.
1a340 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 ** (2007-08-30)
1a350 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 Frank van Vugt
1a360 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 has studied this
1a370 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 problem closely
1a380 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 .** and has send
1a390 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f his findings to
1a3a0 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 the SQLite deve
1a3b0 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a lopers. Frank.*
1a3c0 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f * writes that so
1a3d0 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 me Linux kernels
1a3e0 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 offer floating
1a3f0 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a point hardware.*
1a400 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 * emulation that
1a410 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 uses only 32-bi
1a420 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 t mantissas inst
1a430 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a ead of a full .*
1a440 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 * 48-bits as req
1a450 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 uired by the IEE
1a460 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 E standard. (Th
1a470 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e is is the.** CON
1a480 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 FIG_FPE_FASTFPE
1a490 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 option.) On suc
1a4a0 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 h systems, float
1a4b0 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 ing point.** byt
1a4c0 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d e swapping becom
1a4d0 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 es very complica
1a4e0 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 ted. To avoid p
1a4f0 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 roblems,.** the
1a500 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 necessary byte s
1a510 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 wapping is carri
1a520 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 ed out using a 6
1a530 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 4-bit integer.**
1a540 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 rather than a 6
1a550 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 4-bit float. Fr
1a560 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 ank assures us t
1a570 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 hat the code her
1a580 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 e.** works for h
1a590 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 im. We, the dev
1a5a0 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f elopers, have no
1a5b0 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 way to independ
1a5c0 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 ently.** verify
1a5d0 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 this, but Frank
1a5e0 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 seems to know wh
1a5f0 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 at he is talking
1a600 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 about.** so we
1a610 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 trust him..*/.#i
1a620 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 fdef SQLITE_MIXE
1a630 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 D_ENDIAN_64BIT_F
1a640 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 LOAT.static u64
1a650 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e floatSwap(u64 in
1a660 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 ){. union {.
1a670 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 u64 r;. u32
1a680 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 i[2];. } u;. u
1a690 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 32 t;.. u.r = i
1a6a0 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b n;. t = u.i[0];
1a6b0 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b . u.i[0] = u.i[
1a6c0 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 1];. u.i[1] = t
1a6d0 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a ;. return u.r;.
1a6e0 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d }.# define swapM
1a6f0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 ixedEndianFloat(
1a700 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 X) X = floatSwa
1a710 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 p(X).#else.# def
1a720 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 ine swapMixedEnd
1a730 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 ianFloat(X).#end
1a740 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 if../*.** Write
1a750 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 the serialized d
1a760 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 ata blob for the
1a770 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e value stored in
1a780 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 pMem into .** b
1a790 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 uf. It is assume
1a7a0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 d that the calle
1a7b0 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 r has allocated
1a7c0 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 sufficient space
1a7d0 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 ..** Return the
1a7e0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
1a7f0 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e written..**.** n
1a800 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e Buf is the amoun
1a810 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 t of space left
1a820 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 in buf[]. The c
1a830 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 aller is respons
1a840 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f ible.** for allo
1a850 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 cating enough sp
1a860 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 ace to buf[] to
1a870 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 hold the entire
1a880 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 field, exclusive
1a890 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d .** of the pMem-
1a8a0 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 >u.nZero bytes f
1a8b0 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 or a MEM_Zero va
1a8c0 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 lue..**.** Retur
1a8d0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
1a8e0 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 bytes actually w
1a8f0 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b ritten into buf[
1a900 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a ]. The number.*
1a910 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 * of bytes in th
1a920 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 e zero-filled ta
1a930 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 il is included i
1a940 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c n the return val
1a950 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 ue only.** if th
1a960 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a ose bytes were z
1a970 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a eroed in buf[]..
1a980 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 */ .u32 sqlite3V
1a990 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 dbeSerialPut(u8
1a9a0 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c *buf, Mem *pMem,
1a9b0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 u32 serial_type
1a9c0 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 ){. u32 len;..
1a9d0 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 /* Integer and
1a9e0 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 Real */. if( se
1a9f0 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 rial_type<=7 &&
1aa00 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b serial_type>0 ){
1aa10 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 . u64 v;.
1aa20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 u32 i;. if( s
1aa30 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b erial_type==7 ){
1aa40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 . assert( s
1aa50 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 izeof(v)==sizeof
1aa60 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 (pMem->u.r) );.
1aa70 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 memcpy(&v,
1aa80 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 &pMem->u.r, size
1aa90 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 of(v));. sw
1aaa0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f apMixedEndianFlo
1aab0 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 at(v);. }else
1aac0 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d {. v = pMem
1aad0 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 ->u.i;. }.
1aae0 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 len = i = sqlit
1aaf0 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 e3SmallTypeSizes
1ab00 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 [serial_type];.
1ab10 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 assert( i>0 )
1ab20 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 ;. do{.
1ab30 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 buf[--i] = (u8)(
1ab40 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 v&0xFF);. v
1ab50 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 >>= 8;. }whi
1ab60 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 le( i );. ret
1ab70 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 urn len;. }..
1ab80 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f /* String or blo
1ab90 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 b */. if( seria
1aba0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 l_type>=12 ){.
1abb0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e assert( pMem->
1abc0 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 n + ((pMem->flag
1abd0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d s & MEM_Zero)?pM
1abe0 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 em->u.nZero:0).
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 == (
1ac00 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 int)sqlite3VdbeS
1ac10 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
1ac20 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 ial_type) );.
1ac30 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a len = pMem->n;.
1ac40 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 if( len>0 )
1ac50 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d memcpy(buf, pMem
1ac60 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 ->z, len);. r
1ac70 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a eturn len;. }..
1ac80 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e /* NULL or con
1ac90 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f stants 0 or 1 */
1aca0 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a . return 0;.}..
1acb0 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 /* Input "x" is
1acc0 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e a sequence of un
1acd0 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 signed character
1ace0 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 s that represent
1acf0 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e a.** big-endian
1ad00 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 integer. Retur
1ad10 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 n the equivalent
1ad20 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a native integer.
1ad30 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 */.#define ONE_B
1ad40 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 YTE_INT(x) ((
1ad50 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 i8)(x)[0]).#defi
1ad60 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 ne TWO_BYTE_INT(
1ad70 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 x) (256*(i8)(
1ad80 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a (x)[0])|(x)[1]).
1ad90 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 #define THREE_BY
1ada0 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 TE_INT(x) (6553
1adb0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 6*(i8)((x)[0])|(
1adc0 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 (x)[1]<<8)|(x)[2
1add0 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f ]).#define FOUR_
1ade0 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 BYTE_UINT(x) ((
1adf0 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 (u32)(x)[0]<<24)
1ae00 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 |((x)[1]<<16)|((
1ae10 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d x)[2]<<8)|(x)[3]
1ae20 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 ).#define FOUR_B
1ae30 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 YTE_INT(x) (1677
1ae40 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 7216*(i8)((x)[0]
1ae50 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 )|((x)[1]<<16)|(
1ae60 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 (x)[2]<<8)|(x)[3
1ae70 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 ])../*.** Deseri
1ae80 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 alize the data b
1ae90 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 lob pointed to b
1aea0 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 y buf as serial
1aeb0 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 type serial_type
1aec0 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 .** and store th
1aed0 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d e result in pMem
1aee0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 . Return the nu
1aef0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 mber of bytes re
1af00 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 ad..**.** This f
1af10 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 unction is imple
1af20 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 mented as two se
1af30 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 parate routines
1af40 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e for performance.
1af50 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 .** The few case
1af60 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c s that require l
1af70 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 ocal variables a
1af80 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e re broken out in
1af90 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a to a separate.**
1afa0 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 routine so that
1afb0 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 in most cases t
1afc0 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d he overhead of m
1afd0 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 oving the stack
1afe0 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 pointer.** is av
1aff0 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 oided..*/ .stati
1b000 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 c u32 SQLITE_NOI
1b010 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 NLINE serialGet(
1b020 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 . const unsigne
1b030 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 d char *buf,
1b040 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 /* Buffer to de
1b050 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a serialize from *
1b060 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 /. u32 serial_t
1b070 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 ype,
1b080 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 /* Serial type
1b090 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 to deserialize
1b0a0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 */. Mem *pMem
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b0c0 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c /* Memory cel
1b0d0 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 l to write value
1b0e0 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 into */.){. u6
1b0f0 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 4 x = FOUR_BYTE_
1b100 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 UINT(buf);. u32
1b110 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 y = FOUR_BYTE_U
1b120 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 INT(buf+4);. x
1b130 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 = (x<<32) + y;.
1b140 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 if( serial_type
1b150 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 ==6 ){. /* EV
1b160 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 IDENCE-OF: R-298
1b170 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 51-52272 Value i
1b180 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 s a big-endian 6
1b190 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 4-bit. ** two
1b1a0 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 s-complement int
1b1b0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 eger. */. pMe
1b1c0 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 m->u.i = *(i64*)
1b1d0 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c &x;. pMem->fl
1b1e0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 ags = MEM_Int;.
1b1f0 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 testcase( pMe
1b200 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 m->u.i<0 );. }e
1b210 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 lse{. /* EVID
1b220 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 ENCE-OF: R-57343
1b230 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 -49114 Value is
1b240 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 a big-endian IEE
1b250 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 E 754-2008 64-bi
1b260 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e t. ** floatin
1b270 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 g point number.
1b280 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 */.#if !defined(
1b290 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 NDEBUG) && !defi
1b2a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
1b2b0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a FLOATING_POINT).
1b2c0 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
1b2d0 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 at integers and
1b2e0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 floating point v
1b2f0 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 alues use the sa
1b300 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f me. ** byte o
1b310 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 rder. Or, that
1b320 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f if SQLITE_MIXED_
1b330 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f ENDIAN_64BIT_FLO
1b340 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 AT is. ** def
1b350 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 ined that 64-bit
1b360 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 floating point
1b370 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 values really ar
1b380 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 e mixed. ** e
1b390 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 ndian.. */.
1b3a0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 static const u
1b3b0 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 64 t1 = ((u64)0x
1b3c0 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 3ff00000)<<32;.
1b3d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 static const
1b3e0 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b double r1 = 1.0;
1b3f0 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 . u64 t2 = t1
1b400 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 ;. swapMixedE
1b410 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a ndianFloat(t2);.
1b420 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 assert( size
1b430 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 of(r1)==sizeof(t
1b440 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2) && memcmp(&r1
1b450 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 , &t2, sizeof(r1
1b460 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a ))==0 );.#endif.
1b470 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 assert( size
1b480 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 of(x)==8 && size
1b490 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 of(pMem->u.r)==8
1b4a0 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 );. swapMixe
1b4b0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b dEndianFloat(x);
1b4c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 . memcpy(&pMe
1b4d0 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 m->u.r, &x, size
1b4e0 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d of(x));. pMem
1b4f0 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 ->flags = sqlite
1b500 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 3IsNaN(pMem->u.r
1b510 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d ) ? MEM_Null : M
1b520 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 EM_Real;. }. r
1b530 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 eturn 8;.}.u32 s
1b540 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
1b550 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 Get(. const uns
1b560 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c igned char *buf,
1b570 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 /* Buffer t
1b580 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 o deserialize fr
1b590 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 om */. u32 seri
1b5a0 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 al_type,
1b5b0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 /* Serial
1b5c0 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c type to deserial
1b5d0 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d ize */. Mem *pM
1b5e0 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 em
1b5f0 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 /* Memory
1b600 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 cell to write v
1b610 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a alue into */.){.
1b620 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c switch( serial
1b630 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 _type ){. cas
1b640 65 20 31 30 3a 20 7b 20 2f 2a 20 49 6e 74 65 72 e 10: { /* Inter
1b650 6e 61 6c 20 75 73 65 20 6f 6e 6c 79 3a 20 4e 55 nal use only: NU
1b660 4c 4c 20 77 69 74 68 20 76 69 72 74 75 61 6c 20 LL with virtual
1b670 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20 table.
1b680 20 20 20 20 20 2a 2a 20 55 50 44 41 54 45 20 6e ** UPDATE n
1b690 6f 2d 63 68 61 6e 67 65 20 66 6c 61 67 20 73 65 o-change flag se
1b6a0 74 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d t */. pMem-
1b6b0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c >flags = MEM_Nul
1b6c0 6c 7c 4d 45 4d 5f 5a 65 72 6f 3b 0a 20 20 20 20 l|MEM_Zero;.
1b6d0 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 pMem->n = 0;.
1b6e0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 pMem->u.nZe
1b6f0 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 ro = 0;. br
1b700 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
1b710 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 ase 11: /* Res
1b720 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 erved for future
1b730 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 use */. case
1b740 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 0: { /* Null *
1b750 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 /. /* EVIDE
1b760 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d NCE-OF: R-24078-
1b770 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 09375 Value is a
1b780 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 NULL. */.
1b790 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
1b7a0 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 M_Null;. br
1b7b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
1b7c0 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f ase 1: {. /
1b7d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 * EVIDENCE-OF: R
1b7e0 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c -44885-25196 Val
1b7f0 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 ue is an 8-bit t
1b800 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 wos-complement.
1b810 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e ** integer.
1b820 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e */. pMem->
1b830 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 u.i = ONE_BYTE_I
1b840 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 NT(buf);. p
1b850 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
1b860 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 _Int;. test
1b870 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c case( pMem->u.i<
1b880 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 0 );. retur
1b890 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 n 1;. }. c
1b8a0 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 ase 2: { /* 2-by
1b8b0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 te signed intege
1b8c0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 r */. /* EV
1b8d0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 IDENCE-OF: R-497
1b8e0 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 94-35026 Value i
1b8f0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 s a big-endian 1
1b900 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 6-bit. ** t
1b910 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 wos-complement i
1b920 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 nteger. */.
1b930 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f pMem->u.i = TWO
1b940 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a _BYTE_INT(buf);.
1b950 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 pMem->flag
1b960 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 s = MEM_Int;.
1b970 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 testcase( pMe
1b980 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 m->u.i<0 );.
1b990 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 return 2;.
1b9a0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 }. case 3: {
1b9b0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 /* 3-byte signed
1b9c0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 integer */.
1b9d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 /* EVIDENCE-OF
1b9e0 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 : R-37839-54301
1b9f0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 Value is a big-e
1ba00 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 ndian 24-bit.
1ba10 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c ** twos-compl
1ba20 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a ement integer. *
1ba30 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e /. pMem->u.
1ba40 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 i = THREE_BYTE_I
1ba50 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 NT(buf);. p
1ba60 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
1ba70 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 _Int;. test
1ba80 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c case( pMem->u.i<
1ba90 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 0 );. retur
1baa0 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 n 3;. }. c
1bab0 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 ase 4: { /* 4-by
1bac0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 te signed intege
1bad0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 r */. /* EV
1bae0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 IDENCE-OF: R-018
1baf0 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 49-26079 Value i
1bb00 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 s a big-endian 3
1bb10 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 2-bit. ** t
1bb20 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 wos-complement i
1bb30 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 nteger. */.
1bb40 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 pMem->u.i = FOU
1bb50 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b R_BYTE_INT(buf);
1bb60 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 .#ifdef __HP_cc
1bb70 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 . /* Work a
1bb80 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 round a sign-ext
1bb90 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 ension bug in th
1bba0 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f e HP compiler fo
1bbb0 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 r HP/UX */.
1bbc0 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 if( buf[0]&0x80
1bbd0 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 ) pMem->u.i |=
1bbe0 30 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 0xffffffff800000
1bbf0 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 00LL;.#endif.
1bc00 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
1bc10 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 MEM_Int;.
1bc20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e testcase( pMem->
1bc30 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 u.i<0 );. r
1bc40 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 eturn 4;. }.
1bc50 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 case 5: { /*
1bc60 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 6-byte signed in
1bc70 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f teger */. /
1bc80 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 * EVIDENCE-OF: R
1bc90 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c -50385-09674 Val
1bca0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 ue is a big-endi
1bcb0 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 an 48-bit.
1bcc0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 ** twos-compleme
1bcd0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 nt integer. */.
1bce0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d pMem->u.i =
1bcf0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 FOUR_BYTE_UINT(
1bd00 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 buf+2) + (((i64)
1bd10 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 1)<<32)*TWO_BYTE
1bd20 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 _INT(buf);.
1bd30 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
1bd40 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 EM_Int;. te
1bd50 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e stcase( pMem->u.
1bd60 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 i<0 );. ret
1bd70 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 6;. }.
1bd80 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d case 6: /* 8-
1bd90 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 byte signed inte
1bda0 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 ger */. case
1bdb0 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 7: { /* IEEE flo
1bdc0 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 ating point */.
1bdd0 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 /* These us
1bde0 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 e local variable
1bdf0 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e s, so do them in
1be00 20 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 a separate rout
1be10 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 ine. ** to
1be20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 avoid having to
1be30 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 move the frame p
1be40 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f ointer in the co
1be50 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 mmon case */.
1be60 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c return serial
1be70 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 Get(buf,serial_t
1be80 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d ype,pMem);. }
1be90 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 . case 8:
1bea0 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a /* Integer 0 */.
1beb0 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f case 9: { /
1bec0 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 * Integer 1 */.
1bed0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 /* EVIDENCE
1bee0 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 -OF: R-12976-228
1bef0 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 93 Value is the
1bf00 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 integer 0. */.
1bf10 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d /* EVIDENCE-
1bf20 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 OF: R-18143-1212
1bf30 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 1 Value is the i
1bf40 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 nteger 1. */.
1bf50 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 pMem->u.i = s
1bf60 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 erial_type-8;.
1bf70 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
1bf80 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 = MEM_Int;.
1bf90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d return 0;. }
1bfa0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a . default: {.
1bfb0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 /* EVIDENC
1bfc0 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 E-OF: R-14606-31
1bfd0 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 564 Value is a B
1bfe0 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 LOB that is (N-1
1bff0 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 2)/2 bytes in.
1c000 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 ** length..
1c010 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 ** EVIDENCE
1c020 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 -OF: R-28401-001
1c030 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 40 Value is a st
1c040 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 ring in the text
1c050 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 encoding and.
1c060 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 ** (N-13)/2
1c070 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e bytes in length.
1c080 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 */. static
1c090 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 const u16 aFlag
1c0a0 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c [] = { MEM_Blob|
1c0b0 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 MEM_Ephem, MEM_S
1c0c0 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a tr|MEM_Ephem };.
1c0d0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 pMem->z =
1c0e0 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 (char *)buf;.
1c0f0 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 pMem->n = (se
1c100 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b rial_type-12)/2;
1c110 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
1c120 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 gs = aFlag[seria
1c130 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 l_type&1];.
1c140 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b return pMem->n;
1c150 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
1c160 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 urn 0;.}./*.** T
1c170 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 his routine is u
1c180 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 sed to allocate
1c190 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 sufficient space
1c1a0 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 for an Unpacked
1c1b0 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 Record.** struct
1c1c0 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 ure large enough
1c1d0 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 to be used with
1c1e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
1c1f0 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a rdUnpack() if.**
1c200 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d the first argum
1c210 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 ent is a pointer
1c220 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 to KeyInfo stru
1c230 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a cture pKeyInfo..
1c240 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 **.** The space
1c250 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 is either alloca
1c260 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 ted using sqlite
1c270 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 3DbMallocRaw() o
1c280 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a r from within.**
1c290 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 the unaligned b
1c2a0 75 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 uffer passed via
1c2b0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 the second and
1c2c0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 third arguments
1c2d0 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 (presumably.** s
1c2e0 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 tack space). If
1c2f0 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e the former, then
1c300 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 *ppFree is set
1c310 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 to a pointer tha
1c320 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 t should.** be e
1c330 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 ventually freed
1c340 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 by the caller us
1c350 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 ing sqlite3DbFre
1c360 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 e(). Or, if the
1c370 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 .** allocation c
1c380 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 omes from the pS
1c390 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 pace/szSpace buf
1c3a0 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 fer, *ppFree is
1c3b0 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 set to NULL.** b
1c3c0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e efore returning.
1c3d0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d .**.** If an OOM
1c3e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e error occurs, N
1c3f0 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e ULL is returned.
1c400 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f .*/.UnpackedReco
1c410 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 rd *sqlite3VdbeA
1c420 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f llocUnpackedReco
1c430 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 rd(. KeyInfo *p
1c440 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 20 20 KeyInfo
1c450 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 /* Descrip
1c460 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f tion of the reco
1c470 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 rd */.){. Unpac
1c480 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 kedRecord *p;
1c490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e /* Un
1c4a0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f packed record to
1c4b0 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 return */. int
1c4c0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 nByte;
1c4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1c4e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
1c4f0 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20 required for *p
1c500 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 */. nByte = ROU
1c510 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 ND8(sizeof(Unpac
1c520 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 kedRecord)) + si
1c530 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 zeof(Mem)*(pKeyI
1c540 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 2b 31 nfo->nKeyField+1
1c550 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 63 6b );. p = (Unpack
1c560 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 edRecord *)sqlit
1c570 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b e3DbMallocRaw(pK
1c580 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 eyInfo->db, nByt
1c590 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 20 72 e);. if( !p ) r
1c5a0 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 61 4d eturn 0;. p->aM
1c5b0 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 em = (Mem*)&((ch
1c5c0 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 ar*)p)[ROUND8(si
1c5d0 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 zeof(UnpackedRec
1c5e0 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 ord))];. assert
1c5f0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 ( pKeyInfo->aSor
1c600 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 tOrder!=0 );. p
1c610 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 ->pKeyInfo = pKe
1c620 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 yInfo;. p->nFie
1c630 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e ld = pKeyInfo->n
1c640 4b 65 79 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 KeyField + 1;.
1c650 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a return p;.}../*.
1c660 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 ** Given the nKe
1c670 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 y-byte encoding
1c680 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 of a record in p
1c690 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 Key[], populate
1c6a0 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 the .** Unpacked
1c6b0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 Record structure
1c6c0 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 indicated by th
1c6d0 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e e fourth argumen
1c6e0 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f t with the.** co
1c6f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 ntents of the de
1c700 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f coded record..*/
1c710 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 .void sqlite3Vd
1c720 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a beRecordUnpack(.
1c730 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 KeyInfo *pKeyI
1c740 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f nfo, /* Info
1c750 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 rmation about th
1c760 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 e record format
1c770 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 */. int nKey,
1c780 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
1c790 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 ize of the binar
1c7a0 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f y record */. co
1c7b0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 nst void *pKey,
1c7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 /* The bina
1c7d0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 ry record */. U
1c7e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 npackedRecord *p
1c7f0 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 /* Populat
1c800 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 e this structure
1c810 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e before returnin
1c820 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 g. */.){. const
1c830 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1c840 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e aKey = (const un
1c850 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b signed char *)pK
1c860 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 ey;. int d; .
1c870 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 u32 idx;
1c880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c890 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 /* Offset in aKe
1c8a0 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d y[] to read from
1c8b0 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 */. u16 u;
1c8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c8d0 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 /* Unsigne
1c8e0 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a d loop counter *
1c8f0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 /. u32 szHdr;.
1c900 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e Mem *pMem = p->
1c910 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 aMem;.. p->defa
1c920 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 ult_rc = 0;. as
1c930 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 sert( EIGHT_BYTE
1c940 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 _ALIGNMENT(pMem)
1c950 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 );. idx = getV
1c960 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a arint32(aKey, sz
1c970 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 Hdr);. d = szHd
1c980 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 r;. u = 0;. wh
1c990 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 ile( idx<szHdr &
1c9a0 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 & d<=nKey ){.
1c9b0 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 u32 serial_type
1c9c0 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 ;.. idx += ge
1c9d0 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b tVarint32(&aKey[
1c9e0 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 idx], serial_typ
1c9f0 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e e);. pMem->en
1ca00 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e c = pKeyInfo->en
1ca10 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 c;. pMem->db
1ca20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a = pKeyInfo->db;.
1ca30 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 /* pMem->fla
1ca40 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 gs = 0; // sqlit
1ca50 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 e3VdbeSerialGet(
1ca60 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 ) will set this
1ca70 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d for us */. pM
1ca80 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 em->szMalloc = 0
1ca90 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 ;. pMem->z =
1caa0 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 0;. d += sqli
1cab0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 te3VdbeSerialGet
1cac0 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 (&aKey[d], seria
1cad0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 l_type, pMem);.
1cae0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 pMem++;. i
1caf0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 f( (++u)>=p->nFi
1cb00 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d eld ) break;. }
1cb10 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b . assert( u<=pK
1cb20 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c eyInfo->nKeyFiel
1cb30 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 d + 1 );. p->nF
1cb40 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 ield = u;.}..#if
1cb50 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
1cb60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 ./*.** This func
1cb70 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 tion compares tw
1cb80 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 o index or table
1cb90 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 record keys in
1cba0 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 the same way.**
1cbb0 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 as the sqlite3Vd
1cbc0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
1cbd0 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b ) routine. Unlik
1cbe0 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e VdbeRecordComp
1cbf0 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 are(),.** this f
1cc00 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c unction deserial
1cc10 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 izes and compare
1cc20 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74 s values using t
1cc30 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 he.** sqlite3Vdb
1cc40 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64 eSerialGet() and
1cc50 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 sqlite3MemCompa
1cc60 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 re() functions.
1cc70 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e It is used.** in
1cc80 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d assert() statem
1cc90 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74 ents to ensure t
1cca0 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 hat the optimize
1ccb0 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c d code in.** sql
1ccc0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
1ccd0 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20 mpare() returns
1cce0 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65 results with the
1ccf0 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65 se two primitive
1cd00 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 s..**.** Return
1cd10 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75 true if the resu
1cd20 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e lt of comparison
1cd30 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 is equivalent t
1cd40 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e o desiredResult.
1cd50 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 .** Return false
1cd60 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64 if there is a d
1cd70 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a isagreement..*/.
1cd80 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 static int vdbeR
1cd90 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 ecordCompareDebu
1cda0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 g(. int nKey1,
1cdb0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
1cdc0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 1, /* Left key *
1cdd0 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b /. const Unpack
1cde0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 edRecord *pPKey2
1cdf0 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a , /* Right key *
1ce00 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52 /. int desiredR
1ce10 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 esult
1ce20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 /* Correct ans
1ce30 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 wer */.){. u32
1ce40 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f d1; /
1ce50 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b * Offset into aK
1ce60 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 ey[] of next dat
1ce70 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 a element */. u
1ce80 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 32 idx1;
1ce90 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f /* Offset into
1cea0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 aKey[] of next
1ceb0 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a header element *
1cec0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 /. u32 szHdr1;
1ced0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
1cee0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61 of bytes in hea
1cef0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d der */. int i =
1cf00 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 0;. int rc = 0
1cf10 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e ;. const unsign
1cf20 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d ed char *aKey1 =
1cf30 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
1cf40 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 char *)pKey1;.
1cf50 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e KeyInfo *pKeyIn
1cf60 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a fo;. Mem mem1;.
1cf70 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 . pKeyInfo = pP
1cf80 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a Key2->pKeyInfo;.
1cf90 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e if( pKeyInfo->
1cfa0 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 db==0 ) return 1
1cfb0 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 ;. mem1.enc = p
1cfc0 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 KeyInfo->enc;.
1cfd0 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e mem1.db = pKeyIn
1cfe0 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d fo->db;. /* mem
1cff0 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 1.flags = 0; //
1d000 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c Will be initial
1d010 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 ized by sqlite3V
1d020 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a dbeSerialGet() *
1d030 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 /. VVA_ONLY( me
1d040 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b m1.szMalloc = 0;
1d050 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 ) /* Only neede
1d060 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 d by assert() st
1d070 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f atements */.. /
1d080 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 * Compilers may
1d090 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 complain that me
1d0a0 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 m1.u.i is potent
1d0b0 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 ially uninitiali
1d0c0 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 zed.. ** We cou
1d0d0 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 ld initialize it
1d0e0 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c , as shown here,
1d0f0 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 to silence thos
1d100 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 e complaints..
1d110 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 ** But in fact,
1d120 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 mem1.u.i will ne
1d130 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 ver actually be
1d140 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a used uninitializ
1d150 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 ed, and doing .
1d160 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 ** the unnecess
1d170 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 ary initializati
1d180 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 on has a measura
1d190 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 ble negative per
1d1a0 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d formance. ** im
1d1b0 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 pact, since this
1d1c0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 routine is a ve
1d1d0 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 ry high runner.
1d1e0 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f And so, we choo
1d1f0 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 se. ** to ignor
1d200 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 e the compiler w
1d210 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 arnings and leav
1d220 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 e this variable
1d230 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 uninitialized..
1d240 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 */. /* mem1.u
1d250 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 .i = 0; // not
1d260 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 needed, here to
1d270 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 silence compiler
1d280 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 warning */. .
1d290 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e idx1 = getVarin
1d2a0 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 t32(aKey1, szHdr
1d2b0 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31 1);. if( szHdr1
1d2c0 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20 >98307 ) return
1d2d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a SQLITE_CORRUPT;.
1d2e0 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 d1 = szHdr1;.
1d2f0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 assert( pKeyInf
1d300 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 o->nAllField>=pP
1d310 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 Key2->nField ||
1d320 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 CORRUPT_DB );.
1d330 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f assert( pKeyInfo
1d340 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 ->aSortOrder!=0
1d350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 );. assert( pKe
1d360 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 yInfo->nKeyField
1d370 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 >0 );. assert(
1d380 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 idx1<=szHdr1 ||
1d390 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 CORRUPT_DB );.
1d3a0 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 do{. u32 seri
1d3b0 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f al_type1;.. /
1d3c0 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 * Read the seria
1d3d0 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 l types for the
1d3e0 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 next element in
1d3f0 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 each key. */.
1d400 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 idx1 += getVari
1d410 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 nt32( aKey1+idx1
1d420 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 , serial_type1 )
1d430 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
1d440 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 that there is e
1d450 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 nough key space
1d460 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f remaining to avo
1d470 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 id. ** a buff
1d480 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 er overread. Th
1d490 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 e "d1+serial_typ
1d4a0 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 e1+2" subexpress
1d4b0 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 ion will. **
1d4c0 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 always be greate
1d4d0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 r than or equal
1d4e0 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 to the amount of
1d4f0 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 required key sp
1d500 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 ace.. ** Use
1d510 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 that approximati
1d520 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 on to avoid the
1d530 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 more expensive c
1d540 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 all to. ** sq
1d550 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
1d560 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 ypeLen() in the
1d570 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 common case..
1d580 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 */. if( d1+s
1d590 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 erial_type1+2>(u
1d5a0 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 32)nKey1. &&
1d5b0 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 d1+sqlite3VdbeS
1d5c0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
1d5d0 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 ial_type1)>(u32)
1d5e0 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 nKey1 . ){.
1d5f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
1d600 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 .. /* Extract
1d610 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 the values to b
1d620 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 e compared..
1d630 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c */. d1 += sql
1d640 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 ite3VdbeSerialGe
1d650 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 t(&aKey1[d1], se
1d660 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d rial_type1, &mem
1d670 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 1);.. /* Do t
1d680 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 he comparison.
1d690 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 */. rc = sq
1d6a0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 lite3MemCompare(
1d6b0 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e &mem1, &pPKey2->
1d6c0 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 aMem[i], pKeyInf
1d6d0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 o->aColl[i]);.
1d6e0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 if( rc!=0 ){.
1d6f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d assert( mem
1d700 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 1.szMalloc==0 );
1d710 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 /* See comment
1d720 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 below */.
1d730 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 if( pKeyInfo->aS
1d740 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 ortOrder[i] ){.
1d750 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b rc = -rc;
1d760 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 /* Invert the
1d770 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 result for DESC
1d780 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 sort order. */.
1d790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 }. got
1d7a0 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e o debugCompareEn
1d7b0 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b d;. }. i++
1d7c0 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 ;. }while( idx1
1d7d0 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b <szHdr1 && i<pPK
1d7e0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a ey2->nField );..
1d7f0 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 /* No memory a
1d800 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 llocation is eve
1d810 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 r used on mem1.
1d820 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e Prove this usin
1d830 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f g. ** the follo
1d840 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 wing assert().
1d850 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 If the assert()
1d860 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 fails, it indica
1d870 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 tes a. ** memor
1d880 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 y leak and a nee
1d890 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 d to call sqlite
1d8a0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
1d8b0 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 &mem1).. */. a
1d8c0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 ssert( mem1.szMa
1d8d0 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a lloc==0 );.. /*
1d8e0 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e rc==0 here mean
1d8f0 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 s that one of th
1d900 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f e keys ran out o
1d910 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a f fields and. *
1d920 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 * all the fields
1d930 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e up to that poin
1d940 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 t were equal. Re
1d950 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 turn the default
1d960 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 _rc. ** value.
1d970 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 */. rc = pPKey
1d980 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 2->default_rc;..
1d990 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a debugCompareEnd:
1d9a0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 . if( desiredRe
1d9b0 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 sult==0 && rc==0
1d9c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 ) return 1;. i
1d9d0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 f( desiredResult
1d9e0 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 <0 && rc<0 ) ret
1d9f0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 urn 1;. if( des
1da00 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 iredResult>0 &&
1da10 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b rc>0 ) return 1;
1da20 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 . if( CORRUPT_D
1da30 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 B ) return 1;.
1da40 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 if( pKeyInfo->db
1da50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
1da60 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 return 1;. ret
1da70 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a urn 0;.}.#endif.
1da80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
1da90 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 EBUG./*.** Count
1daa0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 the number of f
1dab0 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f ields (a.k.a. co
1dac0 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 lumns) in the re
1dad0 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a cord given by.**
1dae0 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 pKey,nKey. The
1daf0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 verify that thi
1db00 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 s count is less
1db10 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f than or equal to
1db20 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 the.** limit gi
1db30 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d ven by pKeyInfo-
1db40 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a 0a 2a >nAllField..**.*
1db50 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72 * If this constr
1db60 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69 aint is not sati
1db70 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 sfied, it means
1db80 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70 that the high-sp
1db90 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 eed.** vdbeRecor
1dba0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e dCompareInt() an
1dbb0 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 d vdbeRecordComp
1dbc0 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74 areString() rout
1dbd0 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 ines will.** not
1dbe0 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e work correctly.
1dbf0 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74 If this assert
1dc00 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69 () ever fires, i
1dc10 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 t probably means
1dc20 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79 .** that the Key
1dc30 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 20 6f Info.nKeyField o
1dc40 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c 46 69 r KeyInfo.nAllFi
1dc50 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 eld values were
1dc60 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f computed.** inco
1dc70 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 rrectly..*/.stat
1dc80 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65 ic void vdbeAsse
1dc90 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 rtFieldCountWith
1dca0 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 inLimits(. int
1dcb0 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 nKey, const void
1dcc0 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 *pKey, /* The
1dcd0 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66 record to verif
1dce0 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 y */ . const Ke
1dcf0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 yInfo *pKeyInfo
1dd00 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 /* Compare
1dd10 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20 size with this
1dd20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 KeyInfo */.){.
1dd30 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a int nField = 0;.
1dd40 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 u32 szHdr;. u
1dd50 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 32 idx;. u32 no
1dd60 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 tUsed;. const u
1dd70 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b nsigned char *aK
1dd80 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 ey = (const unsi
1dd90 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b gned char*)pKey;
1dda0 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f .. if( CORRUPT_
1ddb0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 DB ) return;. i
1ddc0 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 dx = getVarint32
1ddd0 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 (aKey, szHdr);.
1dde0 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 assert( nKey>=0
1ddf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a );. assert( sz
1de00 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 Hdr<=(u32)nKey )
1de10 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 ;. while( idx<s
1de20 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20 zHdr ){. idx
1de30 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 += getVarint32(a
1de40 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 Key+idx, notUsed
1de50 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b );. nField++;
1de60 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e . }. assert( n
1de70 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 Field <= pKeyInf
1de80 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 3b 0a o->nAllField );.
1de90 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 }.#else.# define
1dea0 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 vdbeAssertField
1deb0 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 CountWithinLimit
1dec0 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a s(A,B,C).#endif.
1ded0 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 ./*.** Both *pMe
1dee0 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f m1 and *pMem2 co
1def0 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c ntain string val
1df00 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 ues. Compare the
1df10 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 two values.** u
1df20 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 sing the collati
1df30 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c on sequence pCol
1df40 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 l. As usual, ret
1df50 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c urn a negative ,
1df60 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 zero.** or posi
1df70 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 tive value if *p
1df80 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 Mem1 is less tha
1df90 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 n, equal to or g
1dfa0 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 reater than .**
1dfb0 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 *pMem2, respecti
1dfc0 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e vely. Similar in
1dfd0 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d spirit to "rc =
1dfe0 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d (*pMem1) - (*pM
1dff0 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 em2);"..*/.stati
1e000 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 c int vdbeCompar
1e010 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f eMemString(. co
1e020 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a nst Mem *pMem1,.
1e030 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 const Mem *pMe
1e040 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c m2,. const Coll
1e050 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 Seq *pColl,. u8
1e060 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 *prcErr
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1e080 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 If an OOM occur
1e090 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 s, set to SQLITE
1e0a0 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 _NOMEM */.){. i
1e0b0 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 f( pMem1->enc==p
1e0c0 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 Coll->enc ){.
1e0d0 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 /* The strings
1e0e0 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 are already in t
1e0f0 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 he correct encod
1e100 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 ing. Call the.
1e110 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f ** compariso
1e120 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 n function direc
1e130 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 tly */. retur
1e140 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 n pColl->xCmp(pC
1e150 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 oll->pUser,pMem1
1e160 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 ->n,pMem1->z,pMe
1e170 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b m2->n,pMem2->z);
1e180 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e . }else{. in
1e190 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 t rc;. const
1e1a0 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 void *v1, *v2;.
1e1b0 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d Mem c1;. M
1e1c0 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 em c2;. sqlit
1e1d0 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 e3VdbeMemInit(&c
1e1e0 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 1, pMem1->db, ME
1e1f0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c M_Null);. sql
1e200 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 ite3VdbeMemInit(
1e210 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 &c2, pMem1->db,
1e220 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 MEM_Null);. s
1e230 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 qlite3VdbeMemSha
1e240 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d llowCopy(&c1, pM
1e250 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b em1, MEM_Ephem);
1e260 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
1e270 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 MemShallowCopy(&
1e280 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 c2, pMem2, MEM_E
1e290 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 phem);. v1 =
1e2a0 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 sqlite3ValueText
1e2b0 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a ((sqlite3_value*
1e2c0 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 )&c1, pColl->enc
1e2d0 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 );. v2 = sqli
1e2e0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 te3ValueText((sq
1e2f0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 lite3_value*)&c2
1e300 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 , pColl->enc);.
1e310 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c if( (v1==0 ||
1e320 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 v2==0) ){.
1e330 20 69 66 28 20 70 72 63 45 72 72 20 29 20 2a 70 if( prcErr ) *p
1e340 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e rcErr = SQLITE_N
1e350 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20 OMEM_BKPT;.
1e360 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c rc = 0;. }el
1e370 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 se{. rc = p
1e380 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c Coll->xCmp(pColl
1e390 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c 20 76 ->pUser, c1.n, v
1e3a0 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a 20 20 1, c2.n, v2);.
1e3b0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 }. sqlite3V
1e3c0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 dbeMemRelease(&c
1e3d0 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 1);. sqlite3V
1e3e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 dbeMemRelease(&c
1e3f0 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 2);. return r
1e400 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 c;. }.}../*.**
1e410 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 The input pBlob
1e420 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f is guaranteed to
1e430 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20 be a Blob that
1e440 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a is not marked.**
1e450 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 with MEM_Zero.
1e460 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 Return true if
1e470 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 it could be a ze
1e480 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 ro-blob..*/.stat
1e490 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f ic int isAllZero
1e4a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 (const char *z,
1e4b0 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b int n){. int i;
1e4c0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b . for(i=0; i<n;
1e4d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a i++){. if( z
1e4e0 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a [i] ) return 0;.
1e4f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a }. return 1;.
1e500 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 }../*.** Compare
1e510 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 two blobs. Ret
1e520 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 urn negative, ze
1e530 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 ro, or positive
1e540 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 if the first.**
1e550 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 is less than, eq
1e560 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 ual to, or great
1e570 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f er than the seco
1e580 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 nd, respectively
1e590 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 ..** If one blob
1e5a0 20 69 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 is a prefix of
1e5b0 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 the other, then
1e5c0 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 the shorter is t
1e5d0 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 53 51 he lessor..*/.SQ
1e5e0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e LITE_NOINLINE in
1e5f0 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d t sqlite3BlobCom
1e600 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a pare(const Mem *
1e610 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a pB1, const Mem *
1e620 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 pB2){. int c;.
1e630 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e int n1 = pB1->n
1e640 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 ;. int n2 = pB2
1e650 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 ->n;.. /* It is
1e660 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 possible to hav
1e670 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 e a Blob value t
1e680 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e hat has some non
1e690 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 -zero content.
1e6a0 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a ** followed by z
1e6b0 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 ero content. Bu
1e6c0 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 t that only come
1e6d0 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 s up for Blobs f
1e6e0 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 ormed. ** by th
1e6f0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 e OP_MakeRecord
1e700 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 opcode, and such
1e710 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67 65 74 Blobs never get
1e720 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a passed into. *
1e730 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 * sqlite3MemComp
1e740 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 are(). */. asse
1e750 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 rt( (pB1->flags
1e760 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c & MEM_Zero)==0 |
1e770 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 | n1==0 );. ass
1e780 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 ert( (pB2->flags
1e790 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 & MEM_Zero)==0
1e7a0 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 || n2==0 );.. i
1e7b0 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 f( (pB1->flags|p
1e7c0 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d B2->flags) & MEM
1e7d0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 _Zero ){. if(
1e7e0 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 pB1->flags & pB
1e7f0 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 2->flags & MEM_Z
1e800 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72 65 74 ero ){. ret
1e810 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f urn pB1->u.nZero
1e820 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b - pB2->u.nZero;
1e830 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 . }else if( p
1e840 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f B1->flags & MEM_
1e850 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 Zero ){. if
1e860 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 ( !isAllZero(pB2
1e870 2d 3e 7a 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 ->z, pB2->n) ) r
1e880 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 eturn -1;.
1e890 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a return pB1->u.nZ
1e8a0 65 72 6f 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 ero - n2;. }e
1e8b0 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 21 lse{. if( !
1e8c0 69 73 41 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a isAllZero(pB1->z
1e8d0 2c 20 70 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 , pB1->n) ) retu
1e8e0 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 rn +1;. ret
1e8f0 75 72 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e urn n1 - pB2->u.
1e900 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d nZero;. }. }
1e910 0a 20 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 . c = memcmp(pB
1e920 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 1->z, pB2->z, n1
1e930 3e 6e 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a >n2 ? n2 : n1);.
1e940 20 20 69 66 28 20 63 20 29 20 72 65 74 75 72 6e if( c ) return
1e950 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 c;. return n1
1e960 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 - n2;.}../*.** D
1e970 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 o a comparison b
1e980 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 etween a 64-bit
1e990 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 signed integer a
1e9a0 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 nd a 64-bit floa
1e9b0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 ting-point.** nu
1e9c0 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 mber. Return ne
1e9d0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 gative, zero, or
1e9e0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 positive if the
1e9f0 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20 first (i64) is
1ea00 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 less than,.** eq
1ea10 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 ual to, or great
1ea20 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f er than the seco
1ea30 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a nd (double)..*/.
1ea40 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 static int sqlit
1ea50 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 e3IntFloatCompar
1ea60 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 e(i64 i, double
1ea70 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 r){. if( sizeof
1ea80 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 (LONGDOUBLE_TYPE
1ea90 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 )>8 ){. LONGD
1eaa0 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 OUBLE_TYPE x = (
1eab0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 LONGDOUBLE_TYPE)
1eac0 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 i;. if( x<r )
1ead0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
1eae0 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e if( x>r ) return
1eaf0 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 +1;. return
1eb00 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0;. }else{.
1eb10 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c i64 y;. doubl
1eb20 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d e s;. if( r<-
1eb30 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 9223372036854775
1eb40 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 808.0 ) return +
1eb50 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 3d 39 32 1;. if( r>=92
1eb60 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 2337203685477580
1eb70 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 8.0 ) return -1;
1eb80 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b . y = (i64)r;
1eb90 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 . if( i<y ) r
1eba0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 eturn -1;. if
1ebb0 28 20 69 3e 79 20 29 20 72 65 74 75 72 6e 20 2b ( i>y ) return +
1ebc0 31 3b 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 1;. s = (doub
1ebd0 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c le)i;. if( s<
1ebe0 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 r ) return -1;.
1ebf0 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 if( s>r ) ret
1ec00 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 urn +1;. retu
1ec10 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a rn 0;. }.}../*.
1ec20 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 ** Compare the v
1ec30 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 alues contained
1ec40 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 by the two memor
1ec50 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 y cells, returni
1ec60 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 ng.** negative,
1ec70 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 zero or positive
1ec80 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 if pMem1 is les
1ec90 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f s than, equal to
1eca0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 , or greater.**
1ecb0 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 than pMem2. Sort
1ecc0 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c ing order is NUL
1ecd0 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f L's first, follo
1ece0 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 wed by numbers (
1ecf0 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 integers.** and
1ed00 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 reals) sorted nu
1ed10 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f merically, follo
1ed20 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 wed by text orde
1ed30 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 red by the colla
1ed40 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 ting.** sequence
1ed50 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c pColl and final
1ed60 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 ly blob's ordere
1ed70 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a d by memcmp()..*
1ed80 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 *.** Two NULL va
1ed90 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 lues are conside
1eda0 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 red equal by thi
1edb0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 s function..*/.i
1edc0 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d nt sqlite3MemCom
1edd0 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a pare(const Mem *
1ede0 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d pMem1, const Mem
1edf0 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 *pMem2, const C
1ee00 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a ollSeq *pColl){.
1ee10 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 int f1, f2;.
1ee20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 int combined_fla
1ee30 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d gs;.. f1 = pMem
1ee40 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 1->flags;. f2 =
1ee50 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 pMem2->flags;.
1ee60 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 combined_flags
1ee70 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 = f1|f2;. asser
1ee80 74 28 20 21 73 71 6c 69 74 65 33 56 64 62 65 4d t( !sqlite3VdbeM
1ee90 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 6d 31 emIsRowSet(pMem1
1eea0 29 20 26 26 20 21 73 71 6c 69 74 65 33 56 64 62 ) && !sqlite3Vdb
1eeb0 65 4d 65 6d 49 73 52 6f 77 53 65 74 28 70 4d 65 eMemIsRowSet(pMe
1eec0 6d 32 29 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 m2) );. . /* If
1eed0 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 one value is NU
1eee0 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 LL, it is less t
1eef0 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 han the other. I
1ef00 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 f both values.
1ef10 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 ** are NULL, ret
1ef20 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 urn 0.. */. if
1ef30 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 ( combined_flags
1ef40 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 &MEM_Null ){.
1ef50 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f return (f2&MEM_
1ef60 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f Null) - (f1&MEM_
1ef70 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a Null);. }.. /*
1ef80 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 At least one of
1ef90 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 the two values
1efa0 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f is a number. */
1efb0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f . if( combined_
1efc0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d flags&(MEM_Int|M
1efd0 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 EM_Real) ){.
1efe0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d if( (f1 & f2 & M
1eff0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 EM_Int)!=0 ){.
1f000 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 if( pMem1->u
1f010 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 .i < pMem2->u.i
1f020 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 ) return -1;.
1f030 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e if( pMem1->u.
1f040 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 i > pMem2->u.i )
1f050 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 return +1;.
1f060 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 return 0;.
1f070 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 }. if( (f1 &
1f080 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d f2 & MEM_Real)!=
1f090 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 0 ){. if( p
1f0a0 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d Mem1->u.r < pMem
1f0b0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2->u.r ) return
1f0c0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d -1;. if( pM
1f0d0 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 em1->u.r > pMem2
1f0e0 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b ->u.r ) return +
1f0f0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 1;. return
1f100 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 0;. }. if(
1f110 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 (f1&MEM_Int)!=0
1f120 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 ){. if( (f
1f130 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 2&MEM_Real)!=0 )
1f140 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
1f150 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 sqlite3IntFloat
1f160 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 Compare(pMem1->u
1f170 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b .i, pMem2->u.r);
1f180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
1f190 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b return -1;
1f1a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
1f1b0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 if( (f1&MEM_R
1f1c0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 eal)!=0 ){.
1f1d0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 if( (f2&MEM_Int
1f1e0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )!=0 ){.
1f1f0 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 return -sqlite3I
1f200 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 ntFloatCompare(p
1f210 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 Mem2->u.i, pMem1
1f220 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 ->u.r);. }e
1f230 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 lse{. ret
1f240 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a urn -1;. }.
1f250 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
1f260 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 +1;. }.. /* I
1f270 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 f one value is a
1f280 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 string and the
1f290 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c other is a blob,
1f2a0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c the string is l
1f2b0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 ess.. ** If bot
1f2c0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 h are strings, c
1f2d0 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 ompare using the
1f2e0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 collating funct
1f2f0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 ions.. */. if(
1f300 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 combined_flags&
1f310 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 MEM_Str ){. i
1f320 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 f( (f1 & MEM_Str
1f330 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 )==0 ){. re
1f340 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 turn 1;. }.
1f350 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f if( (f2 & MEM_
1f360 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 Str)==0 ){.
1f370 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
1f380 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 }.. assert( p
1f390 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 Mem1->enc==pMem2
1f3a0 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e ->enc || pMem1->
1f3b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
1f3c0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
1f3d0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 pMem1->enc==SQLI
1f3e0 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 TE_UTF8 || .
1f3f0 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 pMem1->e
1f400 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 nc==SQLITE_UTF16
1f410 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 LE || pMem1->enc
1f420 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 ==SQLITE_UTF16BE
1f430 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 );.. /* The
1f440 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e collation sequen
1f450 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e ce must be defin
1f460 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 ed at this point
1f470 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a , even if. **
1f480 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 the user delete
1f490 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 s the collation
1f4a0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 sequence after t
1f4b0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 he vdbe program
1f4c0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c is. ** compil
1f4d0 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 ed (this was not
1f4e0 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 always the case
1f4f0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 ).. */. as
1f500 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 sert( !pColl ||
1f510 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a pColl->xCmp );..
1f520 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b if( pColl ){
1f530 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 . return vd
1f540 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 beCompareMemStri
1f550 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c ng(pMem1, pMem2,
1f560 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 pColl, 0);.
1f570 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 }. /* If a NU
1f580 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 LL pointer was p
1f590 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c assed as the col
1f5a0 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 late function, f
1f5b0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 all through.
1f5c0 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 ** to the blob c
1f5d0 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 ase and use memc
1f5e0 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a mp(). */. }. .
1f5f0 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 /* Both values
1f600 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 must be blobs.
1f610 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d Compare using m
1f620 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 emcmp(). */. r
1f630 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f eturn sqlite3Blo
1f640 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 bCompare(pMem1,
1f650 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a pMem2);.}.../*.*
1f660 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 * The first argu
1f670 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 ment passed to t
1f680 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
1f690 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 a serial-type th
1f6a0 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 at.** correspond
1f6b0 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 s to an integer
1f6c0 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 - all values bet
1f6d0 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 ween 1 and 9 inc
1f6e0 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 lusive .** excep
1f6f0 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 t 7. The second
1f700 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 points to a buff
1f710 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e er containing an
1f720 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a integer value.*
1f730 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 * serialized acc
1f740 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c ording to serial
1f750 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 _type. This func
1f760 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 tion deserialize
1f770 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 s.** and returns
1f780 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 the value..*/.s
1f790 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 tatic i64 vdbeRe
1f7a0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 cordDecodeInt(u3
1f7b0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 2 serial_type, c
1f7c0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a onst u8 *aKey){.
1f7d0 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 u32 y;. asser
1f7e0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c t( CORRUPT_DB ||
1f7f0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 (serial_type>=1
1f800 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c && serial_type<
1f810 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 =9 && serial_typ
1f820 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 e!=7) );. switc
1f830 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 h( serial_type )
1f840 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 {. case 0:.
1f850 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 case 1:.
1f860 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 testcase( aKey[0
1f870 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 ]&0x80 );.
1f880 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f return ONE_BYTE_
1f890 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 INT(aKey);. c
1f8a0 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 ase 2:. tes
1f8b0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 tcase( aKey[0]&0
1f8c0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 x80 );. ret
1f8d0 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 urn TWO_BYTE_INT
1f8e0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 (aKey);. case
1f8f0 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 3:. testca
1f900 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 se( aKey[0]&0x80
1f910 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e );. return
1f920 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 THREE_BYTE_INT(
1f930 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 aKey);. case
1f940 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 4: {. testc
1f950 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 ase( aKey[0]&0x8
1f960 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 0 );. y = F
1f970 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b OUR_BYTE_UINT(aK
1f980 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 ey);. retur
1f990 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 n (i64)*(int*)&y
1f9a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
1f9b0 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 5: {. test
1f9c0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 case( aKey[0]&0x
1f9d0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 80 );. retu
1f9e0 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e rn FOUR_BYTE_UIN
1f9f0 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 T(aKey+2) + (((i
1fa00 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 64)1)<<32)*TWO_B
1fa10 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 YTE_INT(aKey);.
1fa20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a }. case 6:
1fa30 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d {. u64 x =
1fa40 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 FOUR_BYTE_UINT(
1fa50 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 aKey);. tes
1fa60 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 tcase( aKey[0]&0
1fa70 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d x80 );. x =
1fa80 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f (x<<32) | FOUR_
1fa90 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 BYTE_UINT(aKey+4
1faa0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
1fab0 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a (i64)*(i64*)&x;.
1fac0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
1fad0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 urn (serial_type
1fae0 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 - 8);.}../*.**
1faf0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f This function co
1fb00 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 mpares the two t
1fb10 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 able rows or ind
1fb20 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 ex records.** sp
1fb30 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 ecified by {nKey
1fb40 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 1, pKey1} and pP
1fb50 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e Key2. It return
1fb60 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 s a negative, ze
1fb70 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 ro.** or positiv
1fb80 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 e integer if key
1fb90 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 1 is less than,
1fba0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 equal to or .**
1fbb0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 greater than key
1fbc0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 2. The {nKey1,
1fbd0 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 pKey1} key must
1fbe0 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 be a blob.** cre
1fbf0 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d ated by the OP_M
1fc00 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 akeRecord opcode
1fc10 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 of the VDBE. T
1fc20 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 he pPKey2.** key
1fc30 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 must be a parse
1fc40 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 d key such as ob
1fc50 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 tained from.** s
1fc60 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 qlite3VdbeParseR
1fc70 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ecord..**.** If
1fc80 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 argument bSkip i
1fc90 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 s non-zero, it i
1fca0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 s assumed that t
1fcb0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c he caller has al
1fcc0 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 ready.** determi
1fcd0 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 ned that the fir
1fce0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 st fields of the
1fcf0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e keys are equal.
1fd00 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 .**.** Key1 and
1fd10 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 Key2 do not have
1fd20 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 to contain the
1fd30 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 same number of f
1fd40 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a ields. If all .*
1fd50 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 * fields that ap
1fd60 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 pear in both key
1fd70 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 s are equal, the
1fd80 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c n pPKey2->defaul
1fd90 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 t_rc is .** retu
1fda0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 rned..**.** If d
1fdb0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 atabase corrupti
1fdc0 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 on is discovered
1fdd0 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 , set pPKey2->er
1fde0 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c rCode to .** SQL
1fdf0 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 ITE_CORRUPT and
1fe00 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 return 0. If an
1fe10 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 OOM error is enc
1fe20 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 ountered, .** pP
1fe30 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 Key2->errCode is
1fe40 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e set to SQLITE_N
1fe50 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 OMEM and, if it
1fe60 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 is not NULL, the
1fe70 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 .** malloc-faile
1fe80 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 d flag set on da
1fe90 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 tabase handle (p
1fea0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1feb0 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c >db)..*/.int sql
1fec0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
1fed0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 mpareWithSkip(.
1fee0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 int nKey1, cons
1fef0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 t void *pKey1,
1ff00 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a /* Left key */.
1ff10 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 UnpackedRecord
1ff20 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 *pPKey2,
1ff30 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a /* Right key *
1ff40 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 /. int bSkip
1ff50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ff60 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 /* If true,
1ff70 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 skip the first f
1ff80 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 ield */.){. u32
1ff90 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 d1;
1ffa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1ffb0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 Offset into aKey
1ffc0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 [] of next data
1ffd0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 element */. int
1ffe0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
1fff0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
20000 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 Index of next fi
20010 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a eld to compare *
20020 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 /. u32 szHdr1;
20030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20040 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 /* Size of r
20050 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 ecord header in
20060 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 bytes */. u32 i
20070 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 dx1;
20080 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 /* Of
20090 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 fset of first ty
200a0 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a pe in header */.
200b0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 int rc = 0;
200c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
200d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 /* Return valu
200e0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 e */. Mem *pRhs
200f0 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b = pPKey2->aMem;
20100 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 /* Next f
20110 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 ield of pPKey2 t
20120 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b o compare */. K
20130 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
20140 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e ;. const unsign
20150 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d ed char *aKey1 =
20160 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 (const unsigned
20170 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 char *)pKey1;.
20180 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a Mem mem1;.. /*
20190 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 If bSkip is tru
201a0 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c e, then the call
201b0 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 er has already d
201c0 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 etermined that t
201d0 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 he first. ** tw
201e0 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 o elements in th
201f0 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c e keys are equal
20200 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 . Fix the variou
20210 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 s stack variable
20220 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 s so. ** that t
20230 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 his routine begi
20240 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 ns comparing at
20250 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 the second field
20260 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 . */. if( bSkip
20270 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a ){. u32 s1;.
20280 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 idx1 = 1 + g
20290 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 etVarint32(&aKey
202a0 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 1[1], s1);. s
202b0 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d zHdr1 = aKey1[0]
202c0 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 ;. d1 = szHdr
202d0 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 1 + sqlite3VdbeS
202e0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 erialTypeLen(s1)
202f0 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 ;. i = 1;.
20300 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 pRhs++;. }else
20310 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 {. idx1 = get
20320 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 Varint32(aKey1,
20330 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 szHdr1);. d1
20340 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 = szHdr1;. if
20350 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e ( d1>(unsigned)n
20360 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 Key1 ){ . p
20370 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d PKey2->errCode =
20380 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 (u8)SQLITE_CORR
20390 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 UPT_BKPT;.
203a0 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f return 0; /* Co
203b0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 rruption */.
203c0 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d }. i = 0;. }
203d0 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 .. VVA_ONLY( me
203e0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b m1.szMalloc = 0;
203f0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 ) /* Only neede
20400 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 d by assert() st
20410 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 atements */. as
20420 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b sert( pPKey2->pK
20430 65 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c eyInfo->nAllFiel
20440 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c d>=pPKey2->nFiel
20450 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 d . || COR
20460 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 RUPT_DB );. ass
20470 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 ert( pPKey2->pKe
20480 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 yInfo->aSortOrde
20490 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 r!=0 );. assert
204a0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e ( pPKey2->pKeyIn
204b0 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 3e 30 20 fo->nKeyField>0
204c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 );. assert( idx
204d0 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 1<=szHdr1 || COR
204e0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b RUPT_DB );. do{
204f0 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f . u32 serial_
20500 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 type;.. /* RH
20510 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 S is an integer
20520 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d */. if( pRhs-
20530 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 >flags & MEM_Int
20540 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c ){. serial
20550 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 _type = aKey1[id
20560 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 x1];. testc
20570 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 ase( serial_type
20580 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 ==12 );. if
20590 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 ( serial_type>=1
205a0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 0 ){. rc
205b0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 = +1;. }els
205c0 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 e if( serial_typ
205d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 e==0 ){.
205e0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d rc = -1;. }
205f0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f else if( serial_
20600 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 type==7 ){.
20610 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 sqlite3VdbeSe
20620 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 rialGet(&aKey1[d
20630 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 1], serial_type,
20640 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 &mem1);.
20650 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e rc = -sqlite3In
20660 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 tFloatCompare(pR
20670 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e hs->u.i, mem1.u.
20680 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b r);. }else{
20690 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 . i64 lhs
206a0 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 = vdbeRecordDec
206b0 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 odeInt(serial_ty
206c0 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b pe, &aKey1[d1]);
206d0 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 . i64 rhs
206e0 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 = pRhs->u.i;.
206f0 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 if( lhs<rh
20700 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 s ){. r
20710 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 c = -1;.
20720 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 }else if( lhs>rh
20730 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 s ){. r
20740 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 c = +1;.
20750 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }. }.
20760 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 . /* RHS is r
20770 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 eal */. else
20780 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 if( pRhs->flags
20790 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 & MEM_Real ){.
207a0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 serial_type
207b0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 = aKey1[idx1];.
207c0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f if( serial_
207d0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 type>=10 ){.
207e0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 /* Serial ty
207f0 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 pes 12 or greate
20800 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e r are strings an
20810 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 d blobs (greater
20820 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a than. **
20830 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 numbers). Types
20840 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 10 and 11 are c
20850 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 urrently "reserv
20860 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 ed for future .
20870 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 ** use",
20880 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 so it doesn't re
20890 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 ally matter what
208a0 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 the results of
208b0 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 comparing.
208c0 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d ** them to num
208d0 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 beric values are
208e0 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 . */. rc
208f0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c = +1;. }el
20900 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 se if( serial_ty
20910 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 pe==0 ){.
20920 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 rc = -1;.
20930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 }else{. s
20940 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
20950 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 Get(&aKey1[d1],
20960 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 serial_type, &me
20970 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 m1);. if(
20980 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 serial_type==7
20990 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ){. if(
209a0 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e mem1.u.r<pRhs->
209b0 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 u.r ){.
209c0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 rc = -1;.
209d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
209e0 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 mem1.u.r>pRhs->u
209f0 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 .r ){.
20a00 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 rc = +1;.
20a10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d }. }
20a20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 else{.
20a30 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 rc = sqlite3IntF
20a40 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 loatCompare(mem1
20a50 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 .u.i, pRhs->u.r)
20a60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
20a70 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
20a80 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e * RHS is a strin
20a90 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 g */. else if
20aa0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 ( pRhs->flags &
20ab0 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 MEM_Str ){.
20ac0 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b getVarint32(&aK
20ad0 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 ey1[idx1], seria
20ae0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 l_type);. t
20af0 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f estcase( serial_
20b00 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 type==12 );.
20b10 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 if( serial_typ
20b20 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 e<12 ){.
20b30 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d rc = -1;. }
20b40 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 else if( !(seria
20b50 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 l_type & 0x01) )
20b60 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b {. rc = +
20b70 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 1;. }else{.
20b80 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d mem1.n =
20b90 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 (serial_type -
20ba0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 12) / 2;.
20bb0 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d testcase( (d1+m
20bc0 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 em1.n)==(unsigne
20bd0 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 d)nKey1 );.
20be0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 testcase( (d1
20bf0 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 +mem1.n+1)==(uns
20c00 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 igned)nKey1 );.
20c10 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d if( (d1+m
20c20 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e em1.n) > (unsign
20c30 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 ed)nKey1 ){.
20c40 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 pPKey2->er
20c50 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 rCode = (u8)SQLI
20c60 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
20c70 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
20c80 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 n 0;
20c90 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f /* Corruptio
20ca0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c n */. }el
20cb0 73 65 20 69 66 28 20 28 70 4b 65 79 49 6e 66 6f se if( (pKeyInfo
20cc0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 = pPKey2->pKeyI
20cd0 6e 66 6f 29 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 nfo)->aColl[i] )
20ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 {. mem1
20cf0 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d .enc = pKeyInfo-
20d00 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 >enc;.
20d10 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e mem1.db = pKeyIn
20d20 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 fo->db;.
20d30 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d mem1.flags = M
20d40 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 EM_Str;.
20d50 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 mem1.z = (char
20d60 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 *)&aKey1[d1];.
20d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 rc = vdb
20d80 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e eCompareMemStrin
20d90 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 g(.
20da0 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b &mem1, pRhs, pK
20db0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d eyInfo->aColl[i]
20dc0 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f , &pPKey2->errCo
20dd0 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a de. );.
20de0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
20df0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d int nCm
20e00 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 p = MIN(mem1.n,
20e10 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 pRhs->n);.
20e20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 rc = memcmp(
20e30 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 &aKey1[d1], pRhs
20e40 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 ->z, nCmp);.
20e50 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 if( rc==0
20e60 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 ) rc = mem1.n -
20e70 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 pRhs->n; .
20e80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
20e90 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 }.. /* RHS is
20ea0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 a blob */. e
20eb0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c lse if( pRhs->fl
20ec0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 ags & MEM_Blob )
20ed0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 {. assert(
20ee0 28 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d (pRhs->flags & M
20ef0 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 EM_Zero)==0 || p
20f00 52 68 73 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 Rhs->n==0 );.
20f10 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 getVarint32(&
20f20 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 aKey1[idx1], ser
20f30 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 ial_type);.
20f40 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 testcase( seria
20f50 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 l_type==12 );.
20f60 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 if( serial_t
20f70 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 ype<12 || (seria
20f80 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 l_type & 0x01) )
20f90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d {. rc = -
20fa0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 1;. }else{.
20fb0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 int nStr
20fc0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 = (serial_type
20fd0 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 - 12) / 2;.
20fe0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 testcase( (d1
20ff0 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 +nStr)==(unsigne
21000 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 d)nKey1 );.
21010 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 testcase( (d1
21020 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 +nStr+1)==(unsig
21030 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 ned)nKey1 );.
21040 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 if( (d1+nSt
21050 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e r) > (unsigned)n
21060 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 Key1 ){.
21070 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 pPKey2->errCod
21080 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 e = (u8)SQLITE_C
21090 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 ORRUPT_BKPT;.
210a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b return 0;
210b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
210c0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f /* Corruption */
210d0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 . }else i
210e0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 f( pRhs->flags &
210f0 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 MEM_Zero ){.
21100 20 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c if( !isAl
21110 6c 5a 65 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 lZero((const cha
21120 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 r*)&aKey1[d1],nS
21130 74 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 tr) ){.
21140 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 rc = 1;.
21150 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
21160 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 53 74 rc = nSt
21170 72 20 2d 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 r - pRhs->u.nZer
21180 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 o;. }.
21190 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 }else{.
211a0 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 int nCmp
211b0 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 = MIN(nStr, pRh
211c0 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 s->n);.
211d0 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b rc = memcmp(&aK
211e0 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a ey1[d1], pRhs->z
211f0 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 , nCmp);.
21200 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 if( rc==0 ) r
21210 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d c = nStr - pRhs-
21220 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 >n;. }.
21230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
21240 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 /* RHS is null
21250 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 */. else{.
21260 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d serial_type =
21270 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 aKey1[idx1];.
21280 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c rc = (serial
21290 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d _type!=0);. }
212a0 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 .. if( rc!=0
212b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 4b ){. if( pPK
212c0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 ey2->pKeyInfo->a
212d0 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a SortOrder[i] ){.
212e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 rc = -rc
212f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
21300 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f assert( vdbeReco
21310 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e rdCompareDebug(n
21320 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b Key1, pKey1, pPK
21330 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 ey2, rc) );.
21340 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 assert( mem1.s
21350 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f zMalloc==0 ); /
21360 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 * See comment be
21370 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 low */. ret
21380 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 urn rc;. }..
21390 20 20 20 69 2b 2b 3b 0a 20 20 20 20 69 66 28 20 i++;. if(
213a0 69 3d 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c i==pPKey2->nFiel
213b0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 d ) break;. p
213c0 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d Rhs++;. d1 +=
213d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
213e0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c alTypeLen(serial
213f0 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 _type);. idx1
21400 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e += sqlite3Varin
21410 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 tLen(serial_type
21420 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 );. }while( idx
21430 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 1<(unsigned)szHd
21440 72 31 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 r1 && d1<=(unsig
21450 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 ned)nKey1 );..
21460 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c /* No memory all
21470 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 ocation is ever
21480 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 used on mem1. P
21490 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a rove this using.
214a0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 ** the followi
214b0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 ng assert(). If
214c0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 the assert() fa
214d0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 ils, it indicate
214e0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 s a. ** memory
214f0 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 leak and a need
21500 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 to call sqlite3V
21510 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d dbeMemRelease(&m
21520 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 em1). */. asse
21530 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f rt( mem1.szMallo
21540 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 c==0 );.. /* rc
21550 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 ==0 here means t
21560 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 hat one or both
21570 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 of the keys ran
21580 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e out of fields an
21590 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 d. ** all the f
215a0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 ields up to that
215b0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 point were equa
215c0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 l. Return the de
215d0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 fault_rc. ** va
215e0 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 lue. */. asser
215f0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 t( CORRUPT_DB .
21600 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 || vdbeRec
21610 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 ordCompareDebug(
21620 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
21630 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 Key2, pPKey2->de
21640 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 fault_rc) .
21650 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 || pPKey2->pKe
21660 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f yInfo->db->mallo
21670 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 cFailed. );. p
21680 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 PKey2->eqSeen =
21690 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 1;. return pPKe
216a0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a y2->default_rc;.
216b0 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 }.int sqlite3Vdb
216c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a eRecordCompare(.
216d0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e int nKey1, con
216e0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 st void *pKey1,
216f0 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f /* Left key */
21700 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 . UnpackedRecor
21710 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 d *pPKey2
21720 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 /* Right key
21730 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 */.){. return s
21740 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 qlite3VdbeRecord
21750 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 CompareWithSkip(
21760 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
21770 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a Key2, 0);.}.../*
21780 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
21790 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 n is an optimize
217a0 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c d version of sql
217b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
217c0 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 mpare() .** that
217d0 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 66 (a) the first f
217e0 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 ield of pPKey2 i
217f0 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e s an integer, an
21800 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 d (b) the .** si
21810 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 ze-of-header var
21820 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74 int at the start
21830 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 of (pKey1/nKey1
21840 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 ) fits in a sing
21850 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e le.** byte (i.e.
21860 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 is less than 12
21870 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 8)..**.** To avo
21880 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 id concerns abou
21890 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 t buffer overrea
218a0 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 ds, this routine
218b0 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a is only used.**
218c0 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 on schemas wher
218d0 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 e the maximum va
218e0 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 lid header size
218f0 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c is 63 bytes or l
21900 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ess..*/.static i
21910 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d nt vdbeRecordCom
21920 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e pareInt(. int n
21930 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 Key1, const void
21940 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 *pKey1, /* Left
21950 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b key */. Unpack
21960 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 edRecord *pPKey2
21970 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 /* Right
21980 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e key */.){. con
21990 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 st u8 *aKey = &(
219a0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 (const u8*)pKey1
219b0 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b )[*(const u8*)pK
219c0 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 ey1 & 0x3F];. i
219d0 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d nt serial_type =
219e0 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 ((const u8*)pKe
219f0 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 y1)[1];. int re
21a00 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 s;. u32 y;. u6
21a10 34 20 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 4 x;. i64 v;.
21a20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 i64 lhs;.. vdbe
21a30 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 AssertFieldCount
21a40 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 WithinLimits(nKe
21a50 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 y1, pKey1, pPKey
21a60 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 2->pKeyInfo);.
21a70 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 assert( (*(u8*)p
21a80 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 Key1)<=0x3F || C
21a90 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 ORRUPT_DB );. s
21aa0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 witch( serial_ty
21ab0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 pe ){. case 1
21ac0 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 : { /* 1-byte si
21ad0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a gned integer */.
21ae0 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f lhs = ONE_
21af0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a BYTE_INT(aKey);.
21b00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
21b10 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 lhs<0 );. b
21b20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
21b30 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 case 2: { /* 2-b
21b40 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
21b50 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 er */. lhs
21b60 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 = TWO_BYTE_INT(a
21b70 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 Key);. test
21b80 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 case( lhs<0 );.
21b90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
21ba0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 }. case 3: {
21bb0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 /* 3-byte signed
21bc0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 integer */.
21bd0 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 lhs = THREE_BY
21be0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 TE_INT(aKey);.
21bf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 testcase( lh
21c00 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 s<0 );. bre
21c10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
21c20 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 se 4: { /* 4-byt
21c30 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 e signed integer
21c40 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f */. y = FO
21c50 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 UR_BYTE_UINT(aKe
21c60 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 y);. lhs =
21c70 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a (i64)*(int*)&y;.
21c80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
21c90 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 lhs<0 );. b
21ca0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
21cb0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 case 5: { /* 6-b
21cc0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
21cd0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 er */. lhs
21ce0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 = FOUR_BYTE_UINT
21cf0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 (aKey+2) + (((i6
21d00 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 4)1)<<32)*TWO_BY
21d10 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 TE_INT(aKey);.
21d20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 testcase( lh
21d30 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 s<0 );. bre
21d40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
21d50 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 se 6: { /* 8-byt
21d60 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 e signed integer
21d70 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f */. x = FO
21d80 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 UR_BYTE_UINT(aKe
21d90 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 y);. x = (x
21da0 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 <<32) | FOUR_BYT
21db0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a E_UINT(aKey+4);.
21dc0 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 lhs = *(i6
21dd0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 4*)&x;. tes
21de0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a tcase( lhs<0 );.
21df0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
21e00 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a }. case 8: .
21e10 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 lhs = 0;.
21e20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
21e30 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 case 9:. lh
21e40 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 s = 1;. bre
21e50 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 ak;.. /* This
21e60 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 case could be r
21e70 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 emoved without c
21e80 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 hanging the resu
21e90 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 lts of running.
21ea0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e ** this code.
21eb0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 Including it ca
21ec0 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 uses gcc to gene
21ed0 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 rate a faster sw
21ee0 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 itch . ** sta
21ef0 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 tement (since th
21f00 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 e range of switc
21f10 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 h targets now st
21f20 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 arts at zero and
21f30 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 . ** is conti
21f40 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 guous) but does
21f50 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 not cause any du
21f60 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 plicate code to
21f70 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 be generated.
21f80 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 ** (as gcc is c
21f90 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 lever enough to
21fa0 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 combine the two
21fb0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 like cases). Oth
21fc0 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 er . ** compi
21fd0 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 lers might be si
21fe0 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 milar. */ .
21ff0 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a case 0: case 7:.
22000 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c return sql
22010 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
22020 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 mpare(nKey1, pKe
22030 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 y1, pPKey2);..
22040 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 default:.
22050 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
22060 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
22070 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 (nKey1, pKey1, p
22080 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 PKey2);. }.. v
22090 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b = pPKey2->aMem[
220a0 30 5d 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 0].u.i;. if( v>
220b0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d lhs ){. res =
220c0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d pPKey2->r1;. }
220d0 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 else if( v<lhs )
220e0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 {. res = pPKe
220f0 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 y2->r2;. }else
22100 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 if( pPKey2->nFie
22110 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 ld>1 ){. /* T
22120 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 he first fields
22130 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 of the two keys
22140 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 are equal. Compa
22150 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 re the trailing
22160 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 . ** fields.
22170 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 */. res = sq
22180 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 lite3VdbeRecordC
22190 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e ompareWithSkip(n
221a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b Key1, pKey1, pPK
221b0 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 ey2, 1);. }else
221c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 {. /* The fir
221d0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 st fields of the
221e0 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 two keys are eq
221f0 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 ual and there ar
22200 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 e no trailing.
22210 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 ** fields. Ret
22220 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 urn pPKey2->defa
22230 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 ult_rc in this c
22240 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 ase. */. res
22250 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c = pPKey2->defaul
22260 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 t_rc;. pPKey2
22270 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 ->eqSeen = 1;.
22280 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 }.. assert( vdb
22290 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 eRecordCompareDe
222a0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 bug(nKey1, pKey1
222b0 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 , pPKey2, res) )
222c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a ;. return res;.
222d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 }../*.** This fu
222e0 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 nction is an opt
222f0 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f imized version o
22300 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 f sqlite3VdbeRec
22310 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a ordCompare() .**
22320 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69 that (a) the fi
22330 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b rst field of pPK
22340 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c ey2 is a string,
22350 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69 that (b) the fi
22360 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 rst field.** use
22370 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 s the collation
22380 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 sequence BINARY
22390 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65 and (c) that the
223a0 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 size-of-header
223b0 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 varint .** at th
223c0 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 e start of (pKey
223d0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 1/nKey1) fits in
223e0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a a single byte..
223f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 */.static int vd
22400 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 beRecordCompareS
22410 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 tring(. int nKe
22420 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a y1, const void *
22430 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b pKey1, /* Left k
22440 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 ey */. Unpacked
22450 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 Record *pPKey2
22460 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b /* Right k
22470 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 ey */.){. const
22480 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f u8 *aKey1 = (co
22490 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 nst u8*)pKey1;.
224a0 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 int serial_type
224b0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 ;. int res;..
224c0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e assert( pPKey2->
224d0 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 aMem[0].flags &
224e0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 MEM_Str );. vdb
224f0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e eAssertFieldCoun
22500 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b tWithinLimits(nK
22510 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 ey1, pKey1, pPKe
22520 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 y2->pKeyInfo);.
22530 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b getVarint32(&aK
22540 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 ey1[1], serial_t
22550 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 ype);. if( seri
22560 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 al_type<12 ){.
22570 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e res = pPKey2->
22580 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 r1; /* (pKe
22590 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e y1/nKey1) is a n
225a0 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 umber or a null
225b0 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 */. }else if( !
225c0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 (serial_type & 0
225d0 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 x01) ){ . res
225e0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 = pPKey2->r2;
225f0 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b /* (pKey1/nK
22600 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a ey1) is a blob *
22610 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 /. }else{. i
22620 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 nt nCmp;. int
22630 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 nStr;. int s
22640 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b zHdr = aKey1[0];
22650 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 .. nStr = (se
22660 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 rial_type-12) /
22670 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 2;. if( (szHd
22680 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 r + nStr) > nKey
22690 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 1 ){. pPKey
226a0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 2->errCode = (u8
226b0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f )SQLITE_CORRUPT_
226c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 BKPT;. retu
226d0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 rn 0; /* Corr
226e0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a uption */. }.
226f0 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 nCmp = MIN(
22700 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e pPKey2->aMem[0].
22710 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 n, nStr );. r
22720 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 es = memcmp(&aKe
22730 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 y1[szHdr], pPKey
22740 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 2->aMem[0].z, nC
22750 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 mp);.. if( re
22760 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 s==0 ){. re
22770 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 s = nStr - pPKey
22780 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 2->aMem[0].n;.
22790 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 if( res==0 )
227a0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 {. if( pP
227b0 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 Key2->nField>1 )
227c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 {. res
227d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 = sqlite3VdbeRec
227e0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b ordCompareWithSk
227f0 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c ip(nKey1, pKey1,
22800 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 pPKey2, 1);.
22810 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
22820 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 res = pPKe
22830 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a y2->default_rc;.
22840 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 pPKey2
22850 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 ->eqSeen = 1;.
22860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 }. }e
22870 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b lse if( res>0 ){
22880 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 . res = p
22890 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 PKey2->r2;.
228a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
228b0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 res = pPKey2->r1
228c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 ;. }. }e
228d0 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b lse if( res>0 ){
228e0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b . res = pPK
228f0 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c ey2->r2;. }el
22900 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 se{. res =
22910 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 pPKey2->r1;.
22920 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 }. }.. assert(
22930 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 vdbeRecordCompa
22940 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 reDebug(nKey1, p
22950 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 Key1, pPKey2, re
22960 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 s). || COR
22970 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c RUPT_DB. |
22980 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e | pPKey2->pKeyIn
22990 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 fo->db->mallocFa
229a0 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 iled. );. retu
229b0 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a rn res;.}../*.**
229c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 Return a pointe
229d0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 r to an sqlite3V
229e0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
229f0 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 () compatible fu
22a00 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 nction.** suitab
22a10 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 le for comparing
22a20 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f serialized reco
22a30 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 rds to the unpac
22a40 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 ked record passe
22a50 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 d.** as the only
22a60 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 argument..*/.Re
22a70 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 cordCompare sqli
22a80 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 te3VdbeFindCompa
22a90 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 re(UnpackedRecor
22aa0 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 d *p){. /* vari
22ab0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 ntRecordCompareI
22ac0 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 nt() and varintR
22ad0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 ecordCompareStri
22ae0 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 ng() both assume
22af0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 . ** that the s
22b00 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 ize-of-header va
22b10 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 rint that occurs
22b20 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 at the start of
22b30 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a each record. *
22b40 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 * fits in a sing
22b50 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 le byte (i.e. is
22b60 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 127 or less). v
22b70 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 arintRecordCompa
22b80 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 reInt(). ** als
22b90 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 o assumes that i
22ba0 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 t is safe to ove
22bb0 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62 rread a buffer b
22bc0 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a y at least the .
22bd0 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 ** maximum pos
22be0 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 sible legal head
22bf0 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 er size plus 8 b
22c00 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 ytes. Because th
22c10 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 ere is. ** guar
22c20 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 anteed to be at
22c30 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f least 74 (but no
22c40 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 t 136) bytes of
22c50 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e padding followin
22c60 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 g each. ** buff
22c70 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 er passed to var
22c80 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 intRecordCompare
22c90 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 Int() this makes
22ca0 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 it convenient t
22cb0 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 o. ** limit the
22cc0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 size of the hea
22cd0 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 der to 64 bytes
22ce0 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74 in cases where t
22cf0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 he first field.
22d00 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 ** is an intege
22d10 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 r.. **. ** The
22d20 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 easiest way to
22d30 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d enforce this lim
22d40 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 it is to conside
22d50 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 r only records w
22d60 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c ith. ** 13 fiel
22d70 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 ds or less. If t
22d80 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 he first field i
22d90 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 s an integer, th
22da0 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a e maximum legal.
22db0 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 ** header size
22dc0 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 is (12*5 + 1 +
22dd0 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 1) bytes. */.
22de0 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d if( p->pKeyInfo-
22df0 3e 6e 41 6c 6c 46 69 65 6c 64 3c 3d 31 33 20 29 >nAllField<=13 )
22e00 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 {. int flags
22e10 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 = p->aMem[0].fla
22e20 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 gs;. if( p->p
22e30 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 KeyInfo->aSortOr
22e40 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 der[0] ){.
22e50 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 p->r1 = 1;.
22e60 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 p->r2 = -1;.
22e70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d }else{. p-
22e80 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 >r1 = -1;.
22e90 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d p->r2 = 1;. }
22ea0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 . if( (flags
22eb0 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 & MEM_Int) ){.
22ec0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 return vdbeR
22ed0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b ecordCompareInt;
22ee0 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 . }. testc
22ef0 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d ase( flags & MEM
22f00 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 _Real );. tes
22f10 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d tcase( flags & M
22f20 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 EM_Null );. t
22f30 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 estcase( flags &
22f40 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 MEM_Blob );.
22f50 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d if( (flags & (M
22f60 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c EM_Real|MEM_Null
22f70 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 |MEM_Blob))==0 &
22f80 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 & p->pKeyInfo->a
22f90 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 Coll[0]==0 ){.
22fa0 20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 assert( flag
22fb0 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 s & MEM_Str );.
22fc0 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 return vdbe
22fd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 RecordCompareStr
22fe0 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a ing;. }. }..
22ff0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
23000 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
23010 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 e;.}../*.** pCur
23020 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e points at an in
23030 64 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 dex entry create
23040 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d d using the OP_M
23050 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 akeRecord opcode
23060 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f ..** Read the ro
23070 77 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 wid (the last fi
23080 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 eld in the recor
23090 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 d) and store it
230a0 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 in *rowid..** Re
230b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 turn SQLITE_OK i
230c0 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 f everything wor
230d0 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 ks, or an error
230e0 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a code otherwise..
230f0 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 **.** pCur might
23100 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 be pointing to
23110 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 text obtained fr
23120 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 om a corrupt dat
23130 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 abase file..** S
23140 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 o the content ca
23150 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e nnot be trusted.
23160 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 Do appropriate
23170 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 checks on the c
23180 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 ontent..*/.int s
23190 71 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 qlite3VdbeIdxRow
231a0 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 id(sqlite3 *db,
231b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 BtCursor *pCur,
231c0 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 i64 *rowid){. i
231d0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 64 nCellKey = 0;
231e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 . int rc;. u32
231f0 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f szHdr; /
23200 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 * Size of the he
23210 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 ader */. u32 ty
23220 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 peRowid; /* S
23230 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 erial type of th
23240 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 e rowid */. u32
23250 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f lenRowid; /
23260 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f * Size of the ro
23270 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 wid */. Mem m,
23280 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 v;.. /* Get the
23290 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 size of the ind
232a0 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 ex entry. Only
232b0 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 indices entries
232c0 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 of less. ** tha
232d0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f n 2GiB are suppo
232e0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 rt - anything la
232f0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 rge must be data
23300 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e base corruption.
23310 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 . ** Any corrup
23320 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 tion is detected
23330 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 in sqlite3Btree
23340 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 ParseCellPtr(),
23350 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 though, so. **
23360 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 this code can sa
23370 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 fely assume that
23380 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d nCellKey is 32-
23390 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 bits . */. as
233a0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 sert( sqlite3Btr
233b0 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 eeCursorIsValid(
233c0 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c pCur) );. nCell
233d0 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72 Key = sqlite3Btr
233e0 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 eePayloadSize(pC
233f0 75 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 ur);. assert( (
23400 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 nCellKey & SQLIT
23410 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 E_MAX_U32)==(u64
23420 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 )nCellKey );..
23430 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 /* Read in the c
23440 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 omplete content
23450 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 of the index ent
23460 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 ry */. sqlite3V
23470 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 dbeMemInit(&m, d
23480 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 b, 0);. rc = sq
23490 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d lite3VdbeMemFrom
234a0 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 Btree(pCur, 0, (
234b0 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d u32)nCellKey, &m
234c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 );. if( rc ){.
234d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
234e0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 }.. /* The inde
234f0 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 x entry must beg
23500 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 in with a header
23510 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 size */. (void
23520 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 )getVarint32((u8
23530 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 *)m.z, szHdr);.
23540 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 testcase( szHdr
23550 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 ==3 );. testcas
23560 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b e( szHdr==m.n );
23570 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 . testcase( szH
23580 64 72 3e 30 78 37 66 66 66 66 66 66 66 20 29 3b dr>0x7fffffff );
23590 0a 20 20 61 73 73 65 72 74 28 20 6d 2e 6e 3e 3d . assert( m.n>=
235a0 30 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 0 );. if( unlik
235b0 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 73 ely(szHdr<3 || s
235c0 7a 48 64 72 3e 28 75 6e 73 69 67 6e 65 64 29 6d zHdr>(unsigned)m
235d0 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 .n) ){. goto
235e0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 idx_rowid_corrup
235f0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 tion;. }.. /*
23600 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f The last field o
23610 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 f the index shou
23620 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 ld be an integer
23630 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 - the ROWID..
23640 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 ** Verify that t
23650 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 he last entry re
23660 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 ally is an integ
23670 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 er. */. (void)g
23680 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 etVarint32((u8*)
23690 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 &m.z[szHdr-1], t
236a0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 ypeRowid);. tes
236b0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 tcase( typeRowid
236c0 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 ==1 );. testcas
236d0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 e( typeRowid==2
236e0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 );. testcase( t
236f0 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 ypeRowid==3 );.
23700 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 testcase( typeR
23710 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 owid==4 );. tes
23720 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 tcase( typeRowid
23730 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 ==5 );. testcas
23740 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 e( typeRowid==6
23750 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 );. testcase( t
23760 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 ypeRowid==8 );.
23770 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 testcase( typeR
23780 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 owid==9 );. if(
23790 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f unlikely(typeRo
237a0 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 wid<1 || typeRow
237b0 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 id>9 || typeRowi
237c0 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 d==7) ){. got
237d0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 o idx_rowid_corr
237e0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 uption;. }. le
237f0 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 nRowid = sqlite3
23800 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 SmallTypeSizes[t
23810 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 ypeRowid];. tes
23820 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d tcase( (u32)m.n=
23830 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 =szHdr+lenRowid
23840 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c );. if( unlikel
23850 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 y((u32)m.n<szHdr
23860 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 +lenRowid) ){.
23870 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 goto idx_rowid
23880 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d _corruption;. }
23890 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 .. /* Fetch the
238a0 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 integer off the
238b0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 end of the inde
238c0 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 x record */. sq
238d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 lite3VdbeSerialG
238e0 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e et((u8*)&m.z[m.n
238f0 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 -lenRowid], type
23900 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 Rowid, &v);. *r
23910 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 owid = v.u.i;.
23920 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 sqlite3VdbeMemRe
23930 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 lease(&m);. ret
23940 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a urn SQLITE_OK;..
23950 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 /* Jump here i
23960 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 f database corru
23970 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 ption is detecte
23980 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 d after m has be
23990 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 en. ** allocate
239a0 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f d. Free the m o
239b0 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e bject and return
239c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e SQLITE_CORRUPT.
239d0 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f */.idx_rowid_co
239e0 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 rruption:. test
239f0 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 case( m.szMalloc
23a00 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 !=0 );. sqlite3
23a10 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 VdbeMemRelease(&
23a20 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c m);. return SQL
23a30 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
23a40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 ;.}../*.** Compa
23a50 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 re the key of th
23a60 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 e index entry th
23a70 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 at cursor pC is
23a80 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 pointing to agai
23a90 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 nst.** the key s
23aa0 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b tring in pUnpack
23ab0 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 ed. Write into
23ac0 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a *pRes a number.*
23ad0 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 * that is negati
23ae0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 ve, zero, or pos
23af0 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c itive if pC is l
23b00 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 ess than, equal
23b10 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 to,.** or greate
23b20 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 r than pUnpacked
23b30 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 . Return SQLITE
23b40 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a _OK on success..
23b50 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 **.** pUnpacked
23b60 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 is either create
23b70 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 d without a rowi
23b80 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 d or is truncate
23b90 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 d so that it.**
23ba0 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 omits the rowid
23bb0 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 at the end. The
23bc0 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e rowid at the en
23bd0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 d of the index e
23be0 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 ntry.** is ignor
23bf0 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e ed as well. Hen
23c00 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 ce, this routine
23c10 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 only compares t
23c20 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 he prefixes .**
23c30 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f of the keys prio
23c40 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 r to the final r
23c50 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e owid, not the en
23c60 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 tire key..*/.int
23c70 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b sqlite3VdbeIdxK
23c80 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c eyCompare(. sql
23c90 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 ite3 *db,
23ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
23cb0 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 Database connec
23cc0 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 tion */. VdbeCu
23cd0 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 rsor *pC,
23ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
23cf0 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 e cursor to comp
23d00 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 are against */.
23d10 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
23d20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 *pUnpacked,
23d30 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 /* Unpacked ve
23d40 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a rsion of key */.
23d50 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 int *res
23d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23d70 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 /* Write the
23d80 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c comparison resul
23d90 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 t here */.){. i
23da0 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 64 nCellKey = 0;
23db0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 . int rc;. BtC
23dc0 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d ursor *pCur;. M
23dd0 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 em m;.. assert(
23de0 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 pC->eCurType==C
23df0 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a URTYPE_BTREE );.
23e00 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e pCur = pC->uc.
23e10 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 pCursor;. asser
23e20 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 t( sqlite3BtreeC
23e30 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 ursorIsValid(pCu
23e40 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 r) );. nCellKey
23e50 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 = sqlite3BtreeP
23e60 61 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 ayloadSize(pCur)
23e70 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 ;. /* nCellKey
23e80 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 will always be b
23e90 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 etween 0 and 0xf
23ea0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 fffffff because
23eb0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 of the way. **
23ec0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 that btreeParseC
23ed0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c ellPtr() and sql
23ee0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 ite3GetVarint32(
23ef0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 ) are implemente
23f00 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c d */. if( nCell
23f10 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b Key<=0 || nCellK
23f20 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b ey>0x7fffffff ){
23f30 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 . *res = 0;.
23f40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
23f50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 _CORRUPT_BKPT;.
23f60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 }. sqlite3Vdbe
23f70 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 MemInit(&m, db,
23f80 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 0);. rc = sqlit
23f90 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 e3VdbeMemFromBtr
23fa0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 ee(pCur, 0, (u32
23fb0 29 6e 43 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a )nCellKey, &m);.
23fc0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
23fd0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 return rc;. }.
23fe0 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 *res = sqlite3V
23ff0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
24000 57 69 74 68 53 6b 69 70 28 6d 2e 6e 2c 20 6d 2e WithSkip(m.n, m.
24010 7a 2c 20 70 55 6e 70 61 63 6b 65 64 2c 20 30 29 z, pUnpacked, 0)
24020 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d ;. sqlite3VdbeM
24030 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 emRelease(&m);.
24040 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
24050 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 K;.}../*.** This
24060 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 routine sets th
24070 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 e value to be re
24080 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 turned by subseq
24090 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a uent calls to.**
240a0 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 sqlite3_changes
240b0 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 () on the databa
240c0 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 se handle 'db'.
240d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
240e0 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 VdbeSetChanges(s
240f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 qlite3 *db, int
24100 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 nChange){. asse
24110 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 rt( sqlite3_mute
24120 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 x_held(db->mutex
24130 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e ) );. db->nChan
24140 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 ge = nChange;.
24150 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 db->nTotalChange
24160 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a += nChange;.}..
24170 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 /*.** Set a flag
24180 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 in the vdbe to
24190 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 update the chang
241a0 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 e counter when i
241b0 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a t is finalised.*
241c0 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 * or reset..*/.v
241d0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 oid sqlite3VdbeC
241e0 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 ountChanges(Vdbe
241f0 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 *v){. v->chang
24200 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f eCntOn = 1;.}../
24210 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 *.** Mark every
24220 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
24230 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 nt associated wi
24240 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f th a database co
24250 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 nnection.** as e
24260 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e xpired..**.** An
24270 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 expired stateme
24280 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 nt means that re
24290 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 compilation of t
242a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a he statement is.
242b0 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 ** recommend. S
242c0 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 tatements expire
242d0 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 when things hap
242e0 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 pen that make th
242f0 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 eir.** programs
24300 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 obsolete. Remov
24310 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 ing user-defined
24320 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f functions or co
24330 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 llating.** seque
24340 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e nces, or changin
24350 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 g an authorizati
24360 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 on function are
24370 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 the types of.**
24380 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 things that make
24390 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d prepared statem
243a0 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a ents obsolete..*
243b0 2a 0a 2a 2a 20 49 66 20 69 43 6f 64 65 20 69 73 *.** If iCode is
243c0 20 31 2c 20 74 68 65 6e 20 65 78 70 69 72 61 74 1, then expirat
243d0 69 6f 6e 20 69 73 20 61 64 76 69 73 6f 72 79 2e ion is advisory.
243e0 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 The statement
243f0 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 72 65 70 should.** be rep
24400 72 65 70 61 72 65 64 20 62 65 66 6f 72 65 20 62 repared before b
24410 65 69 6e 67 20 72 65 73 74 61 72 74 65 64 2c 20 eing restarted,
24420 62 75 74 20 69 66 20 69 74 20 69 73 20 61 6c 72 but if it is alr
24430 65 61 64 79 20 72 75 6e 6e 69 6e 67 0a 2a 2a 20 eady running.**
24440 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f it is allowed to
24450 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 run to completi
24460 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 6e 74 65 72 6e on..**.** Intern
24470 61 6c 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 ally, this funct
24480 69 6f 6e 20 6a 75 73 74 20 73 65 74 73 20 74 68 ion just sets th
24490 65 20 56 64 62 65 2e 65 78 70 69 72 65 64 20 66 e Vdbe.expired f
244a0 6c 61 67 20 6f 6e 20 61 6c 6c 0a 2a 2a 20 70 72 lag on all.** pr
244b0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 epared statement
244c0 73 2e 20 20 54 68 65 20 66 6c 61 67 20 69 73 20 s. The flag is
244d0 73 65 74 20 74 6f 20 31 20 66 6f 72 20 61 6e 20 set to 1 for an
244e0 69 6d 6d 65 64 69 61 74 65 20 65 78 70 69 72 61 immediate expira
244f0 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 73 65 74 20 tion.** and set
24500 74 6f 20 32 20 66 6f 72 20 61 6e 20 61 64 76 69 to 2 for an advi
24510 73 6f 72 79 20 65 78 70 69 72 61 74 69 6f 6e 2e sory expiration.
24520 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
24530 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 ExpirePreparedSt
24540 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 atements(sqlite3
24550 20 2a 64 62 2c 20 69 6e 74 20 69 43 6f 64 65 29 *db, int iCode)
24560 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 {. Vdbe *p;. f
24570 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 or(p = db->pVdbe
24580 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 ; p; p=p->pNext)
24590 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 {. p->expired
245a0 20 3d 20 69 43 6f 64 65 2b 31 3b 0a 20 20 7d 0a = iCode+1;. }.
245b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
245c0 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 the database ass
245d0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
245e0 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 Vdbe..*/.sqlite
245f0 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 3 *sqlite3VdbeDb
24600 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 (Vdbe *v){. ret
24610 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a urn v->db;.}../*
24620 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 .** Return the S
24630 51 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c QLITE_PREPARE fl
24640 61 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a ags for a Vdbe..
24650 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 */.u8 sqlite3Vdb
24660 65 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64 ePrepareFlags(Vd
24670 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e be *v){. return
24680 20 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d v->prepFlags;.}
24690 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 ../*.** Return a
246a0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 pointer to an s
246b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 qlite3_value str
246c0 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e ucture containin
246d0 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e g the value boun
246e0 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 d.** parameter i
246f0 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 Var of VM v. Exc
24700 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 ept, if the valu
24710 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c e is an SQL NULL
24720 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 , return .** 0 i
24730 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 nstead. Unless i
24740 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 t is NULL, apply
24750 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f affinity aff (o
24760 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 ne of the SQLITE
24770 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 _AFF_*.** consta
24780 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 nts) to the valu
24790 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 e before returni
247a0 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 ng it..**.** The
247b0 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 returned value
247c0 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 must be freed by
247d0 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e the caller usin
247e0 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 g sqlite3ValueFr
247f0 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 ee()..*/.sqlite3
24800 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 _value *sqlite3V
24810 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 dbeGetBoundValue
24820 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 (Vdbe *v, int iV
24830 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 ar, u8 aff){. a
24840 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b ssert( iVar>0 );
24850 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 . if( v ){.
24860 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e Mem *pMem = &v->
24870 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 aVar[iVar-1];.
24880 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 assert( (v->db
24890 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 ->flags & SQLITE
248a0 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 _EnableQPSG)==0
248b0 29 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 );. if( 0==(p
248c0 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
248d0 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 _Null) ){.
248e0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 sqlite3_value *p
248f0 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c Ret = sqlite3Val
24900 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 ueNew(v->db);.
24910 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a if( pRet ){.
24920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
24930 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 dbeMemCopy((Mem
24940 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 *)pRet, pMem);.
24950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 sqlite3Va
24960 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 lueApplyAffinity
24970 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 (pRet, aff, SQLI
24980 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 TE_UTF8);.
24990 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 }. return p
249a0 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 Ret;. }. }.
249b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
249c0 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 .** Configure SQ
249d0 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 L variable iVar
249e0 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 so that binding
249f0 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 a new value to i
24a00 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 t signals.** to
24a10 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 sqlite3_reoptimi
24a20 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 ze() that re-pre
24a30 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 paring the state
24a40 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a ment may result.
24a50 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 ** in a better q
24a60 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f uery plan..*/.vo
24a70 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 id sqlite3VdbeSe
24a80 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 tVarmask(Vdbe *v
24a90 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 , int iVar){. a
24aa0 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b ssert( iVar>0 );
24ab0 0a 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 . assert( (v->d
24ac0 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 b->flags & SQLIT
24ad0 45 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 E_EnableQPSG)==0
24ae0 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d );. if( iVar>=
24af0 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 32 ){. v->exp
24b00 6d 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 mask |= 0x800000
24b10 30 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 00;. }else{.
24b20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 v->expmask |= (
24b30 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d (u32)1 << (iVar-
24b40 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 1));. }.}../*.*
24b50 2a 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69 * Cause a functi
24b60 6f 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 on to throw an e
24b70 72 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63 rror if it was c
24b80 61 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 all from OP_Pure
24b90 46 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 Func.** rather t
24ba0 68 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e han OP_Function.
24bb0 0a 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 .**.** OP_PureFu
24bc0 6e 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 nc means that th
24bd0 65 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 e function must
24be0 62 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 be deterministic
24bf0 2c 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 , and should.**
24c00 74 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 throw an error i
24c10 66 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e f it is given in
24c20 70 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20 puts that would
24c30 6d 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 make it non-dete
24c40 72 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 rministic..** Th
24c50 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e is routine is in
24c60 76 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69 voked by date/ti
24c70 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 me functions tha
24c80 74 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d t use non-determ
24c90 69 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 inistic.** featu
24ca0 72 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77 res such as 'now
24cb0 27 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 '..*/.int sqlite
24cc0 33 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c 3NotPureFunc(sql
24cd0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 ite3_context *pC
24ce0 74 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 tx){.#ifdef SQLI
24cf0 54 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f TE_ENABLE_STAT3_
24d00 4f 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 OR_STAT4. if( p
24d10 43 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 Ctx->pVdbe==0 )
24d20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 return 1;.#endif
24d30 0a 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 . if( pCtx->pVd
24d40 62 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f be->aOp[pCtx->iO
24d50 70 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 p].opcode==OP_Pu
24d60 72 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 reFunc ){. sq
24d70 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 lite3_result_err
24d80 6f 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 or(pCtx, .
24d90 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 "non-determinis
24da0 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 tic function in
24db0 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e index expression
24dc0 20 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 or CHECK constr
24dd0 61 69 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 aint",. -1
24de0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b );. return 0;
24df0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b . }. return 1;
24e00 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 .}..#ifndef SQLI
24e10 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
24e20 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 ABLE./*.** Trans
24e30 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 fer error messag
24e40 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 e text from an s
24e50 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 qlite3_vtab.zErr
24e60 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 Msg (text stored
24e70 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 .** in memory ob
24e80 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 tained from sqli
24e90 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f te3_malloc) into
24ea0 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 a Vdbe.zErrMsg
24eb0 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 (text stored.**
24ec0 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e in memory obtain
24ed0 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 ed from sqlite3D
24ee0 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 bMalloc)..*/.voi
24ef0 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 d sqlite3VtabImp
24f00 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a ortErrmsg(Vdbe *
24f10 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 p, sqlite3_vtab
24f20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 *pVtab){. if( p
24f30 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b Vtab->zErrMsg ){
24f40 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 . sqlite3 *db
24f50 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 = p->db;. sq
24f60 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
24f70 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 p->zErrMsg);.
24f80 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 p->zErrMsg = sq
24f90 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 lite3DbStrDup(db
24fa0 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 , pVtab->zErrMsg
24fb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 );. sqlite3_f
24fc0 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d ree(pVtab->zErrM
24fd0 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e sg);. pVtab->
24fe0 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d zErrMsg = 0;. }
24ff0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c .}.#endif /* SQL
25000 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c ITE_OMIT_VIRTUAL
25010 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 TABLE */..#ifdef
25020 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 SQLITE_ENABLE_P
25030 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f REUPDATE_HOOK../
25040 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f *.** If the seco
25050 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e nd argument is n
25060 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 ot NULL, release
25070 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 any allocations
25080 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 associated .**
25090 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 with the memory
250a0 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e cells in the p->
250b0 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c aMem[] array. Al
250c0 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 so free the Unpa
250d0 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 ckedRecord.** st
250e0 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 ructure itself,
250f0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 using sqlite3DbF
25100 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ree()..**.** Thi
25110 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 s function is us
25120 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 ed to free Unpac
25130 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 kedRecord struct
25140 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 ures allocated b
25150 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 y.** the vdbeUnp
25160 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 ackRecord() func
25170 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 tion found in vd
25180 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 beapi.c..*/.stat
25190 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 ic void vdbeFree
251a0 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 Unpacked(sqlite3
251b0 20 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 *db, int nField
251c0 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 , UnpackedRecord
251d0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b *p){. if( p ){
251e0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 . int i;.
251f0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c for(i=0; i<nFiel
25200 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d d; i++){. M
25210 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 em *pMem = &p->a
25220 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 Mem[i];. if
25230 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 ( pMem->zMalloc
25240 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d ) sqlite3VdbeMem
25250 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 Release(pMem);.
25260 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
25270 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b DbFreeNN(db, p);
25280 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a . }.}.#endif /*
25290 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 SQLITE_ENABLE_P
252a0 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f REUPDATE_HOOK */
252b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
252c0 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 ENABLE_PREUPDATE
252d0 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f _HOOK./*.** Invo
252e0 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 ke the pre-updat
252f0 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 e hook. If this
25300 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 is an UPDATE or
25310 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74 DELETE pre-updat
25320 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 e call,.** then
25330 63 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 cursor passed as
25340 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 the second argu
25350 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e ment should poin
25360 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f t to the row abo
25370 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 ut.** to be upda
25380 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 te or deleted. I
25390 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f f the applicatio
253a0 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f n calls sqlite3_
253b0 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c preupdate_old(),
253c0 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 .** the required
253d0 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 value will be r
253e0 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 ead from the row
253f0 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e the cursor poin
25400 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ts to..*/.void s
25410 71 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64 qlite3VdbePreUpd
25420 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 ateHook(. Vdbe
25430 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 *v,
25440 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 /* Vd
25450 62 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f be pre-update ho
25460 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 ok is invoked by
25470 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 */. VdbeCursor
25480 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 *pCsr,
25490 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 /* Cursor
254a0 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 to grab old.* va
254b0 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 lues from */. i
254c0 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 nt op,
254d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
254e0 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c * SQLITE_INSERT,
254f0 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 UPDATE or DELET
25500 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 E */. const cha
25510 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 r *zDb,
25520 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 /* Databa
25530 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 se name */. Tab
25540 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 le *pTab,
25550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
25560 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a Modified table *
25570 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20 /. i64 iKey1,
25580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25590 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b /* Initial k
255a0 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e ey value */. in
255b0 74 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20 t iReg
255c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
255d0 20 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65 Register for ne
255e0 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b w.* record */.){
255f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
25600 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b v->db;. i64 iK
25610 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65 ey2;. PreUpdate
25620 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f preupdate;. co
25630 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d nst char *zTbl =
25640 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 pTab->zName;.
25650 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 static const u8
25660 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 fakeSortOrder =
25670 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 0;.. assert( db
25680 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 ->pPreUpdate==0
25690 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 );. memset(&pre
256a0 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f update, 0, sizeo
256b0 66 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 f(PreUpdate));.
256c0 20 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 if( HasRowid(pT
256d0 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b ab)==0 ){. iK
256e0 65 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b ey1 = iKey2 = 0;
256f0 0a 20 20 20 20 70 72 65 75 70 64 61 74 65 2e 70 . preupdate.p
25700 50 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d Pk = sqlite3Prim
25710 61 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 aryKeyIndex(pTab
25720 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
25730 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 if( op==SQLITE_U
25740 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 PDATE ){. i
25750 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 Key2 = v->aMem[i
25760 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 Reg].u.i;. }e
25770 6c 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 lse{. iKey2
25780 20 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a = iKey1;. }.
25790 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 }.. assert( p
257a0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 Csr->nField==pTa
257b0 62 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 b->nCol .
257c0 7c 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 || (pCsr->nField
257d0 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 ==pTab->nCol+1 &
257e0 26 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c & op==SQLITE_DEL
257f0 45 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 ETE && iReg==-1)
25800 0a 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 . );.. preupda
25810 74 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 te.v = v;. preu
25820 70 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 pdate.pCsr = pCs
25830 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f r;. preupdate.o
25840 70 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 p = op;. preupd
25850 61 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 ate.iNewReg = iR
25860 65 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e eg;. preupdate.
25870 6b 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b keyinfo.db = db;
25880 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 . preupdate.key
25890 69 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 info.enc = ENC(d
258a0 62 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e b);. preupdate.
258b0 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c keyinfo.nKeyFiel
258c0 64 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a d = pTab->nCol;.
258d0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 preupdate.keyi
258e0 6e 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d nfo.aSortOrder =
258f0 20 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f (u8*)&fakeSortO
25900 72 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 rder;. preupdat
25910 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b e.iKey1 = iKey1;
25920 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 . preupdate.iKe
25930 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 y2 = iKey2;. pr
25940 65 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70 eupdate.pTab = p
25950 54 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 Tab;.. db->pPre
25960 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 Update = &preupd
25970 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 ate;. db->xPreU
25980 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 pdateCallback(db
25990 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c ->pPreUpdateArg,
259a0 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 db, op, zDb, zT
259b0 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 bl, iKey1, iKey2
259c0 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 );. db->pPreUpd
259d0 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 ate = 0;. sqlit
259e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 e3DbFree(db, pre
259f0 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b update.aRecord);
25a00 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 . vdbeFreeUnpac
25a10 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 ked(db, preupdat
25a20 65 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 e.keyinfo.nKeyFi
25a30 65 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 eld+1, preupdate
25a40 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 .pUnpacked);. v
25a50 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 dbeFreeUnpacked(
25a60 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 db, preupdate.ke
25a70 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b yinfo.nKeyField+
25a80 31 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 1, preupdate.pNe
25a90 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 wUnpacked);. if
25aa0 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 ( preupdate.aNew
25ab0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
25ac0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 for(i=0; i<pC
25ad0 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 sr->nField; i++)
25ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 {. sqlite3V
25af0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 dbeMemRelease(&p
25b00 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d reupdate.aNew[i]
25b10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c );. }. sql
25b20 69 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c ite3DbFreeNN(db,
25b30 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 preupdate.aNew)
25b40 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f ;. }.}.#endif /
25b50 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f * SQLITE_ENABLE_
25b60 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a PREUPDATE_HOOK *
25b70 2f 0a /.