0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65 /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 ing:.**.** Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 d not evil..**
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 ive others..**
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69 used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20 ng, destroying,
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20 * a VDBE (or an
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61 "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72 the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 ld.) Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77 all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 ce file..** But
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65 that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74 s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 lude "vdbeInt.h"
02d0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 ../*.** Create a
02e0: 20 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 new virtual dat
02f0: 61 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f abase engine..*/
0300: 0a 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 .Vdbe *sqlite3Vd
0310: 62 65 43 72 65 61 74 65 28 50 61 72 73 65 20 2a beCreate(Parse *
0320: 70 50 61 72 73 65 29 7b 0a 20 20 73 71 6c 69 74 pParse){. sqlit
0330: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d e3 *db = pParse-
0340: 3e 64 62 3b 0a 20 20 56 64 62 65 20 2a 70 3b 0a >db;. Vdbe *p;.
0350: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d p = sqlite3DbM
0360: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 allocZero(db, si
0370: 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 20 zeof(Vdbe) );.
0380: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 if( p==0 ) retur
0390: 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 n 0;. p->db = d
03a0: 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 b;. if( db->pVd
03b0: 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 56 be ){. db->pV
03c0: 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a dbe->pPrev = p;.
03d0: 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d }. p->pNext =
03e0: 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 2d db->pVdbe;. p-
03f0: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 62 >pPrev = 0;. db
0400: 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 70 ->pVdbe = p;. p
0410: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d ->magic = VDBE_M
0420: 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e AGIC_INIT;. p->
0430: 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b pParse = pParse;
0440: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
0450: 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a e->aLabel==0 );.
0460: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
0470: 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a 20 ->nLabel==0 );.
0480: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d assert( pParse-
0490: 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a >nOpAlloc==0 );.
04a0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f return p;.}../
04b0: 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 *.** Remember th
04c0: 65 20 53 51 4c 20 73 74 72 69 6e 67 20 66 6f 72 e SQL string for
04d0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 a prepared stat
04e0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ement..*/.void s
04f0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 53 71 6c qlite3VdbeSetSql
0500: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 (Vdbe *p, const
0510: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 char *z, int n,
0520: 69 6e 74 20 69 73 50 72 65 70 61 72 65 56 32 29 int isPrepareV2)
0530: 7b 0a 20 20 61 73 73 65 72 74 28 20 69 73 50 72 {. assert( isPr
0540: 65 70 61 72 65 56 32 3d 3d 31 20 7c 7c 20 69 73 epareV2==1 || is
0550: 50 72 65 70 61 72 65 56 32 3d 3d 30 20 29 3b 0a PrepareV2==0 );.
0560: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 if( p==0 ) ret
0570: 75 72 6e 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 urn;.#if defined
0580: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 (SQLITE_OMIT_TRA
0590: 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 CE) && !defined(
05a0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 SQLITE_ENABLE_SQ
05b0: 4c 4c 4f 47 29 0a 20 20 69 66 28 20 21 69 73 50 LLOG). if( !isP
05c0: 72 65 70 61 72 65 56 32 20 29 20 72 65 74 75 72 repareV2 ) retur
05d0: 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 n;.#endif. asse
05e0: 72 74 28 20 70 2d 3e 7a 53 71 6c 3d 3d 30 20 29 rt( p->zSql==0 )
05f0: 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 3d 20 73 71 ;. p->zSql = sq
0600: 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 lite3DbStrNDup(p
0610: 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 ->db, z, n);. p
0620: 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d 20 ->isPrepareV2 =
0630: 28 75 38 29 69 73 50 72 65 70 61 72 65 56 32 3b (u8)isPrepareV2;
0640: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
0650: 20 74 68 65 20 53 51 4c 20 61 73 73 6f 63 69 61 the SQL associa
0660: 74 65 64 20 77 69 74 68 20 61 20 70 72 65 70 61 ted with a prepa
0670: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f red statement.*/
0680: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c .const char *sql
0690: 69 74 65 33 5f 73 71 6c 28 73 71 6c 69 74 65 33 ite3_sql(sqlite3
06a0: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 _stmt *pStmt){.
06b0: 20 56 64 62 65 20 2a 70 20 3d 20 28 56 64 62 65 Vdbe *p = (Vdbe
06c0: 20 2a 29 70 53 74 6d 74 3b 0a 20 20 72 65 74 75 *)pStmt;. retu
06d0: 72 6e 20 28 70 20 26 26 20 70 2d 3e 69 73 50 72 rn (p && p->isPr
06e0: 65 70 61 72 65 56 32 29 20 3f 20 70 2d 3e 7a 53 epareV2) ? p->zS
06f0: 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ql : 0;.}../*.**
0700: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e Swap all conten
0710: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 t between two VD
0720: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a BE structures..*
0730: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
0740: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c beSwap(Vdbe *pA,
0750: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 Vdbe *pB){. Vd
0760: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 be tmp, *pTmp;.
0770: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 74 char *zTmp;. t
0780: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 mp = *pA;. *pA
0790: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 = *pB;. *pB = t
07a0: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d mp;. pTmp = pA-
07b0: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e >pNext;. pA->pN
07c0: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b ext = pB->pNext;
07d0: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 . pB->pNext = p
07e0: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 Tmp;. pTmp = pA
07f0: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 ->pPrev;. pA->p
0800: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 Prev = pB->pPrev
0810: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 ;. pB->pPrev =
0820: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 pTmp;. zTmp = p
0830: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a A->zSql;. pA->z
0840: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a Sql = pB->zSql;.
0850: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d pB->zSql = zTm
0860: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 p;. pB->isPrepa
0870: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 reV2 = pA->isPre
0880: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a pareV2;.}../*.**
0890: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 Resize the Vdbe
08a0: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 .aOp array so th
08b0: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 at it is at leas
08c0: 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 t one op larger
08d0: 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e than .** it was.
08e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 .**.** If an out
08f0: 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 -of-memory error
0900: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 occurs while re
0910: 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 sizing the array
0920: 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 , return.** SQLI
0930: 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 TE_NOMEM. In thi
0940: 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 s case Vdbe.aOp
0950: 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f and Vdbe.nOpAllo
0960: 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 c remain .** unc
0970: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 hanged (this is
0980: 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f so that any opco
0990: 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f des already allo
09a0: 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a cated can be .**
09b0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c correctly deall
09c0: 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 ocated along wit
09d0: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 h the rest of th
09e0: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 e Vdbe)..*/.stat
09f0: 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 ic int growOpArr
0a00: 61 79 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 56 ay(Vdbe *v){. V
0a10: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 dbeOp *pNew;. P
0a20: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 arse *p = v->pPa
0a30: 72 73 65 3b 0a 20 20 69 6e 74 20 6e 4e 65 77 20 rse;. int nNew
0a40: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f = (p->nOpAlloc ?
0a50: 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a p->nOpAlloc*2 :
0a60: 20 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 (int)(1024/size
0a70: 6f 66 28 4f 70 29 29 29 3b 0a 20 20 70 4e 65 77 of(Op)));. pNew
0a80: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c = sqlite3DbReal
0a90: 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f loc(p->db, v->aO
0aa0: 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f p, nNew*sizeof(O
0ab0: 70 29 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 p));. if( pNew
0ac0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c ){. p->nOpAll
0ad0: 6f 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 oc = sqlite3DbMa
0ae0: 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 llocSize(p->db,
0af0: 70 4e 65 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 pNew)/sizeof(Op)
0b00: 3b 0a 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 ;. v->aOp = p
0b10: 4e 65 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 New;. }. retur
0b20: 6e 20 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 n (pNew ? SQLITE
0b30: 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d _OK : SQLITE_NOM
0b40: 45 4d 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 EM);.}..#ifdef S
0b50: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 QLITE_DEBUG./* T
0b60: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a his routine is j
0b70: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 ust a convenient
0b80: 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 place to set a
0b90: 62 72 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 breakpoint that
0ba0: 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 will.** fire aft
0bb0: 65 72 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 er each opcode i
0bc0: 73 20 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 s inserted and d
0bd0: 69 73 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a isplayed using.*
0be0: 2a 20 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 * "PRAGMA vdbe_a
0bf0: 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a ddoptrace=on"..*
0c00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 /.static void te
0c10: 73 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f st_addop_breakpo
0c20: 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 int(void){. sta
0c30: 74 69 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 tic int n = 0;.
0c40: 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a n++;.}.#endif..
0c50: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 /*.** Add a new
0c60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 instruction to t
0c70: 68 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 he list of instr
0c80: 75 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 uctions current
0c90: 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 in the.** VDBE.
0ca0: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 Return the addr
0cb0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 ess of the new i
0cc0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a nstruction..**.*
0cd0: 2a 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a * Parameters:.**
0ce0: 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 .** p
0cf0: 20 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 Pointer t
0d00: 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a o the VDBE.**.**
0d10: 20 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 op
0d20: 20 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 The opcode f
0d30: 6f 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 or this instruct
0d40: 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c ion.**.** p1,
0d50: 20 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 p2, p3 Ope
0d60: 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 rands.**.** Use
0d70: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 the sqlite3VdbeR
0d80: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 esolveLabel() fu
0d90: 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e nction to fix an
0da0: 20 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 address and.**
0db0: 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 the sqlite3VdbeC
0dc0: 68 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 hangeP4() functi
0dd0: 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 on to change the
0de0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 value of the P4
0df0: 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a .** operand..*/.
0e00: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 int sqlite3VdbeA
0e10: 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 ddOp3(Vdbe *p, i
0e20: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 nt op, int p1, i
0e30: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a nt p2, int p3){.
0e40: 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f int i;. VdbeO
0e50: 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 p *pOp;.. i = p
0e60: 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 ->nOp;. assert(
0e70: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
0e80: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 MAGIC_INIT );.
0e90: 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 assert( op>0 &&
0ea0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 op<0xff );. if(
0eb0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 p->pParse->nOpA
0ec0: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 lloc<=i ){. i
0ed0: 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70 f( growOpArray(p
0ee0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 ) ){. retur
0ef0: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 n 1;. }. }.
0f00: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 p->nOp++;. pOp
0f10: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 = &p->aOp[i];.
0f20: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 pOp->opcode = (
0f30: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 u8)op;. pOp->p5
0f40: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 = 0;. pOp->p1
0f50: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 = p1;. pOp->p2
0f60: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 = p2;. pOp->p3
0f70: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e = p3;. pOp->p4.
0f80: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 p = 0;. pOp->p4
0f90: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 type = P4_NOTUSE
0fa0: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 D;.#ifdef SQLITE
0fb0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f _ENABLE_EXPLAIN_
0fc0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e COMMENTS. pOp->
0fd0: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 zComment = 0;.#e
0fe0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 ndif.#ifdef SQLI
0ff0: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 TE_DEBUG. if( p
1000: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 ->db->flags & SQ
1010: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 LITE_VdbeAddopTr
1020: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a ace ){. int j
1030: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 j, kk;. Parse
1040: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 *pParse = p->pP
1050: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a arse;. for(jj
1060: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 =kk=0; jj<SQLITE
1070: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b _N_COLCACHE; jj+
1080: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 +){. struct
1090: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 yColCache *x =
10a0: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 pParse->aColCach
10b0: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66 e + jj;. if
10c0: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 ( x->iLevel>pPar
10d0: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 se->iCacheLevel
10e0: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20 || x->iReg==0 )
10f0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 continue;.
1100: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b printf(" r[%d]={
1110: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 %d:%d}", x->iReg
1120: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e , x->iTable, x->
1130: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 iColumn);.
1140: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 kk++;. }.
1150: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 if( kk ) printf(
1160: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 "\n");. sqlit
1170: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c e3VdbePrintOp(0,
1180: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b i, &p->aOp[i]);
1190: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f . test_addop_
11a0: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 breakpoint();.
11b0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 }.#endif.#ifdef
11c0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 VDBE_PROFILE. p
11d0: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a Op->cycles = 0;.
11e0: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a pOp->cnt = 0;.
11f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 #endif.#ifdef SQ
1200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 LITE_VDBE_COVERA
1210: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 GE. pOp->iSrcLi
1220: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 ne = 0;.#endif.
1230: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 return i;.}.int
1240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
1250: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 p0(Vdbe *p, int
1260: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 op){. return sq
1270: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 lite3VdbeAddOp3(
1280: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b p, op, 0, 0, 0);
1290: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 .}.int sqlite3Vd
12a0: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 beAddOp1(Vdbe *p
12b0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 , int op, int p1
12c0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 ){. return sqli
12d0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c te3VdbeAddOp3(p,
12e0: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a op, p1, 0, 0);.
12f0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 }.int sqlite3Vdb
1300: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c eAddOp2(Vdbe *p,
1310: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c int op, int p1,
1320: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 int p2){. retu
1330: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 rn sqlite3VdbeAd
1340: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 dOp3(p, op, p1,
1350: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a p2, 0);.}.../*.*
1360: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 * Add an opcode
1370: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 that includes th
1380: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 e p4 value as a
1390: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 pointer..*/.int
13a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
13b0: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 4(. Vdbe *p,
13c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 /* Add
13d0: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 the opcode to th
13e0: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f is VM */. int o
13f0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f p, /
1400: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 * The new opcode
1410: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 */. int p1,
1420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1430: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 P1 operand */.
1440: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 int p2,
1450: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f /* The P2 o
1460: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 perand */. int
1470: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 p3,
1480: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e /* The P3 operan
1490: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 d */. const cha
14a0: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 r *zP4, /* Th
14b0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a e P4 operand */.
14c0: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 int p4type
14d0: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 /* P4 oper
14e0: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 and type */.){.
14f0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 int addr = sqli
1500: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c te3VdbeAddOp3(p,
1510: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 op, p1, p2, p3)
1520: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 ;. sqlite3VdbeC
1530: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c hangeP4(p, addr,
1540: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 zP4, p4type);.
1550: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a return addr;.}.
1560: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 ./*.** Add an OP
1570: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 _ParseSchema opc
1580: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 ode. This routi
1590: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 ne is broken out
15a0: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 from.** sqlite3
15b0: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e VdbeAddOp4() sin
15c0: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 ce it needs to a
15d0: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 lso needs to mar
15e0: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 k all btrees.**
15f0: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 as having been u
1600: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a sed..**.** The z
1610: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 Where string mus
1620: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 t have been obta
1630: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 ined from sqlite
1640: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 3_malloc()..** T
1650: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c his routine will
1660: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 take ownership
1670: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 of the allocated
1680: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 memory..*/.void
1690: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 sqlite3VdbeAddP
16a0: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 arseSchemaOp(Vdb
16b0: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 e *p, int iDb, c
16c0: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 har *zWhere){.
16d0: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 int j;. int add
16e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 r = sqlite3VdbeA
16f0: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 ddOp3(p, OP_Pars
1700: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c eSchema, iDb, 0,
1710: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 0);. sqlite3Vd
1720: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 beChangeP4(p, ad
1730: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 dr, zWhere, P4_D
1740: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a YNAMIC);. for(j
1750: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 =0; j<p->db->nDb
1760: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 ; j++) sqlite3Vd
1770: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a beUsesBtree(p, j
1780: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 );.}../*.** Add
1790: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 an opcode that i
17a0: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 ncludes the p4 v
17b0: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 alue as an integ
17c0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 er..*/.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 e3VdbeAddOp4Int(
17e0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 . Vdbe *p,
17f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 /* Add th
1800: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 e opcode to this
1810: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c VM */. int op,
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1830: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a The new opcode *
1840: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 /. int p1,
1850: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 /* The P
1860: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 1 operand */. i
1870: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 nt p2,
1880: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 /* The P2 ope
1890: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 rand */. int p3
18a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a , /*
18b0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 The P3 operand
18c0: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 */. int p4
18d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
18e0: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e P4 operand as an
18f0: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 integer */.){.
1900: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 int addr = sqli
1910: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c te3VdbeAddOp3(p,
1920: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 op, p1, p2, p3)
1930: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 ;. sqlite3VdbeC
1940: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c hangeP4(p, addr,
1950: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 SQLITE_INT_TO_P
1960: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 TR(p4), P4_INT32
1970: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 );. return addr
1980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 ;.}../*.** Creat
1990: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 e a new symbolic
19a0: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e label for an in
19b0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 struction that h
19c0: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 as yet to be.**
19d0: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 coded. The symb
19e0: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 olic label is re
19f0: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 ally just a nega
1a00: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 tive number. Th
1a10: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 e.** label can b
1a20: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32 e used as the P2
1a30: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 value of an ope
1a40: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 ration. Later,
1a50: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 when.** the labe
1a60: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f l is resolved to
1a70: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72 a specific addr
1a80: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 ess, the VDBE wi
1a90: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 ll scan.** throu
1aa0: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e gh its operation
1ab0: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 list and change
1ac0: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 all values of P
1ad0: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 2 which match.**
1ae0: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 the label into
1af0: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 the resolved add
1b00: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ress..**.** The
1b10: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 VDBE knows that
1b20: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 a P2 value is a
1b30: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 label because la
1b40: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 bels are.** alwa
1b50: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 ys negative and
1b60: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 P2 values are su
1b70: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d ppose to be non-
1b80: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e negative..** Hen
1b90: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 ce, a negative P
1ba0: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 2 value is a lab
1bb0: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20 el that has yet
1bc0: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a to be resolved..
1bd0: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 **.** Zero is re
1be0: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c turned if a mall
1bf0: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 oc() fails..*/.i
1c00: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 nt sqlite3VdbeMa
1c10: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29 keLabel(Vdbe *v)
1c20: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 {. Parse *p = v
1c30: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 ->pParse;. int
1c40: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b i = p->nLabel++;
1c50: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 . assert( v->ma
1c60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
1c70: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69 INIT );. if( (i
1c80: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a & (i-1))==0 ){.
1c90: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 p->aLabel =
1ca0: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 sqlite3DbRealloc
1cb0: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d OrFree(p->db, p-
1cc0: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20 >aLabel, .
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cf0: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28 (i*2+1)*sizeof(
1d00: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a p->aLabel[0]));.
1d10: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61 }. if( p->aLa
1d20: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c bel ){. p->aL
1d30: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20 abel[i] = -1;.
1d40: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b }. return -1-i;
1d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 .}../*.** Resolv
1d60: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 e label "x" to b
1d70: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 e the address of
1d80: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 the next instru
1d90: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 ction to.** be i
1da0: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 nserted. The pa
1db0: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 rameter "x" must
1dc0: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 have been obtai
1dd0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 ned from.** a pr
1de0: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 ior call to sqli
1df0: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c te3VdbeMakeLabel
1e00: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ()..*/.void sqli
1e10: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 te3VdbeResolveLa
1e20: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 bel(Vdbe *v, int
1e30: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 x){. Parse *p
1e40: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 = v->pParse;. i
1e50: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61 nt j = -1-x;. a
1e60: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d ssert( v->magic=
1e70: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 =VDBE_MAGIC_INIT
1e80: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c );. assert( j<
1e90: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69 p->nLabel );. i
1ea0: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20 f( ALWAYS(j>=0)
1eb0: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a && p->aLabel ){.
1ec0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d p->aLabel[j]
1ed0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 = v->nOp;. }.
1ee0: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76 p->iFixedOp = v
1ef0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a ->nOp - 1;.}../*
1f00: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 .** Mark the VDB
1f10: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 E as one that ca
1f20: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e n only be run on
1f30: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 e time..*/.void
1f40: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e sqlite3VdbeRunOn
1f50: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b lyOnce(Vdbe *p){
1f60: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 . p->runOnlyOnc
1f70: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 e = 1;.}..#ifdef
1f80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a SQLITE_DEBUG /*
1f90: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 sqlite3AssertMa
1fa0: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a yAbort() logic *
1fb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c /../*.** The fol
1fc0: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 lowing type and
1fd0: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 function are use
1fe0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 d to iterate thr
1ff0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 ough all opcodes
2000: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 .** in a Vdbe ma
2010: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 in program and e
2020: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 ach of the sub-p
2030: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 rograms (trigger
2040: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e s) it may .** in
2050: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 voke directly or
2060: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 indirectly. It
2070: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 should be used a
2080: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a s follows:.**.**
2090: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 Op *pOp;.**
20a0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 VdbeOpIter sIte
20b0: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 r;.**.** memse
20c0: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a t(&sIter, 0, siz
20d0: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 eof(sIter));.**
20e0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 sIter.v = v;
20f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2100: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 // v i
2110: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 s of type Vdbe*
2120: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f .** while( (pO
2130: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 p = opIterNext(&
2140: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 sIter)) ){.**
2150: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e // Do somethin
2160: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 g with pOp.**
2170: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 }.** sqlite3Db
2180: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 Free(v->db, sIte
2190: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f r.apSub);.** .*/
21a0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
21b0: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f VdbeOpIter VdbeO
21c0: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 pIter;.struct Vd
21d0: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 beOpIter {. Vdb
21e0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 e *v;
21f0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 /* Vdbe
2200: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 to iterate throu
2210: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f gh the opcodes o
2220: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 f */. SubProgra
2230: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 m **apSub;
2240: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 /* Array of su
2250: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 bprograms */. i
2260: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 nt nSub;
2270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
2280: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 ber of entries i
2290: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 n apSub */. int
22a0: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 iAddr;
22b0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 /* Addre
22c0: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 ss of next instr
22d0: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e uction to return
22e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 */. int iSub;
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2300: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f /* 0 = main pro
2310: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 gram, 1 = first
2320: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e sub-program etc.
2330: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 */.};.static Op
2340: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 *opIterNext(Vdb
2350: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 eOpIter *p){. V
2360: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 dbe *v = p->v;.
2370: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 Op *pRet = 0;.
2380: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 Op *aOp;. int
2390: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 nOp;.. if( p->i
23a0: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a Sub<=p->nSub ){.
23b0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 . if( p->iSub
23c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 ==0 ){. aOp
23d0: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 = v->aOp;.
23e0: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 nOp = v->nOp;.
23f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
2400: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 aOp = p->apSub[p
2410: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a ->iSub-1]->aOp;.
2420: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 nOp = p->a
2430: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d pSub[p->iSub-1]-
2440: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 >nOp;. }.
2450: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 assert( p->iAddr
2460: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 <nOp );.. pRe
2470: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 t = &aOp[p->iAdd
2480: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 r];. p->iAddr
2490: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 ++;. if( p->i
24a0: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 Addr==nOp ){.
24b0: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 p->iSub++;.
24c0: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 p->iAddr = 0
24d0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 ;. }. . i
24e0: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d f( pRet->p4type=
24f0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 =P4_SUBPROGRAM )
2500: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 {. int nByt
2510: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a e = (p->nSub+1)*
2520: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 sizeof(SubProgra
2530: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a m*);. int j
2540: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b ;. for(j=0;
2550: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 j<p->nSub; j++)
2560: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d {. if( p-
2570: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d >apSub[j]==pRet-
2580: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 >p4.pProgram ) b
2590: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
25a0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 if( j==p->nS
25b0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d ub ){. p-
25c0: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 >apSub = sqlite3
25d0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 DbReallocOrFree(
25e0: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c v->db, p->apSub,
25f0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 nByte);.
2600: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 if( !p->apSub )
2610: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74 {. pRet
2620: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 = 0;. }e
2630: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 lse{. p
2640: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b ->apSub[p->nSub+
2650: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 +] = pRet->p4.pP
2660: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 rogram;.
2670: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }. }.
2680: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 }.. return pR
2690: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 et;.}../*.** Che
26a0: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 ck if the progra
26b0: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 m stored in the
26c0: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 VM associated wi
26d0: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a th pParse may.**
26e0: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 throw an ABORT
26f0: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 exception (causi
2700: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 ng the statement
2710: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 , but not entire
2720: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 transaction.**
2730: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 to be rolled bac
2740: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 k). This conditi
2750: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 on is true if th
2760: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f e main program o
2770: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f r any.** sub-pro
2780: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 grams contains a
2790: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ny of the follow
27a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 ing:.**.** *
27b0: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d OP_Halt with P1=
27c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e SQLITE_CONSTRAIN
27d0: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 T and P2=OE_Abor
27e0: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 t..** * OP_Ha
27f0: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 ltIfNull with P1
2800: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 =SQLITE_CONSTRAI
2810: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f NT and P2=OE_Abo
2820: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 rt..** * OP_D
2830: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f estroy.** * O
2840: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a P_VUpdate.** *
2850: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 OP_VRename.**
2860: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 * OP_FkCounte
2870: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d r with P2==0 (im
2880: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 mediate foreign
2890: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a key constraint).
28a0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b **.** Then check
28b0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 that the value
28c0: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 of Parse.mayAbor
28d0: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a t is true if an.
28e0: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 ** ABORT may be
28f0: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 thrown, or false
2900: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 otherwise. Retu
2910: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f rn true if it do
2920: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 es.** match, or
2930: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e false otherwise.
2940: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 This function i
2950: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 s intended to be
2960: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 used as.** part
2970: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 of an assert st
2980: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 atement in the c
2990: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 ompiler. Similar
29a0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 to:.**.** ass
29b0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 ert( sqlite3Vdbe
29c0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 AssertMayAbort(p
29d0: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 Parse->pVdbe, pP
29e0: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 arse->mayAbort)
29f0: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 );.*/.int sqlite
2a00: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 3VdbeAssertMayAb
2a10: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 ort(Vdbe *v, int
2a20: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e mayAbort){. in
2a30: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a t hasAbort = 0;.
2a40: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 Op *pOp;. Vdb
2a50: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 eOpIter sIter;.
2a60: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 memset(&sIter,
2a70: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 0, sizeof(sIter)
2a80: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 );. sIter.v = v
2a90: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 ;.. while( (pOp
2aa0: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 = opIterNext(&s
2ab0: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 Iter))!=0 ){.
2ac0: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f int opcode = pO
2ad0: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 p->opcode;. i
2ae0: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 f( opcode==OP_De
2af0: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d stroy || opcode=
2b00: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f =OP_VUpdate || o
2b10: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d pcode==OP_VRenam
2b20: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 e .#ifndef SQLIT
2b30: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b E_OMIT_FOREIGN_K
2b40: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f EY. || (opco
2b50: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 de==OP_FkCounter
2b60: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 && pOp->p1==0 &
2b70: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 & pOp->p2==1) .#
2b80: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 endif. || ((
2b90: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 opcode==OP_Halt
2ba0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 || opcode==OP_Ha
2bb0: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 ltIfNull) .
2bc0: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78 && ((pOp->p1&0x
2bd0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 ff)==SQLITE_CONS
2be0: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70 TRAINT && pOp->p
2bf0: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20 2==OE_Abort)).
2c00: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62 ){. hasAb
2c10: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 ort = 1;. b
2c20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a reak;. }. }.
2c30: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
2c40: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 v->db, sIter.apS
2c50: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 ub);.. /* Retur
2c60: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f n true if hasAbo
2c70: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 rt==mayAbort. Or
2c80: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 if a malloc fai
2c90: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 lure occurred..
2ca0: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 ** If malloc fa
2cb0: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 iled, then the w
2cc0: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 hile() loop abov
2cd0: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 e may not have i
2ce0: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 terated. ** thr
2cf0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 ough all opcodes
2d00: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 and hasAbort ma
2d10: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 y be set incorre
2d20: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a ctly. Return. *
2d30: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 * true for this
2d40: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 case to prevent
2d50: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 the assert() in
2d60: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d the callers fram
2d70: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c e. ** from fail
2d80: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 ing. */. retur
2d90: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f n ( v->db->mallo
2da0: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 cFailed || hasAb
2db0: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b ort==mayAbort );
2dc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c .}.#endif /* SQL
2dd0: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20 ITE_DEBUG - the
2de0: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 sqlite3AssertMay
2df0: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e Abort() function
2e00: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20 */../*.** Loop
2e10: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67 through the prog
2e20: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 ram looking for
2e30: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61 P2 values that a
2e40: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f re negative.** o
2e50: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 n jump instructi
2e60: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20 ons. Each such
2e70: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c value is a label
2e80: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a . Resolve the.*
2e90: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69 * label by setti
2ea0: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 ng the P2 value
2eb0: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e to its correct n
2ec0: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a on-zero value..*
2ed0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
2ee0: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65 e is called once
2ef0: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 after all opcod
2f00: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 es have been ins
2f10: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72 erted..**.** Var
2f20: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41 iable *pMaxFuncA
2f30: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 rgs is set to th
2f40: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20 e maximum value
2f50: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65 of any P2 argume
2f60: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f nt .** to an OP_
2f70: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67 Function, OP_Agg
2f80: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74 Step or OP_VFilt
2f90: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20 er opcode. This
2fa0: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73 is used by .** s
2fb0: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 qlite3VdbeMakeRe
2fc0: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68 ady() to size th
2fd0: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 e Vdbe.apArg[] a
2fe0: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 rray..**.** The
2ff0: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64 Op.opflags field
3000: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f is set on all o
3010: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 pcodes..*/.stati
3020: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 c void resolveP2
3030: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 Values(Vdbe *p,
3040: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 int *pMaxFuncArg
3050: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 s){. int i;. i
3060: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 nt nMaxArgs = *p
3070: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f MaxFuncArgs;. O
3080: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 p *pOp;. Parse
3090: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 *pParse = p->pPa
30a0: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 rse;. int *aLab
30b0: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 el = pParse->aLa
30c0: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e bel;. p->readOn
30d0: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 ly = 1;. p->bIs
30e0: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f Reader = 0;. fo
30f0: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d r(pOp=p->aOp, i=
3100: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 p->nOp-1; i>=0;
3110: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 i--, pOp++){.
3120: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 u8 opcode = pOp
3130: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f ->opcode;.. /
3140: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 * NOTE: Be sure
3150: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f to update mkopco
3160: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 deh.awk when add
3170: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a ing or removing.
3180: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f ** cases fro
3190: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a m this switch! *
31a0: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 /. switch( op
31b0: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 code ){. ca
31c0: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a se OP_Function:.
31d0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67 case OP_Ag
31e0: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20 gStep: {.
31f0: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61 if( pOp->p5>nMa
3200: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 xArgs ) nMaxArgs
3210: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20 = pOp->p5;.
3220: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
3230: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 }. case OP
3240: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a _Transaction: {.
3250: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d if( pOp-
3260: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 >p2!=0 ) p->read
3270: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 Only = 0;.
3280: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a /* fall thru *
3290: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 /. }.
32a0: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d case OP_AutoComm
32b0: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f it:. case O
32c0: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 P_Savepoint: {.
32d0: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 p->bIsRea
32e0: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 der = 1;.
32f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
3300: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
3310: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61 MIT_WAL. ca
3320: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 se OP_Checkpoint
3330: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 :.#endif. c
3340: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 ase OP_Vacuum:.
3350: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75 case OP_Jou
3360: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 rnalMode: {.
3370: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 p->readOnly
3380: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e = 0;. p->
3390: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 bIsReader = 1;.
33a0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
33b0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 }.#ifndef SQ
33c0: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 LITE_OMIT_VIRTUA
33d0: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73 LTABLE. cas
33e0: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a e OP_VUpdate: {.
33f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d if( pOp-
3400: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e >p2>nMaxArgs ) n
3410: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 MaxArgs = pOp->p
3420: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 2;. break
3430: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
3440: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a case OP_VFilter:
3450: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e {. int n
3460: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 ;. assert
3470: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 ( p->nOp - i >=
3480: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 3 );. ass
3490: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 ert( pOp[-1].opc
34a0: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 ode==OP_Integer
34b0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70 );. n = p
34c0: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 Op[-1].p1;.
34d0: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 if( n>nMaxArg
34e0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e s ) nMaxArgs = n
34f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
3500: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a . }.#endif.
3510: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 case OP_Ne
3520: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f xt:. case O
3530: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20 P_NextIfOpen:.
3540: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 case OP_Sort
3550: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 erNext: {.
3560: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e pOp->p4.xAdvan
3570: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 ce = sqlite3Btre
3580: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70 eNext;. p
3590: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f Op->p4type = P4_
35a0: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 ADVANCE;.
35b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
35c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 case OP_Pr
35d0: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f ev:. case O
35e0: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a P_PrevIfOpen: {.
35f0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e pOp->p4.
3600: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 xAdvance = sqlit
3610: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b e3BtreePrevious;
3620: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 . pOp->p4
3630: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 type = P4_ADVANC
3640: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b E;. break
3650: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
3660: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 . pOp->opflag
3670: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 s = sqlite3Opcod
3680: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65 eProperty[opcode
3690: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d ];. if( (pOp-
36a0: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47 >opflags & OPFLG
36b0: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 _JUMP)!=0 && pOp
36c0: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 ->p2<0 ){.
36d0: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e assert( -1-pOp->
36e0: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 p2<pParse->nLabe
36f0: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e l );. pOp->
3700: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 p2 = aLabel[-1-p
3710: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 Op->p2];. }.
3720: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 }. sqlite3DbFr
3730: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 ee(p->db, pParse
3740: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 ->aLabel);. pPa
3750: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b rse->aLabel = 0;
3760: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 . pParse->nLabe
3770: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 l = 0;. *pMaxFu
3780: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 ncArgs = nMaxArg
3790: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e s;. assert( p->
37a0: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 bIsReader!=0 ||
37b0: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d DbMaskAllZero(p-
37c0: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d >btreeMask) );.}
37d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
37e0: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 he address of th
37f0: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 e next instructi
3800: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 on to be inserte
3810: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 d..*/.int sqlite
3820: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 3VdbeCurrentAddr
3830: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 (Vdbe *p){. ass
3840: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
3850: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 DBE_MAGIC_INIT )
3860: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f ;. return p->nO
3870: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 p;.}../*.** This
3880: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e function return
3890: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 s a pointer to t
38a0: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f he array of opco
38b0: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 des associated w
38c0: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 ith.** the Vdbe
38d0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 passed as the fi
38e0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 rst argument. It
38f0: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 is the callers
3900: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a responsibility.*
3910: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 * to arrange for
3920: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 the returned ar
3930: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 ray to be eventu
3940: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 ally freed using
3950: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 the .** vdbeFre
3960: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 eOpArray() funct
3970: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 ion..**.** Befor
3980: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e e returning, *pn
3990: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 Op is set to the
39a0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 number of entri
39b0: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e es in the return
39c0: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 ed.** array. Als
39d0: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 o, *pnMaxArg is
39e0: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 set to the large
39f0: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 r of its current
3a00: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 value and .** t
3a10: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 he number of ent
3a20: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 ries in the Vdbe
3a30: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 .apArg[] array r
3a40: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 equired to execu
3a50: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 te the .** retur
3a60: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a ned program..*/.
3a70: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 VdbeOp *sqlite3V
3a80: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 dbeTakeOpArray(V
3a90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f dbe *p, int *pnO
3aa0: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 p, int *pnMaxArg
3ab0: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 ){. VdbeOp *aOp
3ac0: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 = p->aOp;. ass
3ad0: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e ert( aOp && !p->
3ae0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
3af0: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 );.. /* Check
3b00: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 that sqlite3Vdbe
3b10: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 UsesBtree() was
3b20: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 not called on th
3b30: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 is VM */. asser
3b40: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f t( DbMaskAllZero
3b50: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 (p->btreeMask) )
3b60: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 ;.. resolveP2Va
3b70: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 lues(p, pnMaxArg
3b80: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e );. *pnOp = p->
3b90: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 nOp;. p->aOp =
3ba0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0;. return aOp;
3bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 .}../*.** Add a
3bc0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 whole list of op
3bd0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 erations to the
3be0: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e operation stack.
3bf0: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 Return the.**
3c00: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 address of the f
3c10: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 irst operation a
3c20: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c dded..*/.int sql
3c30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 ite3VdbeAddOpLis
3c40: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e t(Vdbe *p, int n
3c50: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 Op, VdbeOpList c
3c60: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69 onst *aOp, int i
3c70: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61 Lineno){. int a
3c80: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70 ddr;. assert( p
3c90: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
3ca0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 GIC_INIT );. if
3cb0: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e ( p->nOp + nOp >
3cc0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 p->pParse->nOpA
3cd0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 lloc && growOpAr
3ce0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65 ray(p) ){. re
3cf0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 turn 0;. }. ad
3d00: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 dr = p->nOp;. i
3d10: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 f( ALWAYS(nOp>0)
3d20: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
3d30: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f VdbeOpList co
3d40: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a nst *pIn = aOp;.
3d50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e for(i=0; i<n
3d60: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b Op; i++, pIn++){
3d70: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 . int p2 =
3d80: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 pIn->p2;. V
3d90: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 dbeOp *pOut = &p
3da0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 ->aOp[i+addr];.
3db0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 pOut->opcod
3dc0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b e = pIn->opcode;
3dd0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 . pOut->p1
3de0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 = pIn->p1;.
3df0: 20 69 66 28 20 70 32 3c 30 20 29 7b 0a 20 20 20 if( p2<0 ){.
3e00: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c assert( sql
3e10: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 ite3OpcodeProper
3e20: 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 5d ty[pOut->opcode]
3e30: 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 20 29 3b & OPFLG_JUMP );
3e40: 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 . pOut->p
3e50: 32 20 3d 20 61 64 64 72 20 2b 20 41 44 44 52 28 2 = addr + ADDR(
3e60: 70 32 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 p2);. }else
3e70: 7b 0a 20 20 20 20 20 20 20 20 70 4f 75 74 2d 3e {. pOut->
3e80: 70 32 20 3d 20 70 32 3b 0a 20 20 20 20 20 20 7d p2 = p2;. }
3e90: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 . pOut->p3
3ea0: 3d 20 70 49 6e 2d 3e 70 33 3b 0a 20 20 20 20 20 = pIn->p3;.
3eb0: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 pOut->p4type =
3ec0: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 P4_NOTUSED;.
3ed0: 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 pOut->p4.p = 0
3ee0: 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 35 ;. pOut->p5
3ef0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c = 0;.#ifdef SQL
3f00: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 ITE_ENABLE_EXPLA
3f10: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 IN_COMMENTS.
3f20: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 pOut->zComment
3f30: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
3f40: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f def SQLITE_VDBE_
3f50: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 70 COVERAGE. p
3f60: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 Out->iSrcLine =
3f70: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 iLineno+i;.#else
3f80: 0a 20 20 20 20 20 20 28 76 6f 69 64 29 69 4c 69 . (void)iLi
3f90: 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 neno;.#endif.#if
3fa0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
3fb0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 . if( p->db
3fc0: 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 ->flags & SQLITE
3fd0: 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 _VdbeAddopTrace
3fe0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
3ff0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c e3VdbePrintOp(0,
4000: 20 69 2b 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 i+addr, &p->aOp
4010: 5b 69 2b 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 [i+addr]);.
4020: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a }.#endif. }.
4030: 20 20 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f p->nOp += nO
4040: 70 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 p;. }. return
4050: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 addr;.}../*.** C
4060: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 hange the value
4070: 6f 66 20 74 68 65 20 50 31 20 6f 70 65 72 61 6e of the P1 operan
4080: 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 d for a specific
4090: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a instruction..**
40a0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
40b0: 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61 20 6c useful when a l
40c0: 61 72 67 65 20 70 72 6f 67 72 61 6d 20 69 73 20 arge program is
40d0: 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a loaded from a.**
40e0: 20 73 74 61 74 69 63 20 61 72 72 61 79 20 75 73 static array us
40f0: 69 6e 67 20 73 71 6c 69 74 65 33 56 64 62 65 41 ing sqlite3VdbeA
4100: 64 64 4f 70 4c 69 73 74 20 62 75 74 20 77 65 20 ddOpList but we
4110: 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a want to make a.*
4120: 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e * few minor chan
4130: 67 65 73 20 74 6f 20 74 68 65 20 70 72 6f 67 72 ges to the progr
4140: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 am..*/.void sqli
4150: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 te3VdbeChangeP1(
4160: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 Vdbe *p, u32 add
4170: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 r, int val){. a
4180: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 ssert( p!=0 );.
4190: 20 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f if( ((u32)p->nO
41a0: 70 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 p)>addr ){. p
41b0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d ->aOp[addr].p1 =
41c0: 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a val;. }.}../*.
41d0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 ** Change the va
41e0: 6c 75 65 20 6f 66 20 74 68 65 20 50 32 20 6f 70 lue of the P2 op
41f0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 erand for a spec
4200: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e ific instruction
4210: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
4220: 65 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72 20 e is useful for
4230: 73 65 74 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 setting a jump d
4240: 65 73 74 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 estination..*/.v
4250: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 oid sqlite3VdbeC
4260: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c hangeP2(Vdbe *p,
4270: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 u32 addr, int v
4280: 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 al){. assert( p
4290: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 !=0 );. if( ((u
42a0: 33 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 32)p->nOp)>addr
42b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 ){. p->aOp[ad
42c0: 64 72 5d 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 dr].p2 = val;.
42d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 }.}../*.** Chang
42e0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 e the value of t
42f0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 66 6f he P3 operand fo
4300: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 r a specific ins
4310: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 truction..*/.voi
4320: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 d sqlite3VdbeCha
4330: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75 ngeP3(Vdbe *p, u
4340: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 32 addr, int val
4350: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d ){. assert( p!=
4360: 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 0 );. if( ((u32
4370: 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b )p->nOp)>addr ){
4380: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 . p->aOp[addr
4390: 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a ].p3 = val;. }.
43a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 }../*.** Change
43b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 the value of the
43c0: 20 50 35 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 P5 operand for
43d0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c the most recentl
43e0: 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 65 72 61 y.** added opera
43f0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 tion..*/.void sq
4400: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 lite3VdbeChangeP
4410: 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20 76 61 5(Vdbe *p, u8 va
4420: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 l){. assert( p!
4430: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 =0 );. if( p->a
4440: 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 Op ){. assert
4450: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 ( p->nOp>0 );.
4460: 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d p->aOp[p->nOp-
4470: 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 1].p5 = val;. }
4480: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 .}../*.** Change
4490: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 the P2 operand
44a0: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 of instruction a
44b0: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 ddr so that it p
44c0: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 oints to.** the
44d0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e address of the n
44e0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 ext instruction
44f0: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a to be coded..*/.
4500: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
4510: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70 JumpHere(Vdbe *p
4520: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 , int addr){. s
4530: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
4540: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e P2(p, addr, p->n
4550: 4f 70 29 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 Op);. p->pParse
4560: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e ->iFixedOp = p->
4570: 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a nOp - 1;.}.../*.
4580: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 ** If the input
4590: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 FuncDef structur
45a0: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 e is ephemeral,
45b0: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49 then free it. I
45c0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66 f.** the FuncDef
45d0: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c is not ephermal
45e0: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e , then do nothin
45f0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 g..*/.static voi
4600: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 d freeEphemeralF
4610: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 unction(sqlite3
4620: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 *db, FuncDef *pD
4630: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 ef){. if( ALWAY
4640: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66 S(pDef) && (pDef
4650: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 ->funcFlags & SQ
4660: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 LITE_FUNC_EPHEM)
4670: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 !=0 ){. sqlit
4680: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 e3DbFree(db, pDe
4690: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 f);. }.}..stati
46a0: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f c void vdbeFreeO
46b0: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a pArray(sqlite3 *
46c0: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f , Op *, int);../
46d0: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 *.** Delete a P4
46e0: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 value if necess
46f0: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ary..*/.static v
4700: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 oid freeP4(sqlit
4710: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 e3 *db, int p4ty
4720: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 pe, void *p4){.
4730: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 if( p4 ){. a
4740: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 ssert( db );.
4750: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 switch( p4type
4760: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 ){. case P4
4770: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 _REAL:. cas
4780: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 e P4_INT64:.
4790: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 case P4_DYNAMI
47a0: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 C:. case P4
47b0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 _INTARRAY: {.
47c0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
47d0: 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 ee(db, p4);.
47e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
47f0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 }. case P4
4800: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 _KEYINFO: {.
4810: 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 if( db->pnBy
4820: 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 tesFreed==0 ) sq
4830: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 lite3KeyInfoUnre
4840: 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b f((KeyInfo*)p4);
4850: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a . break;.
4860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 }. ca
4870: 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b se P4_MPRINTF: {
4880: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d . if( db-
4890: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 >pnBytesFreed==0
48a0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 ) sqlite3_free(
48b0: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 p4);. bre
48c0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
48d0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 case P4_FUNCDE
48e0: 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 F: {. fre
48f0: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 eEphemeralFuncti
4900: 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a on(db, (FuncDef*
4910: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 )p4);. br
4920: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
4930: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 case P4_MEM:
4940: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 {. if( db
4950: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d ->pnBytesFreed==
4960: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 0 ){. s
4970: 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 qlite3ValueFree(
4980: 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 (sqlite3_value*)
4990: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c p4);. }el
49a0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 se{. Me
49b0: 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b m *p = (Mem*)p4;
49c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
49d0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e e3DbFree(db, p->
49e0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 zMalloc);.
49f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
4a00: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 e(db, p);.
4a10: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 }. brea
4a20: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 k;. }.
4a30: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 case P4_VTAB :
4a40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 {. if( db
4a50: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d ->pnBytesFreed==
4a60: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 0 ) sqlite3VtabU
4a70: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 nlock((VTable *)
4a80: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 p4);. bre
4a90: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
4aa0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 }. }.}../*.** F
4ab0: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c ree the space al
4ac0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 located for aOp
4ad0: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 and any p4 value
4ae0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 s allocated for
4af0: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 the.** opcodes c
4b00: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e ontained within.
4b10: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e If aOp is not N
4b20: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 ULL it is assume
4b30: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a d to contain .**
4b40: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a nOp entries. .*
4b50: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 /.static void vd
4b60: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 beFreeOpArray(sq
4b70: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 lite3 *db, Op *a
4b80: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 Op, int nOp){.
4b90: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f if( aOp ){. O
4ba0: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 p *pOp;. for(
4bb0: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f pOp=aOp; pOp<&aO
4bc0: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a p[nOp]; pOp++){.
4bd0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c freeP4(db,
4be0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f pOp->p4type, pO
4bf0: 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 p->p4.p);.#ifdef
4c00: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 SQLITE_ENABLE_E
4c10: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a XPLAIN_COMMENTS.
4c20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 sqlite3DbF
4c30: 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f ree(db, pOp->zCo
4c40: 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 mment);.#endif
4c50: 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 . }. }.
4c60: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
4c70: 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a , aOp);.}../*.**
4c80: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f Link the SubPro
4c90: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 gram object pass
4ca0: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 ed as the second
4cb0: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 argument into t
4cc0: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 he linked.** lis
4cd0: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 t at Vdbe.pSubPr
4ce0: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 ogram. This list
4cf0: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 is used to dele
4d00: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 te all sub-progr
4d10: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 am.** objects wh
4d20: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 en the VM is no
4d30: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e longer required.
4d40: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
4d50: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 VdbeLinkSubProgr
4d60: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 am(Vdbe *pVdbe,
4d70: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a SubProgram *p){.
4d80: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 p->pNext = pVd
4d90: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 be->pProgram;.
4da0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 pVdbe->pProgram
4db0: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 = p;.}../*.** Ch
4dc0: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 ange the opcode
4dd0: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f at addr into OP_
4de0: 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c Noop.*/.void sql
4df0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f ite3VdbeChangeTo
4e00: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e Noop(Vdbe *p, in
4e10: 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 70 t addr){. if( p
4e20: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 ->aOp ){. Vdb
4e30: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 eOp *pOp = &p->a
4e40: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 Op[addr];. sq
4e50: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
4e60: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 b;. freeP4(db
4e70: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 , pOp->p4type, p
4e80: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d Op->p4.p);. m
4e90: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 emset(pOp, 0, si
4ea0: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 zeof(pOp[0]));.
4eb0: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d pOp->opcode =
4ec0: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 OP_Noop;. if
4ed0: 28 20 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 ( addr==p->nOp-1
4ee0: 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d ) p->nOp--;. }
4ef0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 .}../*.** Remove
4f00: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 the last opcode
4f10: 20 69 6e 73 65 72 74 65 64 0a 2a 2f 0a 69 6e 74 inserted.*/.int
4f20: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 sqlite3VdbeDele
4f30: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 tePriorOpcode(Vd
4f40: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 be *p, u8 op){.
4f50: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e if( (p->nOp-1)>
4f60: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 (p->pParse->iFix
4f70: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b edOp) && p->aOp[
4f80: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 p->nOp-1].opcode
4f90: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 ==op ){. sqli
4fa0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e te3VdbeChangeToN
4fb0: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 oop(p, p->nOp-1)
4fc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
4fd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 }else{. ret
4fe0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a urn 0;. }.}../*
4ff0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 .** Change the v
5000: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f alue of the P4 o
5010: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 perand for a spe
5020: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f cific instructio
5030: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 n..** This routi
5040: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 ne is useful whe
5050: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 n a large progra
5060: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d m is loaded from
5070: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 a.** static arr
5080: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 ay using sqlite3
5090: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 VdbeAddOpList bu
50a0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b t we want to mak
50b0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 e a.** few minor
50c0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 changes to the
50d0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 program..**.** I
50e0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 f n>=0 then the
50f0: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 P4 operand is dy
5100: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 namic, meaning t
5110: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a hat a copy of.**
5120: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d the string is m
5130: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 ade into memory
5140: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 obtained from sq
5150: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a lite3_malloc()..
5160: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d ** A value of n=
5170: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 =0 means copy by
5180: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f tes of zP4 up to
5190: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 and including t
51a0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c he.** first null
51b0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 byte. If n>0 t
51c0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 hen copy n+1 byt
51d0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a es of zP4..** .*
51e0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f * Other values o
51f0: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 f n (P4_STATIC,
5200: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 P4_COLLSEQ etc.)
5210: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a indicate that z
5220: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 P4 points.** to
5230: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 a string or stru
5240: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 cture that is gu
5250: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 aranteed to exis
5260: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 t for the lifeti
5270: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 me of.** the Vdb
5280: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 e. In these case
5290: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f s we can just co
52a0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a py the pointer..
52b0: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 **.** If addr<0
52c0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f then change P4 o
52d0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e n the most recen
52e0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 tly inserted ins
52f0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 truction..*/.voi
5300: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 d sqlite3VdbeCha
5310: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 ngeP4(Vdbe *p, i
5320: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 nt addr, const c
5330: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 har *zP4, int n)
5340: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 {. Op *pOp;. s
5350: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 qlite3 *db;. as
5360: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 sert( p!=0 );.
5370: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 db = p->db;. as
5380: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
5390: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
53a0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d );. if( p->aOp=
53b0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 =0 || db->malloc
53c0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 Failed ){. if
53d0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a ( n!=P4_VTAB ){.
53e0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c freeP4(db,
53f0: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 n, (void*)*(cha
5400: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d r**)&zP4);. }
5410: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
5420: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f . assert( p->nO
5430: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 p>0 );. assert(
5440: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a addr<p->nOp );.
5450: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a if( addr<0 ){.
5460: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f addr = p->nO
5470: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 p - 1;. }. pOp
5480: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d = &p->aOp[addr]
5490: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d ;. assert( pOp-
54a0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 >p4type==P4_NOTU
54b0: 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f SED. || pO
54c0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e p->p4type==P4_IN
54d0: 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f T32. || pO
54e0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 p->p4type==P4_KE
54f0: 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 YINFO );. freeP
5500: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 4(db, pOp->p4typ
5510: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 e, pOp->p4.p);.
5520: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a pOp->p4.p = 0;.
5530: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 if( n==P4_INT3
5540: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 2 ){. /* Note
5550: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 : this cast is s
5560: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 afe, because the
5570: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 origin data poi
5580: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 nt was an int.
5590: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 ** that was ca
55a0: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 st to a (const c
55b0: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 har *). */. p
55c0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 Op->p4.i = SQLIT
55d0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 E_PTR_TO_INT(zP4
55e0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 );. pOp->p4ty
55f0: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 pe = P4_INT32;.
5600: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d }else if( zP4==
5610: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 0 ){. pOp->p4
5620: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d .p = 0;. pOp-
5630: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 >p4type = P4_NOT
5640: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 USED;. }else if
5650: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 ( n==P4_KEYINFO
5660: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 ){. pOp->p4.p
5670: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 = (void*)zP4;.
5680: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d pOp->p4type =
5690: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d P4_KEYINFO;. }
56a0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 else if( n==P4_V
56b0: 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e TAB ){. pOp->
56c0: 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 p4.p = (void*)zP
56d0: 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 4;. pOp->p4ty
56e0: 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 pe = P4_VTAB;.
56f0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 sqlite3VtabLoc
5700: 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 k((VTable *)zP4)
5710: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28 ;. assert( ((
5720: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 VTable *)zP4)->d
5730: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 b==p->db );. }e
5740: 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 lse if( n<0 ){.
5750: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 pOp->p4.p = (
5760: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 void*)zP4;. p
5770: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 Op->p4type = (si
5780: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d gned char)n;. }
5790: 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d else{. if( n=
57a0: 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 =0 ) n = sqlite3
57b0: 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 Strlen30(zP4);.
57c0: 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 pOp->p4.z = s
57d0: 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70 28 qlite3DbStrNDup(
57e0: 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a p->db, zP4, n);.
57f0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 pOp->p4type
5800: 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 = P4_DYNAMIC;.
5810: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 }.}../*.** Set t
5820: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 he P4 on the mos
5830: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 t recently added
5840: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b opcode to the K
5850: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a eyInfo for the.*
5860: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a * index given..*
5870: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
5880: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 beSetP4KeyInfo(P
5890: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e arse *pParse, In
58a0: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 dex *pIdx){. Vd
58b0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e be *v = pParse->
58c0: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28 pVdbe;. assert(
58d0: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 v!=0 );. asser
58e0: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20 t( pIdx!=0 );.
58f0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
5900: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72 eP4(v, -1, (char
5910: 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f *)sqlite3KeyInfo
5920: 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20 OfIndex(pParse,
5930: 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20 pIdx),.
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f P4_
5950: 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 KEYINFO);.}..#if
5960: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
5970: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e E_EXPLAIN_COMMEN
5980: 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 TS./*.** Change
5990: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 the comment on t
59a0: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 he most recently
59b0: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 coded instructi
59c0: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 on. Or.** inser
59d0: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 t a No-op and ad
59e0: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f d the comment to
59f0: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 that new instru
5a00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 ction. This.**
5a10: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 makes the code e
5a20: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 asier to read du
5a30: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 ring debugging.
5a40: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 None of this ha
5a50: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 ppens.** in a pr
5a60: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a oduction build..
5a70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 */.static void v
5a80: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65 dbeVComment(Vdbe
5a90: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 *p, const char
5aa0: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73 *zFormat, va_lis
5ab0: 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28 t ap){. assert(
5ac0: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e p->nOp>0 || p->
5ad0: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 aOp==0 );. asse
5ae0: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c rt( p->aOp==0 ||
5af0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 p->aOp[p->nOp-1
5b00: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c ].zComment==0 ||
5b10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 p->db->mallocFa
5b20: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d iled );. if( p-
5b30: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65 >nOp ){. asse
5b40: 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 rt( p->aOp );.
5b50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
5b60: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d p->db, p->aOp[p-
5b70: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 >nOp-1].zComment
5b80: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d );. p->aOp[p-
5b90: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 >nOp-1].zComment
5ba0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e = sqlite3VMPrin
5bb0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 tf(p->db, zForma
5bc0: 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f t, ap);. }.}.vo
5bd0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f id sqlite3VdbeCo
5be0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 mment(Vdbe *p, c
5bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
5c00: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c at, ...){. va_l
5c10: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 ist ap;. if( p
5c20: 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 ){. va_start(
5c30: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 ap, zFormat);.
5c40: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 vdbeVComment(p
5c50: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a , zFormat, ap);.
5c60: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a va_end(ap);.
5c70: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 }.}.void sqlit
5c80: 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e e3VdbeNoopCommen
5c90: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 t(Vdbe *p, const
5ca0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
5cb0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 ...){. va_list
5cc0: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 ap;. if( p ){.
5cd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 sqlite3VdbeAd
5ce0: 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 dOp0(p, OP_Noop)
5cf0: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 ;. va_start(a
5d00: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 p, zFormat);.
5d10: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c vdbeVComment(p,
5d20: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 zFormat, ap);.
5d30: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 va_end(ap);.
5d40: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20 }.}.#endif /*
5d50: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65 NDEBUG */..#ifde
5d60: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f f SQLITE_VDBE_CO
5d70: 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 VERAGE./*.** Set
5d80: 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68 the value if th
5d90: 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64 e iSrcLine field
5da0: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75 for the previou
5db0: 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 sly coded instru
5dc0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ction..*/.void s
5dd0: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e qlite3VdbeSetLin
5de0: 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c eNumber(Vdbe *v,
5df0: 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73 int iLine){. s
5e00: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 qlite3VdbeGetOp(
5e10: 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20 v,-1)->iSrcLine
5e20: 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 = iLine;.}.#endi
5e30: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45 f /* SQLITE_VDBE
5e40: 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a _COVERAGE */../*
5e50: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f .** Return the o
5e60: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 pcode for a give
5e70: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 n address. If t
5e80: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 he address is -1
5e90: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e , then.** return
5ea0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 the most recent
5eb0: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f ly inserted opco
5ec0: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d de..**.** If a m
5ed0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
5ee0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 error has occur
5ef0: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 red prior to the
5f00: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 calling of this
5f10: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 .** routine, the
5f20: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 n a pointer to a
5f30: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 dummy VdbeOp wi
5f40: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 ll be returned.
5f50: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 That opcode.**
5f60: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 is readable but
5f70: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 not writable, th
5f80: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 ough it is cast
5f90: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 to a writable va
5fa0: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 lue..** The retu
5fb0: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 rn of a dummy op
5fc0: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 code allows the
5fd0: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 call to continue
5fe0: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 functioning.**
5ff0: 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c after a OOM faul
6000: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 t without having
6010: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 to check to see
6020: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 if the return f
6030: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 rom .** this rou
6040: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 tine is a valid
6050: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 pointer. But be
6060: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e cause the dummy.
6070: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 opcode is 0,.**
6080: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 dummy will never
6090: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 be written to.
60a0: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 This is verifie
60b0: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 d by code inspec
60c0: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 tion and.** by r
60d0: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 unning with Valg
60e0: 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 rind..*/.VdbeOp
60f0: 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f *sqlite3VdbeGetO
6100: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 p(Vdbe *p, int a
6110: 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 ddr){. /* C89 s
6120: 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 pecifies that th
6130: 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d e constant "dumm
6140: 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 y" will be initi
6150: 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 alized to all.
6160: 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 ** zeros, which
6170: 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 is correct. MSV
6180: 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 C generates a wa
6190: 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c rning, neverthel
61a0: 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 ess. */. static
61b0: 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 VdbeOp dummy;
61c0: 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 /* Ignore the MS
61d0: 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 VC warning about
61e0: 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 no initializer
61f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e */. assert( p->
6200: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
6210: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 C_INIT );. if(
6220: 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 addr<0 ){. ad
6230: 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b dr = p->nOp - 1;
6240: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 28 . }. assert( (
6250: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c addr>=0 && addr<
6260: 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 p->nOp) || p->db
6270: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
6280: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d ;. if( p->db->m
6290: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 allocFailed ){.
62a0: 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 4f return (VdbeO
62b0: 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c p*)&dummy;. }el
62c0: 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 se{. return &
62d0: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 p->aOp[addr];.
62e0: 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 }.}..#if defined
62f0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 (SQLITE_ENABLE_E
6300: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 XPLAIN_COMMENTS)
6310: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e ./*.** Return an
6320: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 integer value f
6330: 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 or one of the pa
6340: 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65 20 rameters to the
6350: 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 opcode pOp.** de
6360: 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61 72 termined by char
6370: 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 acter c..*/.stat
6380: 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 ic int translate
6390: 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 P(char c, const
63a0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 Op *pOp){. if(
63b0: 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e 20 c=='1' ) return
63c0: 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 pOp->p1;. if( c
63d0: 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20 70 =='2' ) return p
63e0: 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d Op->p2;. if( c=
63f0: 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70 4f ='3' ) return pO
6400: 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d p->p3;. if( c==
6410: 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 '4' ) return pOp
6420: 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e ->p4.i;. return
6430: 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a pOp->p5;.}../*.
6440: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 ** Compute a str
6450: 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f 6d ing for the "com
6460: 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20 61 ment" field of a
6470: 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 VDBE opcode lis
6480: 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ting..**.** The
6490: 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 Synopsis: field
64a0: 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 in comments in t
64b0: 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 he vdbe.c source
64c0: 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 file gets conve
64d0: 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 rted.** to an ex
64e0: 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 tra string that
64f0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 is appended to t
6500: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 he sqlite3Opcode
6510: 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65 0a Name(). In the.
6520: 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 ** absence of ot
6530: 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 her comments, th
6540: 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63 6f is synopsis beco
6550: 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 mes the comment
6560: 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a on the opcode..*
6570: 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 * Some translati
6580: 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a on occurs:.**.**
6590: 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20 20 "PX"
65a0: 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 -> "r[X]".**
65b0: 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20 2d "PX@PY" -
65c0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 > "r[X..X+Y-1]"
65d0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 or "r[x]" if y
65e0: 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 is 0 or 1.**
65f0: 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d 3e "PX@PY+1" ->
6600: 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 "r[X..X+Y]"
6610: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 or "r[x]" if y
6620: 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 is 0.** "P
6630: 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 Y..PY" -> "r[X
6640: 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22 72 ..Y]" or "r
6650: 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a [x]" if y<=x.*/.
6660: 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c static int displ
6670: 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e ayComment(. con
6680: 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 st Op *pOp,
6690: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74 6f /* The opcode to
66a0: 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f be commented */
66b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
66c0: 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 P4, /* Previou
66d0: 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61 6c sly obtained val
66e0: 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 ue for P4 */. c
66f0: 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 har *zTemp,
6700: 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75 6c /* Write resul
6710: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 t here */. int
6720: 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20 2f nTemp /
6730: 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62 6c * Space availabl
6740: 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a e in zTemp[] */.
6750: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
6760: 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 *zOpName;. cons
6770: 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 t char *zSynopsi
6780: 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 s;. int nOpName
6790: 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a ;. int ii, jj;.
67a0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 zOpName = sqli
67b0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f te3OpcodeName(pO
67c0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f p->opcode);. nO
67d0: 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 pName = sqlite3S
67e0: 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 trlen30(zOpName)
67f0: 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b ;. if( zOpName[
6800: 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 nOpName+1] ){.
6810: 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 int seenCom =
6820: 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 0;. char c;.
6830: 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a zSynopsis = z
6840: 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d OpName += nOpNam
6850: 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 e + 1;. for(i
6860: 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 i=jj=0; jj<nTemp
6870: 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f -1 && (c = zSyno
6880: 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 psis[ii])!=0; ii
6890: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 ++){. if( c
68a0: 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 =='P' ){.
68b0: 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b c = zSynopsis[+
68c0: 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 +ii];. if
68d0: 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 ( c=='4' ){.
68e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
68f0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c printf(nTemp-jj,
6900: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c zTemp+jj, "%s",
6910: 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d zP4);. }
6920: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 else if( c=='X'
6930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c ){. sql
6940: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
6950: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a emp-jj, zTemp+jj
6960: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f , "%s", pOp->zCo
6970: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 mment);.
6980: 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 seenCom = 1;.
6990: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 }else{.
69a0: 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d int v1 =
69b0: 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 translateP(c, p
69c0: 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 Op);. i
69d0: 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 nt v2;.
69e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
69f0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d f(nTemp-jj, zTem
6a00: 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b p+jj, "%d", v1);
6a10: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 . if( s
6a20: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 trncmp(zSynopsis
6a30: 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d +ii+1, "@P", 2)=
6a40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
6a50: 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 ii += 3;.
6a60: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c jj += sql
6a70: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 ite3Strlen30(zTe
6a80: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 mp+jj);.
6a90: 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 v2 = transla
6aa0: 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 teP(zSynopsis[ii
6ab0: 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 ], pOp);.
6ac0: 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 if( strncmp
6ad0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c (zSynopsis+ii+1,
6ae0: 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 "+1",2)==0 ){.
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b ii +
6b00: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 = 2;.
6b10: 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 v2++;.
6b20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
6b30: 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 if( v2>1 ){.
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c sql
6b50: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
6b60: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a emp-jj, zTemp+jj
6b70: 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d , "..%d", v1+v2-
6b80: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 1);.
6b90: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 }. }els
6ba0: 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 e if( strncmp(zS
6bb0: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e ynopsis+ii+1, ".
6bc0: 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 .P3", 4)==0 && p
6bd0: 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 Op->p3==0 ){.
6be0: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 ii += 4
6bf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
6c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
6c10: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 jj += sqlite3Str
6c20: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b len30(zTemp+jj);
6c30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
6c40: 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b zTemp[jj++
6c50: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 ] = c;. }.
6c60: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 }. if( !se
6c70: 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d enCom && jj<nTem
6c80: 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d p-5 && pOp->zCom
6c90: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 ment ){. sq
6ca0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
6cb0: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a Temp-jj, zTemp+j
6cc0: 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e j, "; %s", pOp->
6cd0: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 zComment);.
6ce0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 jj += sqlite3St
6cf0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 rlen30(zTemp+jj)
6d00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
6d10: 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 jj<nTemp ) zTemp
6d20: 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 [jj] = 0;. }els
6d30: 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d e if( pOp->zComm
6d40: 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 ent ){. sqlit
6d50: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
6d60: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 p, zTemp, "%s",
6d70: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a pOp->zComment);.
6d80: 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 jj = sqlite3
6d90: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b Strlen30(zTemp);
6da0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 . }else{. zT
6db0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 emp[0] = 0;.
6dc0: 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 jj = 0;. }. re
6dd0: 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 turn jj;.}.#endi
6de0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 f /* SQLITE_DEBU
6df0: 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65 66 69 G */...#if !defi
6e00: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
6e10: 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 EXPLAIN) || !def
6e20: 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 ined(NDEBUG) \.
6e30: 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 || defined(V
6e40: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 DBE_PROFILE) ||
6e50: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 defined(SQLITE_D
6e60: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 EBUG)./*.** Comp
6e70: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 ute a string tha
6e80: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 t describes the
6e90: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 P4 parameter for
6ea0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 an opcode..** U
6eb0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 se zTemp for any
6ec0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 required tempor
6ed0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 ary buffer space
6ee0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 ..*/.static char
6ef0: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a *displayP4(Op *
6f00: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 pOp, char *zTemp
6f10: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 , int nTemp){.
6f20: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d char *zP4 = zTem
6f30: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 p;. assert( nTe
6f40: 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 mp>=20 );. swit
6f50: 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 ch( pOp->p4type
6f60: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b ){. case P4_K
6f70: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 EYINFO: {.
6f80: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 int i, j;.
6f90: 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 KeyInfo *pKeyInf
6fa0: 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 o = pOp->p4.pKey
6fb0: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 Info;. asse
6fc0: 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 rt( pKeyInfo->aS
6fd0: 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 ortOrder!=0 );.
6fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
6ff0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 rintf(nTemp, zTe
7000: 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 mp, "k(%d", pKey
7010: 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 Info->nField);.
7020: 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 i = sqlite3
7030: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b Strlen30(zTemp);
7040: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 . for(j=0;
7050: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 j<pKeyInfo->nFie
7060: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 ld; j++){.
7070: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c CollSeq *pColl
7080: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f = pKeyInfo->aCo
7090: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 ll[j];. c
70a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c onst char *zColl
70b0: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c = pColl ? pColl
70c0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b ->zName : "nil";
70d0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d . int n =
70e0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
70f0: 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 (zColl);.
7100: 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d if( n==6 && mem
7110: 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 cmp(zColl,"BINAR
7120: 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 Y",6)==0 ){.
7130: 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 zColl = "B
7140: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d ";. n =
7150: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 1;. }.
7160: 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 if( i+n>nT
7170: 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 emp-6 ){.
7180: 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 memcpy(&zTemp
7190: 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 [i],",...",4);.
71a0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
71b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
71c0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 zTemp[i++] = '
71d0: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ,';. if(
71e0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f pKeyInfo->aSortO
71f0: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 rder[j] ){.
7200: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 zTemp[i++]
7210: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d = '-';. }
7220: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 . memcpy(
7230: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c &zTemp[i], zColl
7240: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 , n+1);.
7250: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a i += n;. }.
7260: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d zTemp[i++]
7270: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 = ')';. zT
7280: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 emp[i] = 0;.
7290: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d assert( i<nTem
72a0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b p );. break
72b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
72c0: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 P4_COLLSEQ: {.
72d0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 CollSeq *pC
72e0: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 oll = pOp->p4.pC
72f0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 oll;. sqlit
7300: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
7310: 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 p, zTemp, "(%.20
7320: 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d s)", pColl->zNam
7330: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b e);. break;
7340: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
7350: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 P4_FUNCDEF: {.
7360: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 FuncDef *pDe
7370: 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e f = pOp->p4.pFun
7380: 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 c;. sqlite3
7390: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c _snprintf(nTemp,
73a0: 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 zTemp, "%s(%d)"
73b0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 , pDef->zName, p
73c0: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 Def->nArg);.
73d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
73e0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 case P4_INT64
73f0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 : {. sqlite
7400: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 3_snprintf(nTemp
7410: 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c , zTemp, "%lld",
7420: 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b *pOp->p4.pI64);
7430: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
7440: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f }. case P4_
7450: 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 INT32: {. s
7460: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
7470: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 nTemp, zTemp, "%
7480: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a d", pOp->p4.i);.
7490: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
74a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 }. case P4_R
74b0: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c EAL: {. sql
74c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
74d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 emp, zTemp, "%.1
74e0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 6g", *pOp->p4.pR
74f0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 eal);. brea
7500: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
7510: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 e P4_MEM: {.
7520: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f Mem *pMem = pO
7530: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 p->p4.pMem;.
7540: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 if( pMem->flag
7550: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 s & MEM_Str ){.
7560: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 zP4 = pMe
7570: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 m->z;. }els
7580: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 e if( pMem->flag
7590: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 s & MEM_Int ){.
75a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
75b0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
75c0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d Temp, "%lld", pM
75d0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 em->u.i);.
75e0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e }else if( pMem->
75f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c flags & MEM_Real
7600: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
7610: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 te3_snprintf(nTe
7620: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 mp, zTemp, "%.16
7630: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 g", pMem->r);.
7640: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d }else if( pM
7650: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f em->flags & MEM_
7660: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 Null ){.
7670: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
7680: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 (nTemp, zTemp, "
7690: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 NULL");. }e
76a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 lse{. ass
76b0: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 ert( pMem->flags
76c0: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 & MEM_Blob );.
76d0: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 zP4 = "(b
76e0: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 lob)";. }.
76f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
7700: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 }.#ifndef SQLITE
7710: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
7720: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 LE. case P4_V
7730: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c TAB: {. sql
7740: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 ite3_vtab *pVtab
7750: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 = pOp->p4.pVtab
7760: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 ->pVtab;. s
7770: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
7780: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 nTemp, zTemp, "v
7790: 74 61 62 3a 25 70 3a 25 70 22 2c 20 70 56 74 61 tab:%p:%p", pVta
77a0: 62 2c 20 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c b, pVtab->pModul
77b0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b e);. break;
77c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
77d0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 case P4_INTARR
77e0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 AY: {. sqli
77f0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 te3_snprintf(nTe
7800: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 69 6e 74 61 mp, zTemp, "inta
7810: 72 72 61 79 22 29 3b 0a 20 20 20 20 20 20 62 72 rray");. br
7820: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
7830: 61 73 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 ase P4_SUBPROGRA
7840: 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 M: {. sqlit
7850: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
7860: 70 2c 20 7a 54 65 6d 70 2c 20 22 70 72 6f 67 72 p, zTemp, "progr
7870: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 am");. brea
7880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
7890: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a e P4_ADVANCE: {.
78a0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d zTemp[0] =
78b0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0;. break;
78c0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 . }. defau
78d0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 lt: {. zP4
78e0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 = pOp->p4.z;.
78f0: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b if( zP4==0 ){
7900: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a . zP4 = z
7910: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 Temp;. zT
7920: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 emp[0] = 0;.
7930: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 }. }. }.
7940: 61 73 73 65 72 74 28 20 7a 50 34 21 3d 30 20 29 assert( zP4!=0 )
7950: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a ;. return zP4;.
7960: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 }.#endif../*.**
7970: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 Declare to the V
7980: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 dbe that the BTr
7990: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d ee object at db-
79a0: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e >aDb[i] is used.
79b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 .**.** The prepa
79c0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e red statements n
79d0: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 eed to know in a
79e0: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c dvance the compl
79f0: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 ete set of.** at
7a00: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 tached databases
7a10: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 that will be us
7a20: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 e. A mask of th
7a30: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a ese databases.**
7a40: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 is maintained i
7a50: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 n p->btreeMask.
7a60: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b The p->lockMask
7a70: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 value is the su
7a80: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 bset of.** p->bt
7a90: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 reeMask of datab
7aa0: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 ases that will r
7ab0: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a equire a lock..*
7ac0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
7ad0: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 beUsesBtree(Vdbe
7ae0: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 *p, int i){. a
7af0: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 ssert( i>=0 && i
7b00: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 <p->db->nDb && i
7b10: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 <(int)sizeof(yDb
7b20: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 Mask)*8 );. ass
7b30: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 ert( i<(int)size
7b40: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 of(p->btreeMask)
7b50: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 *8 );. DbMaskSe
7b60: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 t(p->btreeMask,
7b70: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 i);. if( i!=1 &
7b80: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 & sqlite3BtreeSh
7b90: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 arable(p->db->aD
7ba0: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 b[i].pBt) ){.
7bb0: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f DbMaskSet(p->lo
7bc0: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a ckMask, i);. }.
7bd0: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 }..#if !defined(
7be0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 SQLITE_OMIT_SHAR
7bf0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c ED_CACHE) && SQL
7c00: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 ITE_THREADSAFE>0
7c10: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 ./*.** If SQLite
7c20: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 is compiled to
7c30: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 support shared-c
7c40: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f ache mode and to
7c50: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a be threadsafe,.
7c60: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 ** this routine
7c70: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 obtains the mute
7c80: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 x associated wit
7c90: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 h each BtShared
7ca0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 structure.** tha
7cb0: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 t may be accesse
7cc0: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 d by the VM pass
7cd0: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e ed as an argumen
7ce0: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 t. In doing so i
7cf0: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 t also.** sets t
7d00: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d he BtShared.db m
7d10: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 ember of each of
7d20: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 the BtShared st
7d30: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 ructures, ensuri
7d40: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 ng.** that the c
7d50: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 orrect busy-hand
7d60: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 ler callback is
7d70: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 invoked if requi
7d80: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 red..**.** If SQ
7d90: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 Lite is not thre
7da0: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 adsafe but does
7db0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 support shared-c
7dc0: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a ache mode, then.
7dd0: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 ** sqlite3BtreeE
7de0: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 nter() is invoke
7df0: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 d to set the BtS
7e00: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c hared.db variabl
7e10: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 es.** of all of
7e20: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 BtShared structu
7e30: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 res accessible v
7e40: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ia the database
7e50: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 handle .** assoc
7e60: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 iated with the V
7e70: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 M..**.** If SQLi
7e80: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 te is not thread
7e90: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f safe and does no
7ea0: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 t support shared
7eb0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 -cache mode, thi
7ec0: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 s.** function is
7ed0: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 a no-op..**.**
7ee0: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b The p->btreeMask
7ef0: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d field is a bitm
7f00: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 ask of all btree
7f10: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 s that the prepa
7f20: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e red .** statemen
7f30: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 t p will ever us
7f40: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 e. Let N be the
7f50: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 number of bits
7f60: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a in p->btreeMask.
7f70: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 ** corresponding
7f80: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 to btrees that
7f90: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 use shared cache
7fa0: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 . Then the runt
7fb0: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 ime of.** this r
7fc0: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 outine is N*N.
7fd0: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 But as N is rare
7fe0: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 ly more than 1,
7ff0: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a this should not.
8000: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e ** be a problem.
8010: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
8020: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a VdbeEnter(Vdbe *
8030: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 p){. int i;. s
8040: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 qlite3 *db;. Db
8050: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 *aDb;. int nDb
8060: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c ;. if( DbMaskAl
8070: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 lZero(p->lockMas
8080: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a k) ) return; /*
8090: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 The common case
80a0: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 */. db = p->db
80b0: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 ;. aDb = db->aD
80c0: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e b;. nDb = db->n
80d0: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 Db;. for(i=0; i
80e0: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 <nDb; i++){.
80f0: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 if( i!=1 && DbMa
8100: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 skTest(p->lockMa
8110: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 sk,i) && ALWAYS(
8120: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 aDb[i].pBt!=0) )
8130: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 {. sqlite3B
8140: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d treeEnter(aDb[i]
8150: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d .pBt);. }. }
8160: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 .}.#endif..#if !
8170: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
8180: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 MIT_SHARED_CACHE
8190: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 ) && SQLITE_THRE
81a0: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 ADSAFE>0./*.** U
81b0: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 nlock all of the
81c0: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 btrees previous
81d0: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 ly locked by a c
81e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 all to sqlite3Vd
81f0: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f beEnter()..*/.vo
8200: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 id sqlite3VdbeLe
8210: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ave(Vdbe *p){.
8220: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 int i;. sqlite3
8230: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b *db;. Db *aDb;
8240: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 . int nDb;. if
8250: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 ( DbMaskAllZero(
8260: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 p->lockMask) ) r
8270: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 eturn; /* The c
8280: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 ommon case */.
8290: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 db = p->db;. aD
82a0: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e b = db->aDb;. n
82b0: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 Db = db->nDb;.
82c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 for(i=0; i<nDb;
82d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 i++){. if( i!
82e0: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 =1 && DbMaskTest
82f0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 (p->lockMask,i)
8300: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d && ALWAYS(aDb[i]
8310: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 .pBt!=0) ){.
8320: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 sqlite3BtreeLe
8330: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b ave(aDb[i].pBt);
8340: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e . }. }.}.#en
8350: 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 dif..#if defined
8360: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c (VDBE_PROFILE) |
8370: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 | defined(SQLITE
8380: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 _DEBUG)./*.** Pr
8390: 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 int a single opc
83a0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 ode. This routi
83b0: 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 ne is used for d
83c0: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a ebugging only..*
83d0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
83e0: 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a bePrintOp(FILE *
83f0: 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 pOut, int pc, Op
8400: 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a *pOp){. char *
8410: 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 zP4;. char zPtr
8420: 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f [50];. char zCo
8430: 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 m[100];. static
8440: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f const char *zFo
8450: 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 rmat1 = "%4d %-1
8460: 33 73 20 25 34 64 20 25 34 64 20 25 34 64 20 25 3s %4d %4d %4d %
8470: 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b -13s %.2X %s\n";
8480: 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 . if( pOut==0 )
8490: 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a pOut = stdout;.
84a0: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 zP4 = displayP
84b0: 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 4(pOp, zPtr, siz
84c0: 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 eof(zPtr));.#ifd
84d0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
84e0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 _EXPLAIN_COMMENT
84f0: 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 S. displayComme
8500: 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f nt(pOp, zP4, zCo
8510: 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 m, sizeof(zCom))
8520: 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 ;.#else. zCom[0
8530: 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 ] = 0;.#endif.
8540: 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 /* NB: The sqli
8550: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 te3OpcodeName()
8560: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c function is impl
8570: 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 emented by code
8580: 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 created. ** by
8590: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 the mkopcodeh.aw
85a0: 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e k and mkopcodec.
85b0: 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 awk scripts whic
85c0: 68 20 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 h extract the.
85d0: 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 ** information f
85e0: 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 rom the vdbe.c s
85f0: 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 ource text */.
8600: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 fprintf(pOut, zF
8610: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 ormat1, pc, .
8620: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 sqlite3Opcode
8630: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 Name(pOp->opcode
8640: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d ), pOp->p1, pOp-
8650: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 >p2, pOp->p3, zP
8660: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 4, pOp->p5,.
8670: 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 zCom. );. ff
8680: 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 lush(pOut);.}.#e
8690: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 ndif../*.** Rele
86a0: 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 ase an array of
86b0: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a N Mem elements.*
86c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 /.static void re
86d0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 leaseMemArray(Me
86e0: 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 m *p, int N){.
86f0: 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 if( p && N ){.
8700: 20 20 4d 65 6d 20 2a 70 45 6e 64 3b 0a 20 20 20 Mem *pEnd;.
8710: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 sqlite3 *db = p
8720: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c ->db;. u8 mal
8730: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d loc_failed = db-
8740: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 >mallocFailed;.
8750: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 if( db->pnByt
8760: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 esFreed ){.
8770: 20 66 6f 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b for(pEnd=&p[N];
8780: 20 70 3c 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 p<pEnd; p++){.
8790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 sqlite3Db
87a0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c Free(db, p->zMal
87b0: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 loc);. }.
87c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 return;.
87d0: 7d 0a 20 20 20 20 66 6f 72 28 70 45 6e 64 3d 26 }. for(pEnd=&
87e0: 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 70 2b p[N]; p<pEnd; p+
87f0: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 +){. assert
8800: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 ( (&p[1])==pEnd
8810: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d || p[0].db==p[1]
8820: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 .db );. ass
8830: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 ert( sqlite3Vdbe
8840: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e CheckMemInvarian
8850: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 ts(p) );..
8860: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 /* This block is
8870: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e really an inlin
8880: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 ed version of sq
8890: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
88a0: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 ase(). ** t
88b0: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 hat takes advant
88c0: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 age of the fact
88d0: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 that the memory
88e0: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 cell value is .
88f0: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 ** being se
8900: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 t to NULL after
8910: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 releasing any dy
8920: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e namic resources.
8930: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 . **.
8940: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 ** The justifica
8950: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 tion for duplica
8960: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 ting code is tha
8970: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a t according to .
8980: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 ** callgri
8990: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 nd, this causes
89a0: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 a certain test c
89b0: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 ase to hit the C
89c0: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a PU 4.7 . **
89d0: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 percent less (x
89e0: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 86 linux, gcc ve
89f0: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 rsion 4.1.2, -O6
8a00: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 ) than if .
8a10: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 ** sqlite3MemRe
8a20: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c lease() were cal
8a30: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 led from here. W
8a40: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 ith -O2, this ju
8a50: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 mps. ** to
8a60: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 6.6 percent. The
8a70: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e test case is in
8a80: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 serting 1000 row
8a90: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a s into a table .
8aa0: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f ** with no
8ab0: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 indexes using a
8ac0: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 single prepared
8ad0: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e INSERT statemen
8ae0: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 t, bind() .
8af0: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e ** and reset().
8b00: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f Inserts are gro
8b10: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e uped into a tran
8b20: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a saction.. *
8b30: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 /. testcase
8b40: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d ( p->flags & MEM
8b50: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 _Agg );. te
8b60: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 stcase( p->flags
8b70: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 & MEM_Dyn );.
8b80: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d testcase( p-
8b90: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 >flags & MEM_Fra
8ba0: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 me );. test
8bb0: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 case( p->flags &
8bc0: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 MEM_RowSet );.
8bd0: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 if( p->flag
8be0: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 s&(MEM_Agg|MEM_D
8bf0: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d yn|MEM_Frame|MEM
8c00: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 _RowSet) ){.
8c10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
8c20: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 emRelease(p);.
8c30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d }else if( p-
8c40: 3e 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 >zMalloc ){.
8c50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
8c60: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 e(db, p->zMalloc
8c70: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 4d );. p->zM
8c80: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 alloc = 0;.
8c90: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 }.. p->fla
8ca0: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e gs = MEM_Undefin
8cb0: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 ed;. }. db
8cc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
8cd0: 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 3b 0a malloc_failed;.
8ce0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c }.}../*.** Del
8cf0: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20 ete a VdbeFrame
8d00: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 object and its c
8d10: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 ontents. VdbeFra
8d20: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a me objects are.*
8d30: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 * allocated by t
8d40: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 he OP_Program op
8d50: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 code in sqlite3V
8d60: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f dbeExec()..*/.vo
8d70: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 id sqlite3VdbeFr
8d80: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 ameDelete(VdbeFr
8d90: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 ame *p){. int i
8da0: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 ;. Mem *aMem =
8db0: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b VdbeFrameMem(p);
8dc0: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a . VdbeCursor **
8dd0: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 apCsr = (VdbeCur
8de0: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e sor **)&aMem[p->
8df0: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f nChildMem];. fo
8e00: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 r(i=0; i<p->nChi
8e10: 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 ldCsr; i++){.
8e20: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 sqlite3VdbeFree
8e30: 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 Cursor(p->v, apC
8e40: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 sr[i]);. }. re
8e50: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d leaseMemArray(aM
8e60: 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d em, p->nChildMem
8e70: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 );. sqlite3DbFr
8e80: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b ee(p->v->db, p);
8e90: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 .}..#ifndef SQLI
8ea0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a TE_OMIT_EXPLAIN.
8eb0: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73 /*.** Give a lis
8ec0: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67 ting of the prog
8ed0: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75 ram in the virtu
8ee0: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a al machine..**.*
8ef0: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20 * The interface
8f00: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 is the same as s
8f10: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 qlite3VdbeExec()
8f20: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f . But instead o
8f30: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65 f.** running the
8f40: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65 code, it invoke
8f50: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f s the callback o
8f60: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73 nce for each ins
8f70: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 truction..** Thi
8f80: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65 s feature is use
8f90: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22 d to implement "
8fa0: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 EXPLAIN"..**.**
8fb0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d When p->explain=
8fc0: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63 =1, each instruc
8fd0: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20 tion is listed.
8fe0: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c When.** p->expl
8ff0: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f ain==2, only OP_
9000: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74 Explain instruct
9010: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20 ions are listed
9020: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65 and these.** are
9030: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66 shown in a diff
9040: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70 erent format. p
9050: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20 ->explain==2 is
9060: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e used to implemen
9070: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45 t.** EXPLAIN QUE
9080: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 RY PLAN..**.** W
9090: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d hen p->explain==
90a0: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69 1, first the mai
90b0: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73 n program is lis
90c0: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f ted, then each o
90d0: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72 f.** the trigger
90e0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 subprograms are
90f0: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f listed one by o
9100: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 ne..*/.int sqlit
9110: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64 e3VdbeList(. Vd
9120: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20 be *p
9130: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 /* The V
9140: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 DBE */.){. int
9150: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20 nRow;
9160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9170: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f /* Stop when ro
9180: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 w count reaches
9190: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 this */. int nS
91a0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 ub = 0;
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
91c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d * Number of sub-
91d0: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61 vdbes seen so fa
91e0: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 r */. SubProgra
91f0: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20 m **apSub = 0;
9200: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
9210: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65 rray of sub-vdbe
9220: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62 s */. Mem *pSub
9230: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 = 0;
9240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d /* M
9250: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20 emory cell hold
9260: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 array of subprog
9270: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a s */. sqlite3 *
9280: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20 db = p->db;
9290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
92a0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e he database conn
92b0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 ection */. int
92c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
92d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
92e0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 /* Loop counter
92f0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 */. int rc = S
9300: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 QLITE_OK;
9310: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 /* Re
9320: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d turn code */. M
9330: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 em *pMem = &p->a
9340: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20 Mem[1];
9350: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d /* First Mem
9360: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a of result set *
9370: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e /.. assert( p->
9380: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73 explain );. ass
9390: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
93a0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b DBE_MAGIC_RUN );
93b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63 . assert( p->rc
93c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 ==SQLITE_OK || p
93d0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 ->rc==SQLITE_BUS
93e0: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 Y || p->rc==SQLI
93f0: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f TE_NOMEM );.. /
9400: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68 * Even though th
9410: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e is opcode does n
9420: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73 ot use dynamic s
9430: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20 trings for. **
9440: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75 the result, resu
9450: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 lt columns may b
9460: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66 ecome dynamic if
9470: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a the user calls.
9480: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c ** sqlite3_col
9490: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61 umn_text16(), ca
94a0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74 using a translat
94b0: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e ion to UTF-16 en
94c0: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 coding.. */. r
94d0: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 eleaseMemArray(p
94e0: 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52 Mem, 8);. p->pR
94f0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20 esultSet = 0;..
9500: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 if( p->rc==SQLI
9510: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 TE_NOMEM ){.
9520: 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 /* This happens
9530: 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e if a malloc() in
9540: 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 side a call to s
9550: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 qlite3_column_te
9560: 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 xt() or. ** s
9570: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 qlite3_column_te
9580: 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 xt16() failed.
9590: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f */. db->mallo
95a0: 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 cFailed = 1;.
95b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 return SQLITE_E
95c0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 RROR;. }.. /*
95d0: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 When the number
95e0: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 of output rows r
95f0: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 eaches nRow, tha
9600: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a t means the. **
9610: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e listing has fin
9620: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 ished and sqlite
9630: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 3_step() should
9640: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f return SQLITE_DO
9650: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 NE.. ** nRow is
9660: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 the sum of the
9670: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 number of rows i
9680: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 n the main progr
9690: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 am, plus. ** th
96a0: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d e sum of the num
96b0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 ber of rows in a
96c0: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 ll trigger subpr
96d0: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 ograms encounter
96e0: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 ed. ** so far.
96f0: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 The nRow value
9700: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 will increase as
9710: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 new trigger sub
9720: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a programs are. *
9730: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 * encountered, b
9740: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 ut p->pc will ev
9750: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 entually catch u
9760: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a p to nRow.. */.
9770: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b nRow = p->nOp;
9780: 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 . if( p->explai
9790: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 n==1 ){. /* T
97a0: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 he first 8 memor
97b0: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 y cells are used
97c0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 for the result
97d0: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c set. So we will
97e0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 . ** commande
97f0: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 er the 9th cell
9800: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 to use as storag
9810: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f e for an array o
9820: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a f pointers. *
9830: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 * to trigger sub
9840: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 programs. The V
9850: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 DBE is guarantee
9860: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 d to have at lea
9870: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c st 9. ** cell
9880: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 s. */. asser
9890: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a t( p->nMem>9 );.
98a0: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 pSub = &p->a
98b0: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 Mem[9];. if(
98c0: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f pSub->flags&MEM_
98d0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a Blob ){. /*
98e0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 On the first ca
98f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 ll to sqlite3_st
9900: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 ep(), pSub will
9910: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 hold a NULL. It
9920: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 is. ** ini
9930: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c tialized to a BL
9940: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 OB by the P4_SUB
9950: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 PROGRAM processi
9960: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a ng logic below *
9970: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 /. nSub = p
9980: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 Sub->n/sizeof(Vd
9990: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 be*);. apSu
99a0: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 b = (SubProgram
99b0: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 **)pSub->z;.
99c0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 }. for(i=0; i
99d0: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 <nSub; i++){.
99e0: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 nRow += apSub
99f0: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a [i]->nOp;. }.
9a00: 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 }.. do{. i
9a10: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 = p->pc++;. }w
9a20: 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 hile( i<nRow &&
9a30: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 p->explain==2 &&
9a40: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 p->aOp[i].opcod
9a50: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b e!=OP_Explain );
9a60: 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 . if( i>=nRow )
9a70: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 {. p->rc = SQ
9a80: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 LITE_OK;. rc
9a90: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 = SQLITE_DONE;.
9aa0: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 }else if( db->u
9ab0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 1.isInterrupted
9ac0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 ){. p->rc = S
9ad0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b QLITE_INTERRUPT;
9ae0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
9af0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 _ERROR;. sqli
9b00: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d te3SetString(&p-
9b10: 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 25 >zErrMsg, db, "%
9b20: 73 22 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 s", sqlite3ErrSt
9b30: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c r(p->rc));. }el
9b40: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 se{. char *zP
9b50: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 4;. Op *pOp;.
9b60: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 if( i<p->nOp
9b70: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 ){. /* The
9b80: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d output line num
9b90: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f ber is small eno
9ba0: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20 ugh that we are
9bb0: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 still in the.
9bc0: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 ** main progr
9bd0: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 am. */. pOp
9be0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 = &p->aOp[i];.
9bf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
9c00: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e /* We are curren
9c10: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 tly listing subp
9c20: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 rograms. Figure
9c30: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 out which one a
9c40: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b nd. ** pick
9c50: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 up the appropri
9c60: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 ate opcode. */.
9c70: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 int j;.
9c80: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 i -= p->nOp;.
9c90: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e for(j=0; i>
9ca0: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 =apSub[j]->nOp;
9cb0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 j++){. i
9cc0: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 -= apSub[j]->nOp
9cd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
9ce0: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d pOp = &apSub[j]-
9cf0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 >aOp[i];. }.
9d00: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 if( p->explai
9d10: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d n==1 ){. pM
9d20: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
9d30: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d Int;. pMem-
9d40: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 >u.i = i;
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 /* Prog
9d70: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 ram counter */.
9d80: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a pMem++;. .
9d90: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 pMem->flag
9da0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d s = MEM_Static|M
9db0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b EM_Str|MEM_Term;
9dc0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d . pMem->z =
9dd0: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f (char*)sqlite3O
9de0: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f pcodeName(pOp->o
9df0: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 pcode); /* Opcod
9e00: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 e */. asser
9e10: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b t( pMem->z!=0 );
9e20: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d . pMem->n =
9e30: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
9e40: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 (pMem->z);.
9e50: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c pMem->enc = SQL
9e60: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 ITE_UTF8;.
9e70: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f pMem++;.. /
9e80: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f * When an OP_Pro
9e90: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 gram opcode is e
9ea0: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e ncounter (the on
9eb0: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 ly opcode that h
9ec0: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 as. ** a P4
9ed0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 _SUBPROGRAM argu
9ee0: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 ment), expand th
9ef0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 e size of the ar
9f00: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 ray of subprogra
9f10: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 ms. ** kept
9f20: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a in p->aMem[9].z
9f30: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 to hold the new
9f40: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d program - assum
9f50: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 ing this subprog
9f60: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 ram. ** has
9f70: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 not already bee
9f80: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f n seen.. */
9f90: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e . if( pOp->
9fa0: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 p4type==P4_SUBPR
9fb0: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 OGRAM ){.
9fc0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 int nByte = (nS
9fd0: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 ub+1)*sizeof(Sub
9fe0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 Program*);.
9ff0: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 int j;.
a000: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 for(j=0; j<nSu
a010: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 b; j++){.
a020: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d if( apSub[j]=
a030: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 =pOp->p4.pProgra
a040: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 m ) break;.
a050: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
a060: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 j==nSub && SQLI
a070: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 TE_OK==sqlite3Vd
a080: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 beMemGrow(pSub,
a090: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 nByte, nSub!=0)
a0a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 ){. apS
a0b0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d ub = (SubProgram
a0c0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 **)pSub->z;.
a0d0: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 apSub[nSu
a0e0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 b++] = pOp->p4.p
a0f0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 Program;.
a100: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c pSub->flags |
a110: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 = MEM_Blob;.
a120: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 pSub->n =
a130: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 nSub*sizeof(SubP
a140: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 rogram*);.
a150: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
a160: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 }.. pMem->fla
a170: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
a180: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f pMem->u.i = pO
a190: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 p->p1;
a1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a1b0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 /* P1 */. pMe
a1c0: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e m++;.. pMem->
a1d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
a1e0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d . pMem->u.i =
a1f0: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 pOp->p2;
a200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a210: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 /* P2 */.
a220: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 pMem++;.. pMe
a230: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 m->flags = MEM_I
a240: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e nt;. pMem->u.
a250: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 i = pOp->p3;
a260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a270: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 /* P3 */.
a280: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 pMem++;..
a290: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d if( sqlite3VdbeM
a2a0: 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 32 2c emGrow(pMem, 32,
a2b0: 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 20 20 0) ){
a2c0: 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 /* P4 */.
a2d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e assert( p->db->
a2e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a mallocFailed );.
a2f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
a300: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d ITE_ERROR;. }
a310: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 . pMem->flags
a320: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 = MEM_Str|MEM_T
a330: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 erm;. zP4 = d
a340: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d isplayP4(pOp, pM
a350: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20 em->z, 32);.
a360: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a if( zP4!=pMem->z
a370: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
a380: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 3VdbeMemSetStr(p
a390: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 Mem, zP4, -1, SQ
a3a0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 LITE_UTF8, 0);.
a3b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
a3c0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 assert( pMem->z!
a3d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d =0 );. pMem
a3e0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 ->n = sqlite3Str
a3f0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a len30(pMem->z);.
a400: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 pMem->enc
a410: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 = SQLITE_UTF8;.
a420: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b }. pMem++;
a430: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 .. if( p->exp
a440: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 lain==1 ){.
a450: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 if( sqlite3Vdbe
a460: 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 34 2c MemGrow(pMem, 4,
a470: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 0) ){. a
a480: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 ssert( p->db->ma
a490: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 llocFailed );.
a4a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c return SQL
a4b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 ITE_ERROR;.
a4c0: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 }. pMem->f
a4d0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d lags = MEM_Str|M
a4e0: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 EM_Term;. p
a4f0: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 Mem->n = 2;.
a500: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
a510: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 tf(3, pMem->z, "
a520: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b %.2x", pOp->p5);
a530: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 /* P5 */.
a540: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 pMem->enc = SQ
a550: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 LITE_UTF8;.
a560: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 pMem++;. .#ifd
a570: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
a580: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 _EXPLAIN_COMMENT
a590: 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 S. if( sqli
a5a0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 te3VdbeMemGrow(p
a5b0: 4d 65 6d 2c 20 35 30 30 2c 20 30 29 20 29 7b 0a Mem, 500, 0) ){.
a5c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
a5d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
a5e0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 led );. r
a5f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
a600: 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 OR;. }.
a610: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
a620: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d MEM_Str|MEM_Term
a630: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 ;. pMem->n
a640: 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 = displayComment
a650: 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d (pOp, zP4, pMem-
a660: 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 >z, 500);.
a670: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 pMem->enc = SQLI
a680: 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 TE_UTF8;.#else.
a690: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
a6a0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 = MEM_Null;
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a6c0: 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f /* Comment */
a6d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 .#endif. }..
a6e0: 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e p->nResColumn
a6f0: 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 = 8 - 4*(p->exp
a700: 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e lain-1);. p->
a710: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d pResultSet = &p-
a720: 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d >aMem[1];. p-
a730: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b >rc = SQLITE_OK;
a740: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
a750: 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 _ROW;. }. retu
a760: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 rn rc;.}.#endif
a770: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 /* SQLITE_OMIT_E
a780: 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 XPLAIN */..#ifde
a790: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f f SQLITE_DEBUG./
a7a0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 *.** Print the S
a7b0: 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 QL that was used
a7c0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 to generate a V
a7d0: 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a DBE program..*/.
a7e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
a7f0: 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 PrintSql(Vdbe *p
a800: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 ){. const char
a810: 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d *z = 0;. if( p-
a820: 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d >zSql ){. z =
a830: 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 p->zSql;. }els
a840: 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 e if( p->nOp>=1
a850: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 ){. const Vdb
a860: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 eOp *pOp = &p->a
a870: 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 Op[0];. if( p
a880: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 Op->opcode==OP_I
a890: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a nit && pOp->p4.z
a8a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d !=0 ){. z =
a8b0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 pOp->p4.z;.
a8c0: 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 while( sqlite3
a8d0: 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b Isspace(*z) ) z+
a8e0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 +;. }. }. i
a8f0: 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 f( z ) printf("S
a900: 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b QL: [%s]\n", z);
a910: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 .}.#endif..#if !
a920: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
a930: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 MIT_TRACE) && de
a940: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 fined(SQLITE_ENA
a950: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a BLE_IOTRACE)./*.
a960: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 ** Print an IOTR
a970: 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 ACE message show
a980: 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e ing SQL content.
a990: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
a9a0: 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 VdbeIOTraceSql(V
a9b0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e dbe *p){. int n
a9c0: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 Op = p->nOp;. V
a9d0: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 dbeOp *pOp;. if
a9e0: 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 ( sqlite3IoTrace
a9f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
aa00: 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 if( nOp<1 ) retu
aa10: 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e rn;. pOp = &p->
aa20: 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f aOp[0];. if( pO
aa30: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e p->opcode==OP_In
aa40: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 it && pOp->p4.z!
aa50: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c =0 ){. int i,
aa60: 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 j;. char z[1
aa70: 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 000];. sqlite
aa80: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 3_snprintf(sizeo
aa90: 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 f(z), z, "%s", p
aaa0: 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 Op->p4.z);. f
aab0: 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 or(i=0; sqlite3I
aac0: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b sspace(z[i]); i+
aad0: 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 +){}. for(j=0
aae0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 ; z[i]; i++){.
aaf0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 if( sqlite3I
ab00: 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a sspace(z[i]) ){.
ab10: 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d if( z[i-
ab20: 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 1]!=' ' ){.
ab30: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 z[j++] = '
ab40: 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 ';. }.
ab50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
ab60: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b z[j++] = z[i];
ab70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
ab80: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 z[j] = 0;.
ab90: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 sqlite3IoTrace(
aba0: 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a "SQL %s\n", z);.
abb0: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 }.}.#endif /*
abc0: 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 !SQLITE_OMIT_TRA
abd0: 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 CE && SQLITE_ENA
abe0: 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a BLE_IOTRACE */..
abf0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 /*.** Allocate s
ac00: 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 pace from a fixe
ac10: 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e d size buffer an
ac20: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 d return a point
ac30: 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 er to.** that sp
ac40: 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 ace. If insuffi
ac50: 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 cient space is a
ac60: 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e vailable, return
ac70: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 NULL..**.** The
ac80: 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 pBuf parameter
ac90: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 is the initial v
aca0: 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 alue of a pointe
acb0: 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 r which will.**
acc0: 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 receive the new
acd0: 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 memory. pBuf is
ace0: 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 normally NULL.
acf0: 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a If pBuf is not.
ad00: 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e ** NULL, it mean
ad10: 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 s that memory sp
ad20: 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 ace has already
ad30: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 been allocated a
ad40: 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 nd that.** this
ad50: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e routine should n
ad60: 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 ot allocate any
ad70: 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 new memory. Whe
ad80: 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a n pBuf is not.**
ad90: 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 NULL simply ret
ada0: 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 urn pBuf. Only
adb0: 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d allocate new mem
adc0: 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 ory space when p
add0: 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a Buf.** is NULL..
ade0: 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 **.** nByte is t
adf0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
ae00: 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 es of space need
ae10: 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f ed..**.** *ppFro
ae20: 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 m points to avai
ae30: 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 lable space and
ae40: 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 pEnd points to t
ae50: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a he end of the.**
ae60: 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 available space
ae70: 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 . When space is
ae80: 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 allocated, *ppF
ae90: 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 rom is advanced
aea0: 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 past.** the end
aeb0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 of the allocated
aec0: 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 space..**.** *p
aed0: 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 nByte is a count
aee0: 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 er of the number
aef0: 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 of bytes of spa
af00: 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61 69 ce that have fai
af10: 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 led.** to alloca
af20: 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 te. If there is
af30: 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 insufficient sp
af40: 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 ace in *ppFrom t
af50: 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a o satisfy the.**
af60: 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 request, then i
af70: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 ncrement *pnByte
af80: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f by the amount o
af90: 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a f the request..*
afa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 /.static void *a
afb0: 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 llocSpace(. voi
afc0: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 d *pBuf,
afd0: 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 /* Where retur
afe0: 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 n pointer will b
aff0: 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e e stored */. in
b000: 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 t nByte,
b010: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
b020: 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 bytes to allocat
b030: 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 e */. u8 **ppFr
b040: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 om, /* I
b050: 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 N/OUT: Allocate
b060: 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a from *ppFrom */.
b070: 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 u8 *pEnd,
b080: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
b090: 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 r to 1 byte past
b0a0: 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 the end of *ppF
b0b0: 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 rom buffer */.
b0c0: 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 int *pnByte
b0d0: 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 /* If alloc
b0e0: 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 ation cannot be
b0f0: 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 made, increment
b100: 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 *pnByte */.){.
b110: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 assert( EIGHT_BY
b120: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 TE_ALIGNMENT(*pp
b130: 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 From) );. if( p
b140: 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 Buf ) return pBu
b150: 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 f;. nByte = ROU
b160: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 ND8(nByte);. if
b170: 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 ( &(*ppFrom)[nBy
b180: 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 te] <= pEnd ){.
b190: 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a pBuf = (void*
b1a0: 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 )*ppFrom;. *p
b1b0: 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a pFrom += nByte;.
b1c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e }else{. *pn
b1d0: 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 Byte += nByte;.
b1e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 }. return pBuf
b1f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e ;.}../*.** Rewin
b200: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 d the VDBE back
b210: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 to the beginning
b220: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 in preparation
b230: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 for.** running i
b240: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 t..*/.void sqlit
b250: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 e3VdbeRewind(Vdb
b260: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e e *p){.#if defin
b270: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 ed(SQLITE_DEBUG)
b280: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 || defined(VDBE
b290: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 _PROFILE). int
b2a0: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 i;.#endif. asse
b2b0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 rt( p!=0 );. as
b2c0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
b2d0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
b2e0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 );.. /* There s
b2f0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 hould be at leas
b300: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 t one opcode..
b310: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e */. assert( p->
b320: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 nOp>0 );.. /* S
b330: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 et the magic to
b340: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 VDBE_MAGIC_RUN s
b350: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 ooner rather tha
b360: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d n later. */. p-
b370: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 >magic = VDBE_MA
b380: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 GIC_RUN;..#ifdef
b390: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 SQLITE_DEBUG.
b3a0: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d for(i=1; i<p->nM
b3b0: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 em; i++){. as
b3c0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d sert( p->aMem[i]
b3d0: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 .db==p->db );.
b3e0: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 }.#endif. p->pc
b3f0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d = -1;. p->rc =
b400: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d SQLITE_OK;. p-
b410: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f >errorAction = O
b420: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 E_Abort;. p->ma
b430: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
b440: 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e _RUN;. p->nChan
b450: 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 ge = 0;. p->cac
b460: 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e heCtr = 1;. p->
b470: 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d minWriteFileForm
b480: 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 at = 255;. p->i
b490: 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 Statement = 0;.
b4a0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e p->nFkConstrain
b4b0: 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 t = 0;.#ifdef VD
b4c0: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 BE_PROFILE. for
b4d0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 (i=0; i<p->nOp;
b4e0: 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 i++){. p->aOp
b4f0: 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 [i].cnt = 0;.
b500: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 p->aOp[i].cycle
b510: 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 s = 0;. }.#endi
b520: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 f.}../*.** Prepa
b530: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 re a virtual mac
b540: 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 hine for executi
b550: 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 on for the first
b560: 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 time after.** c
b570: 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 reating the virt
b580: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 ual machine. Th
b590: 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e is involves thin
b5a0: 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c gs such.** as al
b5b0: 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 6b 20 73 locating stack s
b5c0: 70 61 63 65 20 61 6e 64 20 69 6e 69 74 69 61 6c pace and initial
b5d0: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 izing the progra
b5e0: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 m counter..** Af
b5f0: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 ter the VDBE has
b600: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 be prepped, it
b610: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 can be executed
b620: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a by one or more.*
b630: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 * calls to sqlit
b640: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a e3VdbeExec(). .
b650: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 **.** This funct
b660: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 ion may be calle
b670: 64 20 65 78 61 63 74 20 6f 6e 63 65 20 6f 6e 20 d exact once on
b680: 61 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d a each virtual m
b690: 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 achine..** After
b6a0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 this routine is
b6b0: 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 called the VM h
b6c0: 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 as been "package
b6d0: 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a d" and is ready.
b6e0: 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 ** to run. Afte
b6f0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 r this routine i
b700: 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 68 65 72 s called, futher
b710: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 calls to .** sq
b720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 lite3VdbeAddOp()
b730: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 functions are p
b740: 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 rohibited. This
b750: 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e routine disconn
b760: 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 ects.** the Vdbe
b770: 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 from the Parse
b780: 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 object that help
b790: 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 ed generate it s
b7a0: 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 o that the.** th
b7b0: 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 e Vdbe becomes a
b7c0: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e n independent en
b7d0: 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 tity and the Par
b7e0: 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 se object can be
b7f0: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a .** destroyed..*
b800: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c *.** Use the sql
b810: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 ite3VdbeRewind()
b820: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 procedure to re
b830: 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 store a virtual
b840: 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 machine back.**
b850: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 to its initial s
b860: 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61 tate after it ha
b870: 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 s been run..*/.v
b880: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d oid sqlite3VdbeM
b890: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 akeReady(. Vdbe
b8a0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
b8b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
b8c0: 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 e VDBE */. Pars
b8d0: 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 e *pParse
b8e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 /* Pa
b8f0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f rsing context */
b900: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 .){. sqlite3 *d
b910: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
b920: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 /* The data
b930: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
b940: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 */. int nVar;
b950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b960: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
b970: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 parameters */.
b980: 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 int nMem;
b990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b9a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 /* Number of VM
b9b0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 memory registers
b9c0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f */. int nCurso
b9d0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
b9e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
b9f0: 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 f cursors requir
ba00: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 ed */. int nArg
ba10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
ba20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
ba30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e of arguments in
ba40: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a subprograms */.
ba50: 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 int nOnce;
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ba70: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 /* Number of OP
ba80: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f _Once instructio
ba90: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 ns */. int n;
baa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bab0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 /* Loop c
bac0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a ounter */. u8 *
bad0: 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 zCsr;
bae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 /* Me
baf0: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 mory available f
bb00: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f or allocation */
bb10: 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 . u8 *zEnd;
bb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bb30: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 /* First byte
bb40: 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d past allocated m
bb50: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e emory */. int n
bb60: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 Byte;
bb70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 /* How
bb80: 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f much extra memo
bb90: 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a ry is needed */.
bba0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 . assert( p!=0
bbb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
bbc0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 nOp>0 );. asser
bbd0: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a t( pParse!=0 );.
bbe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 assert( p->mag
bbf0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 ic==VDBE_MAGIC_I
bc00: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 NIT );. assert(
bc10: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 pParse==p->pPar
bc20: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e se );. db = p->
bc30: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 db;. assert( db
bc40: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d ->mallocFailed==
bc50: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 0 );. nVar = pP
bc60: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d arse->nVar;. nM
bc70: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 em = pParse->nMe
bc80: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 m;. nCursor = p
bc90: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e Parse->nTab;. n
bca0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d Arg = pParse->nM
bcb0: 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d axArg;. nOnce =
bcc0: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a pParse->nOnce;.
bcd0: 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 if( nOnce==0 )
bce0: 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 nOnce = 1; /* E
bcf0: 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f nsure at least o
bd00: 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f ne byte in p->aO
bd10: 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a nceFlag[] */. .
bd20: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75 /* For each cu
bd30: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61 rsor required, a
bd40: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d lso allocate a m
bd50: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f emory cell. Memo
bd60: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e ry. ** cells (n
bd70: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e Mem+1-nCursor)..
bd80: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c nMem, inclusive,
bd90: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 will never be u
bda0: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 sed by. ** the
bdb0: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e vdbe program. In
bdc0: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75 stead they are u
bdd0: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 sed to allocate
bde0: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 space for. ** V
bdf0: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73 dbeCursor/BtCurs
be00: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54 or structures. T
be10: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 he blob of memor
be20: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
be30: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 h . ** cursor 0
be40: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 is stored in me
be50: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 mory cell nMem.
be60: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 Memory cell (nMe
be70: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 m-1). ** stores
be80: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d the blob of mem
be90: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 ory associated w
bea0: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74 ith cursor 1, et
beb0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 c.. **. ** See
bec0: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 also: allocateC
bed0: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 ursor().. */.
bee0: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b nMem += nCursor;
bef0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 .. /* Allocate
bf00: 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 space for memory
bf10: 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20 registers, SQL
bf20: 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20 variables, VDBE
bf30: 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a cursors and . *
bf40: 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 * an array to ma
bf50: 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 rshal SQL functi
bf60: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e on arguments in.
bf70: 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 . */. zCsr = (
bf80: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e u8*)&p->aOp[p->n
bf90: 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 Op];
bfa0: 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 /* Memory avalia
bfb0: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 ble for allocati
bfc0: 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 on */. zEnd = (
bfd0: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 u8*)&p->aOp[pPar
bfe0: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 se->nOpAlloc];
bff0: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 /* First byte pa
c000: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d st end of zCsr[]
c010: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 */.. resolveP2
c020: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 Values(p, &nArg)
c030: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a ;. p->usesStmtJ
c040: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 ournal = (u8)(pP
c050: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 arse->isMultiWri
c060: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 te && pParse->ma
c070: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 yAbort);. if( p
c080: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 Parse->explain &
c090: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 & nMem<10 ){.
c0a0: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a nMem = 10;. }.
c0b0: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 memset(zCsr, 0
c0c0: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 , zEnd-zCsr);.
c0d0: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 zCsr += (zCsr -
c0e0: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 (u8*)0)&7;. ass
c0f0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f ert( EIGHT_BYTE_
c100: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 ALIGNMENT(zCsr)
c110: 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 );. p->expired
c120: 3d 20 30 3b 0a 0a 20 20 70 2d 3e 65 78 70 69 72 = 0;.. p->expir
c130: 65 64 20 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20 ed = 0;. . /*
c140: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73 Memory for regis
c150: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73 ters, parameters
c160: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 , cursor, etc, i
c170: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 s allocated in t
c180: 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 wo. ** passes.
c190: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 On the first pa
c1a0: 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 ss, we try to re
c1b0: 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65 use unused space
c1c0: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e at the . ** en
c1d0: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 d of the opcode
c1e0: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 array. If we ar
c1f0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 e unable to sati
c200: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 sfy all memory.
c210: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 ** requirements
c220: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 by reusing the
c230: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 opcode array tai
c240: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f l, then the seco
c250: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c nd. ** pass wil
c260: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 l fill in the re
c270: 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 st using a fresh
c280: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 allocation. .
c290: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 **. ** This tw
c2a0: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 o-pass approach
c2b0: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d that reuses as m
c2c0: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f uch memory as po
c2d0: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a ssible from. **
c2e0: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70 the leftover sp
c2f0: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f ace at the end o
c300: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 f the opcode arr
c310: 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 ay can significa
c320: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 ntly. ** reduce
c330: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d the amount of m
c340: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 emory held by a
c350: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
c360: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a nt.. */. do {.
c370: 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 nByte = 0;.
c380: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c p->aMem = all
c390: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c ocSpace(p->aMem,
c3a0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d nMem*sizeof(Mem
c3b0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 ), &zCsr, zEnd,
c3c0: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e &nByte);. p->
c3d0: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 aVar = allocSpac
c3e0: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a e(p->aVar, nVar*
c3f0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 sizeof(Mem), &zC
c400: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 sr, zEnd, &nByte
c410: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 );. p->apArg
c420: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e = allocSpace(p->
c430: 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 apArg, nArg*size
c440: 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c of(Mem*), &zCsr,
c450: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a zEnd, &nByte);.
c460: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 p->azVar = a
c470: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 llocSpace(p->azV
c480: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 ar, nVar*sizeof(
c490: 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a char*), &zCsr, z
c4a0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 End, &nByte);.
c4b0: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c p->apCsr = all
c4c0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72 ocSpace(p->apCsr
c4d0: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 , nCursor*sizeof
c4e0: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 (VdbeCursor*),.
c4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c500: 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20 &zCsr,
c510: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 zEnd, &nByte);.
c520: 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 p->aOnceFlag
c530: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e = allocSpace(p->
c540: 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 aOnceFlag, nOnce
c550: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 , &zCsr, zEnd, &
c560: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 nByte);. if(
c570: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 nByte ){. p
c580: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 ->pFree = sqlite
c590: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 3DbMallocZero(db
c5a0: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a , nByte);. }.
c5b0: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 zCsr = p->pF
c5c0: 72 65 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 ree;. zEnd =
c5d0: 26 7a 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 &zCsr[nByte];.
c5e0: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 }while( nByte &&
c5f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c !db->mallocFail
c600: 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 ed );.. p->nCur
c610: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 sor = nCursor;.
c620: 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 p->nOnceFlag =
c630: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e nOnce;. if( p->
c640: 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e aVar ){. p->n
c650: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 Var = (ynVar)nVa
c660: 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 r;. for(n=0;
c670: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 n<nVar; n++){.
c680: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 p->aVar[n].f
c690: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b lags = MEM_Null;
c6a0: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e . p->aVar[n
c6b0: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d ].db = db;. }
c6c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a . }. if( p->az
c6d0: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a Var ){. p->nz
c6e0: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a Var = pParse->nz
c6f0: 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 Var;. memcpy(
c700: 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 p->azVar, pParse
c710: 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 ->azVar, p->nzVa
c720: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 r*sizeof(p->azVa
c730: 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 r[0]));. mems
c740: 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 et(pParse->azVar
c750: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 , 0, pParse->nzV
c760: 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 ar*sizeof(pParse
c770: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 ->azVar[0]));.
c780: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 }. if( p->aMem
c790: 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d ){. p->aMem--
c7a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
c7b0: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d /* aMem[]
c7c0: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d goes from 1..nM
c7d0: 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 em */. p->nMe
c7e0: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 m = nMem;
c7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 /*
c800: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e not from 0..n
c810: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 Mem-1 */. for
c820: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e (n=1; n<=nMem; n
c830: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d ++){. p->aM
c840: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 em[n].flags = ME
c850: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 M_Undefined;.
c860: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 p->aMem[n].db
c870: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d = db;. }. }
c880: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 . p->explain =
c890: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b pParse->explain;
c8a0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 . sqlite3VdbeRe
c8b0: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a wind(p);.}../*.*
c8c0: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 * Close a VDBE c
c8d0: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 ursor and releas
c8e0: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 e all the resour
c8f0: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 ces that cursor
c900: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 .** happens to h
c910: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c old..*/.void sql
c920: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 ite3VdbeFreeCurs
c930: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 or(Vdbe *p, Vdbe
c940: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 Cursor *pCx){.
c950: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 if( pCx==0 ){.
c960: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 return;. }.
c970: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 sqlite3VdbeSorte
c980: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 rClose(p->db, pC
c990: 78 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 x);. if( pCx->p
c9a0: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 Bt ){. sqlite
c9b0: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3BtreeClose(pCx-
c9c0: 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 >pBt);. /* Th
c9d0: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 e pCx->pCursor w
c9e0: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 ill be close aut
c9f0: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 omatically, if i
ca00: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 t exists, by.
ca10: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f ** the call abo
ca20: 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 ve. */. }else i
ca30: 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 f( pCx->pCursor
ca40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 ){. sqlite3Bt
ca50: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 reeCloseCursor(p
ca60: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 Cx->pCursor);.
ca70: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 }.#ifndef SQLITE
ca80: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
ca90: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 LE. if( pCx->pV
caa0: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 tabCursor ){.
cab0: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 sqlite3_vtab_cu
cac0: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f rsor *pVtabCurso
cad0: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 r = pCx->pVtabCu
cae0: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 rsor;. const
caf0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a sqlite3_module *
cb00: 70 4d 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 pModule = pVtabC
cb10: 75 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d ursor->pVtab->pM
cb20: 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e odule;. p->in
cb30: 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a VtabMethod = 1;.
cb40: 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c pModule->xCl
cb50: 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 ose(pVtabCursor)
cb60: 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d ;. p->inVtabM
cb70: 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 ethod = 0;. }.#
cb80: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 endif.}../*.** C
cb90: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 opy the values s
cba0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 tored in the Vdb
cbb0: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 eFrame structure
cbc0: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 to its Vdbe. Th
cbd0: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 is.** is used, f
cbe0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e or example, when
cbf0: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 a trigger sub-p
cc00: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 rogram is halted
cc10: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 to restore.** c
cc20: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 ontrol to the ma
cc30: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 in program..*/.i
cc40: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 nt sqlite3VdbeFr
cc50: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 ameRestore(VdbeF
cc60: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 rame *pFrame){.
cc70: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d Vdbe *v = pFram
cc80: 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 6e 63 65 e->v;. v->aOnce
cc90: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 Flag = pFrame->a
cca0: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e OnceFlag;. v->n
ccb0: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d OnceFlag = pFram
ccc0: 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 e->nOnceFlag;.
ccd0: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d v->aOp = pFrame-
cce0: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d >aOp;. v->nOp =
ccf0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 pFrame->nOp;.
cd00: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 v->aMem = pFrame
cd10: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 ->aMem;. v->nMe
cd20: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d m = pFrame->nMem
cd30: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 ;. v->apCsr = p
cd40: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 Frame->apCsr;.
cd50: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 v->nCursor = pFr
cd60: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 ame->nCursor;.
cd70: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 v->db->lastRowid
cd80: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 = pFrame->lastR
cd90: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e owid;. v->nChan
cda0: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 ge = pFrame->nCh
cdb0: 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 ange;. return p
cdc0: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a Frame->pc;.}../*
cdd0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 .** Close all cu
cde0: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 rsors..**.** Als
cdf0: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 o release any dy
ce00: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c namic memory hel
ce10: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 d by the VM in t
ce20: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d he Vdbe.aMem mem
ce30: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 ory .** cell arr
ce40: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 ay. This is nece
ce50: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d ssary as the mem
ce60: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d ory cell array m
ce70: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f ay contain.** po
ce80: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 inters to VdbeFr
ce90: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 ame objects, whi
cea0: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 ch may in turn c
ceb0: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 ontain pointers
cec0: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f to.** open curso
ced0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f rs..*/.static vo
cee0: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f id closeAllCurso
cef0: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 rs(Vdbe *p){. i
cf00: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a f( p->pFrame ){.
cf10: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 VdbeFrame *p
cf20: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 Frame;. for(p
cf30: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b Frame=p->pFrame;
cf40: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 pFrame->pParent
cf50: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d ; pFrame=pFrame-
cf60: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 >pParent);. s
cf70: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 qlite3VdbeFrameR
cf80: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a estore(pFrame);.
cf90: 20 20 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 }. p->pFrame
cfa0: 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 = 0;. p->nFrame
cfb0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e = 0;.. if( p->
cfc0: 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 apCsr ){. int
cfd0: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b i;. for(i=0;
cfe0: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 i<p->nCursor; i
cff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 ++){. VdbeC
d000: 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 ursor *pC = p->a
d010: 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 pCsr[i];. i
d020: 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 f( pC ){.
d030: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 sqlite3VdbeFree
d040: 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 Cursor(p, pC);.
d050: 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b p->apCsr[
d060: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a i] = 0;. }.
d070: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 }. }. if(
d080: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 p->aMem ){. r
d090: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 eleaseMemArray(&
d0a0: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e p->aMem[1], p->n
d0b0: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c Mem);. }. whil
d0c0: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 e( p->pDelFrame
d0d0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 ){. VdbeFrame
d0e0: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c *pDel = p->pDel
d0f0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 Frame;. p->pD
d100: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e elFrame = pDel->
d110: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c pParent;. sql
d120: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c ite3VdbeFrameDel
d130: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a ete(pDel);. }..
d140: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 /* Delete any
d150: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 auxdata allocati
d160: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 ons made by the
d170: 56 4d 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 VM */. sqlite3V
d180: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 dbeDeleteAuxData
d190: 28 70 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 (p, -1, 0);. as
d1a0: 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 sert( p->pAuxDat
d1b0: 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a a==0 );.}../*.**
d1c0: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d Clean up the VM
d1d0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e after execution
d1e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
d1f0: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 tine will automa
d200: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e tically close an
d210: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 y cursors, lists
d220: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 , and/or.** sort
d230: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 ers that were le
d240: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 ft open. It als
d250: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 o deletes the va
d260: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 lues of.** varia
d270: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 bles in the aVar
d280: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 [] array..*/.sta
d290: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 tic void Cleanup
d2a0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c (Vdbe *p){. sql
d2b0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 ite3 *db = p->db
d2c0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ;..#ifdef SQLITE
d2d0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 _DEBUG. /* Exec
d2e0: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 ute assert() sta
d2f0: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 tements to ensur
d300: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e e that the Vdbe.
d310: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a apCsr[] and . *
d320: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 * Vdbe.aMem[] ar
d330: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 rays have alread
d340: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 y been cleaned u
d350: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a p. */. int i;.
d360: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 if( p->apCsr )
d370: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e for(i=0; i<p->n
d380: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 Cursor; i++) ass
d390: 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d ert( p->apCsr[i]
d3a0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e ==0 );. if( p->
d3b0: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 aMem ){. for(
d3c0: 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b i=1; i<=p->nMem;
d3d0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d i++) assert( p-
d3e0: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d >aMem[i].flags==
d3f0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b MEM_Undefined );
d400: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 . }.#endif.. s
d410: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
d420: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 p->zErrMsg);.
d430: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a p->zErrMsg = 0;.
d440: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 p->pResultSet
d450: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 = 0;.}../*.** Se
d460: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 t the number of
d470: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 result columns t
d480: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 hat will be retu
d490: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c rned by this SQL
d4a0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 .** statement. T
d4b0: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 his is now set a
d4c0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 t compile time,
d4d0: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 rather than duri
d4e0: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 ng.** execution
d4f0: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 of the vdbe prog
d500: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 ram so that sqli
d510: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 te3_column_count
d520: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c () can.** be cal
d530: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 led on an SQL st
d540: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 atement before s
d550: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a qlite3_step()..*
d560: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
d570: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 beSetNumCols(Vdb
d580: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f e *p, int nResCo
d590: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 lumn){. Mem *pC
d5a0: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b olName;. int n;
d5b0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
d5c0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 p->db;.. relea
d5d0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 seMemArray(p->aC
d5e0: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 olName, p->nResC
d5f0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 olumn*COLNAME_N)
d600: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 ;. sqlite3DbFre
d610: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d e(db, p->aColNam
d620: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f e);. n = nResCo
d630: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a lumn*COLNAME_N;.
d640: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 p->nResColumn
d650: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d = (u16)nResColum
d660: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 n;. p->aColName
d670: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d = pColName = (M
d680: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c em*)sqlite3DbMal
d690: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 locZero(db, size
d6a0: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 of(Mem)*n );. i
d6b0: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d f( p->aColName==
d6c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 0 ) return;. wh
d6d0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a ile( n-- > 0 ){.
d6e0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c pColName->fl
d6f0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a ags = MEM_Null;.
d700: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 pColName->db
d710: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 = p->db;. pC
d720: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a olName++;. }.}.
d730: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e ./*.** Set the n
d740: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 ame of the idx't
d750: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 h column to be r
d760: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 eturned by the S
d770: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a QL statement..**
d780: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 zName must be a
d790: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 pointer to a nu
d7a0: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 l terminated str
d7b0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ing..**.** This
d7c0: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 call must be mad
d7d0: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 e after a call t
d7e0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 o sqlite3VdbeSet
d7f0: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a NumCols()..**.**
d800: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d The final param
d810: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 eter, xDel, must
d820: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 be one of SQLIT
d830: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 E_DYNAMIC, SQLIT
d840: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 E_STATIC.** or S
d850: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e QLITE_TRANSIENT.
d860: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 If it is SQLITE
d870: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 _DYNAMIC, then t
d880: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 he buffer pointe
d890: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 d.** to by zName
d8a0: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 will be freed b
d8b0: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 y sqlite3DbFree(
d8c0: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 ) when the vdbe
d8d0: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f is destroyed..*/
d8e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
d8f0: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 SetColName(. Vd
d900: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 be *p,
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
d920: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e * Vdbe being con
d930: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 figured */. int
d940: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 idx,
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
d960: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e Index of column
d970: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 zName applies t
d980: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 o */. int var,
d990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d9a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f /* One o
d9b0: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 f the COLNAME_*
d9c0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 constants */. c
d9d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 onst char *zName
d9e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
d9f0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 /* Pointer to bu
da00: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 ffer containing
da10: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 name */. void (
da20: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 *xDel)(void*)
da30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 /* Me
da40: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 mory management
da50: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 strategy for zNa
da60: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 me */.){. int r
da70: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 c;. Mem *pColNa
da80: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 me;. assert( id
da90: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 x<p->nResColumn
daa0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 );. assert( var
dab0: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 <COLNAME_N );.
dac0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f if( p->db->mallo
dad0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 cFailed ){. a
dae0: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c ssert( !zName ||
daf0: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 xDel!=SQLITE_DY
db00: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 NAMIC );. ret
db10: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
db20: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
db30: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 p->aColName!=0 )
db40: 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 ;. pColName = &
db50: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 (p->aColName[idx
db60: 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 +var*p->nResColu
db70: 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c mn]);. rc = sql
db80: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 ite3VdbeMemSetSt
db90: 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d r(pColName, zNam
dba0: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 e, -1, SQLITE_UT
dbb0: 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 F8, xDel);. ass
dbc0: 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a ert( rc!=0 || !z
dbd0: 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d Name || (pColNam
dbe0: 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 e->flags&MEM_Ter
dbf0: 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 m)!=0 );. retur
dc00: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 n rc;.}../*.** A
dc10: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 read or write t
dc20: 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f ransaction may o
dc30: 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 r may not be act
dc40: 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 ive on database
dc50: 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 handle.** db. If
dc60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 a transaction i
dc70: 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 s active, commit
dc80: 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 it. If there is
dc90: 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e a.** write-tran
dca0: 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 saction spanning
dcb0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 more than one d
dcc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 atabase file, th
dcd0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 is routine.** ta
dce0: 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 kes care of the
dcf0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 master journal t
dd00: 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 rickery..*/.stat
dd10: 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 ic int vdbeCommi
dd20: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 t(sqlite3 *db, V
dd30: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 dbe *p){. int i
dd40: 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d ;. int nTrans =
dd50: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 0; /* Number o
dd60: 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 f databases with
dd70: 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 an active write
dd80: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a -transaction */.
dd90: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
dda0: 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 E_OK;. int need
ddb0: 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 Xcommit = 0;..#i
ddc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 fdef SQLITE_OMIT
ddd0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 _VIRTUALTABLE.
dde0: 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 /* With this opt
ddf0: 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 ion, sqlite3Vtab
de00: 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 Sync() is define
de10: 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a d to be simply .
de20: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 ** SQLITE_OK s
de30: 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e o p is not used.
de40: 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f . */. UNUSED_
de50: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 PARAMETER(p);.#e
de60: 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 ndif.. /* Befor
de70: 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 e doing anything
de80: 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 else, call the
de90: 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b xSync() callback
dea0: 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 for any. ** vi
deb0: 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 rtual module tab
dec0: 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 les written in t
ded0: 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e his transaction.
dee0: 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a This has to. *
def0: 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 * be done before
df00: 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 determining whe
df10: 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f ther a master jo
df20: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 urnal file is .
df30: 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 ** required, as
df40: 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c an xSync() call
df50: 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 back may add an
df60: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 attached databas
df70: 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 e. ** to the tr
df80: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a ansaction.. */.
df90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 rc = sqlite3Vt
dfa0: 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a abSync(db, p);..
dfb0: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 /* This loop d
dfc0: 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 etermines (a) if
dfd0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b the commit hook
dfe0: 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b should be invok
dff0: 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 ed and. ** (b)
e000: 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 how many databas
e010: 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 e files have ope
e020: 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 n write transact
e030: 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 ions, not . **
e040: 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 including the te
e050: 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 mp database. (b)
e060: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 is important be
e070: 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 cause if more th
e080: 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 an . ** one dat
e090: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 abase file has a
e0a0: 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 n open write tra
e0b0: 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 nsaction, a mast
e0c0: 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 er journal. **
e0d0: 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 file is required
e0e0: 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 for an atomic c
e0f0: 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 ommit.. */ . f
e100: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 or(i=0; rc==SQLI
e110: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e TE_OK && i<db->n
e120: 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 Db; i++){ . B
e130: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e tree *pBt = db->
e140: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 aDb[i].pBt;.
e150: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 if( sqlite3Btree
e160: 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 IsInTrans(pBt) )
e170: 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d {. needXcom
e180: 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 mit = 1;. i
e190: 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e 73 f( i!=1 ) nTrans
e1a0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ++;. sqlite
e1b0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3BtreeEnter(pBt)
e1c0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c ;. rc = sql
e1d0: 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 ite3PagerExclusi
e1e0: 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 veLock(sqlite3Bt
e1f0: 72 65 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a reePager(pBt));.
e200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 sqlite3Btr
e210: 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 eeLeave(pBt);.
e220: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 }. }. if( rc
e230: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
e240: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
e250: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 }.. /* If there
e260: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 are any write-t
e270: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 ransactions at a
e280: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 ll, invoke the c
e290: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 ommit hook */.
e2a0: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 if( needXcommit
e2b0: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 && db->xCommitCa
e2c0: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 llback ){. rc
e2d0: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 = db->xCommitCa
e2e0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d llback(db->pComm
e2f0: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 itArg);. if(
e300: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 rc ){. retu
e310: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 rn SQLITE_CONSTR
e320: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b AINT_COMMITHOOK;
e330: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a . }. }.. /*
e340: 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 The simple case
e350: 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 - no more than
e360: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c one database fil
e370: 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 e (not counting
e380: 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 the. ** TEMP da
e390: 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72 tabase) has a tr
e3a0: 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 ansaction active
e3b0: 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 . There is no
e3c0: 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a need for the. *
e3d0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c * master-journal
e3e0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 .. **. ** If t
e3f0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
e400: 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 of sqlite3BtreeG
e410: 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 etFilename() is
e420: 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 a zero length.
e430: 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 ** string, it me
e440: 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 ans the main dat
e450: 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 abase is :memory
e460: 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 : or a temp file
e470: 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 . In . ** that
e480: 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 case we do not
e490: 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d support atomic m
e4a0: 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 ulti-file commit
e4b0: 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 s, so use the .
e4c0: 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 ** simple case
e4d0: 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 then too.. */.
e4e0: 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 if( 0==sqlite3S
e4f0: 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 trlen30(sqlite3B
e500: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 treeGetFilename(
e510: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 db->aDb[0].pBt))
e520: 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 . || nTrans<=1
e530: 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d . ){. for(i=
e540: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0; rc==SQLITE_OK
e550: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 && i<db->nDb; i
e560: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 ++){. Btree
e570: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
e580: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 i].pBt;. if
e590: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 ( pBt ){.
e5a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc = sqlite3Btr
e5b0: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 eeCommitPhaseOne
e5c0: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 (pBt, 0);.
e5d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
e5e0: 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e Do the commit on
e5f0: 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 ly if all databa
e600: 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 ses successfully
e610: 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 complete phase
e620: 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 1. . ** If on
e630: 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f e of the BtreeCo
e640: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 mmitPhaseOne() c
e650: 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 alls fails, this
e660: 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 indicates an.
e670: 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 ** IO error wh
e680: 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 ile deleting or
e690: 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 truncating a jou
e6a0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 rnal file. It is
e6b0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a unlikely,. *
e6c0: 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 * but could happ
e6d0: 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 en. In this case
e6e0: 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 abandon process
e6f0: 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 ing and return t
e700: 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f he error.. */
e710: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 . for(i=0; rc
e720: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 ==SQLITE_OK && i
e730: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a <db->nDb; i++){.
e740: 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 Btree *pBt
e750: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 = db->aDb[i].pB
e760: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 t;. if( pBt
e770: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){. rc =
e780: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d sqlite3BtreeCom
e790: 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c mitPhaseTwo(pBt,
e7a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 0);. }.
e7b0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 }. if( rc==S
e7c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
e7d0: 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d sqlite3VtabCom
e7e0: 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 mit(db);. }.
e7f0: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d }.. /* The com
e800: 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 plex case - Ther
e810: 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c e is a multi-fil
e820: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 e write-transact
e830: 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a ion active.. **
e840: 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61 This requires a
e850: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
e860: 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 file to ensure t
e870: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 he transaction i
e880: 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 s. ** committed
e890: 20 61 74 6f 6d 69 63 6c 79 2e 0a 20 20 2a 2f 0a atomicly.. */.
e8a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
e8b0: 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 MIT_DISKIO. els
e8c0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 e{. sqlite3_v
e8d0: 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 fs *pVfs = db->p
e8e0: 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 Vfs;. int nee
e8f0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 dSync = 0;. c
e900: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 har *zMaster = 0
e910: 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 ; /* File-name
e920: 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 for the master
e930: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 journal */. c
e940: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e har const *zMain
e950: 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 File = sqlite3Bt
e960: 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 reeGetFilename(d
e970: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a b->aDb[0].pBt);.
e980: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 sqlite3_file
e990: 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 *pMaster = 0;.
e9a0: 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 i64 offset =
e9b0: 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0;. int res;.
e9c0: 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 int retryCou
e9d0: 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 nt = 0;. int
e9e0: 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 nMainFile;..
e9f0: 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 /* Select a mast
ea00: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 er journal file
ea10: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 name */. nMai
ea20: 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 nFile = sqlite3S
ea30: 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c trlen30(zMainFil
ea40: 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 e);. zMaster
ea50: 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 = sqlite3MPrintf
ea60: 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 (db, "%s-mjXXXXX
ea70: 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c X9XXz", zMainFil
ea80: 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 e);. if( zMas
ea90: 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 ter==0 ) return
eaa0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
eab0: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 do {. u32
eac0: 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 iRandom;.
ead0: 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 if( retryCount )
eae0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 {. if( re
eaf0: 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a tryCount>100 ){.
eb00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
eb10: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 3_log(SQLITE_FUL
eb20: 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 L, "MJ delete: %
eb30: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 s", zMaster);.
eb40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f sqlite3O
eb50: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d sDelete(pVfs, zM
eb60: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 aster, 0);.
eb70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
eb80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 }else if( re
eb90: 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 tryCount==1 ){.
eba0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
ebb0: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c _log(SQLITE_FULL
ebc0: 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 , "MJ collide: %
ebd0: 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 s", zMaster);.
ebe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
ebf0: 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 retryCount
ec00: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ++;. sqlite
ec10: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 3_randomness(siz
ec20: 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 eof(iRandom), &i
ec30: 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 Random);. s
ec40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
ec50: 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 13, &zMaster[nMa
ec60: 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 inFile], "-mj%06
ec70: 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 X9%02X",.
ec80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ec90: 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d (iRandom
eca0: 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 >>8)&0xffffff, i
ecb0: 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 Random&0xff);.
ecc0: 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 /* The antip
ecd0: 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 enultimate chara
ece0: 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 cter of the mast
ecf0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 er journal name
ed00: 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 must. ** be
ed10: 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 "9" to avoid na
ed20: 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 me collisions wh
ed30: 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c en using 8+3 fil
ed40: 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 enames. */.
ed50: 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 assert( zMaster
ed60: 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 [sqlite3Strlen30
ed70: 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 (zMaster)-3]=='9
ed80: 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 ' );. sqlit
ed90: 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d e3FileSuffix3(zM
eda0: 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 ainFile, zMaster
edb0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 );. rc = sq
edc0: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 lite3OsAccess(pV
edd0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c fs, zMaster, SQL
ede0: 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 ITE_ACCESS_EXIST
edf0: 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 S, &res);. }w
ee00: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 hile( rc==SQLITE
ee10: 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 _OK && res );.
ee20: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
ee30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 _OK ){. /*
ee40: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 Open the master
ee50: 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 journal. */.
ee60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
ee70: 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c OpenMalloc(pVfs,
ee80: 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 zMaster, &pMast
ee90: 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 er, . S
eea0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 QLITE_OPEN_READW
eeb0: 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e RITE|SQLITE_OPEN
eec0: 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 _CREATE|.
eed0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 SQLITE_OPEN_E
eee0: 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f XCLUSIVE|SQLITE_
eef0: 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 OPEN_MASTER_JOUR
ef00: 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a NAL, 0. );.
ef10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 }. if( rc
ef20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
ef30: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
ef40: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b ee(db, zMaster);
ef50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 . return rc
ef60: 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a ;. }. . /*
ef70: 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 Write the name
ef80: 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 of each database
ef90: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 file in the tra
efa0: 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 nsaction into th
efb0: 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 e new. ** mas
efc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
efd0: 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 . If an error oc
efe0: 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 curs at this poi
eff0: 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 nt close. **
f000: 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d and delete the m
f010: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
f020: 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 le. All the indi
f030: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 vidual journal f
f040: 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c iles. ** stil
f050: 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 l have 'null' as
f060: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 the master jour
f070: 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 nal pointer, so
f080: 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 they will roll.
f090: 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 ** back indep
f0a0: 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 endently if a fa
f0b0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 ilure occurs..
f0c0: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 */. for(i=0
f0d0: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b ; i<db->nDb; i++
f0e0: 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a ){. Btree *
f0f0: 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d pBt = db->aDb[i]
f100: 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 .pBt;. if(
f110: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e sqlite3BtreeIsIn
f120: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 Trans(pBt) ){.
f130: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 char const
f140: 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 *zFile = sqlite
f150: 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 3BtreeGetJournal
f160: 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 name(pBt);.
f170: 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 if( zFile==0
f180: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e ){. con
f190: 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 tinue; /* Ignor
f1a0: 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f e TEMP and :memo
f1b0: 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f ry: databases */
f1c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
f1d0: 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 assert( zFile
f1e0: 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 [0]!=0 );.
f1f0: 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 if( !needSync
f200: 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 && !sqlite3Btree
f210: 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 SyncDisabled(pBt
f220: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e ) ){. n
f230: 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 eedSync = 1;.
f240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 }. r
f250: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 c = sqlite3OsWri
f260: 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c te(pMaster, zFil
f270: 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e e, sqlite3Strlen
f280: 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 30(zFile)+1, off
f290: 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 set);. of
f2a0: 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 fset += sqlite3S
f2b0: 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 trlen30(zFile)+1
f2c0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 ;. if( rc
f2d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
f2e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
f2f0: 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 OsCloseFree(pMas
f300: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ter);.
f310: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 sqlite3OsDelete(
f320: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 pVfs, zMaster, 0
f330: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c );. sql
f340: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a ite3DbFree(db, z
f350: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 Master);.
f360: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
f370: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
f380: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 }.. /* Sy
f390: 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f nc the master jo
f3a0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 urnal file. If t
f3b0: 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 he IOCAP_SEQUENT
f3c0: 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a IAL device. *
f3d0: 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 * flag is set th
f3e0: 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 is is not requir
f3f0: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 ed.. */. i
f400: 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 f( needSync .
f410: 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 && 0==(sqlite3
f420: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 OsDeviceCharacte
f430: 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 ristics(pMaster)
f440: 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 &SQLITE_IOCAP_SE
f450: 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 QUENTIAL). &
f460: 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 & SQLITE_OK!=(rc
f470: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 = sqlite3OsSync
f480: 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 (pMaster, SQLITE
f490: 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 _SYNC_NORMAL)).
f4a0: 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 ){. sqli
f4b0: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 te3OsCloseFree(p
f4c0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 Master);. s
f4d0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 qlite3OsDelete(p
f4e0: 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 Vfs, zMaster, 0)
f4f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 ;. sqlite3D
f500: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 bFree(db, zMaste
f510: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e r);. return
f520: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 rc;. }..
f530: 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 /* Sync all the
f540: 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 db files involve
f550: 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 d in the transac
f560: 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 tion. The same c
f570: 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 all. ** sets
f580: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
f590: 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 al pointer in ea
f5a0: 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f ch individual jo
f5b0: 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a urnal. If. **
f5c0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 an error occurs
f5d0: 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 here, do not de
f5e0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 lete the master
f5f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 journal file..
f600: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 **. ** If t
f610: 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 he error occurs
f620: 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 during the first
f630: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 call to. **
f640: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d sqlite3BtreeComm
f650: 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 itPhaseOne(), th
f660: 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 en there is a ch
f670: 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 ance that the.
f680: 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 ** master jour
f690: 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 nal file will be
f6a0: 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 orphaned. But w
f6b0: 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 e cannot delete
f6c0: 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 it,. ** in ca
f6d0: 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f se the master jo
f6e0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 urnal file name
f6f0: 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f was written into
f700: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 the journal.
f710: 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 ** file before
f720: 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 the failure occu
f730: 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 rred.. */.
f740: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 for(i=0; rc==SQ
f750: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d LITE_OK && i<db-
f760: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 >nDb; i++){ .
f770: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
f780: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
f790: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b if( pBt ){
f7a0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 . rc = sq
f7b0: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
f7c0: 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d PhaseOne(pBt, zM
f7d0: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a aster);. }.
f7e0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
f7f0: 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 3OsCloseFree(pMa
f800: 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 ster);. asser
f810: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 t( rc!=SQLITE_BU
f820: 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 SY );. if( rc
f830: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
f840: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
f850: 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b ee(db, zMaster);
f860: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 . return rc
f870: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
f880: 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 Delete the maste
f890: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 r journal file.
f8a0: 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 This commits the
f8b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 transaction. Af
f8c0: 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 ter. ** doing
f8d0: 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 this the direct
f8e0: 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 ory is synced ag
f8f0: 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 ain before any i
f900: 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a ndividual. **
f910: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c transaction fil
f920: 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a es are deleted..
f930: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 */. rc =
f940: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 sqlite3OsDelete(
f950: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 pVfs, zMaster, 1
f960: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 );. sqlite3Db
f970: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 Free(db, zMaster
f980: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d );. zMaster =
f990: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 0;. if( rc )
f9a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 {. return r
f9b0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a c;. }.. /*
f9c0: 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 All files and d
f9d0: 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 irectories have
f9e0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e already been syn
f9f0: 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c ced, so the foll
fa00: 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c owing. ** cal
fa10: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 ls to sqlite3Btr
fa20: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f eeCommitPhaseTwo
fa30: 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 () are only clos
fa40: 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 ing files and.
fa50: 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 ** deleting or
fa60: 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 truncating jour
fa70: 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 nals. If somethi
fa80: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 ng goes wrong wh
fa90: 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 ile. ** this
faa0: 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 is happening we
fab0: 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 don't really car
fac0: 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 e. The integrity
fad0: 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 of the. ** t
fae0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c ransaction is al
faf0: 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 ready guaranteed
fb00: 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 , but some stray
fb10: 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 'cold' journals
fb20: 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c . ** may be l
fb30: 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 ying around. Ret
fb40: 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 urning an error
fb50: 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 code won't help
fb60: 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a matters.. */.
fb70: 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 disable_simu
fb80: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 lated_io_errors(
fb90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 );. sqlite3Be
fba0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 ginBenignMalloc(
fbb0: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 );. for(i=0;
fbc0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
fbd0: 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 . Btree *p
fbe0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e Bt = db->aDb[i].
fbf0: 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 pBt;. if( p
fc00: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 Bt ){. sq
fc10: 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
fc20: 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 PhaseTwo(pBt, 1)
fc30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
fc40: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 sqlite3EndBe
fc50: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 nignMalloc();.
fc60: 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 enable_simulat
fc70: 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a ed_io_errors();.
fc80: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 . sqlite3Vtab
fc90: 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a Commit(db);. }.
fca0: 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e #endif.. return
fcb0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 rc;.}../* .** T
fcc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 his routine chec
fcd0: 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 ks that the sqli
fce0: 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 te3.nVdbeActive
fcf0: 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a count variable.*
fd00: 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 * matches the nu
fd10: 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 mber of vdbe's i
fd20: 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 n the list sqlit
fd30: 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 e3.pVdbe that ar
fd40: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 e.** currently a
fd50: 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 ctive. An assert
fd60: 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 ion fails if the
fd70: 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e two counts do n
fd80: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 ot match..** Thi
fd90: 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c s is an internal
fda0: 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 self-check only
fdb0: 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 - it is not an
fdc0: 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 essential proces
fdd0: 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a sing.** step..**
fde0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f .** This is a no
fdf0: 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 -op if NDEBUG is
fe00: 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 defined..*/.#if
fe10: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 ndef NDEBUG.stat
fe20: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 ic void checkAct
fe30: 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 iveVdbeCnt(sqlit
fe40: 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 e3 *db){. Vdbe
fe50: 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 *p;. int cnt =
fe60: 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 0;. int nWrite
fe70: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 = 0;. int nRead
fe80: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e = 0;. p = db->
fe90: 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 pVdbe;. while(
fea0: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c p ){. if( sql
feb0: 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 ite3_stmt_busy((
fec0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 sqlite3_stmt*)p)
fed0: 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b ){. cnt++;
fee0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 . if( p->re
fef0: 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 adOnly==0 ) nWri
ff00: 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 te++;. if(
ff10: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e p->bIsReader ) n
ff20: 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 Read++;. }.
ff30: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a p = p->pNext;.
ff40: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e }. assert( cn
ff50: 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 t==db->nVdbeActi
ff60: 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 ve );. assert(
ff70: 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 nWrite==db->nVdb
ff80: 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 eWrite );. asse
ff90: 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e rt( nRead==db->n
ffa0: 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 VdbeRead );.}.#e
ffb0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 lse.#define chec
ffc0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 kActiveVdbeCnt(x
ffd0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 ).#endif../*.**
ffe0: 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 If the Vdbe pass
fff0: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 ed as the first
10000 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 argument opened
10010 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e a statement-tran
10020 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 saction,.** clos
10030 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 e it now. Argume
10040 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 nt eOp must be e
10050 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f ither SAVEPOINT_
10060 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 ROLLBACK or.** S
10070 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 AVEPOINT_RELEASE
10080 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 . If it is SAVEP
10090 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 OINT_ROLLBACK, t
100a0 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e hen the statemen
100b0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e t.** transaction
100c0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e is rolled back.
100d0 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 If eOp is SAVEP
100e0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 OINT_RELEASE, th
100f0 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 en the .** state
10100 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
10110 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a is committed..*
10120 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 *.** If an IO er
10130 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 ror occurs, an S
10140 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 QLITE_IOERR_XXX
10150 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 error code is re
10160 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 turned. .** Othe
10170 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e rwise SQLITE_OK.
10180 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
10190 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e dbeCloseStatemen
101a0 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 t(Vdbe *p, int e
101b0 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a Op){. sqlite3 *
101c0 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 const db = p->db
101d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c ;. int rc = SQL
101e0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 ITE_OK;.. /* If
101f0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 p->iStatement i
10200 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a s greater than z
10210 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 ero, then this V
10220 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 dbe opened a .
10230 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 ** statement tra
10240 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 nsaction that sh
10250 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 ould be closed h
10260 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 ere. The only ex
10270 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 ception. ** is
10280 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 that an IO error
10290 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 may have occurr
102a0 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 ed, causing an e
102b0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 mergency rollbac
102c0 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 k.. ** In this
102d0 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 case (db->nState
102e0 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 ment==0), and th
102f0 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 ere is nothing t
10300 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 o do.. */. if(
10310 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 db->nStatement
10320 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 && p->iStatement
10330 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
10340 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 const int iSa
10350 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 vepoint = p->iSt
10360 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 atement-1;..
10370 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 assert( eOp==SAV
10380 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 EPOINT_ROLLBACK
10390 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e || eOp==SAVEPOIN
103a0 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 T_RELEASE);.
103b0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 assert( db->nSta
103c0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 tement>0 );.
103d0 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 assert( p->iStat
103e0 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 ement==(db->nSta
103f0 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 tement+db->nSave
10400 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 point) );.. f
10410 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 or(i=0; i<db->nD
10420 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 b; i++){ .
10430 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 int rc2 = SQLITE
10440 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 _OK;. Btree
10450 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
10460 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 i].pBt;. if
10470 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 ( pBt ){.
10480 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f if( eOp==SAVEPO
10490 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a INT_ROLLBACK ){.
104a0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 rc2 =
104b0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 sqlite3BtreeSave
104c0 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 point(pBt, SAVEP
104d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 OINT_ROLLBACK, i
104e0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 Savepoint);.
104f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
10500 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b ( rc2==SQLITE_OK
10510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 ){. rc
10520 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 2 = sqlite3Btree
10530 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 Savepoint(pBt, S
10540 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 AVEPOINT_RELEASE
10550 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 , iSavepoint);.
10560 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
10570 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
10580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 OK ){.
10590 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 rc = rc2;.
105a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
105b0 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 }. db->nState
105c0 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 ment--;. p->i
105d0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a Statement = 0;..
105e0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
105f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 TE_OK ){. i
10600 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e f( eOp==SAVEPOIN
10610 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 T_ROLLBACK ){.
10620 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
10630 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 e3VtabSavepoint(
10640 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f db, SAVEPOINT_RO
10650 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 LLBACK, iSavepoi
10660 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 nt);. }.
10670 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 if( rc==SQLIT
10680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
10690 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 rc = sqlite3Vtab
106a0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 Savepoint(db, SA
106b0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c VEPOINT_RELEASE,
106c0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 iSavepoint);.
106d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
106e0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 /* If the state
106f0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
10700 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 is being rolled
10710 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 back, also rest
10720 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 ore the . **
10730 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 database handles
10740 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 deferred constr
10750 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 aint counter to
10760 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 the value it had
10770 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 when . ** th
10780 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e e statement tran
10790 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e saction was open
107a0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 ed. */. if(
107b0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 eOp==SAVEPOINT_R
107c0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 OLLBACK ){.
107d0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f db->nDeferredCo
107e0 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 ns = p->nStmtDef
107f0 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e Cons;. db->
10800 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 nDeferredImmCons
10810 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d = p->nStmtDefIm
10820 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d mCons;. }. }
10830 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
10840 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 ./*.** This func
10850 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 tion is called w
10860 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f hen a transactio
10870 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 n opened by the
10880 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e database .** han
10890 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 dle associated w
108a0 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 ith the VM passe
108b0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 d as an argument
108c0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 is about to be
108d0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 .** committed. I
108e0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 f there are outs
108f0 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 tanding deferred
10900 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e foreign key con
10910 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 straint.** viola
10920 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 tions, return SQ
10930 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 LITE_ERROR. Othe
10940 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b rwise, SQLITE_OK
10950 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 ..**.** If there
10960 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 are outstanding
10970 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 FK violations a
10980 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e nd this function
10990 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c returns .** SQL
109a0 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 ITE_ERROR, set t
109b0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 he result of the
109c0 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f VM to SQLITE_CO
109d0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e NSTRAINT_FOREIGN
109e0 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 KEY.** and write
109f0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 an error messag
10a00 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 e to it. Then re
10a10 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
10a20 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 R..*/.#ifndef SQ
10a30 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 LITE_OMIT_FOREIG
10a40 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 N_KEY.int sqlite
10a50 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 3VdbeCheckFk(Vdb
10a60 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 e *p, int deferr
10a70 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a ed){. sqlite3 *
10a80 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 db = p->db;. if
10a90 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 ( (deferred && (
10aa0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e db->nDeferredCon
10ab0 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 s+db->nDeferredI
10ac0 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c mmCons)>0) . |
10ad0 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 | (!deferred &&
10ae0 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 p->nFkConstraint
10af0 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d >0) . ){. p-
10b00 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e >rc = SQLITE_CON
10b10 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b STRAINT_FOREIGNK
10b20 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 EY;. p->error
10b30 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 Action = OE_Abor
10b40 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 t;. sqlite3Se
10b50 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72 tString(&p->zErr
10b60 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47 Msg, db, "FOREIG
10b70 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 N KEY constraint
10b80 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 failed");. r
10b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
10ba0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e OR;. }. return
10bb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 SQLITE_OK;.}.#e
10bc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 ndif../*.** This
10bd0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c routine is call
10be0 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 ed the when a VD
10bf0 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 BE tries to halt
10c00 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a . If the VDBE.*
10c10 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 * has made chang
10c20 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 es and is in aut
10c30 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 ocommit mode, th
10c40 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a en commit those.
10c50 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 ** changes. If
10c60 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 a rollback is ne
10c70 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 eded, then do th
10c80 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a e rollback..**.*
10c90 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
10ca0 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 s the only way t
10cb0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 o move the state
10cc0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a of a VM from.**
10cd0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 SQLITE_MAGIC_RU
10ce0 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 N to SQLITE_MAGI
10cf0 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 C_HALT. It is h
10d00 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 armless to.** ca
10d10 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 ll this on a VM
10d20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 that is in the S
10d30 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 QLITE_MAGIC_HALT
10d40 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 state..**.** Re
10d50 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f turn an error co
10d60 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d de. If the comm
10d70 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d it could not com
10d80 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 plete because of
10d90 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 .** lock content
10da0 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 ion, return SQLI
10db0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c TE_BUSY. If SQL
10dc0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 ITE_BUSY is retu
10dd0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e rned, it.** mean
10de0 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 s the close did
10df0 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e not happen and n
10e00 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 eeds to be repea
10e10 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 ted..*/.int sqli
10e20 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 te3VdbeHalt(Vdbe
10e30 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 *p){. int rc;
10e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10e50 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 /* Used
10e60 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 to store transie
10e70 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 nt return codes
10e80 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 */. sqlite3 *db
10e90 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 = p->db;.. /*
10ea0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f This function co
10eb0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 ntains the logic
10ec0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 that determines
10ed0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 if a statement
10ee0 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 or. ** transact
10ef0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d ion will be comm
10f00 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 itted or rolled
10f10 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 back as a result
10f20 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 of the. ** exe
10f30 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 cution of this v
10f40 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 irtual machine.
10f50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e . **. ** If an
10f60 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 y of the followi
10f70 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a ng errors occur:
10f80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 . **. ** S
10f90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a QLITE_NOMEM. **
10fa0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 SQLITE_IOER
10fb0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 R. ** SQLIT
10fc0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 E_FULL. **
10fd0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 SQLITE_INTERRUPT
10fe0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 . **. ** Then
10ff0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 the internal cac
11000 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 he might have be
11010 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e en left in an in
11020 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 consistent. **
11030 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 state. We need
11040 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 to rollback the
11050 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 statement transa
11060 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 ction, if there
11070 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 is. ** one, or
11080 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 the complete tra
11090 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 nsaction if ther
110a0 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e e is no statemen
110b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 t transaction..
110c0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 */.. if( p->db
110d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
110e0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 {. p->rc = SQ
110f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a LITE_NOMEM;. }.
11100 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c if( p->aOnceFl
11110 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 ag ) memset(p->a
11120 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e OnceFlag, 0, p->
11130 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c nOnceFlag);. cl
11140 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 oseAllCursors(p)
11150 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 ;. if( p->magic
11160 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e !=VDBE_MAGIC_RUN
11170 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ){. return S
11180 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 QLITE_OK;. }.
11190 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 checkActiveVdbeC
111a0 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f nt(db);.. /* No
111b0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 commit or rollb
111c0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 ack needed if th
111d0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 e program never
111e0 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 started or if th
111f0 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 e. ** SQL state
11200 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 ment does not re
11210 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 ad or write a da
11220 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f tabase file. */
11230 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 . if( p->pc>=0
11240 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 && p->bIsReader
11250 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 ){. int mrc;
11260 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 /* Primary err
11270 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e or code from p->
11280 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 rc */. int eS
11290 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a tatementOp = 0;.
112a0 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 int isSpecia
112b0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 lError;
112c0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 /* Set to tru
112d0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 e if a 'special'
112e0 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f error */.. /
112f0 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 * Lock all btree
11300 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 s used by the st
11310 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 atement */. s
11320 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 qlite3VdbeEnter(
11330 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 p);.. /* Chec
11340 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 k for one of the
11350 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 special errors
11360 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e */. mrc = p->
11370 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 61 rc & 0xff;. a
11380 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 51 ssert( p->rc!=SQ
11390 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b LITE_IOERR_BLOCK
113a0 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 65 ED ); /* This e
113b0 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 65 rror no longer e
113c0 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 53 xists */. isS
113d0 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 pecialError = mr
113e0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 c==SQLITE_NOMEM
113f0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 || mrc==SQLITE_I
11400 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 OERR.
11410 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 || mrc
11420 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 ==SQLITE_INTERRU
11430 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 PT || mrc==SQLIT
11440 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 E_FULL;. if(
11450 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 isSpecialError )
11460 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 {. /* If th
11470 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 64 e query was read
11480 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 -only and the er
11490 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 ror code is SQLI
114a0 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 TE_INTERRUPT, .
114b0 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 ** no rollb
114c0 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 ack is necessary
114d0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 . Otherwise, at
114e0 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e least a savepoin
114f0 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e t . ** tran
11500 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 saction must be
11510 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 rolled back to r
11520 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 estore the datab
11530 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 ase to a .
11540 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 ** consistent st
11550 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 ate.. **.
11560 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 ** Even if t
11570 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 he statement is
11580 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 read-only, it is
11590 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 important to pe
115a0 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 rform. ** a
115b0 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 statement or tr
115c0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 ansaction rollba
115d0 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 ck operation. If
115e0 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 the error .
115f0 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 ** occurred wh
11600 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 ile writing to t
11610 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d he journal, sub-
11620 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 journal or datab
11630 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c ase. ** fil
11640 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 e as part of an
11650 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 effort to free u
11660 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73 p cache space (s
11670 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 ee function.
11680 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 ** pagerStress
11690 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 () in pager.c),
116a0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 the rollback is
116b0 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 required to rest
116c0 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 ore . ** th
116d0 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e e pager to a con
116e0 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 sistent state..
116f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
11700 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c ( !p->readOnly |
11710 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e | mrc!=SQLITE_IN
11720 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 TERRUPT ){.
11730 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c if( (mrc==SQL
11740 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 ITE_NOMEM || mrc
11750 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 ==SQLITE_FULL) &
11760 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 & p->usesStmtJou
11770 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 rnal ){.
11780 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d eStatementOp =
11790 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 SAVEPOINT_ROLLB
117a0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c ACK;. }el
117b0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a se{. /*
117c0 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 We are forced t
117d0 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 o roll back the
117e0 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 active transacti
117f0 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 on. Before doing
11800 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f . ** so
11810 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 , abort any othe
11820 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 r statements thi
11830 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 s handle current
11840 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 ly has active..
11850 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 */.
11860 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c sqlite3Rol
11870 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c lbackAll(db, SQL
11880 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 ITE_ABORT_ROLLBA
11890 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 CK);. s
118a0 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 qlite3CloseSavep
118b0 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 oints(db);.
118c0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d db->autoCom
118d0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 mit = 1;.
118e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
118f0 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 .. /* Check f
11900 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 or immediate for
11910 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 eign key violati
11920 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 ons. */. if(
11930 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b p->rc==SQLITE_OK
11940 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
11950 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 3VdbeCheckFk(p,
11960 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 0);. }. .
11970 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d /* If the auto-
11980 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 commit flag is s
11990 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 et and this is t
119a0 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 he only active w
119b0 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d riter . ** VM
119c0 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 , then we do eit
119d0 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 her a commit or
119e0 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 rollback of the
119f0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 current transact
11a00 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 ion. . **.
11a10 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 ** Note: This b
11a20 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 lock also runs i
11a30 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 f one of the spe
11a40 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 cial errors hand
11a50 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 led . ** abov
11a60 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 e has occurred.
11a70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
11a80 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 !sqlite3VtabInSy
11a90 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 nc(db) . &&
11aa0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a db->autoCommit .
11ab0 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 && db->nVdb
11ac0 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 eWrite==(p->read
11ad0 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b Only==0) . ){
11ae0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 . if( p->rc
11af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 ==SQLITE_OK || (
11b00 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d p->errorAction==
11b10 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 OE_Fail && !isSp
11b20 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 ecialError) ){.
11b30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
11b40 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 te3VdbeCheckFk(p
11b50 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 , 1);. if
11b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
11b70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 ){. if(
11b80 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e NEVER(p->readOn
11b90 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ly) ){.
11ba0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 sqlite3VdbeLe
11bb0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 ave(p);.
11bc0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
11bd0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 E_ERROR;.
11be0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 }. r
11bf0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 c = SQLITE_CONST
11c00 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 RAINT_FOREIGNKEY
11c10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
11c20 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 . /* T
11c30 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 he auto-commit f
11c40 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 lag is true, the
11c50 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 vdbe program wa
11c60 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 s successful .
11c70 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 ** or hi
11c80 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 t an 'OR FAIL' c
11c90 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 onstraint and th
11ca0 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 ere are no defer
11cb0 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 red foreign.
11cc0 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e ** key con
11cd0 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 straints to hold
11ce0 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 up the transact
11cf0 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 ion. This means
11d00 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 a commit .
11d10 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 ** is requir
11d20 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 ed. */.
11d30 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 rc = vdbeCommit
11d40 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 (db, p);.
11d50 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 }. if( r
11d60 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 c==SQLITE_BUSY &
11d70 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b & p->readOnly ){
11d80 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
11d90 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a e3VdbeLeave(p);.
11da0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
11db0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 SQLITE_BUSY;.
11dc0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
11dd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
11de0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 . p->rc
11df0 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 = rc;.
11e00 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b sqlite3Rollback
11e10 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f All(db, SQLITE_O
11e20 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 K);. }els
11e30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d e{. db-
11e40 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d >nDeferredCons =
11e50 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 0;. db
11e60 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f ->nDeferredImmCo
11e70 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 ns = 0;.
11e80 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e db->flags &= ~
11e90 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b SQLITE_DeferFKs;
11ea0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
11eb0 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c e3CommitInternal
11ec0 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 Changes(db);.
11ed0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c }. }el
11ee0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 se{. sqli
11ef0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 te3RollbackAll(d
11f00 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 b, SQLITE_OK);.
11f10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d }. db-
11f20 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b >nStatement = 0;
11f30 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 . }else if( e
11f40 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 StatementOp==0 )
11f50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 {. if( p->r
11f60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 c==SQLITE_OK ||
11f70 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d p->errorAction==
11f80 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 OE_Fail ){.
11f90 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 eStatementOp
11fa0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 = SAVEPOINT_RELE
11fb0 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 ASE;. }else
11fc0 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 if( p->errorAct
11fd0 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b ion==OE_Abort ){
11fe0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d . eStatem
11ff0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e entOp = SAVEPOIN
12000 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 T_ROLLBACK;.
12010 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
12020 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b sqlite3Rollback
12030 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 All(db, SQLITE_A
12040 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a BORT_ROLLBACK);.
12050 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 sqlite3C
12060 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 loseSavepoints(d
12070 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e b);. db->
12080 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a autoCommit = 1;.
12090 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
120a0 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 . /* If eStat
120b0 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a ementOp is non-z
120c0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 ero, then a stat
120d0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
120e0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a n needs to. *
120f0 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f * be committed o
12100 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 r rolled back. C
12110 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 all sqlite3VdbeC
12120 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 loseStatement()
12130 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e to. ** do so.
12140 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 If this operati
12150 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 on returns an er
12160 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 ror, and the cur
12170 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 rent statement.
12180 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 ** error code
12190 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 is SQLITE_OK or
121a0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
121b0 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 NT, then promote
121c0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 the. ** curr
121d0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 ent statement er
121e0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f ror code.. */
121f0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d . if( eStatem
12200 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 entOp ){. r
12210 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 c = sqlite3VdbeC
12220 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c loseStatement(p,
12230 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a eStatementOp);.
12240 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a if( rc ){.
12250 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 if( p->r
12260 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 c==SQLITE_OK ||
12270 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 (p->rc&0xff)==SQ
12280 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 LITE_CONSTRAINT
12290 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e ){. p->
122a0 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 rc = rc;.
122b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
122c0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 (db, p->zErrMsg)
122d0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a ;. p->z
122e0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 ErrMsg = 0;.
122f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 }. sq
12300 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c lite3RollbackAll
12310 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 (db, SQLITE_ABOR
12320 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 T_ROLLBACK);.
12330 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 sqlite3Clos
12340 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b eSavepoints(db);
12350 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 . db->aut
12360 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 oCommit = 1;.
12370 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 }. }. .
12380 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 /* If this was
12390 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 an INSERT, UPDA
123a0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 TE or DELETE and
123b0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 no statement tr
123c0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a ansaction. **
123d0 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 has been rolled
123e0 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 back, update th
123f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 e database conne
12400 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 ction change-cou
12410 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 nter. . */.
12420 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 if( p->changeC
12430 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 ntOn ){. if
12440 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d ( eStatementOp!=
12450 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
12460 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 CK ){. sq
12470 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e lite3VdbeSetChan
12480 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e ges(db, p->nChan
12490 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 ge);. }else
124a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
124b0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 3VdbeSetChanges(
124c0 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a db, 0);. }.
124d0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 p->nChange
124e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
124f0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 /* Release the
12500 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c locks */. sql
12510 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 ite3VdbeLeave(p)
12520 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 ;. }.. /* We h
12530 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 ave successfully
12540 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 halted and clos
12550 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f ed the VM. Reco
12560 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f rd this fact. */
12570 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 . if( p->pc>=0
12580 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 ){. db->nVdbe
12590 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 Active--;. if
125a0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 ( !p->readOnly )
125b0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d db->nVdbeWrite-
125c0 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 -;. if( p->bI
125d0 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 sReader ) db->nV
125e0 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 dbeRead--;. a
125f0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 ssert( db->nVdbe
12600 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 Active>=db->nVdb
12610 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 eRead );. ass
12620 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 ert( db->nVdbeRe
12630 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 ad>=db->nVdbeWri
12640 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 te );. assert
12650 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 ( db->nVdbeWrite
12660 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e >=0 );. }. p->
12670 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 magic = VDBE_MAG
12680 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b IC_HALT;. check
12690 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 ActiveVdbeCnt(db
126a0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e );. if( p->db->
126b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a mallocFailed ){.
126c0 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 p->rc = SQLI
126d0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 TE_NOMEM;. }..
126e0 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d /* If the auto-
126f0 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 commit flag is s
12700 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e et to true, then
12710 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 any locks that
12720 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 were held. ** b
12730 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 y connection db
12740 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 have now been re
12750 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c leased. Call sql
12760 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e ite3ConnectionUn
12770 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 locked() . ** t
12780 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 o invoke any req
12790 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 uired unlock-not
127a0 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 ify callbacks..
127b0 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 */. if( db->au
127c0 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 toCommit ){.
127d0 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f sqlite3Connectio
127e0 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 nUnlocked(db);.
127f0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 }.. assert( db
12800 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 ->nVdbeActive>0
12810 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 || db->autoCommi
12820 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 t==0 || db->nSta
12830 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 tement==0 );. r
12840 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 eturn (p->rc==SQ
12850 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 LITE_BUSY ? SQLI
12860 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 TE_BUSY : SQLITE
12870 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 _OK);.}.../*.**
12880 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 Each VDBE holds
12890 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 the result of th
128a0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 e most recent sq
128b0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c lite3_step() cal
128c0 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 l.** in p->rc.
128d0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 This routine set
128e0 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 s that result ba
128f0 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e ck to SQLITE_OK.
12900 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
12910 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 VdbeResetStepRes
12920 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ult(Vdbe *p){.
12930 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f p->rc = SQLITE_O
12940 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 K;.}../*.** Copy
12950 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 the error code
12960 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 and error messag
12970 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 e belonging to t
12980 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a he VDBE passed.*
12990 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 * as the first a
129a0 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 rgument to its d
129b0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 atabase handle (
129c0 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c so that they wil
129d0 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 l be .** returne
129e0 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 d by calls to sq
129f0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 lite3_errcode()
12a00 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d and sqlite3_errm
12a10 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 sg())..**.** Thi
12a20 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 s function does
12a30 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 not clear the VD
12a40 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 BE error code or
12a50 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a message, just.*
12a60 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f * copies them to
12a70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 the database ha
12a80 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c ndle..*/.int sql
12a90 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 ite3VdbeTransfer
12aa0 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a Error(Vdbe *p){.
12ab0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
12ac0 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 p->db;. int rc
12ad0 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 = p->rc;. if( p
12ae0 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 ->zErrMsg ){.
12af0 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 u8 mallocFailed
12b00 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 = db->mallocFai
12b10 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 led;. sqlite3
12b20 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f BeginBenignMallo
12b30 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d c();. if( db-
12b40 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 >pErr==0 ) db->p
12b50 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c Err = sqlite3Val
12b60 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 ueNew(db);. s
12b70 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 qlite3ValueSetSt
12b80 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 r(db->pErr, -1,
12b90 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 p->zErrMsg, SQLI
12ba0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f TE_UTF8, SQLITE_
12bb0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 TRANSIENT);.
12bc0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e sqlite3EndBenign
12bd0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 Malloc();. db
12be0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
12bf0 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 mallocFailed;.
12c00 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d db->errCode =
12c10 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 rc;. }else{.
12c20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 sqlite3Error(d
12c30 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 b, rc, 0);. }.
12c40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 return rc;.}..#
12c50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
12c60 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a BLE_SQLLOG./*.**
12c70 20 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f If an SQLITE_CO
12c80 4e 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b NFIG_SQLLOG hook
12c90 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 is registered a
12ca0 6e 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 nd the VM has be
12cb0 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f en run, .** invo
12cc0 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 ke it..*/.static
12cd0 20 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 void vdbeInvoke
12ce0 53 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b Sqllog(Vdbe *v){
12cf0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c . if( sqlite3Gl
12d00 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c obalConfig.xSqll
12d10 6f 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c og && v->rc==SQL
12d20 49 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 ITE_OK && v->zSq
12d30 6c 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b l && v->pc>=0 ){
12d40 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 . char *zExpa
12d50 6e 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 nded = sqlite3Vd
12d60 62 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 beExpandSql(v, v
12d70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 ->zSql);. ass
12d80 65 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 ert( v->db->init
12d90 2e 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 .busy==0 );.
12da0 69 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b if( zExpanded ){
12db0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c . sqlite3Gl
12dc0 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c obalConfig.xSqll
12dd0 6f 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 og(. sq
12de0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
12df0 67 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d g.pSqllogArg, v-
12e00 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 >db, zExpanded,
12e10 31 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 1. );.
12e20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 sqlite3DbFree(v
12e30 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 ->db, zExpanded)
12e40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 ;. }. }.}.#e
12e50 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 lse.# define vdb
12e60 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 eInvokeSqllog(x)
12e70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 .#endif../*.** C
12e80 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 lean up a VDBE a
12e90 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 fter execution b
12ea0 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 ut do not delete
12eb0 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 the VDBE just y
12ec0 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 et..** Write any
12ed0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 error messages
12ee0 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 into *pzErrMsg.
12ef0 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 Return the resu
12f00 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 lt code..**.** A
12f10 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e fter this routin
12f20 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 e is run, the VD
12f30 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 BE should be rea
12f40 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 dy to be execute
12f50 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a d.** again..**.*
12f60 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 * To look at it
12f70 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 another way, thi
12f80 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 s routine resets
12f90 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 the state of th
12fa0 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 e.** virtual mac
12fb0 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d hine from VDBE_M
12fc0 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 AGIC_RUN or VDBE
12fd0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b _MAGIC_HALT back
12fe0 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 to.** VDBE_MAGI
12ff0 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 C_INIT..*/.int s
13000 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 qlite3VdbeReset(
13010 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 Vdbe *p){. sqli
13020 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 te3 *db;. db =
13030 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 p->db;.. /* If
13040 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 the VM did not r
13050 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e un to completion
13060 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e or if it encoun
13070 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 tered an. ** er
13080 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 ror, then it mig
13090 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e ht not have been
130a0 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 halted properly
130b0 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 . So halt. **
130c0 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 it now.. */. s
130d0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 qlite3VdbeHalt(p
130e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 );.. /* If the
130f0 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 VDBE has be run
13100 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 even partially,
13110 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 then transfer th
13120 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a e error code. *
13130 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 * and error mess
13140 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 age from the VDB
13150 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 E into the main
13160 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 database structu
13170 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 re. But. ** if
13180 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 the VDBE has ju
13190 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 st been set to r
131a0 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 un but has not a
131b0 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 ctually executed
131c0 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 any. ** instru
131d0 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 ctions yet, leav
131e0 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 e the main datab
131f0 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d ase error inform
13200 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e ation unchanged.
13210 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 . */. if( p->p
13220 63 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 c>=0 ){. vdbe
13230 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b InvokeSqllog(p);
13240 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
13250 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 TransferError(p)
13260 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 ;. sqlite3DbF
13270 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d ree(db, p->zErrM
13280 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 sg);. p->zErr
13290 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 Msg = 0;. if(
132a0 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 p->runOnlyOnce
132b0 29 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 ) p->expired = 1
132c0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d ;. }else if( p-
132d0 3e 72 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 >rc && p->expire
132e0 64 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 d ){. /* The
132f0 65 78 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 expired flag was
13300 20 73 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 set on the VDBE
13310 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 before the firs
13320 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f t call. ** to
13330 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e sqlite3_step().
13340 20 46 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 For consistency
13350 20 28 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f (since sqlite3_
13360 73 74 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a step() was. *
13370 2a 20 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 * called), set t
13380 68 65 20 64 61 74 61 62 61 73 65 20 65 72 72 6f he database erro
13390 72 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 r in this case a
133a0 73 20 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 s well.. */.
133b0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 sqlite3Error(
133c0 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 db, p->rc, p->zE
133d0 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 rrMsg ? "%s" : 0
133e0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 , p->zErrMsg);.
133f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
13400 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 (db, p->zErrMsg)
13410 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 ;. p->zErrMsg
13420 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 = 0;. }.. /*
13430 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f Reclaim all memo
13440 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 ry used by the V
13450 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e DBE. */. Clean
13460 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 up(p);.. /* Sav
13470 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f e profiling info
13480 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 rmation from thi
13490 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f s VDBE run.. */
134a0 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f .#ifdef VDBE_PRO
134b0 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c FILE. {. FIL
134c0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 E *out = fopen("
134d0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 vdbe_profile.out
134e0 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 ", "a");. if(
134f0 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e out ){. in
13500 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e t i;. fprin
13510 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 tf(out, "---- ")
13520 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b ;. for(i=0;
13530 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b i<p->nOp; i++){
13540 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 . fprintf
13550 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d (out, "%02x", p-
13560 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b >aOp[i].opcode);
13570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 . }. f
13580 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 printf(out, "\n"
13590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e );. if( p->
135a0 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 zSql ){.
135b0 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a char c, pc = 0;.
135c0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 fprintf(
135d0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 out, "-- ");.
135e0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 for(i=0; (c
135f0 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d = p->zSql[i])!=
13600 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 0; i++){.
13610 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 if( pc=='\n'
13620 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 ) fprintf(out, "
13630 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 -- ");.
13640 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 putc(c, out);.
13650 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b pc = c;
13660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
13670 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 if( pc!='\n'
13680 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 ) fprintf(out, "
13690 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 \n");. }.
136a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 for(i=0; i<p
136b0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 ->nOp; i++){.
136c0 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 char zHdr[1
136d0 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 00];. sql
136e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 ite3_snprintf(si
136f0 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 zeof(zHdr), zHdr
13700 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 , "%6u %12llu %8
13710 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 llu ",.
13720 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c p->aOp[i].cnt,
13730 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 . p->a
13740 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 Op[i].cycles,.
13750 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b p->aOp[
13760 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f i].cnt>0 ? p->aO
13770 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 p[i].cycles/p->a
13780 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 Op[i].cnt : 0.
13790 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 );.
137a0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 fprintf(out, "%
137b0 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 s", zHdr);.
137c0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 sqlite3VdbePr
137d0 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 intOp(out, i, &p
137e0 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 ->aOp[i]);.
137f0 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 }. fclose(
13800 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a out);. }. }.
13810 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 #endif. p->iCur
13820 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 rentTime = 0;.
13830 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f p->magic = VDBE_
13840 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 MAGIC_INIT;. re
13850 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d turn p->rc & db-
13860 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a >errMask;.}. ./*
13870 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 .** Clean up and
13880 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 delete a VDBE a
13890 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 fter execution.
138a0 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 Return an integ
138b0 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 er which is.** t
138c0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 he result code.
138d0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 Write any error
138e0 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e message text in
138f0 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f to *pzErrMsg..*/
13900 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
13910 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 Finalize(Vdbe *p
13920 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 ){. int rc = SQ
13930 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 LITE_OK;. if( p
13940 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
13950 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 GIC_RUN || p->ma
13960 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
13970 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d HALT ){. rc =
13980 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 sqlite3VdbeRese
13990 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 t(p);. assert
139a0 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 ( (rc & p->db->e
139b0 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 rrMask)==rc );.
139c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 }. sqlite3Vdbe
139d0 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 Delete(p);. ret
139e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
139f0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f If parameter iO
13a00 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a p is less than z
13a10 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 ero, then invoke
13a20 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 the destructor
13a30 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c for.** all auxil
13a40 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 iary data pointe
13a50 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 rs currently cac
13a60 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 hed by the VM pa
13a70 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 ssed as.** the f
13a80 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a irst argument..*
13a90 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 *.** Or, if iOp
13aa0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 is greater than
13ab0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f or equal to zero
13ac0 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 , then the destr
13ad0 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 uctor is.** only
13ae0 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f invoked for tho
13af0 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 se auxiliary dat
13b00 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 a pointers creat
13b10 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a ed by the user .
13b20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f ** function invo
13b30 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 ked by the OP_Fu
13b40 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 nction opcode at
13b50 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 instruction iOp
13b60 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 of .** VM pVdbe
13b70 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 , and only then
13b80 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 if:.**.** * t
13b90 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 he associated fu
13ba0 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 nction parameter
13bb0 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 is the 32nd or
13bc0 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a later (counting.
13bd0 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 ** from lef
13be0 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a t to right), or.
13bf0 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 **.** * the c
13c00 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 orresponding bit
13c10 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 in argument mas
13c20 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 k is clear (wher
13c30 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 e the first.**
13c40 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 function par
13c50 61 6d 65 74 65 72 20 63 6f 72 72 73 70 6f 6e 64 ameter corrspond
13c60 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 s to bit 0 etc.)
13c70 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
13c80 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 3VdbeDeleteAuxDa
13c90 74 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 ta(Vdbe *pVdbe,
13ca0 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 int iOp, int mas
13cb0 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a k){. AuxData **
13cc0 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 pp = &pVdbe->pAu
13cd0 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 xData;. while(
13ce0 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 *pp ){. AuxDa
13cf0 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a ta *pAux = *pp;.
13d00 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a if( (iOp<0).
13d10 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 || (pAux->i
13d20 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 Op==iOp && (pAux
13d30 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d ->iArg>31 || !(m
13d40 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 ask & MASKBIT32(
13d50 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 pAux->iArg)))).
13d60 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 ){. test
13d70 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 case( pAux->iArg
13d80 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 ==31 );. if
13d90 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 ( pAux->xDelete
13da0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d ){. pAux-
13db0 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 >xDelete(pAux->p
13dc0 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Aux);. }.
13dd0 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e *pp = pAux->
13de0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c pNext;. sql
13df0 69 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65 ite3DbFree(pVdbe
13e00 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 ->db, pAux);.
13e10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 }else{. pp
13e20 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a = &pAux->pNext;.
13e30 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a }. }.}../*.
13e40 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f ** Free all memo
13e50 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ry associated wi
13e60 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 th the Vdbe pass
13e70 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 ed as the second
13e80 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 argument,.** ex
13e90 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 cept for object
13ea0 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 itself, which is
13eb0 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a preserved..**.*
13ec0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 * The difference
13ed0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 between this fu
13ee0 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 nction and sqlit
13ef0 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 e3VdbeDelete() i
13f00 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 s that.** VdbeDe
13f10 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 lete() also unli
13f20 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f nks the Vdbe fro
13f30 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d m the list of VM
13f40 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 s associated wit
13f50 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 h.** the databas
13f60 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 e connection and
13f70 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 frees the objec
13f80 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 t itself..*/.voi
13f90 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 d sqlite3VdbeCle
13fa0 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 arObject(sqlite3
13fb0 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a *db, Vdbe *p){.
13fc0 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 SubProgram *pS
13fd0 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e ub, *pNext;. in
13fe0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 t i;. assert( p
13ff0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 ->db==0 || p->db
14000 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 ==db );. releas
14010 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 eMemArray(p->aVa
14020 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 r, p->nVar);. r
14030 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 eleaseMemArray(p
14040 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e ->aColName, p->n
14050 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d ResColumn*COLNAM
14060 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 E_N);. for(pSub
14070 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 =p->pProgram; pS
14080 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b ub; pSub=pNext){
14090 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 . pNext = pSu
140a0 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 b->pNext;. vd
140b0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 beFreeOpArray(db
140c0 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 , pSub->aOp, pSu
140d0 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c b->nOp);. sql
140e0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
140f0 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 Sub);. }. for(
14100 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e i=p->nzVar-1; i>
14110 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 =0; i--) sqlite3
14120 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a DbFree(db, p->az
14130 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 Var[i]);. vdbeF
14140 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 reeOpArray(db, p
14150 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a ->aOp, p->nOp);.
14160 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
14170 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 db, p->aColName)
14180 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 ;. sqlite3DbFre
14190 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a e(db, p->zSql);.
141a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
141b0 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 db, p->pFree);.#
141c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 if defined(SQLIT
141d0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 E_ENABLE_TREE_EX
141e0 50 4c 41 49 4e 29 0a 20 20 73 71 6c 69 74 65 33 PLAIN). sqlite3
141f0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 DbFree(db, p->zE
14200 78 70 6c 61 69 6e 29 3b 0a 20 20 73 71 6c 69 74 xplain);. sqlit
14210 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e e3DbFree(db, p->
14220 70 45 78 70 6c 61 69 6e 29 3b 0a 23 65 6e 64 69 pExplain);.#endi
14230 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 f.}../*.** Delet
14240 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 45 e an entire VDBE
14250 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
14260 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 65 3VdbeDelete(Vdbe
14270 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 *p){. sqlite3
14280 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 45 *db;.. if( NEVE
14290 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 6e R(p==0) ) return
142a0 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a ;. db = p->db;.
142b0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 assert( sqlite
142c0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3_mutex_held(db-
142d0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c >mutex) );. sql
142e0 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a ite3VdbeClearObj
142f0 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 66 ect(db, p);. if
14300 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 ( p->pPrev ){.
14310 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 p->pPrev->pNex
14320 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 t = p->pNext;.
14330 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 }else{. asser
14340 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 20 t( db->pVdbe==p
14350 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 );. db->pVdbe
14360 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d = p->pNext;. }
14370 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 . if( p->pNext
14380 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d ){. p->pNext-
14390 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 >pPrev = p->pPre
143a0 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 v;. }. p->magi
143b0 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 44 c = VDBE_MAGIC_D
143c0 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 30 EAD;. p->db = 0
143d0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 ;. sqlite3DbFre
143e0 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a e(db, p);.}../*.
143f0 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 ** Make sure the
14400 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 cursor p is rea
14410 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 dy to read or wr
14420 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 ite the row to w
14430 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c hich it.** was l
14440 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 ast positioned.
14450 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 Return an error
14460 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 code if an OOM
14470 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 fault or I/O err
14480 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 or.** prevents u
14490 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 s from positioni
144a0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f ng the cursor to
144b0 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 its correct pos
144c0 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ition..**.** If
144d0 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 a MoveTo operati
144e0 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e on is pending on
144f0 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f the given curso
14500 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a r, then do that.
14510 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 ** MoveTo now.
14520 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 If no move is pe
14530 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 nding, check to
14540 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 see if the row h
14550 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 as been.** delet
14560 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 ed out from unde
14570 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 r the cursor and
14580 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b if it has, mark
14590 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 the row as.** a
145a0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a NULL row..**.**
145b0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 If the cursor i
145c0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 s already pointi
145d0 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 ng to the correc
145e0 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 t row and that r
145f0 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 ow has.** not be
14600 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 en deleted out f
14610 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 rom under the cu
14620 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 rsor, then this
14630 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d routine is a no-
14640 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 op..*/.int sqlit
14650 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 e3VdbeCursorMove
14660 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 to(VdbeCursor *p
14670 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 ){. if( p->defe
14680 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 rredMoveto ){.
14690 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 int res, rc;.#
146a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 ifdef SQLITE_TES
146b0 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 T. extern int
146c0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f sqlite3_search_
146d0 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 count;.#endif.
146e0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 assert( p->isT
146f0 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d able );. rc =
14700 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 sqlite3BtreeMov
14710 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 etoUnpacked(p->p
14720 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f Cursor, 0, p->mo
14730 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 vetoTarget, 0, &
14740 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 res);. if( rc
14750 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 ) return rc;.
14760 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d p->lastRowid =
14770 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 p->movetoTarget
14780 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 ;. if( res!=0
14790 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ) return SQLITE
147a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 _CORRUPT_BKPT;.
147b0 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c p->rowidIsVal
147c0 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 id = 1;.#ifdef S
147d0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 QLITE_TEST. s
147e0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f qlite3_search_co
147f0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 unt++;.#endif.
14800 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 p->deferredMov
14810 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e eto = 0;. p->
14820 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 cacheStatus = CA
14830 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c CHE_STALE;. }el
14840 73 65 20 69 66 28 20 70 2d 3e 70 43 75 72 73 6f se if( p->pCurso
14850 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 68 61 73 r ){. int has
14860 4d 6f 76 65 64 3b 0a 20 20 20 20 69 6e 74 20 72 Moved;. int r
14870 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 c = sqlite3Btree
14880 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 CursorHasMoved(p
14890 2d 3e 70 43 75 72 73 6f 72 2c 20 26 68 61 73 4d ->pCursor, &hasM
148a0 6f 76 65 64 29 3b 0a 20 20 20 20 69 66 28 20 72 oved);. if( r
148b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 c ) return rc;.
148c0 20 20 20 69 66 28 20 68 61 73 4d 6f 76 65 64 20 if( hasMoved
148d0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 63 61 63 68 ){. p->cach
148e0 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f eStatus = CACHE_
148f0 53 54 41 4c 45 3b 0a 20 20 20 20 20 20 69 66 28 STALE;. if(
14900 20 68 61 73 4d 6f 76 65 64 3d 3d 32 20 29 20 70 hasMoved==2 ) p
14910 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 ->nullRow = 1;.
14920 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 }. }. retur
14930 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
14940 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 /*.** The follow
14950 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a ing functions:.*
14960 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 *.** sqlite3Vdbe
14970 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 SerialType().**
14980 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
14990 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 lTypeLen().** sq
149a0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c lite3VdbeSerialL
149b0 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 en().** sqlite3V
149c0 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a dbeSerialPut().*
149d0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 * sqlite3VdbeSer
149e0 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 ialGet().**.** e
149f0 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 ncapsulate the c
14a00 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 ode that seriali
14a10 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 zes values for s
14a20 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 torage in SQLite
14a30 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 .** data and ind
14a40 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 ex records. Each
14a50 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 serialized valu
14a60 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a e consists of a.
14a70 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 ** 'serial-type'
14a80 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 and a blob of d
14a90 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 ata. The serial
14aa0 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 type is an 8-byt
14ab0 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e e unsigned.** in
14ac0 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 teger, stored as
14ad0 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a a varint..**.**
14ae0 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e In an SQLite in
14af0 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 dex record, the
14b00 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 serial type is s
14b10 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 tored directly b
14b20 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f efore.** the blo
14b30 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 b of data that i
14b40 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f t corresponds to
14b50 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 . In a table rec
14b60 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a ord, all serial.
14b70 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f ** types are sto
14b80 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 red at the start
14b90 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 of the record,
14ba0 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 and the blobs of
14bb0 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 data at.** the
14bc0 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 end. Hence these
14bd0 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 functions allow
14be0 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 the caller to h
14bf0 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 andle the.** ser
14c00 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 ial-type and dat
14c10 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c a blob separatel
14c20 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c y..**.** The fol
14c30 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 lowing table des
14c40 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f cribes the vario
14c50 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 us storage class
14c60 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a es for data:.**.
14c70 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 ** serial type
14c80 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 bytes of
14c90 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a data type.
14ca0 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ** -----------
14cb0 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d --- --------
14cc0 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d ------- -----
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 ----------.**
14ce0 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 0
14cf0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 0
14d00 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 NULL.**
14d10 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 1
14d20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 1
14d30 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 signed int
14d40 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 eger.** 2
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14d60 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2
14d70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a signed integer.*
14d80 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 * 3
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 3
14da0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 signed
14db0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 integer.**
14dc0 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4
14dd0 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 4
14de0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 signed integ
14df0 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 er.** 5
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14e10 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6 si
14e20 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 gned integer.**
14e30 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 6
14e40 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 8
14e50 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 signed i
14e60 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 nteger.** 7
14e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14e80 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 8
14e90 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 IEEE float.**
14ea0 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 8
14eb0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 0
14ec0 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 Integer
14ed0 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 constant 0.**
14ee0 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 9
14ef0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 0
14f00 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f Integer co
14f10 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 nstant 1.**
14f20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 10,11
14f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14f40 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 reserved for
14f50 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 expansion.**
14f60 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 N>=12 and even
14f70 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 (N-12)/2
14f80 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 BLOB.**
14f90 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 N>=13 and odd
14fa0 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 (N-13)/2
14fb0 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a text.**.**
14fc0 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 The 8 and 9 typ
14fd0 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e es were added in
14fe0 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 3.3.0, file for
14ff0 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 mat 4. Prior ve
15000 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c rsions.** of SQL
15010 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 ite will not und
15020 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 erstand those se
15030 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a rial types..*/..
15040 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 /*.** Return the
15050 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 serial-type for
15060 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 the value store
15070 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 d in pMem..*/.u3
15080 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 2 sqlite3VdbeSer
15090 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 ialType(Mem *pMe
150a0 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d m, int file_form
150b0 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 at){. int flags
150c0 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a = pMem->flags;.
150d0 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 69 66 28 20 int n;.. if(
150e0 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 flags&MEM_Null )
150f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
15100 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 }. if( flags&
15110 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f MEM_Int ){. /
15120 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 * Figure out whe
15130 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 ther to use 1, 2
15140 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 , 4, 6 or 8 byte
15150 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 s. */.# define
15160 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 MAX_6BYTE ((((i
15170 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 64)0x00008000)<<
15180 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 32)-1). i64 i
15190 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 = pMem->u.i;.
151a0 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 u64 u;. if(
151b0 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 i<0 ){. if
151c0 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54 45 29 ( i<(-MAX_6BYTE)
151d0 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 ) return 6;.
151e0 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 20 74 /* Previous t
151f0 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20 20 75 est prevents: u
15200 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30 33 36 = -(-9223372036
15210 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a 20 20 854775808) */.
15220 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20 20 20 u = -i;.
15230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d }else{. u =
15240 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 i;. }. if
15250 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 ( u<=127 ){.
15260 20 20 72 65 74 75 72 6e 20 28 28 69 26 31 29 3d return ((i&1)=
15270 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 =i && file_forma
15280 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29 75 t>=4) ? 8+(u32)u
15290 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 : 1;. }.
152a0 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20 72 if( u<=32767 ) r
152b0 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66 28 eturn 2;. if(
152c0 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72 65 u<=8388607 ) re
152d0 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28 20 turn 3;. if(
152e0 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 20 u<=2147483647 )
152f0 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69 66 return 4;. if
15300 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 ( u<=MAX_6BYTE )
15310 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20 72 return 5;. r
15320 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 eturn 6;. }. i
15330 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 f( flags&MEM_Rea
15340 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 l ){. return
15350 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 7;. }. assert(
15360 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f pMem->db->mallo
15370 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 cFailed || flags
15380 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c &(MEM_Str|MEM_Bl
15390 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 4d 65 ob) );. n = pMe
153a0 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 m->n;. if( flag
153b0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a s & MEM_Zero ){.
153c0 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 n += pMem->u
153d0 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 61 73 .nZero;. }. as
153e0 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a 20 20 sert( n>=0 );.
153f0 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 return ((n*2) +
15400 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 12 + ((flags&MEM
15410 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f _Str)!=0));.}../
15420 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
15430 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 length of the da
15440 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 ta corresponding
15450 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 to the supplied
15460 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f serial-type..*/
15470 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 .u32 sqlite3Vdbe
15480 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 SerialTypeLen(u3
15490 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 2 serial_type){.
154a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 if( serial_typ
154b0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 65 74 e>=12 ){. ret
154c0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 urn (serial_type
154d0 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b -12)/2;. }else{
154e0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 . static cons
154f0 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b t u8 aSize[] = {
15500 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 0, 1, 2, 3, 4,
15510 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 6, 8, 8, 0, 0, 0
15520 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 , 0 };. retur
15530 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 n aSize[serial_t
15540 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a ype];. }.}../*.
15550 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 ** If we are on
15560 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 an architecture
15570 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 with mixed-endia
15580 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 n floating .** p
15590 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 oints (ex: ARM7)
155a0 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c then swap the l
155b0 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 ower 4 bytes wit
155c0 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 h the .** upper
155d0 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 4 bytes. Return
155e0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a the result..**.
155f0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 ** For most arch
15600 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 itectures, this
15610 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a is a no-op..**.*
15620 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 * (later): It i
15630 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 s reported to me
15640 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d that the mixed-
15650 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a endian problem.*
15660 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 * on ARM7 is an
15670 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 issue with GCC,
15680 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d not with the ARM
15690 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 7 chip. It seem
156a0 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 s.** that early
156b0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 versions of GCC
156c0 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 stored the two w
156d0 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 ords of a 64-bit
156e0 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 .** float in the
156f0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 wrong order. A
15700 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 nd that error ha
15710 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 s been propagate
15720 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e d.** ever since.
15730 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e The blame is n
15740 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 ot necessarily w
15750 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e ith GCC, though.
15760 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 .** GCC might ha
15770 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 ve just copying
15780 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d the problem from
15790 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 a prior compile
157a0 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 r..** I am also
157b0 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 told that newer
157c0 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 versions of GCC
157d0 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 that follow a di
157e0 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 fferent.** ABI g
157f0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 et the byte orde
15800 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 r right..**.** D
15810 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 evelopers using
15820 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d SQLite on an ARM
15830 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 7 should compile
15840 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a and run their.*
15850 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 * application us
15860 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 ing -DSQLITE_DEB
15870 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e UG=1 at least on
15880 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a ce. With DEBUG.
15890 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 ** enabled, some
158a0 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 asserts below w
158b0 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 ill ensure that
158c0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f the byte order o
158d0 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f f.** floating po
158e0 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f int values is co
158f0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 rrect..**.** (20
15900 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 07-08-30) Frank
15910 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 van Vugt has st
15920 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c udied this probl
15930 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e em closely.** an
15940 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 d has send his f
15950 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 indings to the S
15960 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 QLite developers
15970 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 . Frank.** writ
15980 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e es that some Lin
15990 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 ux kernels offer
159a0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 floating point
159b0 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c hardware.** emul
159c0 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 ation that uses
159d0 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 only 32-bit mant
159e0 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 issas instead of
159f0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 a full .** 48-b
15a00 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 its as required
15a10 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e by the IEEE stan
15a20 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 dard. (This is
15a30 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 the.** CONFIG_FP
15a40 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e E_FASTFPE option
15a50 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 .) On such syst
15a60 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f ems, floating po
15a70 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 int.** byte swap
15a80 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 ping becomes ver
15a90 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 y complicated.
15aa0 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d To avoid problem
15ab0 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 s,.** the necess
15ac0 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e ary byte swappin
15ad0 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 g is carried out
15ae0 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 using a 64-bit
15af0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 integer.** rathe
15b00 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 r than a 64-bit
15b10 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 float. Frank as
15b20 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 sures us that th
15b30 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 e code here.** w
15b40 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 orks for him. W
15b50 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 e, the developer
15b60 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 s, have no way t
15b70 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a o independently.
15b80 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 ** verify this,
15b90 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 but Frank seems
15ba0 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 to know what he
15bb0 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 is talking about
15bc0 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 .** so we trust
15bd0 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 him..*/.#ifdef S
15be0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 QLITE_MIXED_ENDI
15bf0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 AN_64BIT_FLOAT.s
15c00 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 tatic u64 floatS
15c10 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 wap(u64 in){. u
15c20 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 nion {. u64 r
15c30 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a ;. u32 i[2];.
15c40 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a } u;. u32 t;.
15c50 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 . u.r = in;. t
15c60 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 = u.i[0];. u.i
15c70 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 [0] = u.i[1];.
15c80 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 u.i[1] = t;. re
15c90 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 turn u.r;.}.# de
15ca0 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e fine swapMixedEn
15cb0 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 dianFloat(X) X
15cc0 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 = floatSwap(X).#
15cd0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 else.# define sw
15ce0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f apMixedEndianFlo
15cf0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a at(X).#endif../*
15d00 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 .** Write the se
15d10 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c rialized data bl
15d20 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 ob for the value
15d30 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 stored in pMem
15d40 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 into .** buf. It
15d50 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 is assumed that
15d60 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 the caller has
15d70 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 allocated suffic
15d80 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 ient space..** R
15d90 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 eturn the number
15da0 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 of bytes writte
15db0 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 n..**.** nBuf is
15dc0 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 the amount of s
15dd0 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 pace left in buf
15de0 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 []. The caller
15df0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a is responsible.*
15e00 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 * for allocating
15e10 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f enough space to
15e20 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 buf[] to hold t
15e30 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c he entire field,
15e40 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 exclusive.** of
15e50 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 the pMem->u.nZe
15e60 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d ro bytes for a M
15e70 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a EM_Zero value..*
15e80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
15e90 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
15ea0 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e actually written
15eb0 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 into buf[]. Th
15ec0 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 e number.** of b
15ed0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f ytes in the zero
15ee0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 -filled tail is
15ef0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 included in the
15f00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c return value onl
15f10 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 y.** if those by
15f20 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 tes were zeroed
15f30 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 in buf[]..*/ .u3
15f40 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 2 sqlite3VdbeSer
15f50 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 ialPut(u8 *buf,
15f60 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 Mem *pMem, u32 s
15f70 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 erial_type){. u
15f80 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 32 len;.. /* In
15f90 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a teger and Real *
15fa0 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 /. if( serial_t
15fb0 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c ype<=7 && serial
15fc0 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 _type>0 ){. u
15fd0 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 64 v;. u32 i;
15fe0 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f . if( serial_
15ff0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 type==7 ){.
16000 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 assert( sizeof(
16010 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d v)==sizeof(pMem-
16020 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d >r) );. mem
16030 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 cpy(&v, &pMem->r
16040 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 , sizeof(v));.
16050 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 swapMixedEnd
16060 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 ianFloat(v);.
16070 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 }else{. v
16080 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 = pMem->u.i;.
16090 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d }. len = i =
160a0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
160b0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c alTypeLen(serial
160c0 5f 74 79 70 65 29 3b 0a 20 20 20 20 77 68 69 6c _type);. whil
160d0 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 e( i-- ){.
160e0 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 buf[i] = (u8)(v&
160f0 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 0xFF);. v >
16100 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 >= 8;. }.
16110 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a return len;. }.
16120 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 . /* String or
16130 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 blob */. if( se
16140 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b rial_type>=12 ){
16150 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 . assert( pMe
16160 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 m->n + ((pMem->f
16170 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 lags & MEM_Zero)
16180 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 ?pMem->u.nZero:0
16190 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d ). =
161a0 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 = (int)sqlite3Vd
161b0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
161c0 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a serial_type) );.
161d0 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e len = pMem->
161e0 6e 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 62 75 n;. memcpy(bu
161f0 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 f, pMem->z, len)
16200 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e ;. return len
16210 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c ;. }.. /* NULL
16220 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 or constants 0
16230 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e or 1 */. return
16240 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 0;.}../* Input
16250 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 "x" is a sequenc
16260 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 e of unsigned ch
16270 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 aracters that re
16280 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 present a.** big
16290 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e -endian integer.
162a0 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 Return the equ
162b0 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 ivalent native i
162c0 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e nteger.*/.#defin
162d0 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 e ONE_BYTE_INT(x
162e0 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d ) ((i8)(x)[0]
162f0 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 ).#define TWO_BY
16300 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 TE_INT(x) (25
16310 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 6*(i8)((x)[0])|(
16320 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 x)[1]).#define T
16330 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 HREE_BYTE_INT(x)
16340 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 (65536*(i8)((x
16350 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 )[0])|((x)[1]<<8
16360 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e )|(x)[2]).#defin
16370 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 e FOUR_BYTE_UINT
16380 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b (x) (((u32)(x)[
16390 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 0]<<24)|((x)[1]<
163a0 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 <16)|((x)[2]<<8)
163b0 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 |(x)[3])../*.**
163c0 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 Deserialize the
163d0 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 data blob pointe
163e0 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 d to by buf as s
163f0 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 erial type seria
16400 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 l_type.** and st
16410 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 ore the result i
16420 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 n pMem. Return
16430 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 the number of by
16440 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 tes read..*/ .u3
16450 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 2 sqlite3VdbeSer
16460 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 ialGet(. const
16470 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 unsigned char *b
16480 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 uf, /* Buffe
16490 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 r to deserialize
164a0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 from */. u32 s
164b0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 erial_type,
164c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 /* Seri
164d0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 al type to deser
164e0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 ialize */. Mem
164f0 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 *pMem
16500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d /* Mem
16510 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 ory cell to writ
16520 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a e value into */.
16530 29 7b 0a 20 20 75 36 34 20 78 3b 0a 20 20 75 33 ){. u64 x;. u3
16540 32 20 79 3b 0a 20 20 73 77 69 74 63 68 28 20 73 2 y;. switch( s
16550 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 erial_type ){.
16560 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 case 10: /*
16570 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 Reserved for fut
16580 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 ure use */. c
16590 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 ase 11: /* Res
165a0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 erved for future
165b0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 use */. case
165c0 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 0: { /* NULL *
165d0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c /. pMem->fl
165e0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a ags = MEM_Null;.
165f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
16600 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b }. case 1: {
16610 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 /* 1-byte signe
16620 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 d integer */.
16630 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f pMem->u.i = O
16640 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 NE_BYTE_INT(buf)
16650 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c ;. pMem->fl
16660 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 ags = MEM_Int;.
16670 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 testcase( p
16680 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 Mem->u.i<0 );.
16690 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
166a0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 }. case 2:
166b0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e { /* 2-byte sign
166c0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 ed integer */.
166d0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 pMem->u.i =
166e0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 TWO_BYTE_INT(buf
166f0 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 );. pMem->f
16700 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
16710 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
16720 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 pMem->u.i<0 );.
16730 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 return 2;.
16740 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a }. case 3:
16750 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 { /* 3-byte sig
16760 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 ned integer */.
16770 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d pMem->u.i =
16780 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 THREE_BYTE_INT(
16790 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d buf);. pMem
167a0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e ->flags = MEM_In
167b0 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 t;. testcas
167c0 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 e( pMem->u.i<0 )
167d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 ;. return 3
167e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
167f0 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 4: { /* 4-byte
16800 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a signed integer *
16810 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 /. y = FOUR
16820 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b _BYTE_UINT(buf);
16830 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 . pMem->u.i
16840 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 = (i64)*(int*)&
16850 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 y;. pMem->f
16860 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
16870 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
16880 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 pMem->u.i<0 );.
16890 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 return 4;.
168a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a }. case 5:
168b0 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 { /* 6-byte sig
168c0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 ned integer */.
168d0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d pMem->u.i =
168e0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 FOUR_BYTE_UINT(
168f0 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 buf+2) + (((i64)
16900 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 1)<<32)*TWO_BYTE
16910 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 _INT(buf);.
16920 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
16930 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 EM_Int;. te
16940 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e stcase( pMem->u.
16950 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 i<0 );. ret
16960 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 6;. }.
16970 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d case 6: /* 8-
16980 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 byte signed inte
16990 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 ger */. case
169a0 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 7: { /* IEEE flo
169b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 23 ating point */.#
169c0 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 if !defined(NDEB
169d0 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 UG) && !defined(
169e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 SQLITE_OMIT_FLOA
169f0 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 TING_POINT).
16a00 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 /* Verify that
16a10 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c integers and fl
16a20 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c oating point val
16a30 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 ues use the same
16a40 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 6f . ** byte o
16a50 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 rder. Or, that
16a60 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f if SQLITE_MIXED_
16a70 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f ENDIAN_64BIT_FLO
16a80 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 64 AT is. ** d
16a90 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 efined that 64-b
16aa0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e it floating poin
16ab0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 t values really
16ac0 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 20 are mixed.
16ad0 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 20 ** endian..
16ae0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 */. static
16af0 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 const u64 t1 =
16b00 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 ((u64)0x3ff00000
16b10 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 61 )<<32;. sta
16b20 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 tic const double
16b30 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 20 r1 = 1.0;.
16b40 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 u64 t2 = t1;.
16b50 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 swapMixedEnd
16b60 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 ianFloat(t2);.
16b70 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 assert( size
16b80 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 of(r1)==sizeof(t
16b90 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2) && memcmp(&r1
16ba0 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 , &t2, sizeof(r1
16bb0 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a ))==0 );.#endif.
16bc0 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 x = FOUR_B
16bd0 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 YTE_UINT(buf);.
16be0 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 y = FOUR_BY
16bf0 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a TE_UINT(buf+4);.
16c00 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 x = (x<<32
16c10 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 ) | y;. if(
16c20 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 serial_type==6
16c30 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d ){. pMem-
16c40 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 >u.i = *(i64*)&x
16c50 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e ;. pMem->
16c60 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
16c70 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 . testcas
16c80 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 e( pMem->u.i<0 )
16c90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
16ca0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 assert( s
16cb0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 izeof(x)==8 && s
16cc0 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d izeof(pMem->r)==
16cd0 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 8 );. swa
16ce0 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 pMixedEndianFloa
16cf0 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 t(x);. me
16d00 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 mcpy(&pMem->r, &
16d10 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 x, sizeof(x));.
16d20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 pMem->fla
16d30 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 gs = sqlite3IsNa
16d40 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d N(pMem->r) ? MEM
16d50 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c _Null : MEM_Real
16d60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
16d70 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a return 8;. }.
16d80 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f case 8: /
16d90 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 * Integer 0 */.
16da0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a case 9: { /*
16db0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 Integer 1 */.
16dc0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 pMem->u.i =
16dd0 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 serial_type-8;.
16de0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
16df0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
16e00 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 return 0;.
16e10 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b }. default: {
16e20 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f . static co
16e30 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 nst u16 aFlag[]
16e40 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d = { MEM_Blob|MEM
16e50 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c _Ephem, MEM_Str|
16e60 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 MEM_Ephem };.
16e70 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 65 u32 len = (se
16e80 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b rial_type-12)/2;
16e90 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d . pMem->z =
16ea0 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 (char *)buf;.
16eb0 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c 65 pMem->n = le
16ec0 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 78 n;. pMem->x
16ed0 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 Del = 0;. p
16ee0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c Mem->flags = aFl
16ef0 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 ag[serial_type&1
16f00 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ];. return
16f10 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 len;. }. }.
16f20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
16f30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
16f40 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f is used to allo
16f50 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 cate sufficient
16f60 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 space for an Unp
16f70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 ackedRecord.** s
16f80 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 tructure large e
16f90 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 nough to be used
16fa0 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 with sqlite3Vdb
16fb0 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 eRecordUnpack()
16fc0 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 if.** the first
16fd0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f argument is a po
16fe0 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f inter to KeyInfo
16ff0 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 structure pKeyI
17000 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 nfo..**.** The s
17010 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 pace is either a
17020 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 llocated using s
17030 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 qlite3DbMallocRa
17040 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 w() or from with
17050 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 in.** the unalig
17060 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 ned buffer passe
17070 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 d via the second
17080 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d and third argum
17090 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 ents (presumably
170a0 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 .** stack space)
170b0 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c . If the former,
170c0 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 then *ppFree is
170d0 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 set to a pointe
170e0 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a r that should.**
170f0 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 be eventually f
17100 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c reed by the call
17110 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 er using sqlite3
17120 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 DbFree(). Or, if
17130 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 the .** allocat
17140 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 ion comes from t
17150 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 he pSpace/szSpac
17160 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 e buffer, *ppFre
17170 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c e is set to NULL
17180 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 .** before retur
17190 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 ning..**.** If a
171a0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 n OOM error occu
171b0 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 rs, NULL is retu
171c0 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 rned..*/.Unpacke
171d0 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 dRecord *sqlite3
171e0 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 VdbeAllocUnpacke
171f0 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e dRecord(. KeyIn
17200 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 fo *pKeyInfo,
17210 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 /* De
17220 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 scription of the
17230 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 record */. cha
17240 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 r *pSpace,
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
17260 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 Unaligned space
17270 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 available */. i
17280 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 nt szSpace,
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
172a0 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 * Size of pSpace
172b0 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 [] in bytes */.
172c0 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 char **ppFree
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
172e0 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 /* OUT: Caller
172f0 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 should free this
17300 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 pointer */.){.
17310 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
17320 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *p;
17330 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 /* Unpacked rec
17340 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f ord to return */
17350 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 . int nOff;
17360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17370 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 /* Increment
17380 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 pSpace by nOff t
17390 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 o align it */.
173a0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 int nByte;
173b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
173c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
173d0 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 es required for
173e0 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 *p */.. /* We w
173f0 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 ant to shift the
17400 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 pointer pSpace
17410 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 up such that it
17420 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 is 8-byte aligne
17430 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 d.. ** Thus, we
17440 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 need to calcula
17450 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 te a value, nOff
17460 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 , between 0 and
17470 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 7, to shift . *
17480 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 * it by. If pSp
17490 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 ace is already 8
174a0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e -byte aligned, n
174b0 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 Off should be ze
174c0 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 ro.. */. nOff
174d0 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 = (8 - (SQLITE_P
174e0 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 TR_TO_INT(pSpace
174f0 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e ) & 7)) & 7;. n
17500 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 Byte = ROUND8(si
17510 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 zeof(UnpackedRec
17520 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d ord)) + sizeof(M
17530 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e em)*(pKeyInfo->n
17540 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 Field+1);. if(
17550 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f nByte>szSpace+nO
17560 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 ff ){. p = (U
17570 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 npackedRecord *)
17580 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 sqlite3DbMallocR
17590 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c aw(pKeyInfo->db,
175a0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 nByte);. *pp
175b0 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 Free = (char *)p
175c0 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 ;. if( !p ) r
175d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 eturn 0;. }else
175e0 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 {. p = (Unpac
175f0 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 kedRecord*)&pSpa
17600 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 ce[nOff];. *p
17610 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a pFree = 0;. }..
17620 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d p->aMem = (Mem
17630 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f *)&((char*)p)[RO
17640 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 UND8(sizeof(Unpa
17650 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 ckedRecord))];.
17660 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 assert( pKeyInf
17670 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 o->aSortOrder!=0
17680 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 );. p->pKeyInf
17690 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 o = pKeyInfo;.
176a0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 p->nField = pKey
176b0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 Info->nField + 1
176c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a ;. return p;.}.
176d0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 ./*.** Given the
176e0 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 nKey-byte encod
176f0 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 ing of a record
17700 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c in pKey[], popul
17710 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 ate the .** Unpa
17720 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 ckedRecord struc
17730 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 ture indicated b
17740 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 y the fourth arg
17750 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a ument with the.*
17760 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 * contents of th
17770 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 e decoded record
17780 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 ..*/ .void sqlit
17790 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 e3VdbeRecordUnpa
177a0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 ck(. KeyInfo *p
177b0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 KeyInfo, /*
177c0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 Information abou
177d0 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 t the record for
177e0 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 mat */. int nKe
177f0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 y,
17800 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 /* Size of the b
17810 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a inary record */.
17820 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b const void *pK
17830 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ey, /* The
17840 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f binary record */
17850 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 . UnpackedRecor
17860 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 d *p /* Pop
17870 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 ulate this struc
17880 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 ture before retu
17890 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 rning. */.){. c
178a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
178b0 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 ar *aKey = (cons
178c0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
178d0 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b *)pKey;. int d;
178e0 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 . u32 idx;
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17900 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e /* Offset in
17910 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 aKey[] to read
17920 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b from */. u16 u;
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 /* Uns
17950 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 igned loop count
17960 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 er */. u32 szHd
17970 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d r;. Mem *pMem =
17980 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e p->aMem;.. p->
17990 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a default_rc = 0;.
179a0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f assert( EIGHT_
179b0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 BYTE_ALIGNMENT(p
179c0 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 Mem) );. idx =
179d0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 getVarint32(aKey
179e0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 , szHdr);. d =
179f0 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a szHdr;. u = 0;.
17a00 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 while( idx<szH
17a10 64 72 20 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c dr && u<p->nFiel
17a20 64 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a d && d<=nKey ){.
17a30 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 u32 serial_t
17a40 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d ype;.. idx +=
17a50 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b getVarint32(&aK
17a60 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f ey[idx], serial_
17a70 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d type);. pMem-
17a80 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d >enc = pKeyInfo-
17a90 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e >enc;. pMem->
17aa0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 db = pKeyInfo->d
17ab0 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e b;. /* pMem->
17ac0 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 flags = 0; // sq
17ad0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 lite3VdbeSerialG
17ae0 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 et() will set th
17af0 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 is for us */.
17b00 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d pMem->zMalloc =
17b10 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 0;. d += sql
17b20 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 ite3VdbeSerialGe
17b30 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 t(&aKey[d], seri
17b40 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a al_type, pMem);.
17b50 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 pMem++;.
17b60 75 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 u++;. }. asser
17b70 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e t( u<=pKeyInfo->
17b80 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 nField + 1 );.
17b90 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d p->nField = u;.}
17ba0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 ..#if SQLITE_DEB
17bb0 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 UG./*.** This fu
17bc0 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 nction compares
17bd0 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 two index or tab
17be0 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 le record keys i
17bf0 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a n the same way.*
17c00 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 * as the sqlite3
17c10 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
17c20 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c e() routine. Unl
17c30 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f ike VdbeRecordCo
17c40 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 mpare(),.** this
17c50 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 function deseri
17c60 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 alizes and compa
17c70 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 res values using
17c80 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 the.** sqlite3V
17c90 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 dbeSerialGet() a
17ca0 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d nd sqlite3MemCom
17cb0 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 pare() functions
17cc0 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 . It is used.**
17cd0 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 in assert() stat
17ce0 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 ements to ensure
17cf0 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 that the optimi
17d00 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 zed code in.** s
17d10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 qlite3VdbeRecord
17d20 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e Compare() return
17d30 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 s results with t
17d40 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 hese two primiti
17d50 76 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 ves..*/.static i
17d60 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d nt vdbeRecordCom
17d70 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 pareDebug(. int
17d80 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f nKey1, const vo
17d90 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 id *pKey1, /* Le
17da0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 ft key */. cons
17db0 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 t UnpackedRecord
17dc0 20 2a 70 50 4b 65 79 32 20 20 2f 2a 20 52 69 67 *pPKey2 /* Rig
17dd0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 75 ht key */.){. u
17de0 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 32 d1;
17df0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f /* Offset into
17e00 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 aKey[] of next
17e10 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a data element */.
17e20 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 u32 idx1;
17e30 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 /* Offset i
17e40 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 nto aKey[] of ne
17e50 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e xt header elemen
17e60 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 t */. u32 szHdr
17e70 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 1; /* Num
17e80 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 ber of bytes in
17e90 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 header */. int
17ea0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 i = 0;. int rc
17eb0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 = 0;. const uns
17ec0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 igned char *aKey
17ed0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 1 = (const unsig
17ee0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 ned char *)pKey1
17ef0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 ;. KeyInfo *pKe
17f00 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d yInfo;. Mem mem
17f10 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 1;.. pKeyInfo =
17f20 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 pPKey2->pKeyInf
17f30 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 o;. mem1.enc =
17f40 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 pKeyInfo->enc;.
17f50 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 mem1.db = pKeyI
17f60 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 nfo->db;. /* me
17f70 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f m1.flags = 0; /
17f80 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 / Will be initia
17f90 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 lized by sqlite3
17fa0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 VdbeSerialGet()
17fb0 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d */. VVA_ONLY( m
17fc0 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b em1.zMalloc = 0;
17fd0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 ) /* Only neede
17fe0 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 d by assert() st
17ff0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f atements */.. /
18000 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 * Compilers may
18010 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 complain that me
18020 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 m1.u.i is potent
18030 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 ially uninitiali
18040 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 zed.. ** We cou
18050 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 ld initialize it
18060 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c , as shown here,
18070 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 to silence thos
18080 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 e complaints..
18090 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20 ** But in fact,
180a0 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 mem1.u.i will ne
180b0 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20 ver actually be
180c0 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a used uninitializ
180d0 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 ed, and doing .
180e0 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73 ** the unnecess
180f0 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 ary initializati
18100 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61 on has a measura
18110 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72 ble negative per
18120 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d formance. ** im
18130 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73 pact, since this
18140 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65 routine is a ve
18150 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 ry high runner.
18160 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f And so, we choo
18170 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 se. ** to ignor
18180 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 e the compiler w
18190 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 arnings and leav
181a0 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 e this variable
181b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 uninitialized..
181c0 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 */. /* mem1.u
181d0 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 .i = 0; // not
181e0 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20 needed, here to
181f0 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 silence compiler
18200 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 warning */. .
18210 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e idx1 = getVarin
18220 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 t32(aKey1, szHdr
18230 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 1);. d1 = szHdr
18240 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 1;. assert( pKe
18250 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b yInfo->nField+pK
18260 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e eyInfo->nXField>
18270 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 =pPKey2->nField
18280 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b || CORRUPT_DB );
18290 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 . assert( pKeyI
182a0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 nfo->aSortOrder!
182b0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
182c0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 pKeyInfo->nField
182d0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 >0 );. assert(
182e0 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 idx1<=szHdr1 ||
182f0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 CORRUPT_DB );.
18300 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 do{. u32 seri
18310 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f al_type1;.. /
18320 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 * Read the seria
18330 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 l types for the
18340 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 next element in
18350 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 each key. */.
18360 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 idx1 += getVari
18370 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 nt32( aKey1+idx1
18380 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 , serial_type1 )
18390 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 ;.. /* Verify
183a0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 that there is e
183b0 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 nough key space
183c0 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f remaining to avo
183d0 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 id. ** a buff
183e0 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 er overread. Th
183f0 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 e "d1+serial_typ
18400 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 e1+2" subexpress
18410 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 ion will. **
18420 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 always be greate
18430 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 r than or equal
18440 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 to the amount of
18450 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 required key sp
18460 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 ace.. ** Use
18470 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 that approximati
18480 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 on to avoid the
18490 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 more expensive c
184a0 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 all to. ** sq
184b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
184c0 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 ypeLen() in the
184d0 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 common case..
184e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 */. if( d1+s
184f0 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 erial_type1+2>(u
18500 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 32)nKey1. &&
18510 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 d1+sqlite3VdbeS
18520 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
18530 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 ial_type1)>(u32)
18540 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 nKey1 . ){.
18550 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
18560 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 .. /* Extract
18570 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 the values to b
18580 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 e compared..
18590 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c */. d1 += sql
185a0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 ite3VdbeSerialGe
185b0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 t(&aKey1[d1], se
185c0 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d rial_type1, &mem
185d0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 1);.. /* Do t
185e0 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 he comparison.
185f0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 */. rc = sq
18600 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 lite3MemCompare(
18610 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e &mem1, &pPKey2->
18620 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 aMem[i], pKeyInf
18630 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 o->aColl[i]);.
18640 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 if( rc!=0 ){.
18650 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d assert( mem
18660 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 1.zMalloc==0 );
18670 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 /* See comment
18680 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 below */. i
18690 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f f( pKeyInfo->aSo
186a0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 rtOrder[i] ){.
186b0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 rc = -rc;
186c0 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 /* Invert the r
186d0 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 esult for DESC s
186e0 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 ort order. */.
186f0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 }. retu
18700 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 rn rc;. }.
18710 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 i++;. }while(
18720 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 idx1<szHdr1 && i
18730 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 <pPKey2->nField
18740 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f );.. /* No memo
18750 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 ry allocation is
18760 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 ever used on me
18770 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 m1. Prove this
18780 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 using. ** the f
18790 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 ollowing assert(
187a0 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 ). If the asser
187b0 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e t() fails, it in
187c0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d dicates a. ** m
187d0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 emory leak and a
187e0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 need to call sq
187f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
18800 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f ase(&mem1).. */
18810 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e . assert( mem1.
18820 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 zMalloc==0 );..
18830 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d /* rc==0 here m
18840 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 eans that one of
18850 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 the keys ran ou
18860 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a t of fields and.
18870 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 ** all the fie
18880 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 lds up to that p
18890 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e oint were equal.
188a0 20 52 65 74 75 72 6e 20 74 68 65 20 74 68 65 20 Return the the
188b0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 default_rc. **
188c0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 65 74 value. */. ret
188d0 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 urn pPKey2->defa
188e0 75 6c 74 5f 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 ult_rc;.}.#endif
188f0 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d ../*.** Both *pM
18900 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 em1 and *pMem2 c
18910 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 ontain string va
18920 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 lues. Compare th
18930 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 e two values.**
18940 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 using the collat
18950 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f ion sequence pCo
18960 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 ll. As usual, re
18970 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 turn a negative
18980 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 , zero.** or pos
18990 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a itive value if *
189a0 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 pMem1 is less th
189b0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 an, equal to or
189c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a greater than .**
189d0 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 *pMem2, respect
189e0 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 ively. Similar i
189f0 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 n spirit to "rc
18a00 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 = (*pMem1) - (*p
18a10 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 Mem2);"..*/.stat
18a20 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 ic int vdbeCompa
18a30 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 reMemString(. c
18a40 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c onst Mem *pMem1,
18a50 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d . const Mem *pM
18a60 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c em2,. const Col
18a70 6c 53 65 71 20 2a 70 43 6f 6c 6c 0a 29 7b 0a 20 lSeq *pColl.){.
18a80 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d if( pMem1->enc=
18a90 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 =pColl->enc ){.
18aa0 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 /* The string
18ab0 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e s are already in
18ac0 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 the correct enc
18ad0 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 oding. Call the
18ae0 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 . ** compari
18af0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 son function dir
18b00 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 ectly */. ret
18b10 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 urn pColl->xCmp(
18b20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 pColl->pUser,pMe
18b30 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 m1->n,pMem1->z,p
18b40 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a Mem2->n,pMem2->z
18b50 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
18b60 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 int rc;. cons
18b70 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b t void *v1, *v2;
18b80 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b . int n1, n2;
18b90 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 . Mem c1;.
18ba0 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 6d 65 6d Mem c2;. mem
18bb0 73 65 74 28 26 63 31 2c 20 30 2c 20 73 69 7a 65 set(&c1, 0, size
18bc0 6f 66 28 63 31 29 29 3b 0a 20 20 20 20 6d 65 6d of(c1));. mem
18bd0 73 65 74 28 26 63 32 2c 20 30 2c 20 73 69 7a 65 set(&c2, 0, size
18be0 6f 66 28 63 32 29 29 3b 0a 20 20 20 20 73 71 6c of(c2));. sql
18bf0 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c ite3VdbeMemShall
18c00 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d owCopy(&c1, pMem
18c10 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 1, MEM_Ephem);.
18c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
18c30 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 mShallowCopy(&c2
18c40 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 , pMem2, MEM_Eph
18c50 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 em);. v1 = sq
18c60 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 lite3ValueText((
18c70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 sqlite3_value*)&
18c80 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b c1, pColl->enc);
18c90 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 . n1 = v1==0
18ca0 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 ? 0 : c1.n;.
18cb0 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 v2 = sqlite3Valu
18cc0 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 eText((sqlite3_v
18cd0 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c alue*)&c2, pColl
18ce0 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d ->enc);. n2 =
18cf0 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e v2==0 ? 0 : c2.
18d00 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c n;. rc = pCol
18d10 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 l->xCmp(pColl->p
18d20 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 User, n1, v1, n2
18d30 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 , v2);. sqlit
18d40 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 e3VdbeMemRelease
18d50 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 (&c1);. sqlit
18d60 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 e3VdbeMemRelease
18d70 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 (&c2);. retur
18d80 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a n rc;. }.}../*.
18d90 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 ** Compare the v
18da0 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 alues contained
18db0 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 by the two memor
18dc0 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 y cells, returni
18dd0 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 ng.** negative,
18de0 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 zero or positive
18df0 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 if pMem1 is les
18e00 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f s than, equal to
18e10 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 , or greater.**
18e20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 than pMem2. Sort
18e30 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c ing order is NUL
18e40 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f L's first, follo
18e50 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 wed by numbers (
18e60 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 integers.** and
18e70 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 reals) sorted nu
18e80 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f merically, follo
18e90 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 wed by text orde
18ea0 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 red by the colla
18eb0 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 ting.** sequence
18ec0 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c pColl and final
18ed0 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 ly blob's ordere
18ee0 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a d by memcmp()..*
18ef0 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 *.** Two NULL va
18f00 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 lues are conside
18f10 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 red equal by thi
18f20 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 s function..*/.i
18f30 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d nt sqlite3MemCom
18f40 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a pare(const Mem *
18f50 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d pMem1, const Mem
18f60 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 *pMem2, const C
18f70 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a ollSeq *pColl){.
18f80 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 int rc;. int
18f90 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f f1, f2;. int co
18fa0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 mbined_flags;..
18fb0 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 f1 = pMem1->fla
18fc0 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 gs;. f2 = pMem2
18fd0 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 ->flags;. combi
18fe0 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 ned_flags = f1|f
18ff0 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 2;. assert( (co
19000 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d mbined_flags & M
19010 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b EM_RowSet)==0 );
19020 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 . . /* If one v
19030 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 alue is NULL, it
19040 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 is less than th
19050 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 e other. If both
19060 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 values. ** are
19070 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e NULL, return 0.
19080 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 . */. if( comb
19090 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e ined_flags&MEM_N
190a0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 ull ){. retur
190b0 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 n (f2&MEM_Null)
190c0 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b - (f1&MEM_Null);
190d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e . }.. /* If on
190e0 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d e value is a num
190f0 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65 ber and the othe
19100 72 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75 r is not, the nu
19110 6d 62 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20 mber is less..
19120 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e ** If both are n
19130 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20 umbers, compare
19140 61 73 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20 as reals if one
19150 69 73 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73 is a real, or as
19160 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69 integers. ** i
19170 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72 f both values ar
19180 65 20 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f e integers.. */
19190 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f . if( combined_
191a0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d flags&(MEM_Int|M
191b0 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 EM_Real) ){.
191c0 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20 double r1, r2;.
191d0 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 if( (f1 & f2
191e0 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b & MEM_Int)!=0 ){
191f0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 . if( pMem1
19200 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 ->u.i < pMem2->u
19210 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a .i ) return -1;.
19220 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d if( pMem1-
19230 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e >u.i > pMem2->u.
19240 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 i ) return 1;.
19250 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 return 0;.
19260 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 }. if( (f1&
19270 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a MEM_Real)!=0 ){.
19280 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31 r1 = pMem1
19290 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 ->r;. }else i
192a0 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 f( (f1&MEM_Int)!
192b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31 20 3d =0 ){. r1 =
192c0 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31 2d 3e (double)pMem1->
192d0 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a u.i;. }else{.
192e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a return 1;.
192f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 }. if( (f
19300 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 2&MEM_Real)!=0 )
19310 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70 4d 65 {. r2 = pMe
19320 6d 32 2d 3e 72 3b 0a 20 20 20 20 7d 65 6c 73 65 m2->r;. }else
19330 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 if( (f2&MEM_Int
19340 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 32 )!=0 ){. r2
19350 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 32 = (double)pMem2
19360 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 ->u.i;. }else
19370 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d {. return -
19380 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 1;. }. if(
19390 20 72 31 3c 72 32 20 29 20 72 65 74 75 72 6e 20 r1<r2 ) return
193a0 2d 31 3b 0a 20 20 20 20 69 66 28 20 72 31 3e 72 -1;. if( r1>r
193b0 32 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 2 ) return 1;.
193c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
193d0 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c . /* If one val
193e0 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 ue is a string a
193f0 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 nd the other is
19400 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 a blob, the stri
19410 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a ng is less.. **
19420 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 If both are str
19430 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 ings, compare us
19440 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e ing the collatin
19450 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a g functions.. *
19460 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 /. if( combined
19470 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 _flags&MEM_Str )
19480 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 {. if( (f1 &
19490 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 MEM_Str)==0 ){.
194a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 return 1;.
194b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 }. if( (f2
194c0 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 & MEM_Str)==0 )
194d0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d {. return -
194e0 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 1;. }.. as
194f0 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 sert( pMem1->enc
19500 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a ==pMem2->enc );.
19510 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d assert( pMem
19520 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 1->enc==SQLITE_U
19530 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 TF8 || .
19540 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d pMem1->enc==
19550 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c SQLITE_UTF16LE |
19560 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 | pMem1->enc==SQ
19570 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a LITE_UTF16BE );.
19580 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c . /* The coll
19590 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d ation sequence m
195a0 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 ust be defined a
195b0 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 t this point, ev
195c0 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 en if. ** the
195d0 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 user deletes th
195e0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 e collation sequ
195f0 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 ence after the v
19600 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 dbe program is.
19610 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 ** compiled (
19620 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 this was not alw
19630 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 ays the case)..
19640 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 */. assert
19650 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c ( !pColl || pCol
19660 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 l->xCmp );..
19670 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 if( pColl ){.
19680 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f return vdbeCo
19690 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 mpareMemString(p
196a0 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f Mem1, pMem2, pCo
196b0 6c 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f ll);. }. /
196c0 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e * If a NULL poin
196d0 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 ter was passed a
196e0 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 s the collate fu
196f0 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 nction, fall thr
19700 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 ough. ** to t
19710 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 he blob case and
19720 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 use memcmp().
19730 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f */. }. . /* Bo
19740 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 th values must b
19750 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 e blobs. Compar
19760 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 e using memcmp()
19770 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d . */. rc = mem
19780 63 6d 70 28 70 4d 65 6d 31 2d 3e 7a 2c 20 70 4d cmp(pMem1->z, pM
19790 65 6d 32 2d 3e 7a 2c 20 28 70 4d 65 6d 31 2d 3e em2->z, (pMem1->
197a0 6e 3e 70 4d 65 6d 32 2d 3e 6e 29 3f 70 4d 65 6d n>pMem2->n)?pMem
197b0 32 2d 3e 6e 3a 70 4d 65 6d 31 2d 3e 6e 29 3b 0a 2->n:pMem1->n);.
197c0 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 if( rc==0 ){.
197d0 20 20 20 72 63 20 3d 20 70 4d 65 6d 31 2d 3e 6e rc = pMem1->n
197e0 20 2d 20 70 4d 65 6d 32 2d 3e 6e 3b 0a 20 20 7d - pMem2->n;. }
197f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
19800 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 ../*.** The firs
19810 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 t argument passe
19820 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 d to this functi
19830 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 on is a serial-t
19840 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 ype that.** corr
19850 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e esponds to an in
19860 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 teger - all valu
19870 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 es between 1 and
19880 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 9 inclusive .**
19890 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 except 7. The s
198a0 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 econd points to
198b0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e a buffer contain
198c0 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 ing an integer v
198d0 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a alue.** serializ
198e0 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 ed according to
198f0 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 serial_type. Thi
19900 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 s function deser
19910 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 ializes.** and r
19920 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 eturns the value
19930 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 ..*/.static i64
19940 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 vdbeRecordDecode
19950 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 Int(u32 serial_t
19960 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 ype, const u8 *a
19970 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 Key){. u32 y;.
19980 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 assert( CORRUPT
19990 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 _DB || (serial_t
199a0 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c ype>=1 && serial
199b0 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 _type<=9 && seri
199c0 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 al_type!=7) );.
199d0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f switch( serial_
199e0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 type ){. case
199f0 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 0:. case 1:.
19a00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
19a10 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a aKey[0]&0x80 );.
19a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 return ONE
19a30 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b _BYTE_INT(aKey);
19a40 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 . case 2:.
19a50 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 testcase( aKe
19a60 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 y[0]&0x80 );.
19a70 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 return TWO_BY
19a80 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 TE_INT(aKey);.
19a90 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 case 3:.
19aa0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 testcase( aKey[0
19ab0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 ]&0x80 );.
19ac0 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 return THREE_BYT
19ad0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 E_INT(aKey);.
19ae0 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 case 4: {.
19af0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b testcase( aKey[
19b00 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 0]&0x80 );.
19b10 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 y = FOUR_BYTE_U
19b20 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 INT(aKey);.
19b30 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 return (i64)*(i
19b40 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 nt*)&y;. }.
19b50 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 case 5: {.
19b60 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 testcase( aKey
19b70 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 [0]&0x80 );.
19b80 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 return FOUR_BY
19b90 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 TE_UINT(aKey+2)
19ba0 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 + (((i64)1)<<32)
19bb0 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b *TWO_BYTE_INT(aK
19bc0 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 ey);. }. c
19bd0 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 ase 6: {. u
19be0 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 64 x = FOUR_BYTE
19bf0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 _UINT(aKey);.
19c00 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 testcase( aKe
19c10 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 y[0]&0x80 );.
19c20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c x = (x<<32) |
19c30 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 FOUR_BYTE_UINT(
19c40 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 aKey+4);. r
19c50 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 eturn (i64)*(i64
19c60 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a *)&x;. }. }.
19c70 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 . return (seria
19c80 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a l_type - 8);.}..
19c90 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 /*.** This funct
19ca0 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 ion compares the
19cb0 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 two table rows
19cc0 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 or index records
19cd0 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 .** specified by
19ce0 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 {nKey1, pKey1}
19cf0 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 and pPKey2. It
19d00 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 returns a negati
19d10 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 ve, zero.** or p
19d20 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 ositive integer
19d30 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 if key1 is less
19d40 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f than, equal to o
19d50 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 r .** greater th
19d60 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e an key2. The {n
19d70 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 Key1, pKey1} key
19d80 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a must be a blob.
19d90 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 68 ** created by th
19da0 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f OP_MakeRecord o
19db0 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 pcode of the VDB
19dc0 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a E. The pPKey2.*
19dd0 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 * key must be a
19de0 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 parsed key such
19df0 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d as obtained from
19e00 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 .** sqlite3VdbeP
19e10 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a arseRecord..**.*
19e20 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 * If argument bS
19e30 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c kip is non-zero,
19e40 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 it is assumed t
19e50 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 hat the caller h
19e60 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 as already.** de
19e70 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 termined that th
19e80 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f e first fields o
19e90 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 f the keys are e
19ea0 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 qual..**.** Key1
19eb0 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 and Key2 do not
19ec0 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e have to contain
19ed0 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 the same number
19ee0 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 of fields. If a
19ef0 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 ll .** fields th
19f00 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 at appear in bot
19f10 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c h keys are equal
19f20 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 , then pPKey2->d
19f30 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a efault_rc is .**
19f40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a returned..**.**
19f50 20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 If database cor
19f60 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f ruption is disco
19f70 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 vered, set pPKey
19f80 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 74 6f 20 2->isCorrupt to
19f90 6e 6f 6e 2d 7a 65 72 6f 0a 2a 2a 20 61 6e 64 20 non-zero.** and
19fa0 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 69 6e 74 return 0..*/.int
19fb0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
19fc0 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 rdCompare(. int
19fd0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f nKey1, const vo
19fe0 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 id *pKey1, /*
19ff0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e Left key */. Un
1a000 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 packedRecord *pP
1a010 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a Key2, /*
1a020 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 Right key */.
1a030 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 int bSkip
1a040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a050 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 /* If true, skip
1a060 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 the first field
1a070 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b */.){. u32 d1;
1a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a090 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 /* Offs
1a0a0 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f et into aKey[] o
1a0b0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d f next data elem
1a0c0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 ent */. int i;
1a0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a0e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 /* Inde
1a0f0 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 x of next field
1a100 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 to compare */.
1a110 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 u32 szHdr1;
1a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a130 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 /* Size of recor
1a140 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 d header in byte
1a150 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b s */. u32 idx1;
1a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a170 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 /* Offset
1a180 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 of first type i
1a190 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e n header */. in
1a1a0 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 t rc = 0;
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a1c0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f Return value */
1a1d0 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 . Mem *pRhs = p
1a1e0 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 PKey2->aMem;
1a1f0 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 /* Next field
1a200 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f of pPKey2 to co
1a210 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e mpare */. KeyIn
1a220 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 fo *pKeyInfo = p
1a230 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b PKey2->pKeyInfo;
1a240 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 . const unsigne
1a250 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 d char *aKey1 =
1a260 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 (const unsigned
1a270 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 char *)pKey1;.
1a280 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 Mem mem1;.. /*
1a290 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 If bSkip is true
1a2a0 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 , then the calle
1a2b0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 r has already de
1a2c0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 termined that th
1a2d0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f e first. ** two
1a2e0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 elements in the
1a2f0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e keys are equal.
1a300 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 Fix the various
1a310 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 stack variables
1a320 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 so. ** that th
1a330 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e is routine begin
1a340 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 s comparing at t
1a350 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e he second field.
1a360 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 */. if( bSkip
1a370 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 ){. u32 s1;.
1a380 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 idx1 = 1 + ge
1a390 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 tVarint32(&aKey1
1a3a0 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a [1], s1);. sz
1a3b0 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b Hdr1 = aKey1[0];
1a3c0 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 . d1 = szHdr1
1a3d0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 + sqlite3VdbeSe
1a3e0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b rialTypeLen(s1);
1a3f0 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 . i = 1;.
1a400 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b pRhs++;. }else{
1a410 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 . idx1 = getV
1a420 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 arint32(aKey1, s
1a430 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d zHdr1);. d1 =
1a440 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 szHdr1;. if(
1a450 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b d1>(unsigned)nK
1a460 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 ey1 ){ . pP
1a470 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 Key2->isCorrupt
1a480 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 = (u8)SQLITE_COR
1a490 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 RUPT_BKPT;.
1a4a0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 return 0; /* C
1a4b0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 orruption */.
1a4c0 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 }. i = 0;.
1a4d0 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d }.. VVA_ONLY( m
1a4e0 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b em1.zMalloc = 0;
1a4f0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 ) /* Only neede
1a500 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 d by assert() st
1a510 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 atements */. as
1a520 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b sert( pPKey2->pK
1a530 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 eyInfo->nField+p
1a540 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1a550 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 >nXField>=pPKey2
1a560 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 ->nField .
1a570 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 || CORRUPT_DB )
1a580 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 ;. assert( pPKe
1a590 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 y2->pKeyInfo->aS
1a5a0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 ortOrder!=0 );.
1a5b0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d assert( pPKey2-
1a5c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c >pKeyInfo->nFiel
1a5d0 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 d>0 );. assert(
1a5e0 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c idx1<=szHdr1 ||
1a5f0 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 CORRUPT_DB );.
1a600 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 do{. u32 ser
1a610 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f ial_type;.. /
1a620 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 * RHS is an inte
1a630 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 ger */. if( p
1a640 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Rhs->flags & MEM
1a650 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 _Int ){. se
1a660 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 rial_type = aKey
1a670 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 1[idx1];. t
1a680 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f estcase( serial_
1a690 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 type==12 );.
1a6a0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 if( serial_typ
1a6b0 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 e>=12 ){.
1a6c0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 rc = +1;.
1a6d0 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c }else if( serial
1a6e0 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 _type==0 ){.
1a6f0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 rc = -1;.
1a700 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 }else if( ser
1a710 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 ial_type==7 ){.
1a720 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68 double rh
1a730 73 20 3d 20 28 64 6f 75 62 6c 65 29 70 52 68 73 s = (double)pRhs
1a740 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 73 ->u.i;. s
1a750 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
1a760 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 Get(&aKey1[d1],
1a770 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 serial_type, &me
1a780 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 m1);. if(
1a790 20 6d 65 6d 31 2e 72 3c 72 68 73 20 29 7b 0a 20 mem1.r<rhs ){.
1a7a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 rc = -1
1a7b0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 ;. }else
1a7c0 69 66 28 20 6d 65 6d 31 2e 72 3e 72 68 73 20 29 if( mem1.r>rhs )
1a7d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d {. rc =
1a7e0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 +1;. }.
1a7f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
1a800 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 i64 lhs = vd
1a810 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e beRecordDecodeIn
1a820 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 t(serial_type, &
1a830 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 aKey1[d1]);.
1a840 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 i64 rhs = pR
1a850 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 hs->u.i;.
1a860 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a if( lhs<rhs ){.
1a870 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d rc = -
1a880 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 1;. }else
1a890 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a if( lhs>rhs ){.
1a8a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b rc = +
1a8b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 1;. }.
1a8c0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
1a8d0 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a /* RHS is real *
1a8e0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 /. else if( p
1a8f0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Rhs->flags & MEM
1a900 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 _Real ){. s
1a910 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 erial_type = aKe
1a920 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 y1[idx1];.
1a930 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e if( serial_type>
1a940 3d 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 =12 ){. r
1a950 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 c = +1;. }e
1a960 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 lse if( serial_t
1a970 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ype==0 ){.
1a980 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 rc = -1;.
1a990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
1a9a0 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68 double rhs = pRh
1a9b0 73 2d 3e 72 3b 0a 20 20 20 20 20 20 20 20 64 6f s->r;. do
1a9c0 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20 20 uble lhs;.
1a9d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 sqlite3VdbeSer
1a9e0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 ialGet(&aKey1[d1
1a9f0 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 ], serial_type,
1aa00 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 &mem1);.
1aa10 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d if( serial_type=
1aa20 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =7 ){.
1aa30 6c 68 73 20 3d 20 6d 65 6d 31 2e 72 3b 0a 20 20 lhs = mem1.r;.
1aa40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
1aa50 20 20 20 20 20 20 20 6c 68 73 20 3d 20 28 64 6f lhs = (do
1aa60 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69 3b 0a 20 uble)mem1.u.i;.
1aa70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
1aa80 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a if( lhs<rhs ){.
1aa90 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d rc = -
1aaa0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 1;. }else
1aab0 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a if( lhs>rhs ){.
1aac0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b rc = +
1aad0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 1;. }.
1aae0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
1aaf0 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 /* RHS is a stri
1ab00 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 ng */. else i
1ab10 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 f( pRhs->flags &
1ab20 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 MEM_Str ){.
1ab30 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 getVarint32(&a
1ab40 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 Key1[idx1], seri
1ab50 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 al_type);.
1ab60 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c testcase( serial
1ab70 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 _type==12 );.
1ab80 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 if( serial_ty
1ab90 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 pe<12 ){.
1aba0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 rc = -1;.
1abb0 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 }else if( !(seri
1abc0 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 al_type & 0x01)
1abd0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
1abe0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b +1;. }else{
1abf0 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 . mem1.n
1ac00 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d = (serial_type -
1ac10 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 12) / 2;.
1ac20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b testcase( (d1+
1ac30 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e mem1.n)==(unsign
1ac40 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 ed)nKey1 );.
1ac50 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 testcase( (d
1ac60 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 1+mem1.n+1)==(un
1ac70 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a signed)nKey1 );.
1ac80 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b if( (d1+
1ac90 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 mem1.n) > (unsig
1aca0 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 ned)nKey1 ){.
1acb0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 69 pPKey2->i
1acc0 73 43 6f 72 72 75 70 74 20 3d 20 28 75 38 29 53 sCorrupt = (u8)S
1acd0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1ace0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 PT;. re
1acf0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 turn 0;
1ad00 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 /* Corrup
1ad10 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 tion */.
1ad20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e }else if( pKeyIn
1ad30 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a fo->aColl[i] ){.
1ad40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 mem1.e
1ad50 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 nc = pKeyInfo->e
1ad60 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 nc;. me
1ad70 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f m1.db = pKeyInfo
1ad80 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 ->db;.
1ad90 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d mem1.flags = MEM
1ada0 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 _Str;.
1adb0 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 mem1.z = (char*)
1adc0 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 &aKey1[d1];.
1add0 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 rc = vdbeC
1ade0 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 ompareMemString(
1adf0 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 &mem1, pRhs, pKe
1ae00 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 yInfo->aColl[i])
1ae10 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
1ae20 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e . int n
1ae30 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e Cmp = MIN(mem1.n
1ae40 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 , pRhs->n);.
1ae50 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d rc = memcm
1ae60 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 p(&aKey1[d1], pR
1ae70 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 hs->z, nCmp);.
1ae80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
1ae90 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 0 ) rc = mem1.n
1aea0 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 - pRhs->n; .
1aeb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
1aec0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 }.. /* RHS
1aed0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 is a blob */.
1aee0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e else if( pRhs->
1aef0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 flags & MEM_Blob
1af00 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 ){. getVar
1af10 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 int32(&aKey1[idx
1af20 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 1], serial_type)
1af30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
1af40 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 ( serial_type==1
1af50 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 2 );. if( s
1af60 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c erial_type<12 ||
1af70 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 (serial_type &
1af80 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 0x01) ){.
1af90 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 rc = -1;.
1afa0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 }else{. i
1afb0 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 nt nStr = (seria
1afc0 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 l_type - 12) / 2
1afd0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1afe0 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 se( (d1+nStr)==(
1aff0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 unsigned)nKey1 )
1b000 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1b010 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d se( (d1+nStr+1)=
1b020 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 =(unsigned)nKey1
1b030 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 );. if(
1b040 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 (d1+nStr) > (uns
1b050 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 igned)nKey1 ){.
1b060 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d pPKey2-
1b070 3e 69 73 43 6f 72 72 75 70 74 20 3d 20 28 75 38 >isCorrupt = (u8
1b080 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f )SQLITE_CORRUPT_
1b090 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 BKPT;.
1b0a0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 return 0;
1b0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 /* Corr
1b0c0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 uption */.
1b0d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
1b0e0 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 int nCmp = MI
1b0f0 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 N(nStr, pRhs->n)
1b100 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d ;. rc =
1b110 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 memcmp(&aKey1[d
1b120 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 1], pRhs->z, nCm
1b130 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 p);. if
1b140 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e ( rc==0 ) rc = n
1b150 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 Str - pRhs->n;.
1b160 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
1b170 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
1b180 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 HS is null */.
1b190 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 else{. se
1b1a0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 rial_type = aKey
1b1b0 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 1[idx1];. r
1b1c0 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 c = (serial_type
1b1d0 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 !=0);. }..
1b1e0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 if( rc!=0 ){.
1b1f0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f if( pKeyInfo
1b200 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 ->aSortOrder[i]
1b210 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
1b220 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 -rc;. }.
1b230 20 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 assert( CORRU
1b240 50 54 5f 44 42 0a 20 20 20 20 20 20 20 20 20 20 PT_DB.
1b250 7c 7c 20 28 72 63 3c 30 20 26 26 20 76 64 62 65 || (rc<0 && vdbe
1b260 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 RecordCompareDeb
1b270 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c ug(nKey1, pKey1,
1b280 20 70 50 4b 65 79 32 29 3c 30 29 0a 20 20 20 20 pPKey2)<0).
1b290 20 20 20 20 20 20 7c 7c 20 28 72 63 3e 30 20 26 || (rc>0 &
1b2a0 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 & vdbeRecordComp
1b2b0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 areDebug(nKey1,
1b2c0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3e 30 pKey1, pPKey2)>0
1b2d0 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 ). || p
1b2e0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c KeyInfo->db->mal
1b2f0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 20 20 20 20 locFailed.
1b300 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 );. assert(
1b310 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 mem1.zMalloc==0
1b320 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d ); /* See comm
1b330 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 ent below */.
1b340 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
1b350 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 }.. i++;.
1b360 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 pRhs++;. d1
1b370 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 += sqlite3VdbeS
1b380 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
1b390 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 ial_type);. i
1b3a0 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 dx1 += sqlite3Va
1b3b0 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 rintLen(serial_t
1b3c0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 ype);. }while(
1b3d0 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 idx1<(unsigned)s
1b3e0 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 zHdr1 && i<pPKey
1b3f0 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 2->nField && d1<
1b400 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 =(unsigned)nKey1
1b410 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d );.. /* No mem
1b420 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 ory allocation i
1b430 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d s ever used on m
1b440 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 em1. Prove this
1b450 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 using. ** the
1b460 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 following assert
1b470 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 (). If the asse
1b480 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 rt() fails, it i
1b490 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 ndicates a. **
1b4a0 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 memory leak and
1b4b0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 a need to call s
1b4c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
1b4d0 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f ease(&mem1). */
1b4e0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e . assert( mem1.
1b4f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 zMalloc==0 );..
1b500 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d /* rc==0 here m
1b510 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 eans that one or
1b520 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 both of the key
1b530 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 s ran out of fie
1b540 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c lds and. ** all
1b550 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 the fields up t
1b560 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 o that point wer
1b570 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 e equal. Return
1b580 74 68 65 20 74 68 65 20 64 65 66 61 75 6c 74 5f the the default_
1b590 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 rc. ** value.
1b5a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 */. assert( COR
1b5b0 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20 RUPT_DB .
1b5c0 7c 7c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 || pPKey2->defau
1b5d0 6c 74 5f 72 63 3d 3d 76 64 62 65 52 65 63 6f 72 lt_rc==vdbeRecor
1b5e0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b dCompareDebug(nK
1b5f0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 ey1, pKey1, pPKe
1b600 79 32 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 y2) . || p
1b610 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c KeyInfo->db->mal
1b620 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 locFailed. );.
1b630 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e return pPKey2->
1b640 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 0a 2f default_rc;.}../
1b650 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 *.** This functi
1b660 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a on is an optimiz
1b670 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 ed version of sq
1b680 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 lite3VdbeRecordC
1b690 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 ompare() .** tha
1b6a0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20 t (a) the first
1b6b0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 field of pPKey2
1b6c0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 is an integer, a
1b6d0 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 nd (b) the .** s
1b6e0 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 ize-of-header va
1b6f0 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 rint at the star
1b700 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 t of (pKey1/nKey
1b710 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 1) fits in a sin
1b720 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 gle.** byte (i.e
1b730 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 31 . is less than 1
1b740 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 28)..**.** To av
1b750 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f oid concerns abo
1b760 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 ut buffer overre
1b770 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e ads, this routin
1b780 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a e is only used.*
1b790 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68 65 * on schemas whe
1b7a0 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 re the maximum v
1b7b0 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a 65 alid header size
1b7c0 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72 20 is 63 bytes or
1b7d0 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 less..*/.static
1b7e0 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f int vdbeRecordCo
1b7f0 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 mpareInt(. int
1b800 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 nKey1, const voi
1b810 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 d *pKey1, /* Lef
1b820 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 t key */. Unpac
1b830 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 kedRecord *pPKey
1b840 32 2c 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 2, /* Righ
1b850 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 t key */. int b
1b860 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 Skip
1b870 20 20 20 20 20 20 20 20 20 2f 2a 20 49 67 6e 6f /* Igno
1b880 72 65 64 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 red */.){. cons
1b890 74 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 t u8 *aKey = &((
1b8a0 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 const u8*)pKey1)
1b8b0 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 [*(const u8*)pKe
1b8c0 79 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e y1 & 0x3F];. in
1b8d0 74 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 t serial_type =
1b8e0 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 ((const u8*)pKey
1b8f0 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 1)[1];. int res
1b900 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 ;. u32 y;. u64
1b910 20 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 x;. i64 v = pP
1b920 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e Key2->aMem[0].u.
1b930 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 20 20 i;. i64 lhs;.
1b940 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
1b950 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61 73 73 65 (bSkip);.. asse
1b960 72 74 28 20 62 53 6b 69 70 3d 3d 30 20 29 3b 0a rt( bSkip==0 );.
1b970 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a assert( (*(u8*
1b980 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c )pKey1)<=0x3F ||
1b990 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 CORRUPT_DB );.
1b9a0 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f switch( serial_
1b9b0 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 type ){. case
1b9c0 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 1: { /* 1-byte
1b9d0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a signed integer *
1b9e0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e /. lhs = ON
1b9f0 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 E_BYTE_INT(aKey)
1ba00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
1ba10 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 ( lhs<0 );.
1ba20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
1ba30 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 case 2: { /* 2
1ba40 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 -byte signed int
1ba50 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 eger */. lh
1ba60 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 s = TWO_BYTE_INT
1ba70 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 (aKey);. te
1ba80 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b stcase( lhs<0 );
1ba90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
1baa0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 }. case 3:
1bab0 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e { /* 3-byte sign
1bac0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 ed integer */.
1bad0 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f lhs = THREE_
1bae0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a BYTE_INT(aKey);.
1baf0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1bb00 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 lhs<0 );. b
1bb10 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
1bb20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 case 4: { /* 4-b
1bb30 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
1bb40 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 er */. y =
1bb50 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 FOUR_BYTE_UINT(a
1bb60 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 Key);. lhs
1bb70 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 = (i64)*(int*)&y
1bb80 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
1bb90 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 ( lhs<0 );.
1bba0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
1bbb0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 case 5: { /* 6
1bbc0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 -byte signed int
1bbd0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 eger */. lh
1bbe0 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 s = FOUR_BYTE_UI
1bbf0 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 NT(aKey+2) + (((
1bc00 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f i64)1)<<32)*TWO_
1bc10 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a BYTE_INT(aKey);.
1bc20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1bc30 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 lhs<0 );. b
1bc40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
1bc50 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 case 6: { /* 8-b
1bc60 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
1bc70 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 er */. x =
1bc80 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 FOUR_BYTE_UINT(a
1bc90 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 Key);. x =
1bca0 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 (x<<32) | FOUR_B
1bcb0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 YTE_UINT(aKey+4)
1bcc0 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 ;. lhs = *(
1bcd0 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 i64*)&x;. t
1bce0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 estcase( lhs<0 )
1bcf0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
1bd00 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a }. case 8:
1bd10 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b . lhs = 0;
1bd20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
1bd30 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 case 9:.
1bd40 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 lhs = 1;. b
1bd50 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 reak;.. /* Th
1bd60 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 is case could be
1bd70 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 removed without
1bd80 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 changing the re
1bd90 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 sults of running
1bda0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 . ** this cod
1bdb0 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 e. Including it
1bdc0 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 causes gcc to ge
1bdd0 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 72 20 nerate a faster
1bde0 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 switch . ** s
1bdf0 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 tatement (since
1be00 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 the range of swi
1be10 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 tch targets now
1be20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 starts at zero a
1be30 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e nd. ** is con
1be40 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 tiguous) but doe
1be50 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 s not cause any
1be60 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 duplicate code t
1be70 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 o be generated.
1be80 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 ** (as gcc is
1be90 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 clever enough t
1bea0 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 o combine the tw
1beb0 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f o like cases). O
1bec0 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d ther . ** com
1bed0 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 pilers might be
1bee0 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 similar. */ .
1bef0 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 case 0: case 7
1bf00 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 :. return s
1bf10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 qlite3VdbeRecord
1bf20 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 Compare(nKey1, p
1bf30 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 Key1, pPKey2, 0)
1bf40 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a ;.. default:.
1bf50 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c return sql
1bf60 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
1bf70 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 mpare(nKey1, pKe
1bf80 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a y1, pPKey2, 0);.
1bf90 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73 }.. if( v>lhs
1bfa0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 ){. res = pP
1bfb0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 Key2->r1;. }els
1bfc0 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20 e if( v<lhs ){.
1bfd0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d res = pPKey2-
1bfe0 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 >r2;. }else if(
1bff0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e pPKey2->nField>
1c000 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 1 ){. /* The
1c010 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 first fields of
1c020 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 the two keys are
1c030 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20 equal. Compare
1c040 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20 the trailing .
1c050 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f ** fields. */
1c060 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 . res = sqlit
1c070 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e3VdbeRecordComp
1c080 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 are(nKey1, pKey1
1c090 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 , pPKey2, 1);.
1c0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 }else{. /* Th
1c0b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f e first fields o
1c0c0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 f the two keys a
1c0d0 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 re equal and the
1c0e0 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 re are no traili
1c0f0 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 ng. ** fields
1c100 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d . Return pPKey2-
1c110 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 >default_rc in t
1c120 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 his case. */.
1c130 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 res = pPKey2->d
1c140 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a efault_rc;. }..
1c150 20 20 61 73 73 65 72 74 28 20 28 72 65 73 3d 3d assert( (res==
1c160 30 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 0 && vdbeRecordC
1c170 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 ompareDebug(nKey
1c180 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 1, pKey1, pPKey2
1c190 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 )==0). ||
1c1a0 28 72 65 73 3c 30 20 26 26 20 76 64 62 65 52 65 (res<0 && vdbeRe
1c1b0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 cordCompareDebug
1c1c0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 (nKey1, pKey1, p
1c1d0 50 4b 65 79 32 29 3c 30 29 0a 20 20 20 20 20 20 PKey2)<0).
1c1e0 20 7c 7c 20 28 72 65 73 3e 30 20 26 26 20 76 64 || (res>0 && vd
1c1f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 beRecordCompareD
1c200 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 ebug(nKey1, pKey
1c210 31 2c 20 70 50 4b 65 79 32 29 3e 30 29 0a 20 20 1, pPKey2)>0).
1c220 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f || CORRUPT_
1c230 44 42 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e DB. );. return
1c240 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 res;.}../*.** T
1c250 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
1c260 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 an optimized ver
1c270 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 sion of sqlite3V
1c280 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1c290 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 () .** that (a)
1c2a0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 the first field
1c2b0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 of pPKey2 is a s
1c2c0 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 tring, that (b)
1c2d0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a the first field.
1c2e0 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c ** uses the coll
1c2f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 ation sequence B
1c300 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 INARY and (c) th
1c310 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 at the size-of-h
1c320 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a eader varint .**
1c330 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 at the start of
1c340 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 (pKey1/nKey1) f
1c350 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 its in a single
1c360 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 byte..*/.static
1c370 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f int vdbeRecordCo
1c380 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 mpareString(. i
1c390 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 nt nKey1, const
1c3a0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 void *pKey1, /*
1c3b0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e Left key */. Un
1c3c0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 packedRecord *pP
1c3d0 4b 65 79 32 2c 20 20 20 20 20 20 20 2f 2a 20 52 Key2, /* R
1c3e0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e ight key */. in
1c3f0 74 20 62 53 6b 69 70 0a 29 7b 0a 20 20 63 6f 6e t bSkip.){. con
1c400 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 st u8 *aKey1 = (
1c410 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b const u8*)pKey1;
1c420 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 . int serial_ty
1c430 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 pe;. int res;.
1c440 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
1c450 52 28 62 53 6b 69 70 29 3b 0a 0a 20 20 61 73 73 R(bSkip);.. ass
1c460 65 72 74 28 20 62 53 6b 69 70 3d 3d 30 20 29 3b ert( bSkip==0 );
1c470 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 . getVarint32(&
1c480 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c aKey1[1], serial
1c490 5f 74 79 70 65 29 3b 0a 0a 20 20 69 66 28 20 73 _type);.. if( s
1c4a0 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b erial_type<12 ){
1c4b0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 . res = pPKey
1c4c0 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 2->r1; /* (
1c4d0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 pKey1/nKey1) is
1c4e0 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 a number or a nu
1c4f0 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 ll */. }else if
1c500 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 ( !(serial_type
1c510 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 & 0x01) ){ .
1c520 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 res = pPKey2->r2
1c530 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 ; /* (pKey1
1c540 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f /nKey1) is a blo
1c550 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 b */. }else{.
1c560 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 int nCmp;.
1c570 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e int nStr;. in
1c580 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b t szHdr = aKey1[
1c590 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 0];.. nStr =
1c5a0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 (serial_type-12)
1c5b0 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 / 2;. if( (s
1c5c0 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e zHdr + nStr) > n
1c5d0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 Key1 ){. pP
1c5e0 4b 65 79 32 2d 3e 69 73 43 6f 72 72 75 70 74 20 Key2->isCorrupt
1c5f0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 = (u8)SQLITE_COR
1c600 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 RUPT_BKPT;.
1c610 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a return 0; /*
1c620 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 Corruption */.
1c630 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 }. nCmp =
1c640 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 MIN( pPKey2->aMe
1c650 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a m[0].n, nStr );.
1c660 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 res = memcmp
1c670 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 (&aKey1[szHdr],
1c680 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e pPKey2->aMem[0].
1c690 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 z, nCmp);.. i
1c6a0 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 f( res==0 ){.
1c6b0 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 res = nStr -
1c6c0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e pPKey2->aMem[0].
1c6d0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 n;. if( res
1c6e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 ==0 ){. i
1c6f0 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c f( pPKey2->nFiel
1c700 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 d>1 ){.
1c710 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 res = sqlite3Vd
1c720 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
1c730 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
1c740 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 Key2, 1);.
1c750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
1c760 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d res = pPKey2-
1c770 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 >default_rc;.
1c780 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c }. }el
1c790 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a se if( res>0 ){.
1c7a0 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 res = pP
1c7b0 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 Key2->r2;.
1c7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 }else{. r
1c7d0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b es = pPKey2->r1;
1c7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c . }. }el
1c7f0 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a se if( res>0 ){.
1c800 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 res = pPKe
1c810 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 y2->r2;. }els
1c820 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 e{. res = p
1c830 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d PKey2->r1;. }
1c840 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 . }.. assert(
1c850 28 72 65 73 3d 3d 30 20 26 26 20 76 64 62 65 52 (res==0 && vdbeR
1c860 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 ecordCompareDebu
1c870 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 g(nKey1, pKey1,
1c880 70 50 4b 65 79 32 29 3d 3d 30 29 0a 20 20 20 20 pPKey2)==0).
1c890 20 20 20 7c 7c 20 28 72 65 73 3c 30 20 26 26 20 || (res<0 &&
1c8a0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 vdbeRecordCompar
1c8b0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b eDebug(nKey1, pK
1c8c0 65 79 31 2c 20 70 50 4b 65 79 32 29 3c 30 29 0a ey1, pPKey2)<0).
1c8d0 20 20 20 20 20 20 20 7c 7c 20 28 72 65 73 3e 30 || (res>0
1c8e0 20 26 26 20 76 64 62 65 52 65 63 6f 72 64 43 6f && vdbeRecordCo
1c8f0 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 mpareDebug(nKey1
1c900 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 , pKey1, pPKey2)
1c910 3e 30 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f >0). || CO
1c920 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 RRUPT_DB.
1c930 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 || pPKey2->pKeyI
1c940 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 nfo->db->mallocF
1c950 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 ailed. );. ret
1c960 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a urn res;.}../*.*
1c970 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 * Return a point
1c980 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 er to an sqlite3
1c990 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
1c9a0 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 e() compatible f
1c9b0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 unction.** suita
1c9c0 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e ble for comparin
1c9d0 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 g serialized rec
1c9e0 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 ords to the unpa
1c9f0 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 cked record pass
1ca00 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c ed.** as the onl
1ca10 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 y argument..*/.R
1ca20 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c ecordCompare sql
1ca30 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 ite3VdbeFindComp
1ca40 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f are(UnpackedReco
1ca50 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 rd *p){. /* var
1ca60 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 intRecordCompare
1ca70 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 Int() and varint
1ca80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 RecordCompareStr
1ca90 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d ing() both assum
1caa0 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 e. ** that the
1cab0 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 size-of-header v
1cac0 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 arint that occur
1cad0 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f s at the start o
1cae0 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 f each record.
1caf0 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e ** fits in a sin
1cb00 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 gle byte (i.e. i
1cb10 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 s 127 or less).
1cb20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 varintRecordComp
1cb30 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c areInt(). ** al
1cb40 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 so assumes that
1cb50 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 it is safe to ov
1cb60 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 erread a buffer
1cb70 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 by at least the
1cb80 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f . ** maximum po
1cb90 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 ssible legal hea
1cba0 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 der size plus 8
1cbb0 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 bytes. Because t
1cbc0 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 here is. ** gua
1cbd0 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 ranteed to be at
1cbe0 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e least 74 (but n
1cbf0 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 ot 136) bytes of
1cc00 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 padding followi
1cc10 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 ng each. ** buf
1cc20 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 fer passed to va
1cc30 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 rintRecordCompar
1cc40 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 eInt() this make
1cc50 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 s it convenient
1cc60 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 to. ** limit th
1cc70 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 e size of the he
1cc80 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 ader to 64 bytes
1cc90 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 in cases where
1cca0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a the first field.
1ccb0 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 ** is an integ
1ccc0 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 er.. **. ** Th
1ccd0 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f e easiest way to
1cce0 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 enforce this li
1ccf0 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 mit is to consid
1cd00 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 er only records
1cd10 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 with. ** 13 fie
1cd20 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 lds or less. If
1cd30 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 the first field
1cd40 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 is an integer, t
1cd50 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c he maximum legal
1cd60 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a . ** header siz
1cd70 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b e is (12*5 + 1 +
1cd80 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 1) bytes. */.
1cd90 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 if( (p->pKeyInf
1cda0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 o->nField + p->p
1cdb0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 KeyInfo->nXField
1cdc0 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 )<=13 ){. int
1cdd0 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d flags = p->aMem
1cde0 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 [0].flags;. i
1cdf0 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e f( p->pKeyInfo->
1ce00 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b aSortOrder[0] ){
1ce10 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 . p->r1 = 1
1ce20 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 ;. p->r2 =
1ce30 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 -1;. }else{.
1ce40 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b p->r1 = -1;
1ce50 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 . p->r2 = 1
1ce60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
1ce70 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 (flags & MEM_Int
1ce80 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 ) ){. retur
1ce90 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 n vdbeRecordComp
1cea0 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 areInt;. }.
1ceb0 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 testcase( flag
1cec0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a s & MEM_Real );.
1ced0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c testcase( fl
1cee0 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 ags & MEM_Null )
1cef0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 ;. testcase(
1cf00 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 flags & MEM_Blob
1cf10 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 );. if( (fla
1cf20 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d gs & (MEM_Real|M
1cf30 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 EM_Null|MEM_Blob
1cf40 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 ))==0 && p->pKey
1cf50 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d Info->aColl[0]==
1cf60 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 0 ){. asser
1cf70 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 t( flags & MEM_S
1cf80 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 tr );. retu
1cf90 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d rn vdbeRecordCom
1cfa0 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 pareString;.
1cfb0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 }. }.. return
1cfc0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 sqlite3VdbeRecor
1cfd0 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a dCompare;.}../*.
1cfe0 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 ** pCur points a
1cff0 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 t an index entry
1d000 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 created using t
1d010 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 he OP_MakeRecord
1d020 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 opcode..** Read
1d030 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 the rowid (the
1d040 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 last field in th
1d050 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 e record) and st
1d060 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 ore it in *rowid
1d070 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 ..** Return SQLI
1d080 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 TE_OK if everyth
1d090 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e ing works, or an
1d0a0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 error code othe
1d0b0 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 rwise..**.** pCu
1d0c0 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 r might be point
1d0d0 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 ing to text obta
1d0e0 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 ined from a corr
1d0f0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c upt database fil
1d100 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e e..** So the con
1d110 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 tent cannot be t
1d120 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 rusted. Do appr
1d130 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f opriate checks o
1d140 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a n the content..*
1d150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
1d160 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 eIdxRowid(sqlite
1d170 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 3 *db, BtCursor
1d180 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 *pCur, i64 *rowi
1d190 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b d){. i64 nCellK
1d1a0 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 ey = 0;. int rc
1d1b0 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 ;. u32 szHdr;
1d1c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 /* Size of
1d1d0 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 the header */.
1d1e0 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 u32 typeRowid;
1d1f0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 /* Serial typ
1d200 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a e of the rowid *
1d210 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 /. u32 lenRowid
1d220 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 ; /* Size of
1d230 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 the rowid */.
1d240 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 Mem m, v;.. UNU
1d250 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 SED_PARAMETER(db
1d260 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 );.. /* Get the
1d270 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 size of the ind
1d280 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 ex entry. Only
1d290 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 indices entries
1d2a0 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 of less. ** tha
1d2b0 6e 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f n 2GiB are suppo
1d2c0 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 rt - anything la
1d2d0 72 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 rge must be data
1d2e0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e base corruption.
1d2f0 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 . ** Any corrup
1d300 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 tion is detected
1d310 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 in sqlite3Btree
1d320 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 ParseCellPtr(),
1d330 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 though, so. **
1d340 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 this code can sa
1d350 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 fely assume that
1d360 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d nCellKey is 32-
1d370 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 bits . */. as
1d380 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 sert( sqlite3Btr
1d390 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 eeCursorIsValid(
1d3a0 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f pCur) );. VVA_O
1d3b0 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 NLY(rc =) sqlite
1d3c0 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 3BtreeKeySize(pC
1d3d0 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a ur, &nCellKey);.
1d3e0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 assert( rc==SQ
1d3f0 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f LITE_OK ); /
1d400 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 * pCur is always
1d410 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a valid so KeySiz
1d420 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f e cannot fail */
1d430 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c . assert( (nCel
1d440 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 lKey & SQLITE_MA
1d450 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 X_U32)==(u64)nCe
1d460 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 llKey );.. /* R
1d470 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c ead in the compl
1d480 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 ete content of t
1d490 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a he index entry *
1d4a0 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 /. memset(&m, 0
1d4b0 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 , sizeof(m));.
1d4c0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 rc = sqlite3Vdbe
1d4d0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 MemFromBtree(pCu
1d4e0 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c r, 0, (u32)nCell
1d4f0 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 Key, 1, &m);. i
1d500 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 f( rc ){. ret
1d510 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f urn rc;. }.. /
1d520 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 * The index entr
1d530 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 y must begin wit
1d540 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 h a header size
1d550 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 */. (void)getVa
1d560 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c rint32((u8*)m.z,
1d570 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 szHdr);. testc
1d580 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b ase( szHdr==3 );
1d590 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 . testcase( szH
1d5a0 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 dr==m.n );. if(
1d5b0 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c unlikely(szHdr<
1d5c0 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 3 || (int)szHdr>
1d5d0 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f m.n) ){. goto
1d5e0 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 idx_rowid_corru
1d5f0 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a ption;. }.. /*
1d600 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 The last field
1d610 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f of the index sho
1d620 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 uld be an intege
1d630 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 r - the ROWID..
1d640 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 ** Verify that
1d650 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 the last entry r
1d660 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 eally is an inte
1d670 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 ger. */. (void)
1d680 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a getVarint32((u8*
1d690 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 )&m.z[szHdr-1],
1d6a0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 typeRowid);. te
1d6b0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
1d6c0 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 d==1 );. testca
1d6d0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 se( typeRowid==2
1d6e0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
1d6f0 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a typeRowid==3 );.
1d700 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
1d710 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 Rowid==4 );. te
1d720 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
1d730 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 d==5 );. testca
1d740 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 se( typeRowid==6
1d750 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
1d760 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a typeRowid==8 );.
1d770 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
1d780 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 Rowid==9 );. if
1d790 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 ( unlikely(typeR
1d7a0 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f owid<1 || typeRo
1d7b0 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 wid>9 || typeRow
1d7c0 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f id==7) ){. go
1d7d0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 to idx_rowid_cor
1d7e0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c ruption;. }. l
1d7f0 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 enRowid = sqlite
1d800 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 3VdbeSerialTypeL
1d810 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 en(typeRowid);.
1d820 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 testcase( (u32)
1d830 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f m.n==szHdr+lenRo
1d840 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c wid );. if( unl
1d850 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 ikely((u32)m.n<s
1d860 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 zHdr+lenRowid) )
1d870 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 {. goto idx_r
1d880 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b owid_corruption;
1d890 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 . }.. /* Fetch
1d8a0 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 the integer off
1d8b0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 the end of the
1d8c0 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a index record */.
1d8d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 sqlite3VdbeSer
1d8e0 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a ialGet((u8*)&m.z
1d8f0 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 [m.n-lenRowid],
1d900 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a typeRowid, &v);.
1d910 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 *rowid = v.u.i
1d920 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d ;. sqlite3VdbeM
1d930 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 emRelease(&m);.
1d940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
1d950 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 K;.. /* Jump he
1d960 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 re if database c
1d970 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 orruption is det
1d980 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 ected after m ha
1d990 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f s been. ** allo
1d9a0 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 cated. Free the
1d9b0 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 m object and re
1d9c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 turn SQLITE_CORR
1d9d0 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 UPT. */.idx_rowi
1d9e0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 d_corruption:.
1d9f0 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d 61 6c testcase( m.zMal
1da00 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 loc!=0 );. sqli
1da10 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
1da20 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 e(&m);. return
1da30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
1da40 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f KPT;.}../*.** Co
1da50 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 mpare the key of
1da60 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 the index entry
1da70 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 that cursor pC
1da80 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 is pointing to a
1da90 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 gainst.** the ke
1daa0 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 y string in pUnp
1dab0 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e acked. Write in
1dac0 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 to *pRes a numbe
1dad0 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 r.** that is neg
1dae0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 ative, zero, or
1daf0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69 positive if pC i
1db00 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 s less than, equ
1db10 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 al to,.** or gre
1db20 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 ater than pUnpac
1db30 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c ked. Return SQL
1db40 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 ITE_OK on succes
1db50 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b s..**.** pUnpack
1db60 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65 ed is either cre
1db70 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 ated without a r
1db80 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 owid or is trunc
1db90 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a ated so that it.
1dba0 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 ** omits the row
1dbb0 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 id at the end.
1dbc0 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 The rowid at the
1dbd0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 end of the inde
1dbe0 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 x entry.** is ig
1dbf0 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 nored as well.
1dc00 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 Hence, this rout
1dc10 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 ine only compare
1dc20 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a s the prefixes .
1dc30 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 ** of the keys p
1dc40 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 rior to the fina
1dc50 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 l rowid, not the
1dc60 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a entire key..*/.
1dc70 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 int sqlite3VdbeI
1dc80 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 dxKeyCompare(.
1dc90 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 VdbeCursor *pC,
1dca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dcb0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 /* The cursor t
1dcc0 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 o compare agains
1dcd0 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 t */. UnpackedR
1dce0 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 ecord *pUnpacked
1dcf0 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 , /* Unpac
1dd00 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b ked version of k
1dd10 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 ey */. int *res
1dd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dd30 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 /* Writ
1dd40 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e e the comparison
1dd50 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a result here */.
1dd60 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 ){. i64 nCellKe
1dd70 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b y = 0;. int rc;
1dd80 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 . BtCursor *pCu
1dd90 72 20 3d 20 70 43 2d 3e 70 43 75 72 73 6f 72 3b r = pC->pCursor;
1dda0 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 . Mem m;.. ass
1ddb0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 ert( sqlite3Btre
1ddc0 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 eCursorIsValid(p
1ddd0 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e Cur) );. VVA_ON
1dde0 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 LY(rc =) sqlite3
1ddf0 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 BtreeKeySize(pCu
1de00 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 r, &nCellKey);.
1de10 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c assert( rc==SQL
1de20 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 ITE_OK ); /*
1de30 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 pCur is always v
1de40 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 alid so KeySize
1de50 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 cannot fail */.
1de60 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c /* nCellKey wil
1de70 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 l always be betw
1de80 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 een 0 and 0xffff
1de90 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 ffff because of
1dea0 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 the way. ** tha
1deb0 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c t btreeParseCell
1dec0 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 Ptr() and sqlite
1ded0 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 3GetVarint32() a
1dee0 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a re implemented *
1def0 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 /. if( nCellKey
1df00 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e <=0 || nCellKey>
1df10 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 0x7fffffff ){.
1df20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 *res = 0;.
1df30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
1df40 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a RRUPT_BKPT;. }.
1df50 20 20 6d 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 memset(&m, 0,
1df60 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 sizeof(m));. rc
1df70 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 = sqlite3VdbeMe
1df80 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 mFromBtree(pC->p
1df90 43 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 Cursor, 0, (u32)
1dfa0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 nCellKey, 1, &m)
1dfb0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 ;. if( rc ){.
1dfc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d return rc;. }
1dfd0 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 . *res = sqlite
1dfe0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 3VdbeRecordCompa
1dff0 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e re(m.n, m.z, pUn
1e000 70 61 63 6b 65 64 2c 20 30 29 3b 0a 20 20 73 71 packed, 0);. sq
1e010 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
1e020 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 ase(&m);. retur
1e030 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
1e040 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
1e050 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 ne sets the valu
1e060 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 e to be returned
1e070 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 by subsequent c
1e080 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 alls to.** sqlit
1e090 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 e3_changes() on
1e0a0 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e the database han
1e0b0 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f dle 'db'. .*/.vo
1e0c0 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 id sqlite3VdbeSe
1e0d0 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 tChanges(sqlite3
1e0e0 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 *db, int nChang
1e0f0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 e){. assert( sq
1e100 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
1e110 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 (db->mutex) );.
1e120 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e db->nChange = n
1e130 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 Change;. db->nT
1e140 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 otalChange += nC
1e150 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 hange;.}../*.**
1e160 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 Set a flag in th
1e170 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 e vdbe to update
1e180 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e the change coun
1e190 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 ter when it is f
1e1a0 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 inalised.** or r
1e1b0 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 eset..*/.void sq
1e1c0 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 lite3VdbeCountCh
1e1d0 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a anges(Vdbe *v){.
1e1e0 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e v->changeCntOn
1e1f0 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d = 1;.}../*.** M
1e200 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 ark every prepar
1e210 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 ed statement ass
1e220 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 ociated with a d
1e230 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
1e240 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 on.** as expired
1e250 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 ..**.** An expir
1e260 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 ed statement mea
1e270 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c ns that recompil
1e280 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 ation of the sta
1e290 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 tement is.** rec
1e2a0 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 ommend. Stateme
1e2b0 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 nts expire when
1e2c0 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 things happen th
1e2d0 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a at make their.**
1e2e0 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 programs obsole
1e2f0 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 te. Removing us
1e300 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 er-defined funct
1e310 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e ions or collatin
1e320 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 g.** sequences,
1e330 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 or changing an a
1e340 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e uthorization fun
1e350 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 ction are the ty
1e360 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 pes of.** things
1e370 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 that make prepa
1e380 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f red statements o
1e390 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 bsolete..*/.void
1e3a0 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 sqlite3ExpirePr
1e3b0 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 eparedStatements
1e3c0 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 (sqlite3 *db){.
1e3d0 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 Vdbe *p;. for(
1e3e0 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 p = db->pVdbe; p
1e3f0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 ; p=p->pNext){.
1e400 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 p->expired =
1e410 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 1;. }.}../*.**
1e420 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 Return the datab
1e430 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 ase associated w
1e440 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f ith the Vdbe..*/
1e450 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 .sqlite3 *sqlite
1e460 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 3VdbeDb(Vdbe *v)
1e470 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 {. return v->db
1e480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
1e490 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 n a pointer to a
1e4a0 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 n sqlite3_value
1e4b0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 structure contai
1e4c0 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 ning the value b
1e4d0 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 ound.** paramete
1e4e0 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 r iVar of VM v.
1e4f0 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 Except, if the v
1e500 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e alue is an SQL N
1e510 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 ULL, return .**
1e520 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 0 instead. Unles
1e530 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 s it is NULL, ap
1e540 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 ply affinity aff
1e550 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c (one of the SQL
1e560 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e ITE_AFF_*.** con
1e570 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 stants) to the v
1e580 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 alue before retu
1e590 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 rning it..**.**
1e5a0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c The returned val
1e5b0 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 ue must be freed
1e5c0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 by the caller u
1e5d0 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 sing sqlite3Valu
1e5e0 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 eFree()..*/.sqli
1e5f0 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 te3_value *sqlit
1e600 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 e3VdbeGetBoundVa
1e610 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 lue(Vdbe *v, int
1e620 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a iVar, u8 aff){.
1e630 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 assert( iVar>0
1e640 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 );. if( v ){.
1e650 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 Mem *pMem = &
1e660 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b v->aVar[iVar-1];
1e670 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 . if( 0==(pMe
1e680 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e m->flags & MEM_N
1e690 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 ull) ){. sq
1e6a0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 lite3_value *pRe
1e6b0 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 t = sqlite3Value
1e6c0 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 New(v->db);.
1e6d0 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 if( pRet ){.
1e6e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
1e6f0 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 eMemCopy((Mem *)
1e700 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 pRet, pMem);.
1e710 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 sqlite3Valu
1e720 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 eApplyAffinity(p
1e730 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 Ret, aff, SQLITE
1e740 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a _UTF8);. }.
1e750 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 return pRe
1e760 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 t;. }. }. r
1e770 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
1e780 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 * Configure SQL
1e790 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f variable iVar so
1e7a0 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 that binding a
1e7b0 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 new value to it
1e7c0 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 signals.** to sq
1e7d0 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 lite3_reoptimize
1e7e0 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 () that re-prepa
1e7f0 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 ring the stateme
1e800 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a nt may result.**
1e810 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 in a better que
1e820 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 ry plan..*/.void
1e830 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 sqlite3VdbeSetV
1e840 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 armask(Vdbe *v,
1e850 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 int iVar){. ass
1e860 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 ert( iVar>0 );.
1e870 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a if( iVar>32 ){.
1e880 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d v->expmask =
1e890 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 0xffffffff;. }
1e8a0 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 else{. v->exp
1e8b0 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 mask |= ((u32)1
1e8c0 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 << (iVar-1));.
1e8d0 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c }.}..#ifndef SQL
1e8e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c ITE_OMIT_VIRTUAL
1e8f0 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e TABLE./*.** Tran
1e900 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 sfer error messa
1e910 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 ge text from an
1e920 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 sqlite3_vtab.zEr
1e930 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 rMsg (text store
1e940 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f d.** in memory o
1e950 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c btained from sql
1e960 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 ite3_malloc) int
1e970 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 o a Vdbe.zErrMsg
1e980 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a (text stored.**
1e990 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 in memory obtai
1e9a0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 ned from sqlite3
1e9b0 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f DbMalloc)..*/.vo
1e9c0 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d id sqlite3VtabIm
1e9d0 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 portErrmsg(Vdbe
1e9e0 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 *p, sqlite3_vtab
1e9f0 20 2a 70 56 74 61 62 29 7b 0a 20 20 73 71 6c 69 *pVtab){. sqli
1ea00 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b te3 *db = p->db;
1ea10 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 . sqlite3DbFree
1ea20 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 (db, p->zErrMsg)
1ea30 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d ;. p->zErrMsg =
1ea40 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 sqlite3DbStrDup
1ea50 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 (db, pVtab->zErr
1ea60 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f Msg);. sqlite3_
1ea70 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 free(pVtab->zErr
1ea80 4d 73 67 29 3b 0a 20 20 70 56 74 61 62 2d 3e 7a Msg);. pVtab->z
1ea90 45 72 72 4d 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 ErrMsg = 0;.}.#e
1eaa0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
1eab0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 MIT_VIRTUALTABLE
1eac0 20 2a 2f 0a */.