0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65 /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 ing:.**.** Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 d not evil..**
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 ive others..**
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69 used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20 ng, destroying,
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20 * a VDBE (or an
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61 "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72 the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64 ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72 e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 se *pParse){. s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 rse->db;. Vdbe
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 *p;. p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 64 3DbMallocRawNN(d
02d0: 62 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 b, sizeof(Vdbe)
02e0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 );. if( p==0 )
02f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 73 return 0;. mems
0300: 65 74 28 26 70 2d 3e 61 4f 70 2c 20 30 2c 20 73 et(&p->aOp, 0, s
0310: 69 7a 65 6f 66 28 56 64 62 65 29 2d 6f 66 66 73 izeof(Vdbe)-offs
0320: 65 74 6f 66 28 56 64 62 65 2c 61 4f 70 29 29 3b etof(Vdbe,aOp));
0330: 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b 0a 20 . p->db = db;.
0340: 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65 20 29 if( db->pVdbe )
0350: 7b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 65 2d {. db->pVdbe-
0360: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 7d 0a >pPrev = p;. }.
0370: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d p->pNext = db-
0380: 3e 70 56 64 62 65 3b 0a 20 20 70 2d 3e 70 50 72 >pVdbe;. p->pPr
0390: 65 76 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 56 ev = 0;. db->pV
03a0: 64 62 65 20 3d 20 70 3b 0a 20 20 70 2d 3e 6d 61 dbe = p;. p->ma
03b0: 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
03c0: 5f 49 4e 49 54 3b 0a 20 20 70 2d 3e 70 50 61 72 _INIT;. p->pPar
03d0: 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 70 se = pParse;. p
03e0: 50 61 72 73 65 2d 3e 70 56 64 62 65 20 3d 20 70 Parse->pVdbe = p
03f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 ;. assert( pPar
0400: 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 20 29 3b se->aLabel==0 );
0410: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
0420: 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 29 3b 0a e->nLabel==0 );.
0430: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 assert( pParse
0440: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 20 29 3b ->nOpAlloc==0 );
0450: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
0460: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d 3d 30 20 e->szOpAlloc==0
0470: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
0480: 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 69 AddOp2(p, OP_Ini
0490: 74 2c 20 30 2c 20 31 29 3b 0a 20 20 72 65 74 75 t, 0, 1);. retu
04a0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 rn p;.}../*.** C
04b0: 68 61 6e 67 65 20 74 68 65 20 65 72 72 6f 72 20 hange the error
04c0: 73 74 72 69 6e 67 20 73 74 6f 72 65 64 20 69 6e string stored in
04d0: 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f Vdbe.zErrMsg.*/
04e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
04f0: 65 45 72 72 6f 72 28 56 64 62 65 20 2a 70 2c 20 eError(Vdbe *p,
0500: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 const char *zFor
0510: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f mat, ...){. va_
0520: 6c 69 73 74 20 61 70 3b 0a 20 20 73 71 6c 69 74 list ap;. sqlit
0530: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 e3DbFree(p->db,
0540: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 76 p->zErrMsg);. v
0550: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 a_start(ap, zFor
0560: 6d 61 74 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d mat);. p->zErrM
0570: 73 67 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 sg = sqlite3VMPr
0580: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 intf(p->db, zFor
0590: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 mat, ap);. va_e
05a0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a nd(ap);.}../*.**
05b0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 Remember the SQ
05c0: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 L string for a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
05e0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 t..*/.void sqlit
05f0: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 e3VdbeSetSql(Vdb
0600: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 e *p, const char
0610: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 75 38 20 70 *z, int n, u8 p
0620: 72 65 70 46 6c 61 67 73 29 7b 0a 20 20 69 66 28 repFlags){. if(
0630: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a p==0 ) return;.
0640: 20 20 70 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d p->prepFlags =
0650: 20 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 69 66 prepFlags;. if
0660: 28 20 28 70 72 65 70 46 6c 61 67 73 20 26 20 53 ( (prepFlags & S
0670: 51 4c 49 54 45 5f 50 52 45 50 41 52 45 5f 53 41 QLITE_PREPARE_SA
0680: 56 45 53 51 4c 29 3d 3d 30 20 29 7b 0a 20 20 20 VESQL)==0 ){.
0690: 20 70 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 3b p->expmask = 0;
06a0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 . }. assert( p
06b0: 2d 3e 7a 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 ->zSql==0 );. p
06c0: 2d 3e 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 ->zSql = sqlite3
06d0: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c DbStrNDup(p->db,
06e0: 20 7a 2c 20 6e 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a z, n);.}../*.**
06f0: 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e Swap all conten
0700: 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 t between two VD
0710: 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a BE structures..*
0720: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
0730: 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c beSwap(Vdbe *pA,
0740: 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 Vdbe *pB){. Vd
0750: 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 be tmp, *pTmp;.
0760: 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 char *zTmp;. a
0770: 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70 ssert( pA->db==p
0780: 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d B->db );. tmp =
0790: 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 *pA;. *pA = *p
07a0: 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a B;. *pB = tmp;.
07b0: 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 pTmp = pA->pNe
07c0: 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 xt;. pA->pNext
07d0: 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 = pB->pNext;. p
07e0: 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b B->pNext = pTmp;
07f0: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 . pTmp = pA->pP
0800: 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 rev;. pA->pPrev
0810: 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 = pB->pPrev;.
0820: 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 pB->pPrev = pTmp
0830: 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a ;. zTmp = pA->z
0840: 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 Sql;. pA->zSql
0850: 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 = pB->zSql;. pB
0860: 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 ->zSql = zTmp;.
0870: 20 70 42 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 70 pB->expmask = p
0880: 41 2d 3e 65 78 70 6d 61 73 6b 3b 0a 20 20 70 42 A->expmask;. pB
0890: 2d 3e 70 72 65 70 46 6c 61 67 73 20 3d 20 70 41 ->prepFlags = pA
08a0: 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 20 20 6d ->prepFlags;. m
08b0: 65 6d 63 70 79 28 70 42 2d 3e 61 43 6f 75 6e 74 emcpy(pB->aCount
08c0: 65 72 2c 20 70 41 2d 3e 61 43 6f 75 6e 74 65 72 er, pA->aCounter
08d0: 2c 20 73 69 7a 65 6f 66 28 70 42 2d 3e 61 43 6f , sizeof(pB->aCo
08e0: 75 6e 74 65 72 29 29 3b 0a 20 20 70 42 2d 3e 61 unter));. pB->a
08f0: 43 6f 75 6e 74 65 72 5b 53 51 4c 49 54 45 5f 53 Counter[SQLITE_S
0900: 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50 TMTSTATUS_REPREP
0910: 41 52 45 5d 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ARE]++;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69 arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65 nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 or occurs while
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41 p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 lloc remain .**
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 unchanged (this
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 llocated can be
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 allocated along
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69 Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f nt nOp){. VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 p *pNew;. Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 .. /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69 TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73 me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20 igned to force.
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68 t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72 ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 e opportunities
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 for . ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 ted OOM faults.
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67 LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20 enerally used.
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51 g only. With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68 C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20 e op array. **
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 by the minimum*
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20 amount required
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72 until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72 eaches 512. Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 mal. ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49 on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74 uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 . ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64 e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20 d 1KB of space,
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20 ller. */.#ifdef
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74 LOC_STRESS. int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d lse. int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 (p->nOpAlloc ?
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 p->nOpAlloc*2 :
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 f(Op)));. UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 ;.#endif.. /* E
0e00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 73 nsure that the s
0e10: 69 7a 65 20 6f 66 20 61 20 56 44 42 45 20 64 6f ize of a VDBE do
0e20: 65 73 20 6e 6f 74 20 67 72 6f 77 20 74 6f 6f 20 es not grow too
0e30: 6c 61 72 67 65 20 2a 2f 0a 20 20 69 66 28 20 6e large */. if( n
0e40: 4e 65 77 20 3e 20 70 2d 3e 64 62 2d 3e 61 4c 69 New > p->db->aLi
0e50: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 mit[SQLITE_LIMIT
0e60: 5f 56 44 42 45 5f 4f 50 5d 20 29 7b 0a 20 20 20 _VDBE_OP] ){.
0e70: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 sqlite3OomFault
0e80: 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 72 65 74 (p->db);. ret
0e90: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
0ea0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 ;. }.. assert(
0eb0: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 nOp<=(1024/size
0ec0: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 of(Op)) );. ass
0ed0: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e ert( nNew>=(p->n
0ee0: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a OpAlloc+nOp) );.
0ef0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 pNew = sqlite3
0f00: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c DbRealloc(p->db,
0f10: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 v->aOp, nNew*si
0f20: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 zeof(Op));. if(
0f30: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e pNew ){. p->
0f40: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 szOpAlloc = sqli
0f50: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 te3DbMallocSize(
0f60: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 p->db, pNew);.
0f70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 p->nOpAlloc =
0f80: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a p->szOpAlloc/siz
0f90: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e eof(Op);. v->
0fa0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a aOp = pNew;. }.
0fb0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f return (pNew ?
0fc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c SQLITE_OK : SQL
0fd0: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b ITE_NOMEM_BKPT);
0fe0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 .}..#ifdef SQLIT
0ff0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 E_DEBUG./* This
1000: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 routine is just
1010: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 a convenient pla
1020: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 ce to set a brea
1030: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c kpoint that will
1040: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 .** fire after e
1050: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e ach opcode is in
1060: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c serted and displ
1070: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 ayed using.** "P
1080: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 RAGMA vdbe_addop
1090: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 trace=on"..*/.st
10a0: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 atic void test_a
10b0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 ddop_breakpoint(
10c0: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 void){. static
10d0: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b int n = 0;. n++
10e0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a ;.}.#endif../*.*
10f0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 * Add a new inst
1100: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c ruction to the l
1110: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 ist of instructi
1120: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 ons current in t
1130: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 he.** VDBE. Ret
1140: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 urn the address
1150: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 of the new instr
1160: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 uction..**.** Pa
1170: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 rameters:.**.**
1180: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20 p
1190: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 Pointer to th
11a0: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 e VDBE.**.**
11b0: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 op
11c0: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 The opcode for t
11d0: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a his instruction.
11e0: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c **.** p1, p2,
11f0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 p3 Operand
1200: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 s.**.** Use the
1210: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c sqlite3VdbeResol
1220: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 veLabel() functi
1230: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 on to fix an add
1240: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 ress and.** the
1250: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
1260: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 eP4() function t
1270: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c o change the val
1280: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 ue of the P4.**
1290: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 operand..*/.stat
12a0: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 ic SQLITE_NOINLI
12b0: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 NE int growOp3(V
12c0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 dbe *p, int op,
12d0: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 int p1, int p2,
12e0: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 int p3){. asser
12f0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f t( p->pParse->nO
1300: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 pAlloc<=p->nOp )
1310: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 ;. if( growOpAr
1320: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 ray(p, 1) ) retu
1330: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 rn 1;. assert(
1340: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c p->pParse->nOpAl
1350: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 loc>p->nOp );.
1360: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 return sqlite3Vd
1370: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 beAddOp3(p, op,
1380: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 p1, p2, p3);.}.i
1390: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
13a0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e dOp3(Vdbe *p, in
13b0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e t op, int p1, in
13c0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 t p2, int p3){.
13d0: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 int i;. VdbeOp
13e0: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d *pOp;.. i = p-
13f0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 >nOp;. assert(
1400: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
1410: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 AGIC_INIT );. a
1420: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 ssert( op>=0 &&
1430: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 op<0xff );. if(
1440: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 p->pParse->nOpA
1450: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 lloc<=i ){. r
1460: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c eturn growOp3(p,
1470: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 op, p1, p2, p3)
1480: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b ;. }. p->nOp++
1490: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f ;. pOp = &p->aO
14a0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 p[i];. pOp->opc
14b0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 ode = (u8)op;.
14c0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 pOp->p5 = 0;. p
14d0: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 Op->p1 = p1;. p
14e0: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 Op->p2 = p2;. p
14f0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 Op->p3 = p3;. p
1500: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 Op->p4.p = 0;.
1510: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 pOp->p4type = P4
1520: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 _NOTUSED;.#ifdef
1530: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 SQLITE_ENABLE_E
1540: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a XPLAIN_COMMENTS.
1550: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 pOp->zComment
1560: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 = 0;.#endif.#ifd
1570: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
1580: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 if( p->db->fla
1590: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 gs & SQLITE_Vdbe
15a0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 AddopTrace ){.
15b0: 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 int jj, kk;.
15c0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 Parse *pParse
15d0: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 = p->pParse;.
15e0: 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a for(jj=kk=0; jj
15f0: 3c 70 50 61 72 73 65 2d 3e 6e 43 6f 6c 43 61 63 <pParse->nColCac
1600: 68 65 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 he; jj++){.
1610: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 struct yColCach
1620: 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 e *x = pParse->a
1630: 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 ColCache + jj;.
1640: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b printf(" r[
1650: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d %d]={%d:%d}", x-
1660: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 >iReg, x->iTable
1670: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 , x->iColumn);.
1680: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d kk++;. }
1690: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72 . if( kk ) pr
16a0: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 intf("\n");.
16b0: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 sqlite3VdbePrint
16c0: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 Op(0, i, &p->aOp
16d0: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 [i]);. test_a
16e0: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 ddop_breakpoint(
16f0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 );. }.#endif.#i
1700: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c fdef VDBE_PROFIL
1710: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 E. pOp->cycles
1720: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 = 0;. pOp->cnt
1730: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 = 0;.#endif.#ifd
1740: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 ef SQLITE_VDBE_C
1750: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 OVERAGE. pOp->i
1760: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e SrcLine = 0;.#en
1770: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a dif. return i;.
1780: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 }.int sqlite3Vdb
1790: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c eAddOp0(Vdbe *p,
17a0: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 int op){. retu
17b0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 rn sqlite3VdbeAd
17c0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 dOp3(p, op, 0, 0
17d0: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 , 0);.}.int sqli
17e0: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 te3VdbeAddOp1(Vd
17f0: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 be *p, int op, i
1800: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e nt p1){. return
1810: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
1820: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c p3(p, op, p1, 0,
1830: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 0);.}.int sqlit
1840: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 e3VdbeAddOp2(Vdb
1850: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e e *p, int op, in
1860: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 t p1, int p2){.
1870: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
1880: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c dbeAddOp3(p, op,
1890: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a p1, p2, 0);.}..
18a0: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 /* Generate code
18b0: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 for an uncondit
18c0: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e ional jump to in
18d0: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a struction iDest.
18e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
18f0: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 beGoto(Vdbe *p,
1900: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 int iDest){. re
1910: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 turn sqlite3Vdbe
1920: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 AddOp3(p, OP_Got
1930: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b o, 0, iDest, 0);
1940: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 .}../* Generate
1950: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 code to cause th
1960: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f e string zStr to
1970: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a be loaded into.
1980: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73 ** register iDes
1990: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 t.*/.int sqlite3
19a0: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 VdbeLoadString(V
19b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 dbe *p, int iDes
19c0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a t, const char *z
19d0: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 Str){. return s
19e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 qlite3VdbeAddOp4
19f0: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 (p, OP_String8,
1a00: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 0, iDest, 0, zSt
1a10: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 r, 0);.}../*.**
1a20: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 Generate code th
1a30: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d at initializes m
1a40: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 ultiple register
1a50: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 s to string or i
1a60: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 nteger.** consta
1a70: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 nts. The regist
1a80: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 ers begin with i
1a90: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 Dest and increas
1aa0: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e e consecutively.
1ab0: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 .** One register
1ac0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 is initialized
1ad0: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67 for each characg
1ae0: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e ter in zTypes[].
1af0: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 For each.** "s
1b00: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a " character in z
1b10: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 Types[], the reg
1b20: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e ister is a strin
1b30: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e g if the argumen
1b40: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c t is.** not NULL
1b50: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 , or OP_Null if
1b60: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e the value is a n
1b70: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f ull pointer. Fo
1b80: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61 r each "i" chara
1b90: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 cter.** in zType
1ba0: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 s[], the registe
1bb0: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 r is initialized
1bc0: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a to an integer..
1bd0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 **.** If the inp
1be0: 75 74 20 73 74 72 69 6e 67 20 64 6f 65 73 20 6e ut string does n
1bf0: 6f 74 20 65 6e 64 20 77 69 74 68 20 22 58 22 20 ot end with "X"
1c00: 74 68 65 6e 20 61 6e 20 4f 50 5f 52 65 73 75 6c then an OP_Resul
1c10: 74 52 6f 77 20 69 6e 73 74 72 75 63 74 69 6f 6e tRow instruction
1c20: 0a 2a 2a 20 69 73 20 67 65 6e 65 72 61 74 65 64 .** is generated
1c30: 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 73 20 for the values
1c40: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 76 6f 69 inserted..*/.voi
1c50: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c d sqlite3VdbeMul
1c60: 74 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 tiLoad(Vdbe *p,
1c70: 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 int iDest, const
1c80: 20 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e char *zTypes, .
1c90: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 ..){. va_list a
1ca0: 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 p;. int i;. ch
1cb0: 61 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 ar c;. va_start
1cc0: 28 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 (ap, zTypes);.
1cd0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 for(i=0; (c = zT
1ce0: 79 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b ypes[i])!=0; i++
1cf0: 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 ){. if( c=='s
1d00: 27 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 ' ){. const
1d10: 20 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 char *z = va_ar
1d20: 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 g(ap, const char
1d30: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 *);. sqlite
1d40: 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3VdbeAddOp4(p, z
1d50: 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 ==0 ? OP_Null :
1d60: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 OP_String8, 0, i
1d70: 44 65 73 74 2b 69 2c 20 30 2c 20 7a 2c 20 30 29 Dest+i, 0, z, 0)
1d80: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
1d90: 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20 20 c=='i' ){.
1da0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
1db0: 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 2(p, OP_Integer,
1dc0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 va_arg(ap, int)
1dd0: 2c 20 69 44 65 73 74 2b 69 29 3b 0a 20 20 20 20 , iDest+i);.
1de0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 }else{. got
1df0: 6f 20 73 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 o skip_op_result
1e00: 72 6f 77 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 row;. }. }.
1e10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
1e20: 70 32 28 70 2c 20 4f 50 5f 52 65 73 75 6c 74 52 p2(p, OP_ResultR
1e30: 6f 77 2c 20 69 44 65 73 74 2c 20 69 29 3b 0a 73 ow, iDest, i);.s
1e40: 6b 69 70 5f 6f 70 5f 72 65 73 75 6c 74 72 6f 77 kip_op_resultrow
1e50: 3a 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a :. va_end(ap);.
1e60: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 }../*.** Add an
1e70: 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c opcode that incl
1e80: 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 udes the p4 valu
1e90: 65 20 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a e as a pointer..
1ea0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
1eb0: 62 65 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 beAddOp4(. Vdbe
1ec0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 *p,
1ed0: 2f 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 /* Add the opcod
1ee0: 65 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a e to this VM */.
1ef0: 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 int op,
1f00: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 /* The new
1f10: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 opcode */. int
1f20: 20 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 p1,
1f30: 20 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 /* The P1 opera
1f40: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 nd */. int p2,
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1f60: 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f he P2 operand */
1f70: 0a 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 . int p3,
1f80: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 /* The P3
1f90: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f operand */. co
1fa0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 nst char *zP4,
1fb0: 20 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 /* The P4 oper
1fc0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 and */. int p4t
1fd0: 79 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ype /*
1fe0: 50 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 P4 operand type
1ff0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 */.){. int addr
2000: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 = sqlite3VdbeAd
2010: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 dOp3(p, op, p1,
2020: 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 p2, p3);. sqlit
2030: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 e3VdbeChangeP4(p
2040: 2c 20 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 , addr, zP4, p4t
2050: 79 70 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 ype);. return a
2060: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 ddr;.}../*.** Ad
2070: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 d an opcode that
2080: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 includes the p4
2090: 20 76 61 6c 75 65 20 77 69 74 68 20 61 20 50 34 value with a P4
20a0: 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f _INT64 or.** P4_
20b0: 52 45 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e REAL type..*/.in
20c0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 t sqlite3VdbeAdd
20d0: 4f 70 34 44 75 70 38 28 0a 20 20 56 64 62 65 20 Op4Dup8(. Vdbe
20e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f *p, /
20f0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 * Add the opcode
2100: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 to this VM */.
2110: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 int op,
2120: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 /* The new
2130: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 opcode */. int
2140: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 p1,
2150: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e /* The P1 operan
2160: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 d */. int p2,
2170: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
2180: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a e P2 operand */.
2190: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 int p3,
21a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 /* The P3
21b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e operand */. con
21c0: 73 74 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 st u8 *zP4,
21d0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 /* The P4 opera
21e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 nd */. int p4ty
21f0: 70 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 pe /* P
2200: 34 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 4 operand type *
2210: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 /.){. char *p4c
2220: 6f 70 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d opy = sqlite3DbM
2230: 61 6c 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 allocRawNN(sqlit
2240: 65 33 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b e3VdbeDb(p), 8);
2250: 0a 20 20 69 66 28 20 70 34 63 6f 70 79 20 29 20 . if( p4copy )
2260: 6d 65 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a memcpy(p4copy, z
2270: 50 34 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e P4, 8);. return
2280: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
2290: 70 34 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 p4(p, op, p1, p2
22a0: 2c 20 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 , p3, p4copy, p4
22b0: 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 type);.}../*.**
22c0: 41 64 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 Add an OP_ParseS
22d0: 63 68 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 chema opcode. T
22e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 his routine is b
22f0: 72 6f 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a roken out from.*
2300: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 * sqlite3VdbeAdd
2310: 4f 70 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e Op4() since it n
2320: 65 65 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 eeds to also nee
2330: 64 73 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 ds to mark all b
2340: 74 72 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 trees.** as havi
2350: 6e 67 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a ng been used..**
2360: 0a 2a 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 .** The zWhere s
2370: 74 72 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 tring must have
2380: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 been obtained fr
2390: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f om sqlite3_mallo
23a0: 63 28 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 c()..** This rou
23b0: 74 69 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f tine will take o
23c0: 77 6e 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 wnership of the
23d0: 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 allocated memory
23e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
23f0: 33 56 64 62 65 41 64 64 50 61 72 73 65 53 63 68 3VdbeAddParseSch
2400: 65 6d 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 emaOp(Vdbe *p, i
2410: 6e 74 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 nt iDb, char *zW
2420: 68 65 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a here){. int j;.
2430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 sqlite3VdbeAdd
2440: 4f 70 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 Op4(p, OP_ParseS
2450: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 chema, iDb, 0, 0
2460: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e , zWhere, P4_DYN
2470: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 AMIC);. for(j=0
2480: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 ; j<p->db->nDb;
2490: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 j++) sqlite3Vdbe
24a0: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b UsesBtree(p, j);
24b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
24c0: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 opcode that inc
24d0: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c ludes the p4 val
24e0: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 ue as an integer
24f0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
2500: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 VdbeAddOp4Int(.
2510: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 Vdbe *p,
2520: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 /* Add the
2530: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 opcode to this V
2540: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 M */. int op,
2550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
2560: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a e new opcode */.
2570: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 int p1,
2580: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 /* The P1
2590: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
25a0: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 p2,
25b0: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 /* The P2 opera
25c0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 nd */. int p3,
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
25e0: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f he P3 operand */
25f0: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 . int p4
2600: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 /* The P4
2610: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 operand as an i
2620: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 nteger */.){. i
2630: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 nt addr = sqlite
2640: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 3VdbeAddOp3(p, o
2650: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a p, p1, p2, p3);.
2660: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c if( p->db->mal
2670: 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a locFailed==0 ){.
2680: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 VdbeOp *pOp
2690: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b = &p->aOp[addr];
26a0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 . pOp->p4type
26b0: 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 20 20 = P4_INT32;.
26c0: 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 70 34 3b pOp->p4.i = p4;
26d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 . }. return ad
26e0: 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74 dr;.}../* Insert
26f0: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f the end of a co
2700: 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64 -routine.*/.void
2710: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43 sqlite3VdbeEndC
2720: 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76 oroutine(Vdbe *v
2730: 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b , int regYield){
2740: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 . sqlite3VdbeAd
2750: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f dOp1(v, OP_EndCo
2760: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c routine, regYiel
2770: 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 d);.. /* Clear
2780: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65 the temporary re
2790: 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68 gister cache, th
27a0: 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74 ereby ensuring t
27b0: 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f hat each. ** co
27c0: 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73 -routine has its
27d0: 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 own independent
27e0: 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72 set of register
27f0: 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f s, because co-ro
2800: 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68 utines. ** migh
2810: 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72 t expect their r
2820: 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70 egisters to be p
2830: 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20 reserved across
2840: 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64 an OP_Yield, and
2850: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64 . ** that could
2860: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20 cause problems
2870: 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63 if two or more c
2880: 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 o-routines are u
2890: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20 sing the same.
28a0: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67 ** temporary reg
28b0: 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d ister.. */. v-
28c0: 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 >pParse->nTempRe
28d0: 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72 g = 0;. v->pPar
28e0: 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20 se->nRangeReg =
28f0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 0;.}../*.** Crea
2900: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 te a new symboli
2910: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 c label for an i
2920: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 nstruction that
2930: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a has yet to be.**
2940: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d coded. The sym
2950: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 bolic label is r
2960: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 eally just a neg
2970: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 ative number. T
2980: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 he.** label can
2990: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 be used as the P
29a0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 2 value of an op
29b0: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c eration. Later,
29c0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 when.** the lab
29d0: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 el is resolved t
29e0: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 o a specific add
29f0: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 ress, the VDBE w
2a00: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f ill scan.** thro
2a10: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f ugh its operatio
2a20: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 n list and chang
2a30: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 e all values of
2a40: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a P2 which match.*
2a50: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f * the label into
2a60: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 the resolved ad
2a70: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 dress..**.** The
2a80: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 VDBE knows that
2a90: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 a P2 value is a
2aa0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c label because l
2ab0: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 abels are.** alw
2ac0: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 ays negative and
2ad0: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 P2 values are s
2ae0: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e uppose to be non
2af0: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 -negative..** He
2b00: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 nce, a negative
2b10: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 P2 value is a la
2b20: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 bel that has yet
2b30: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e to be resolved.
2b40: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 .**.** Zero is r
2b50: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c eturned if a mal
2b60: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a loc() fails..*/.
2b70: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d int sqlite3VdbeM
2b80: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 akeLabel(Vdbe *v
2b90: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 ){. Parse *p =
2ba0: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 v->pParse;. int
2bb0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b i = p->nLabel++
2bc0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d ;. assert( v->m
2bd0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 agic==VDBE_MAGIC
2be0: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 _INIT );. if( (
2bf0: 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b i & (i-1))==0 ){
2c00: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d . p->aLabel =
2c10: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f sqlite3DbReallo
2c20: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 cOrFree(p->db, p
2c30: 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 ->aLabel, .
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2c60: 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 (i*2+1)*sizeof
2c70: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b (p->aLabel[0]));
2c80: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c . }. if( p->aL
2c90: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 abel ){. p->a
2ca0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 Label[i] = -1;.
2cb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52 }. return ADDR
2cc0: 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 (i);.}../*.** Re
2cd0: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20 solve label "x"
2ce0: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73 to be the addres
2cf0: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e s of the next in
2d00: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 struction to.**
2d10: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68 be inserted. Th
2d20: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20 e parameter "x"
2d30: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f must have been o
2d40: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 btained from.**
2d50: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 a prior call to
2d60: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c sqlite3VdbeMakeL
2d70: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 abel()..*/.void
2d80: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c sqlite3VdbeResol
2d90: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c veLabel(Vdbe *v,
2da0: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65 int x){. Parse
2db0: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b *p = v->pParse;
2dc0: 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28 . int j = ADDR(
2dd0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d x);. assert( v-
2de0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
2df0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 IC_INIT );. ass
2e00: 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c ert( j<p->nLabel
2e10: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e );. assert( j>
2e20: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 =0 );. if( p->a
2e30: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e Label ){. p->
2e40: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e aLabel[j] = v->n
2e50: 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a Op;. }.}../*.**
2e60: 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 Mark the VDBE a
2e70: 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f s one that can o
2e80: 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 nly be run one t
2e90: 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ime..*/.void sql
2ea0: 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f ite3VdbeRunOnlyO
2eb0: 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 nce(Vdbe *p){.
2ec0: 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d p->runOnlyOnce =
2ed0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 1;.}../*.** Mar
2ee0: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e k the VDBE as on
2ef0: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 e that can only
2f00: 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 be run multiple
2f10: 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 times..*/.void s
2f20: 71 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 qlite3VdbeReusab
2f30: 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 le(Vdbe *p){. p
2f40: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 ->runOnlyOnce =
2f50: 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 0;.}..#ifdef SQL
2f60: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c ITE_DEBUG /* sql
2f70: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f ite3AssertMayAbo
2f80: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f rt() logic */../
2f90: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 *.** The followi
2fa0: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 ng type and func
2fb0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f tion are used to
2fc0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 iterate through
2fd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 all opcodes.**
2fe0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 in a Vdbe main p
2ff0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 rogram and each
3000: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 of the sub-progr
3010: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 ams (triggers) i
3020: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 t may .** invoke
3030: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 directly or ind
3040: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 irectly. It shou
3050: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f ld be used as fo
3060: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f llows:.**.** O
3070: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 p *pOp;.** Vdb
3080: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a eOpIter sIter;.*
3090: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 *.** memset(&s
30a0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 Iter, 0, sizeof(
30b0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 sIter));.** sI
30c0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 ter.v = v;
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30e0: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 // v is of
30f0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 type Vdbe* .**
3100: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 while( (pOp =
3110: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 opIterNext(&sIte
3120: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f r)) ){.** //
3130: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 Do something wi
3140: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a th pOp.** }.**
3150: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
3160: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 (v->db, sIter.ap
3170: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 Sub);.** .*/.typ
3180: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 edef struct Vdbe
3190: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 OpIter VdbeOpIte
31a0: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 r;.struct VdbeOp
31b0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 Iter {. Vdbe *v
31c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
31d0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 /* Vdbe to i
31e0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 terate through t
31f0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f he opcodes of */
3200: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a . SubProgram **
3210: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a apSub; /*
3220: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f Array of subpro
3230: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e grams */. int n
3240: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 Sub;
3250: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
3260: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 of entries in ap
3270: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 Sub */. int iAd
3280: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 dr;
3290: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f /* Address o
32a0: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 f next instructi
32b0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a on to return */.
32c0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 int iSub;
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
32e0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 0 = main program
32f0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d , 1 = first sub-
3300: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a program etc. */.
3310: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 };.static Op *op
3320: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 IterNext(VdbeOpI
3330: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 ter *p){. Vdbe
3340: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 *v = p->v;. Op
3350: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 *pRet = 0;. Op
3360: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b *aOp;. int nOp;
3370: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c .. if( p->iSub<
3380: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 =p->nSub ){..
3390: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 if( p->iSub==0
33a0: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 ){. aOp = v
33b0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 ->aOp;. nOp
33c0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d = v->nOp;. }
33d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 else{. aOp
33e0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 = p->apSub[p->iS
33f0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 ub-1]->aOp;.
3400: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 nOp = p->apSub
3410: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 [p->iSub-1]->nOp
3420: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 ;. }. asse
3430: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 rt( p->iAddr<nOp
3440: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 );.. pRet =
3450: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a &aOp[p->iAddr];.
3460: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a p->iAddr++;.
3470: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 if( p->iAddr
3480: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 ==nOp ){. p
3490: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 ->iSub++;.
34a0: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 p->iAddr = 0;.
34b0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 }. . if( p
34c0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f Ret->p4type==P4_
34d0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 SUBPROGRAM ){.
34e0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 int nByte =
34f0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 (p->nSub+1)*size
3500: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b of(SubProgram*);
3510: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 . int j;.
3520: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 for(j=0; j<p
3530: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 ->nSub; j++){.
3540: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 if( p->apS
3550: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e ub[j]==pRet->p4.
3560: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b pProgram ) break
3570: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
3580: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 if( j==p->nSub )
3590: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 {. p->apS
35a0: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 ub = sqlite3DbRe
35b0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 allocOrFree(v->d
35c0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 b, p->apSub, nBy
35d0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 te);. if(
35e0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 !p->apSub ){.
35f0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 pRet = 0
3600: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
3610: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 . p->ap
3620: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d Sub[p->nSub++] =
3630: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 pRet->p4.pProgr
3640: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 am;. }.
3650: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a }. }. }.
3660: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a . return pRet;.
3670: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 }../*.** Check i
3680: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 f the program st
3690: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 ored in the VM a
36a0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 ssociated with p
36b0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 Parse may.** thr
36c0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 ow an ABORT exce
36d0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 ption (causing t
36e0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 he statement, bu
36f0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 t not entire tra
3700: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 nsaction.** to b
3710: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 e rolled back).
3720: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 This condition i
3730: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 s true if the ma
3740: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e in program or an
3750: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d y.** sub-program
3760: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f s contains any o
3770: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a f the following:
3780: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 .**.** * OP_H
3790: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 alt with P1=SQLI
37a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e TE_CONSTRAINT an
37b0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a d P2=OE_Abort..*
37c0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 * * OP_HaltIf
37d0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c Null with P1=SQL
37e0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 ITE_CONSTRAINT a
37f0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a nd P2=OE_Abort..
3800: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 ** * OP_Destr
3810: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 oy.** * OP_VU
3820: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 pdate.** * OP
3830: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 _VRename.** *
3840: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 OP_FkCounter wi
3850: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 th P2==0 (immedi
3860: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 ate foreign key
3870: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 constraint).**
3880: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 42 74 72 * OP_CreateBtr
3890: 65 65 2f 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 ee/BTREE_INTKEY
38a0: 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 and OP_InitCorou
38b0: 74 69 6e 65 20 0a 2a 2a 20 20 20 20 20 20 28 66 tine .** (f
38c0: 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 or CREATE TABLE
38d0: 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a AS SELECT ...).*
38e0: 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 *.** Then check
38f0: 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f that the value o
3900: 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 f Parse.mayAbort
3910: 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a is true if an.*
3920: 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 * ABORT may be t
3930: 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 hrown, or false
3940: 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 otherwise. Retur
3950: 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 n true if it doe
3960: 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 s.** match, or f
3970: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 alse otherwise.
3980: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 This function is
3990: 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 intended to be
39a0: 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 used as.** part
39b0: 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 of an assert sta
39c0: 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f tement in the co
39d0: 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 mpiler. Similar
39e0: 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 to:.**.** asse
39f0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 rt( sqlite3VdbeA
3a00: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 ssertMayAbort(pP
3a10: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 arse->pVdbe, pPa
3a20: 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 rse->mayAbort) )
3a30: 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ;.*/.int sqlite3
3a40: 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f VdbeAssertMayAbo
3a50: 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 rt(Vdbe *v, int
3a60: 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 mayAbort){. int
3a70: 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 hasAbort = 0;.
3a80: 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 int hasFkCounte
3a90: 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 r = 0;. int has
3aa0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b CreateTable = 0;
3ab0: 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f . int hasInitCo
3ac0: 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f routine = 0;. O
3ad0: 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 p *pOp;. VdbeOp
3ae0: 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 Iter sIter;. me
3af0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 mset(&sIter, 0,
3b00: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a sizeof(sIter));.
3b10: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a sIter.v = v;..
3b20: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 while( (pOp =
3b30: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 opIterNext(&sIte
3b40: 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e r))!=0 ){. in
3b50: 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e t opcode = pOp->
3b60: 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 opcode;. if(
3b70: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 opcode==OP_Destr
3b80: 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 oy || opcode==OP
3b90: 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f _VUpdate || opco
3ba0: 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a de==OP_VRename .
3bb0: 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 || ((opcode
3bc0: 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 ==OP_Halt || opc
3bd0: 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 ode==OP_HaltIfNu
3be0: 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 ll) . && ((
3bf0: 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 pOp->p1&0xff)==S
3c00: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
3c10: 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f && pOp->p2==OE_
3c20: 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 Abort)). ){.
3c30: 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 hasAbort =
3c40: 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 1;. break;.
3c50: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 }. if( op
3c60: 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 42 code==OP_CreateB
3c70: 74 72 65 65 20 26 26 20 70 4f 70 2d 3e 70 33 3d tree && pOp->p3=
3c80: 3d 42 54 52 45 45 5f 49 4e 54 4b 45 59 20 29 20 =BTREE_INTKEY )
3c90: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d hasCreateTable =
3ca0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 1;. if( opco
3cb0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 de==OP_InitCorou
3cc0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f tine ) hasInitCo
3cd0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 routine = 1;.#if
3ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
3cf0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 _FOREIGN_KEY.
3d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f if( opcode==OP_
3d10: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 FkCounter && pOp
3d20: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e ->p1==0 && pOp->
3d30: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 p2==1 ){. h
3d40: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b asFkCounter = 1;
3d50: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
3d60: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 }. sqlite3DbFre
3d70: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 e(v->db, sIter.a
3d80: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 pSub);.. /* Ret
3d90: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 urn true if hasA
3da0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 bort==mayAbort.
3db0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 Or if a malloc f
3dc0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e ailure occurred.
3dd0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 . ** If malloc
3de0: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 failed, then the
3df0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 while() loop ab
3e00: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 ove may not have
3e10: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 iterated. ** t
3e20: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 hrough all opcod
3e30: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 es and hasAbort
3e40: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 may be set incor
3e50: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 rectly. Return.
3e60: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 ** true for thi
3e70: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e s case to preven
3e80: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 t the assert() i
3e90: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 n the callers fr
3ea0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 ame. ** from fa
3eb0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 iling. */. ret
3ec0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c urn ( v->db->mal
3ed0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 locFailed || has
3ee0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 Abort==mayAbort
3ef0: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a || hasFkCounter.
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c ||
3f10: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 (hasCreateTable
3f20: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 && hasInitCorou
3f30: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 tine) );.}.#endi
3f40: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 f /* SQLITE_DEBU
3f50: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 G - the sqlite3A
3f60: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 ssertMayAbort()
3f70: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a function */../*.
3f80: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
3f90: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 is called after
3fa0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 all opcodes have
3fb0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 been inserted.
3fc0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 It loops.** thr
3fd0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 ough all the opc
3fe0: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 odes and fixes u
3ff0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a p some details..
4000: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 **.** (1) For ea
4010: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 ch jump instruct
4020: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 ion with a negat
4030: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 ive P2 value (a
4040: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 label).** re
4050: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c solve the P2 val
4060: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 ue to an actual
4070: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 address..**.** (
4080: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 2) Compute the m
4090: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 aximum number of
40a0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 arguments used
40b0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 by any SQL funct
40c0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 ion.** and s
40d0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 tore that value
40e0: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 in *pMaxFuncArgs
40f0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 ..**.** (3) Upda
4100: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 te the Vdbe.read
4110: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 Only and Vdbe.bI
4120: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f sReader flags to
4130: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 accurately.**
4140: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 indicate what
4150: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 the prepared st
4160: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 atement actually
4170: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 does..**.** (4)
4180: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 Initialize the
4190: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e p4.xAdvance poin
41a0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 ter on opcodes t
41b0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a hat use it..**.*
41c0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 * (5) Reclaim th
41d0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 e memory allocat
41e0: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c ed for storing l
41f0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 abels..**.** Thi
4200: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f s routine will o
4210: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 nly function cor
4220: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b rectly if the mk
4230: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 opcodeh.tcl gene
4240: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 rator.** script
4250: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f numbers the opco
4260: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 des correctly.
4270: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20 Changes to this
4280: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a routine must be.
4290: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 ** coordinated w
42a0: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d ith changes to m
42b0: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f kopcodeh.tcl..*/
42c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 .static void res
42d0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 olveP2Values(Vdb
42e0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 e *p, int *pMaxF
42f0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 uncArgs){. int
4300: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 nMaxArgs = *pMax
4310: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a FuncArgs;. Op *
4320: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 pOp;. Parse *pP
4330: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 arse = p->pParse
4340: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 ;. int *aLabel
4350: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c = pParse->aLabel
4360: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 ;. p->readOnly
4370: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 = 1;. p->bIsRea
4380: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d der = 0;. pOp =
4390: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d &p->aOp[p->nOp-
43a0: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 1];. while(1){.
43b0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d . /* Only JUM
43c0: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68 P opcodes and th
43d0: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 e short list of
43e0: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 special opcodes
43f0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20 in the switch.
4400: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 ** below need
4410: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64 to be considered
4420: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 . The mkopcodeh
4430: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 .tcl generator s
4440: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20 cript groups.
4450: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 ** all these op
4460: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e codes together n
4470: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 ear the front of
4480: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 the opcode list
4490: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 . Skip. ** a
44a0: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64 ny opcode that d
44b0: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f oes not need pro
44c0: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75 cessing by virtu
44d0: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 al of the fact t
44e0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 hat. ** it is
44f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c larger than SQL
4500: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f ITE_MX_JUMP_OPCO
4510: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d DE, as a perform
4520: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f ance optimizatio
4530: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 n.. */. if
4540: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 ( pOp->opcode<=S
4550: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 QLITE_MX_JUMP_OP
4560: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a CODE ){. /*
4570: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 NOTE: Be sure t
4580: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 o update mkopcod
4590: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 eh.tcl when addi
45a0: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 ng or removing.
45b0: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 ** cases fr
45c0: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 om this switch!
45d0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 */. switch(
45e0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a pOp->opcode ){.
45f0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f case OP_
4600: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 Transaction: {.
4610: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 if( pOp
4620: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 ->p2!=0 ) p->rea
4630: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 dOnly = 0;.
4640: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 /* fall thr
4650: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 u */. }.
4660: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 case OP_A
4670: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 utoCommit:.
4680: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 case OP_Savep
4690: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 oint: {.
46a0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d p->bIsReader =
46b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 1;. br
46c0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 eak;. }.#
46d0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
46e0: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63 IT_WAL. c
46f0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e ase OP_Checkpoin
4700: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 t:.#endif.
4710: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d case OP_Vacuum
4720: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f :. case O
4730: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b P_JournalMode: {
4740: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65 . p->re
4750: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 adOnly = 0;.
4760: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 p->bIsRead
4770: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 er = 1;.
4780: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
4790: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 }. case
47a0: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 20 OP_Next:.
47b0: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f case OP_NextIfO
47c0: 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 63 61 73 pen:. cas
47d0: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a e OP_SorterNext:
47e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 {. pOp
47f0: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 ->p4.xAdvance =
4800: 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 sqlite3BtreeNext
4810: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d ;. pOp-
4820: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 >p4type = P4_ADV
4830: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20 ANCE;.
4840: 2f 2a 20 54 68 65 20 63 6f 64 65 20 67 65 6e 65 /* The code gene
4850: 72 61 74 6f 72 20 6e 65 76 65 72 20 63 6f 64 65 rator never code
4860: 73 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6f s any of these o
4870: 70 63 6f 64 65 73 20 61 73 20 61 20 6a 75 6d 70 pcodes as a jump
4880: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f . ** to
4890: 20 61 20 6c 61 62 65 6c 2e 20 20 54 68 65 79 20 a label. They
48a0: 61 72 65 20 61 6c 77 61 79 73 20 63 6f 64 65 64 are always coded
48b0: 20 61 73 20 61 20 6a 75 6d 70 20 62 61 63 6b 77 as a jump backw
48c0: 61 72 64 73 20 74 6f 20 61 20 0a 20 20 20 20 20 ards to a .
48d0: 20 20 20 20 20 2a 2a 20 6b 6e 6f 77 6e 20 61 64 ** known ad
48e0: 64 72 65 73 73 20 2a 2f 0a 20 20 20 20 20 20 20 dress */.
48f0: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d 3e assert( pOp->
4900: 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 p2>=0 );.
4910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
4920: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 }. case
4930: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 OP_Prev:.
4940: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 case OP_PrevIf
4950: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 Open: {.
4960: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e pOp->p4.xAdvan
4970: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 ce = sqlite3Btre
4980: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 ePrevious;.
4990: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 pOp->p4type
49a0: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 = P4_ADVANCE;.
49b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
49c0: 63 6f 64 65 20 67 65 6e 65 72 61 74 6f 72 20 6e code generator n
49d0: 65 76 65 72 20 63 6f 64 65 73 20 61 6e 79 20 6f ever codes any o
49e0: 66 20 74 68 65 73 65 20 6f 70 63 6f 64 65 73 20 f these opcodes
49f0: 61 73 20 61 20 6a 75 6d 70 0a 20 20 20 20 20 20 as a jump.
4a00: 20 20 20 20 2a 2a 20 74 6f 20 61 20 6c 61 62 65 ** to a labe
4a10: 6c 2e 20 20 54 68 65 79 20 61 72 65 20 61 6c 77 l. They are alw
4a20: 61 79 73 20 63 6f 64 65 64 20 61 73 20 61 20 6a ays coded as a j
4a30: 75 6d 70 20 62 61 63 6b 77 61 72 64 73 20 74 6f ump backwards to
4a40: 20 61 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a a . **
4a50: 20 6b 6e 6f 77 6e 20 61 64 64 72 65 73 73 20 2a known address *
4a60: 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 /. asse
4a70: 72 74 28 20 70 4f 70 2d 3e 70 32 3e 3d 30 20 29 rt( pOp->p2>=0 )
4a80: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 ;. brea
4a90: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 k;. }.#if
4aa0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
4ab0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 _VIRTUALTABLE.
4ac0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 case OP_VU
4ad0: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 pdate: {.
4ae0: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e if( pOp->p2>n
4af0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 MaxArgs ) nMaxAr
4b00: 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 gs = pOp->p2;.
4b10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
4b20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
4b30: 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 case OP_VFilter
4b40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e : {. in
4b50: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 61 t n;. a
4b60: 73 73 65 72 74 28 20 28 70 4f 70 20 2d 20 70 2d ssert( (pOp - p-
4b70: 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b 0a 20 20 >aOp) >= 3 );.
4b80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
4b90: 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d pOp[-1].opcode==
4ba0: 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 OP_Integer );.
4bb0: 20 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b n = pOp[
4bc0: 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 -1].p1;.
4bd0: 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 if( n>nMaxArgs
4be0: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b ) nMaxArgs = n;
4bf0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 . /* Fa
4c00: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 ll through into
4c10: 74 68 65 20 64 65 66 61 75 6c 74 20 63 61 73 65 the default case
4c20: 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 */. }.#e
4c30: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 65 66 ndif. def
4c40: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 ault: {.
4c50: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3c 30 20 if( pOp->p2<0
4c60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f ){. /
4c70: 2a 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e * The mkopcodeh.
4c80: 74 63 6c 20 73 63 72 69 70 74 20 68 61 73 20 73 tcl script has s
4c90: 6f 20 61 72 72 61 6e 67 65 64 20 74 68 69 6e 67 o arranged thing
4ca0: 73 20 74 68 61 74 20 74 68 65 20 6f 6e 6c 79 0a s that the only.
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e ** n
4cc0: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 on-jump opcodes
4cd0: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 less than SQLITE
4ce0: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 _MX_JUMP_CODE ar
4cf0: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a e guaranteed to.
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 ** h
4d10: 61 76 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 ave non-negative
4d20: 20 76 61 6c 75 65 73 20 66 6f 72 20 50 32 2e 20 values for P2.
4d30: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 */. a
4d40: 73 73 65 72 74 28 20 28 73 71 6c 69 74 65 33 4f ssert( (sqlite3O
4d50: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f pcodeProperty[pO
4d60: 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 p->opcode] & OPF
4d70: 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 29 3b 0a 20 LG_JUMP)!=0 );.
4d80: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 asser
4d90: 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 t( ADDR(pOp->p2)
4da0: 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 <pParse->nLabel
4db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 );. p
4dc0: 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b Op->p2 = aLabel[
4dd0: 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a ADDR(pOp->p2)];.
4de0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
4df0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
4e00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
4e10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 6b 6f 70 /* The mkop
4e20: 63 6f 64 65 68 2e 74 63 6c 20 73 63 72 69 70 74 codeh.tcl script
4e30: 20 68 61 73 20 73 6f 20 61 72 72 61 6e 67 65 64 has so arranged
4e40: 20 74 68 69 6e 67 73 20 74 68 61 74 20 74 68 65 things that the
4e50: 20 6f 6e 6c 79 0a 20 20 20 20 20 20 2a 2a 20 6e only. ** n
4e60: 6f 6e 2d 6a 75 6d 70 20 6f 70 63 6f 64 65 73 20 on-jump opcodes
4e70: 6c 65 73 73 20 74 68 61 6e 20 53 51 4c 49 54 45 less than SQLITE
4e80: 5f 4d 58 5f 4a 55 4d 50 5f 43 4f 44 45 20 61 72 _MX_JUMP_CODE ar
4e90: 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 0a e guaranteed to.
4ea0: 20 20 20 20 20 20 2a 2a 20 68 61 76 65 20 6e 6f ** have no
4eb0: 6e 2d 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 n-negative value
4ec0: 73 20 66 6f 72 20 50 32 2e 20 2a 2f 0a 20 20 20 s for P2. */.
4ed0: 20 20 20 61 73 73 65 72 74 28 20 28 73 71 6c 69 assert( (sqli
4ee0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 te3OpcodePropert
4ef0: 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 26 4f y[pOp->opcode]&O
4f00: 50 46 4c 47 5f 4a 55 4d 50 29 3d 3d 30 20 7c 7c PFLG_JUMP)==0 ||
4f10: 20 70 4f 70 2d 3e 70 32 3e 3d 30 29 3b 0a 20 20 pOp->p2>=0);.
4f20: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 4f 70 3d }. if( pOp=
4f30: 3d 70 2d 3e 61 4f 70 20 29 20 62 72 65 61 6b 3b =p->aOp ) break;
4f40: 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a 20 20 7d 0a . pOp--;. }.
4f50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
4f60: 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 p->db, pParse->a
4f70: 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 Label);. pParse
4f80: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 ->aLabel = 0;.
4f90: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d pParse->nLabel =
4fa0: 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 0;. *pMaxFuncA
4fb0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a rgs = nMaxArgs;.
4fc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 assert( p->bIs
4fd0: 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d Reader!=0 || DbM
4fe0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 askAllZero(p->bt
4ff0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f reeMask) );.}../
5000: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
5010: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e address of the n
5020: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 ext instruction
5030: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a to be inserted..
5040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
5050: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 beCurrentAddr(Vd
5060: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 be *p){. assert
5070: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
5080: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
5090: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a return p->nOp;.
50a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 }../*.** Verify
50b0: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 that at least N
50c0: 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 opcode slots are
50d0: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 available in p
50e0: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e without.** havin
50f0: 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 g to malloc for
5100: 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65 more space (exce
5110: 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 pt when compiled
5120: 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 using.** SQLITE
5130: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 _TEST_REALLOC_ST
5140: 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 RESS). This int
5150: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64 erface is used d
5160: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a uring testing.**
5170: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 to verify that
5180: 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f certain calls to
5190: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
51a0: 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 pList() can neve
51b0: 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f r.** fail due to
51c0: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 a OOM fault and
51d0: 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 hence that the
51e0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f return value fro
51f0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 m.** sqlite3Vdbe
5200: 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c AddOpList() will
5210: 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e always be non-N
5220: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 ULL..*/.#if defi
5230: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 ned(SQLITE_DEBUG
5240: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 ) && !defined(SQ
5250: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f LITE_TEST_REALLO
5260: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 C_STRESS).void s
5270: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79 qlite3VdbeVerify
5280: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 NoMallocRequired
5290: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 (Vdbe *p, int N)
52a0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e {. assert( p->n
52b0: 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 Op + N <= p->pPa
52c0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b rse->nOpAlloc );
52d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a .}.#endif../*.**
52e0: 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 Verify that the
52f0: 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 74 68 VM passed as th
5300: 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 20 e only argument
5310: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e does not contain
5320: 0a 2a 2a 20 61 6e 20 4f 50 5f 52 65 73 75 6c 74 .** an OP_Result
5330: 52 6f 77 20 6f 70 63 6f 64 65 2e 20 46 61 69 6c Row opcode. Fail
5340: 20 61 6e 20 61 73 73 65 72 74 28 29 20 69 66 20 an assert() if
5350: 69 74 20 64 6f 65 73 2e 20 54 68 69 73 20 69 73 it does. This is
5360: 20 75 73 65 64 0a 2a 2a 20 62 79 20 63 6f 64 65 used.** by code
5370: 20 69 6e 20 70 72 61 67 6d 61 2e 63 20 74 6f 20 in pragma.c to
5380: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 ensure that the
5390: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f implementation o
53a0: 66 20 63 65 72 74 61 69 6e 0a 2a 2a 20 70 72 61 f certain.** pra
53b0: 67 6d 61 73 20 63 6f 6d 70 6f 72 74 73 20 77 69 gmas comports wi
53c0: 74 68 20 74 68 65 20 66 6c 61 67 73 20 73 70 65 th the flags spe
53d0: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 6d 6b cified in the mk
53e0: 70 72 61 67 6d 61 74 61 62 2e 74 63 6c 0a 2a 2a pragmatab.tcl.**
53f0: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69 66 20 script..*/.#if
5400: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 defined(SQLITE_D
5410: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 EBUG) && !define
5420: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 d(SQLITE_TEST_RE
5430: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f ALLOC_STRESS).vo
5440: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65 id sqlite3VdbeVe
5450: 72 69 66 79 4e 6f 52 65 73 75 6c 74 52 6f 77 28 rifyNoResultRow(
5460: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 Vdbe *p){. int
5470: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c i;. for(i=0; i<
5480: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 p->nOp; i++){.
5490: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 assert( p->aOp
54a0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 52 [i].opcode!=OP_R
54b0: 65 73 75 6c 74 52 6f 77 20 29 3b 0a 20 20 7d 0a esultRow );. }.
54c0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 }.#endif../*.**
54d0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 This function re
54e0: 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 turns a pointer
54f0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 to the array of
5500: 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 opcodes associat
5510: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 ed with.** the V
5520: 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 dbe passed as th
5530: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 e first argument
5540: 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c . It is the call
5550: 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 ers responsibili
5560: 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 ty.** to arrange
5570: 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 for the returne
5580: 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 d array to be ev
5590: 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 entually freed u
55a0: 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 sing the .** vdb
55b0: 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 eFreeOpArray() f
55c0: 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 unction..**.** B
55d0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c efore returning,
55e0: 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f *pnOp is set to
55f0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 the number of e
5600: 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 ntries in the re
5610: 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e turned.** array.
5620: 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 Also, *pnMaxArg
5630: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c is set to the l
5640: 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 arger of its cur
5650: 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a rent value and .
5660: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 ** the number of
5670: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 entries in the
5680: 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 Vdbe.apArg[] arr
5690: 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 ay required to e
56a0: 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 xecute the .** r
56b0: 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e eturned program.
56c0: 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 .*/.VdbeOp *sqli
56d0: 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 te3VdbeTakeOpArr
56e0: 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 ay(Vdbe *p, int
56f0: 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 *pnOp, int *pnMa
5700: 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 xArg){. VdbeOp
5710: 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 *aOp = p->aOp;.
5720: 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 assert( aOp &&
5730: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 !p->db->mallocFa
5740: 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 iled );.. /* Ch
5750: 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 eck that sqlite3
5760: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 VdbeUsesBtree()
5770: 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f was not called o
5780: 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 n this VM */. a
5790: 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c ssert( DbMaskAll
57a0: 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 Zero(p->btreeMas
57b0: 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 k) );.. resolve
57c0: 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 P2Values(p, pnMa
57d0: 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d xArg);. *pnOp =
57e0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f p->nOp;. p->aO
57f0: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 p = 0;. return
5800: 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 aOp;.}../*.** Ad
5810: 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f d a whole list o
5820: 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 f operations to
5830: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 the operation st
5840: 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a ack. Return a.*
5850: 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 * pointer to the
5860: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e first operation
5870: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a inserted..**.**
5880: 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67 Non-zero P2 arg
5890: 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69 uments to jump i
58a0: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 nstructions are
58b0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64 automatically ad
58c0: 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61 justed.** so tha
58d0: 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67 65 t the jump targe
58e0: 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f t is relative to
58f0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 the first opera
5900: 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a tion inserted..*
5910: 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 /.VdbeOp *sqlite
5920: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 0a 3VdbeAddOpList(.
5930: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 Vdbe *p,
5940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
5950: 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74 6f * Add opcodes to
5960: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 the prepared st
5970: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 atement */. int
5980: 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 nOp,
5990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
59a0: 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20 74 ber of opcodes t
59b0: 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f o add */. VdbeO
59c0: 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 pList const *aOp
59d0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f , /* The o
59e0: 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64 64 pcodes to be add
59f0: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e ed */. int iLin
5a00: 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20 20 eno
5a10: 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66 /* Source-f
5a20: 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 ile line number
5a30: 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65 20 of first opcode
5a40: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 */.){. int i;.
5a50: 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a VdbeOp *pOut, *
5a60: 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72 74 pFirst;. assert
5a70: 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 ( nOp>0 );. ass
5a80: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
5a90: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 DBE_MAGIC_INIT )
5aa0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b ;. if( p->nOp +
5ab0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65 nOp > p->pParse
5ac0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 ->nOpAlloc && gr
5ad0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 owOpArray(p, nOp
5ae0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ) ){. return
5af0: 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74 20 0;. }. pFirst
5b00: 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 = pOut = &p->aOp
5b10: 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 [p->nOp];. for(
5b20: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c i=0; i<nOp; i++,
5b30: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b aOp++, pOut++){
5b40: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 . pOut->opcod
5b50: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b e = aOp->opcode;
5b60: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 . pOut->p1 =
5b70: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75 aOp->p1;. pOu
5b80: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b t->p2 = aOp->p2;
5b90: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70 . assert( aOp
5ba0: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69 ->p2>=0 );. i
5bb0: 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 f( (sqlite3Opcod
5bc0: 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f eProperty[aOp->o
5bd0: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a pcode] & OPFLG_J
5be0: 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e UMP)!=0 && aOp->
5bf0: 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70 4f p2>0 ){. pO
5c00: 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70 ut->p2 += p->nOp
5c10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 ;. }. pOut
5c20: 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a ->p3 = aOp->p3;.
5c30: 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 pOut->p4type
5c40: 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 = P4_NOTUSED;.
5c50: 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 pOut->p4.p =
5c60: 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 0;. pOut->p5
5c70: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 = 0;.#ifdef SQLI
5c80: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 TE_ENABLE_EXPLAI
5c90: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70 N_COMMENTS. p
5ca0: 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 Out->zComment =
5cb0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 0;.#endif.#ifdef
5cc0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 SQLITE_VDBE_COV
5cd0: 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e ERAGE. pOut->
5ce0: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 iSrcLine = iLine
5cf0: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 no+i;.#else.
5d00: 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 (void)iLineno;.#
5d10: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c endif.#ifdef SQL
5d20: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 ITE_DEBUG. if
5d30: 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 ( p->db->flags &
5d40: 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f SQLITE_VdbeAddo
5d50: 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 pTrace ){.
5d60: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 sqlite3VdbePrint
5d70: 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 Op(0, i+p->nOp,
5d80: 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 &p->aOp[i+p->nOp
5d90: 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ]);. }.#endif
5da0: 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d . }. p->nOp +=
5db0: 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 nOp;. return p
5dc0: 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 First;.}..#if de
5dd0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 fined(SQLITE_ENA
5de0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 BLE_STMT_SCANSTA
5df0: 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 TUS)./*.** Add a
5e00: 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61 n entry to the a
5e10: 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 rray of counters
5e20: 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69 managed by sqli
5e30: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 te3_stmt_scansta
5e40: 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 tus()..*/.void s
5e50: 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53 74 qlite3VdbeScanSt
5e60: 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c atus(. Vdbe *p,
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5e80: 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f /* VM to
5e90: 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 add scanstatus(
5ea0: 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 ) to */. int ad
5eb0: 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 drExplain,
5ec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 /* Add
5ed0: 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 ress of OP_Expla
5ee0: 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 in (or 0) */. i
5ef0: 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 nt addrLoop,
5f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
5f10: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f * Address of loo
5f20: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 p counter */ .
5f30: 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20 20 int addrVisit,
5f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5f50: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f /* Address of ro
5f60: 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74 ws visited count
5f70: 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e er */. LogEst n
5f80: 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 Est,
5f90: 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d /* Estim
5fa0: 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f ated number of o
5fb0: 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 utput rows */.
5fc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
5fd0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
5fe0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 /* Name of table
5ff0: 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20 or index being
6000: 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 scanned */.){.
6010: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e int nByte = (p->
6020: 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f nScan+1) * sizeo
6030: 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 f(ScanStatus);.
6040: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 ScanStatus *aNe
6050: 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61 w;. aNew = (Sca
6060: 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33 nStatus*)sqlite3
6070: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c DbRealloc(p->db,
6080: 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 p->aScan, nByte
6090: 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b );. if( aNew ){
60a0: 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73 20 . ScanStatus
60b0: 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d *pNew = &aNew[p-
60c0: 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 >nScan++];. p
60d0: 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e New->addrExplain
60e0: 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a = addrExplain;.
60f0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f pNew->addrLo
6100: 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 op = addrLoop;.
6110: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 pNew->addrVis
6120: 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a it = addrVisit;.
6130: 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d pNew->nEst =
6140: 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d nEst;. pNew-
6150: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 >zName = sqlite3
6160: 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 DbStrDup(p->db,
6170: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 zName);. p->a
6180: 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d Scan = aNew;. }
6190: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a .}.#endif.../*.*
61a0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c * Change the val
61b0: 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 ue of the opcode
61c0: 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c , or P1, P2, P3,
61d0: 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a or P5 operands.
61e0: 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 ** for a specifi
61f0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a c instruction..*
6200: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
6210: 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 beChangeOpcode(V
6220: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 dbe *p, u32 addr
6230: 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 , u8 iNewOpcode)
6240: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 {. sqlite3VdbeG
6250: 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 etOp(p,addr)->op
6260: 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 code = iNewOpcod
6270: 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 e;.}.void sqlite
6280: 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 3VdbeChangeP1(Vd
6290: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c be *p, u32 addr,
62a0: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c int val){. sql
62b0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c ite3VdbeGetOp(p,
62c0: 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b addr)->p1 = val;
62d0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 .}.void sqlite3V
62e0: 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 dbeChangeP2(Vdbe
62f0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 *p, u32 addr, i
6300: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 nt val){. sqlit
6310: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 e3VdbeGetOp(p,ad
6320: 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d dr)->p2 = val;.}
6330: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
6340: 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a eChangeP3(Vdbe *
6350: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 p, u32 addr, int
6360: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 val){. sqlite3
6370: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 VdbeGetOp(p,addr
6380: 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 )->p3 = val;.}.v
6390: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 oid sqlite3VdbeC
63a0: 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c hangeP5(Vdbe *p,
63b0: 20 75 31 36 20 70 35 29 7b 0a 20 20 61 73 73 65 u16 p5){. asse
63c0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 rt( p->nOp>0 ||
63d0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
63e0: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e led );. if( p->
63f0: 6e 4f 70 3e 30 20 29 20 70 2d 3e 61 4f 70 5b 70 nOp>0 ) p->aOp[p
6400: 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 ->nOp-1].p5 = p5
6410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 ;.}../*.** Chang
6420: 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 e the P2 operand
6430: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 of instruction
6440: 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 addr so that it
6450: 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 points to.** the
6460: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 address of the
6470: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e next instruction
6480: 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f to be coded..*/
6490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
64a0: 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a eJumpHere(Vdbe *
64b0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 p, int addr){.
64c0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
64d0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e eP2(p, addr, p->
64e0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 nOp);.}.../*.**
64f0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e If the input Fun
6500: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 cDef structure i
6510: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 s ephemeral, the
6520: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a n free it. If.*
6530: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 * the FuncDef is
6540: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 not ephermal, t
6550: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a hen do nothing..
6560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 */.static void f
6570: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 reeEphemeralFunc
6580: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 tion(sqlite3 *db
6590: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 , FuncDef *pDef)
65a0: 7b 0a 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 {. if( (pDef->f
65b0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 uncFlags & SQLIT
65c0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 E_FUNC_EPHEM)!=0
65d0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 ){. sqlite3D
65e0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 44 65 66 bFreeNN(db, pDef
65f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 );. }.}..static
6600: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 void vdbeFreeOp
6610: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c Array(sqlite3 *,
6620: 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a Op *, int);../*
6630: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 .** Delete a P4
6640: 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 value if necessa
6650: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 ry..*/.static SQ
6660: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f LITE_NOINLINE vo
6670: 69 64 20 66 72 65 65 50 34 4d 65 6d 28 73 71 6c id freeP4Mem(sql
6680: 69 74 65 33 20 2a 64 62 2c 20 4d 65 6d 20 2a 70 ite3 *db, Mem *p
6690: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 ){. if( p->szMa
66a0: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 lloc ) sqlite3Db
66b0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c Free(db, p->zMal
66c0: 6c 6f 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 loc);. sqlite3D
66d0: 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a bFreeNN(db, p);.
66e0: 7d 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f }.static SQLITE_
66f0: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 NOINLINE void fr
6700: 65 65 50 34 46 75 6e 63 43 74 78 28 73 71 6c 69 eeP4FuncCtx(sqli
6710: 74 65 33 20 2a 64 62 2c 20 73 71 6c 69 74 65 33 te3 *db, sqlite3
6720: 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b 0a 20 20 _context *p){.
6730: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e freeEphemeralFun
6740: 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e 70 46 75 ction(db, p->pFu
6750: 6e 63 29 3b 0a 20 73 71 6c 69 74 65 33 44 62 46 nc);. sqlite3DbF
6760: 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a reeNN(db, p);.}.
6770: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 static void free
6780: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 P4(sqlite3 *db,
6790: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 int p4type, void
67a0: 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72 74 28 *p4){. assert(
67b0: 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63 68 28 db );. switch(
67c0: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 p4type ){. c
67d0: 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 ase P4_FUNCCTX:
67e0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 46 75 {. freeP4Fu
67f0: 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c 69 74 ncCtx(db, (sqlit
6800: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 3b e3_context*)p4);
6810: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
6820: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f }. case P4_
6830: 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65 20 50 REAL:. case P
6840: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63 61 73 4_INT64:. cas
6850: 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 e P4_DYNAMIC:.
6860: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 case P4_INTARR
6870: 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 AY: {. sqli
6880: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 te3DbFree(db, p4
6890: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
68a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 }. case P
68b0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 4_KEYINFO: {.
68c0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 if( db->pnByt
68d0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c esFreed==0 ) sql
68e0: 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 ite3KeyInfoUnref
68f0: 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a ((KeyInfo*)p4);.
6900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
6910: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 }.#ifdef SQLITE
6920: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 _ENABLE_CURSOR_H
6930: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 INTS. case P4
6940: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 73 _EXPR: {. s
6950: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 qlite3ExprDelete
6960: 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b (db, (Expr*)p4);
6970: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
6980: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 }.#endif. c
6990: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 ase P4_FUNCDEF:
69a0: 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68 65 {. freeEphe
69b0: 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 meralFunction(db
69c0: 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b , (FuncDef*)p4);
69d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
69e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f }. case P4_
69f0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 MEM: {. if(
6a00: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 db->pnBytesFree
6a10: 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 d==0 ){.
6a20: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 sqlite3ValueFree
6a30: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a ((sqlite3_value*
6a40: 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 )p4);. }els
6a50: 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 e{. freeP
6a60: 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 4Mem(db, (Mem*)p
6a70: 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 4);. }.
6a80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
6a90: 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 case P4_VTAB
6aa0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 : {. if( db
6ab0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d ->pnBytesFreed==
6ac0: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 0 ) sqlite3VtabU
6ad0: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 nlock((VTable *)
6ae0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b p4);. break
6af0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f ;. }. }.}../
6b00: 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 *.** Free the sp
6b10: 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f ace allocated fo
6b20: 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 r aOp and any p4
6b30: 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 values allocate
6b40: 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 d for the.** opc
6b50: 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 odes contained w
6b60: 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 ithin. If aOp is
6b70: 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 not NULL it is
6b80: 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 assumed to conta
6b90: 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 in .** nOp entri
6ba0: 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 es. .*/.static v
6bb0: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 oid vdbeFreeOpAr
6bc0: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c ray(sqlite3 *db,
6bd0: 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f Op *aOp, int nO
6be0: 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b p){. if( aOp ){
6bf0: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 . Op *pOp;.
6c00: 20 20 66 6f 72 28 70 4f 70 3d 26 61 4f 70 5b 6e for(pOp=&aOp[n
6c10: 4f 70 2d 31 5d 3b 20 70 4f 70 3e 3d 61 4f 70 3b Op-1]; pOp>=aOp;
6c20: 20 70 4f 70 2d 2d 29 7b 0a 20 20 20 20 20 20 69 pOp--){. i
6c30: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3c f( pOp->p4type <
6c40: 3d 20 50 34 5f 46 52 45 45 5f 49 46 5f 4c 45 20 = P4_FREE_IF_LE
6c50: 29 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 ) freeP4(db, pOp
6c60: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 ->p4type, pOp->p
6c70: 34 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 4.p);.#ifdef SQL
6c80: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 ITE_ENABLE_EXPLA
6c90: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 IN_COMMENTS.
6ca0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
6cb0: 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e db, pOp->zCommen
6cc0: 74 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a t);.#endif .
6cd0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
6ce0: 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 61 4f 3DbFreeNN(db, aO
6cf0: 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a p);. }.}../*.**
6d00: 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f Link the SubPro
6d10: 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 gram object pass
6d20: 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 ed as the second
6d30: 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 argument into t
6d40: 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 he linked.** lis
6d50: 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 t at Vdbe.pSubPr
6d60: 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 ogram. This list
6d70: 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 is used to dele
6d80: 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 te all sub-progr
6d90: 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 am.** objects wh
6da0: 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 en the VM is no
6db0: 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e longer required.
6dc0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
6dd0: 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 VdbeLinkSubProgr
6de0: 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 am(Vdbe *pVdbe,
6df0: 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a SubProgram *p){.
6e00: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 p->pNext = pVd
6e10: 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 be->pProgram;.
6e20: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 pVdbe->pProgram
6e30: 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 = p;.}../*.** Ch
6e40: 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 ange the opcode
6e50: 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f at addr into OP_
6e60: 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 Noop.*/.int sqli
6e70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e te3VdbeChangeToN
6e80: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 oop(Vdbe *p, int
6e90: 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f 70 addr){. VdbeOp
6ea0: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e *pOp;. if( p->
6eb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
6ec0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 ) return 0;. a
6ed0: 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 26 ssert( addr>=0 &
6ee0: 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b & addr<p->nOp );
6ef0: 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 . pOp = &p->aOp
6f00: 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 34 [addr];. freeP4
6f10: 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 (p->db, pOp->p4t
6f20: 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b ype, pOp->p4.p);
6f30: 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d . pOp->p4type =
6f40: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 70 P4_NOTUSED;. p
6f50: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 20 Op->p4.z = 0;.
6f60: 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 pOp->opcode = OP
6f70: 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e 20 _Noop;. return
6f80: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 1;.}../*.** If t
6f90: 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 69 he last opcode i
6fa0: 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 73 s "op" and it is
6fb0: 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 74 not a jump dest
6fc0: 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e ination,.** then
6fd0: 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 74 remove it. Ret
6fe0: 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 20 urn true if and
6ff0: 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f 64 only if an opcod
7000: 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a 2a e was removed..*
7010: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
7020: 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 6f eDeletePriorOpco
7030: 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 6f de(Vdbe *p, u8 o
7040: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 p){. if( p->nOp
7050: 3e 30 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e >0 && p->aOp[p->
7060: 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f nOp-1].opcode==o
7070: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 p ){. return
7080: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
7090: 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f eToNoop(p, p->nO
70a0: 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 p-1);. }else{.
70b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
70c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 .}../*.** Change
70d0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 the value of th
70e0: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 e P4 operand for
70f0: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 a specific inst
7100: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 ruction..** This
7110: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 routine is usef
7120: 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 ul when a large
7130: 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 program is loade
7140: 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 d from a.** stat
7150: 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 ic array using s
7160: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c qlite3VdbeAddOpL
7170: 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 ist but we want
7180: 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 to make a.** few
7190: 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 minor changes t
71a0: 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a o the program..*
71b0: 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 *.** If n>=0 the
71c0: 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 n the P4 operand
71d0: 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 is dynamic, mea
71e0: 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 ning that a copy
71f0: 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e of.** the strin
7200: 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d g is made into m
7210: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 emory obtained f
7220: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c rom sqlite3_mall
7230: 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 oc()..** A value
7240: 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 of n==0 means c
7250: 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 opy bytes of zP4
7260: 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 up to and inclu
7270: 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 ding the.** firs
7280: 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 t null byte. If
7290: 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e n>0 then copy n
72a0: 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e +1 bytes of zP4.
72b0: 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 .** .** Other va
72c0: 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 lues of n (P4_ST
72d0: 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 ATIC, P4_COLLSEQ
72e0: 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 etc.) indicate
72f0: 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a that zP4 points.
7300: 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f ** to a string o
7310: 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 r structure that
7320: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 is guaranteed t
7330: 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 o exist for the
7340: 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 lifetime of.** t
7350: 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 he Vdbe. In thes
7360: 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a e cases we can j
7370: 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 ust copy the poi
7380: 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 nter..**.** If a
7390: 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 ddr<0 then chang
73a0: 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 e P4 on the most
73b0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 recently insert
73c0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a ed instruction..
73d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 */.static void S
73e0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 QLITE_NOINLINE v
73f0: 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 dbeChangeP4Full(
7400: 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 . Vdbe *p,. Op
7410: 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 *pOp,. const c
7420: 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 har *zP4,. int
7430: 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e n.){. if( pOp->
7440: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 p4type ){. fr
7450: 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d eeP4(p->db, pOp-
7460: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 >p4type, pOp->p4
7470: 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 .p);. pOp->p4
7480: 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f type = 0;. pO
7490: 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d p->p4.p = 0;. }
74a0: 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 . if( n<0 ){.
74b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 sqlite3VdbeCha
74c0: 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 ngeP4(p, (int)(p
74d0: 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 Op - p->aOp), zP
74e0: 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 4, n);. }else{.
74f0: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e if( n==0 ) n
7500: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e = sqlite3Strlen
7510: 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 30(zP4);. pOp
7520: 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 ->p4.z = sqlite3
7530: 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c DbStrNDup(p->db,
7540: 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f zP4, n);. pO
7550: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 p->p4type = P4_D
7560: 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f YNAMIC;. }.}.vo
7570: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 id sqlite3VdbeCh
7580: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 angeP4(Vdbe *p,
7590: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 int addr, const
75a0: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e char *zP4, int n
75b0: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 ){. Op *pOp;.
75c0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 sqlite3 *db;. a
75d0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 ssert( p!=0 );.
75e0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 db = p->db;. a
75f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d ssert( p->magic=
7600: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 =VDBE_MAGIC_INIT
7610: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d );. assert( p-
7620: 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d >aOp!=0 || db->m
7630: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
7640: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 if( db->mallocF
7650: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 ailed ){. if(
7660: 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 n!=P4_VTAB ) fr
7670: 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 eeP4(db, n, (voi
7680: 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 d*)*(char**)&zP4
7690: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 );. return;.
76a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e }. assert( p->
76b0: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 nOp>0 );. asser
76c0: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 t( addr<p->nOp )
76d0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 ;. if( addr<0 )
76e0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e {. addr = p->
76f0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 nOp - 1;. }. p
7700: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 Op = &p->aOp[add
7710: 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c r];. if( n>=0 |
7720: 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b | pOp->p4type ){
7730: 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 . vdbeChangeP
7740: 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 4Full(p, pOp, zP
7750: 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 4, n);. retur
7760: 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d n;. }. if( n==
7770: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 P4_INT32 ){.
7780: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 /* Note: this ca
7790: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 st is safe, beca
77a0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 use the origin d
77b0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e ata point was an
77c0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 int. ** that
77d0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 was cast to a (
77e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a const char *). *
77f0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 /. pOp->p4.i
7800: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f = SQLITE_PTR_TO_
7810: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f INT(zP4);. pO
7820: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 p->p4type = P4_I
7830: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 NT32;. }else if
7840: 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 ( zP4!=0 ){.
7850: 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 assert( n<0 );.
7860: 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 pOp->p4.p = (
7870: 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 void*)zP4;. p
7880: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 Op->p4type = (si
7890: 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 gned char)n;.
78a0: 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 if( n==P4_VTAB
78b0: 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 ) sqlite3VtabLoc
78c0: 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b k((VTable*)zP4);
78d0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 . }.}../*.** Ch
78e0: 61 6e 67 65 20 74 68 65 20 50 34 20 6f 70 65 72 ange the P4 oper
78f0: 61 6e 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 and of the most
7900: 72 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 recently coded i
7910: 6e 73 74 72 75 63 74 69 6f 6e 20 0a 2a 2a 20 74 nstruction .** t
7920: 6f 20 74 68 65 20 76 61 6c 75 65 20 64 65 66 69 o the value defi
7930: 6e 65 64 20 62 79 20 74 68 65 20 61 72 67 75 6d ned by the argum
7940: 65 6e 74 73 2e 20 20 54 68 69 73 20 69 73 20 61 ents. This is a
7950: 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 high-speed.** v
7960: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 ersion of sqlite
7970: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 2e 3VdbeChangeP4().
7980: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 34 20 6f 70 .**.** The P4 op
7990: 65 72 61 6e 64 20 6d 75 73 74 20 6e 6f 74 20 68 erand must not h
79a0: 61 76 65 20 62 65 65 6e 20 70 72 65 76 69 6f 75 ave been previou
79b0: 73 6c 79 20 64 65 66 69 6e 65 64 2e 20 20 41 6e sly defined. An
79c0: 64 20 74 68 65 20 6e 65 77 0a 2a 2a 20 50 34 20 d the new.** P4
79d0: 6d 75 73 74 20 6e 6f 74 20 62 65 20 50 34 5f 49 must not be P4_I
79e0: 4e 54 33 32 2e 20 20 55 73 65 20 73 71 6c 69 74 NT32. Use sqlit
79f0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 29 e3VdbeChangeP4()
7a00: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 0a 2a 2a in either of.**
7a10: 20 74 68 6f 73 65 20 63 61 73 65 73 2e 0a 2a 2f those cases..*/
7a20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
7a30: 65 41 70 70 65 6e 64 50 34 28 56 64 62 65 20 2a eAppendP4(Vdbe *
7a40: 70 2c 20 76 6f 69 64 20 2a 70 50 34 2c 20 69 6e p, void *pP4, in
7a50: 74 20 6e 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a t n){. VdbeOp *
7a60: 70 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e pOp;. assert( n
7a70: 21 3d 50 34 5f 49 4e 54 33 32 20 26 26 20 6e 21 !=P4_INT32 && n!
7a80: 3d 50 34 5f 56 54 41 42 20 29 3b 0a 20 20 61 73 =P4_VTAB );. as
7a90: 73 65 72 74 28 20 6e 3c 3d 30 20 29 3b 0a 20 20 sert( n<=0 );.
7aa0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f if( p->db->mallo
7ab0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 66 cFailed ){. f
7ac0: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 6e 2c 20 reeP4(p->db, n,
7ad0: 70 50 34 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 pP4);. }else{.
7ae0: 20 20 20 61 73 73 65 72 74 28 20 70 50 34 21 3d assert( pP4!=
7af0: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 0 );. assert(
7b00: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 p->nOp>0 );.
7b10: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 pOp = &p->aOp[p
7b20: 2d 3e 6e 4f 70 2d 31 5d 3b 0a 20 20 20 20 61 73 ->nOp-1];. as
7b30: 73 65 72 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 sert( pOp->p4typ
7b40: 65 3d 3d 50 34 5f 4e 4f 54 55 53 45 44 20 29 3b e==P4_NOTUSED );
7b50: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 . pOp->p4type
7b60: 20 3d 20 6e 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 = n;. pOp->p
7b70: 34 2e 70 20 3d 20 70 50 34 3b 0a 20 20 7d 0a 7d 4.p = pP4;. }.}
7b80: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 ../*.** Set the
7b90: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 P4 on the most r
7ba0: 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 ecently added op
7bb0: 63 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 code to the KeyI
7bc0: 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 nfo for the.** i
7bd0: 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 ndex given..*/.v
7be0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 oid sqlite3VdbeS
7bf0: 65 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 etP4KeyInfo(Pars
7c00: 65 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 e *pParse, Index
7c10: 20 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 *pIdx){. Vdbe
7c20: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 *v = pParse->pVd
7c30: 62 65 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 be;. KeyInfo *p
7c40: 4b 65 79 49 6e 66 6f 3b 0a 20 20 61 73 73 65 72 KeyInfo;. asser
7c50: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 t( v!=0 );. ass
7c60: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a ert( pIdx!=0 );.
7c70: 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 6c pKeyInfo = sql
7c80: 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 ite3KeyInfoOfInd
7c90: 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 29 ex(pParse, pIdx)
7ca0: 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f ;. if( pKeyInfo
7cb0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41 70 ) sqlite3VdbeAp
7cc0: 70 65 6e 64 50 34 28 76 2c 20 70 4b 65 79 49 6e pendP4(v, pKeyIn
7cd0: 66 6f 2c 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b fo, P4_KEYINFO);
7ce0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 .}..#ifdef SQLIT
7cf0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e E_ENABLE_EXPLAIN
7d00: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 _COMMENTS./*.**
7d10: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 Change the comme
7d20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 nt on the most r
7d30: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e ecently coded in
7d40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a struction. Or.*
7d50: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 * insert a No-op
7d60: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d and add the com
7d70: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 ment to that new
7d80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 instruction. T
7d90: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 his.** makes the
7da0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 code easier to
7db0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 read during debu
7dc0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 gging. None of
7dd0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 this happens.**
7de0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 in a production
7df0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 build..*/.static
7e00: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 void vdbeVComme
7e10: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 nt(Vdbe *p, cons
7e20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
7e30: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 va_list ap){.
7e40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 assert( p->nOp>0
7e50: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b || p->aOp==0 );
7e60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f . assert( p->aO
7e70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 p==0 || p->aOp[p
7e80: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e ->nOp-1].zCommen
7e90: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d t==0 || p->db->m
7ea0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
7eb0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 if( p->nOp ){.
7ec0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f assert( p->aO
7ed0: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 p );. sqlite3
7ee0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d DbFree(p->db, p-
7ef0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a >aOp[p->nOp-1].z
7f00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d Comment);. p-
7f10: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a >aOp[p->nOp-1].z
7f20: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 Comment = sqlite
7f30: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 3VMPrintf(p->db,
7f40: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 zFormat, ap);.
7f50: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 }.}.void sqlite
7f60: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 3VdbeComment(Vdb
7f70: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 e *p, const char
7f80: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
7f90: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
7fa0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 if( p ){. va
7fb0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d _start(ap, zForm
7fc0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f at);. vdbeVCo
7fd0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 mment(p, zFormat
7fe0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e , ap);. va_en
7ff0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 d(ap);. }.}.voi
8000: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f d sqlite3VdbeNoo
8010: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 pComment(Vdbe *p
8020: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
8030: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 ormat, ...){. v
8040: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 a_list ap;. if(
8050: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 p ){. sqlite
8060: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 3VdbeAddOp0(p, O
8070: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f P_Noop);. va_
8080: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
8090: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d t);. vdbeVCom
80a0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c ment(p, zFormat,
80b0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 ap);. va_end
80c0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 (ap);. }.}.#end
80d0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f if /* NDEBUG */
80e0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
80f0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a VDBE_COVERAGE./*
8100: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 .** Set the valu
8110: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e e if the iSrcLin
8120: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 e field for the
8130: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 previously coded
8140: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f instruction..*/
8150: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
8160: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 eSetLineNumber(V
8170: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e dbe *v, int iLin
8180: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 e){. sqlite3Vdb
8190: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 eGetOp(v,-1)->iS
81a0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a rcLine = iLine;.
81b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 }.#endif /* SQLI
81c0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 TE_VDBE_COVERAGE
81d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 */../*.** Retur
81e0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 n the opcode for
81f0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 a given address
8200: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 . If the addres
8210: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a s is -1, then.**
8220: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 return the most
8230: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 recently insert
8240: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a ed opcode..**.**
8250: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c If a memory all
8260: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 ocation error ha
8270: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 s occurred prior
8280: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 to the calling
8290: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 of this.** routi
82a0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 ne, then a point
82b0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 er to a dummy Vd
82c0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 beOp will be ret
82d0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 urned. That opc
82e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 ode.** is readab
82f0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 le but not writa
8300: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 ble, though it i
8310: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 s cast to a writ
8320: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 able value..** T
8330: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 he return of a d
8340: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f ummy opcode allo
8350: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 ws the call to c
8360: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e ontinue function
8370: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 ing.** after an
8380: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 OOM fault withou
8390: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 t having to chec
83a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 k to see if the
83b0: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 return from .**
83c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
83d0: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e a valid pointer.
83e0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 But because th
83f0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 e dummy.opcode i
8400: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 s 0,.** dummy wi
8410: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 ll never be writ
8420: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 ten to. This is
8430: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 verified by cod
8440: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 e inspection and
8450: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 .** by running w
8460: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f ith Valgrind..*/
8470: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 .VdbeOp *sqlite3
8480: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a VdbeGetOp(Vdbe *
8490: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 p, int addr){.
84a0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 /* C89 specifies
84b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 that the consta
84c0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 nt "dummy" will
84d0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 be initialized t
84e0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 o all. ** zeros
84f0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 , which is corre
8500: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 ct. MSVC genera
8510: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e tes a warning, n
8520: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a evertheless. */.
8530: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 static VdbeOp
8540: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 dummy; /* Ignor
8550: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 e the MSVC warni
8560: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 ng about no init
8570: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 ializer */. ass
8580: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
8590: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 DBE_MAGIC_INIT )
85a0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 ;. if( addr<0 )
85b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e {. addr = p->
85c0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 nOp - 1;. }. a
85d0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 ssert( (addr>=0
85e0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 && addr<p->nOp)
85f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 || p->db->malloc
8600: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 Failed );. if(
8610: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
8620: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 led ){. retur
8630: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d n (VdbeOp*)&dumm
8640: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 y;. }else{.
8650: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 return &p->aOp[a
8660: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 ddr];. }.}..#if
8670: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
8680: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 ENABLE_EXPLAIN_C
8690: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 OMMENTS)./*.** R
86a0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
86b0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f value for one o
86c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 f the parameters
86d0: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 to the opcode p
86e0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 Op.** determined
86f0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e by character c.
8700: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .*/.static int t
8710: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 ranslateP(char c
8720: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 , const Op *pOp)
8730: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 {. if( c=='1' )
8740: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b return pOp->p1;
8750: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 . if( c=='2' )
8760: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a return pOp->p2;.
8770: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 if( c=='3' ) r
8780: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 eturn pOp->p3;.
8790: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 if( c=='4' ) re
87a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a turn pOp->p4.i;.
87b0: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 return pOp->p5
87c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 ;.}../*.** Compu
87d0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 te a string for
87e0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 the "comment" fi
87f0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 eld of a VDBE op
8800: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a code listing..**
8810: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 .** The Synopsis
8820: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 : field in comme
8830: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e nts in the vdbe.
8840: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 c source file ge
8850: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 ts converted.**
8860: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 to an extra stri
8870: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e ng that is appen
8880: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 ded to the sqlit
8890: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 e3OpcodeName().
88a0: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e In the.** absen
88b0: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d ce of other comm
88c0: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 ents, this synop
88d0: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 sis becomes the
88e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f comment on the o
88f0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 pcode..** Some t
8900: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 ranslation occur
8910: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 s:.**.** "
8920: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b PX" -> "r[
8930: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 X]".** "PX
8940: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e @PY" -> "r[X.
8950: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b .X+Y-1]" or "r[
8960: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 x]" if y is 0 or
8970: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 1.** "PX@
8980: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e PY+1" -> "r[X..
8990: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 X+Y]" or "r[x
89a0: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 ]" if y is 0.**
89b0: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 "PY..PY"
89c0: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 -> "r[X..Y]"
89d0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 or "r[x]" if
89e0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 y<=x.*/.static i
89f0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e nt displayCommen
8a00: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 t(. const Op *p
8a10: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f Op, /* The o
8a20: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d pcode to be comm
8a30: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 ented */. const
8a40: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a char *zP4, /*
8a50: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 Previously obta
8a60: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 ined value for P
8a70: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 4 */. char *zTe
8a80: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 mp, /* Wri
8a90: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a te result here *
8aa0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 /. int nTemp
8ab0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 /* Space
8ac0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 available in zTe
8ad0: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e mp[] */.){. con
8ae0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 st char *zOpName
8af0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ;. const char *
8b00: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 zSynopsis;. int
8b10: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 nOpName;. int
8b20: 69 69 2c 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a ii, jj;. char z
8b30: 41 6c 74 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 Alt[50];. zOpNa
8b40: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f me = sqlite3Opco
8b50: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f deName(pOp->opco
8b60: 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d de);. nOpName =
8b70: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
8b80: 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 (zOpName);. if(
8b90: 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 zOpName[nOpName
8ba0: 2b 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 +1] ){. int s
8bb0: 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 eenCom = 0;.
8bc0: 63 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e char c;. zSyn
8bd0: 6f 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 opsis = zOpName
8be0: 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a += nOpName + 1;.
8bf0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 if( strncmp(
8c00: 7a 53 79 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c zSynopsis,"IF ",
8c10: 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 3)==0 ){. i
8c20: 66 28 20 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c f( pOp->p5 & SQL
8c30: 49 54 45 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 ITE_STOREP2 ){.
8c40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
8c50: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a nprintf(sizeof(z
8c60: 41 6c 74 29 2c 20 7a 41 6c 74 2c 20 22 72 5b 50 Alt), zAlt, "r[P
8c70: 32 5d 20 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 2] = (%s)", zSyn
8c80: 6f 70 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 opsis+3);.
8c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 }else{. s
8ca0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
8cb0: 73 69 7a 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 sizeof(zAlt), zA
8cc0: 6c 74 2c 20 22 69 66 20 25 73 20 67 6f 74 6f 20 lt, "if %s goto
8cd0: 50 32 22 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 P2", zSynopsis+3
8ce0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
8cf0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c zSynopsis = zAl
8d00: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 t;. }. for
8d10: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 (ii=jj=0; jj<nTe
8d20: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 mp-1 && (c = zSy
8d30: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 nopsis[ii])!=0;
8d40: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 ii++){. if(
8d50: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 c=='P' ){.
8d60: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 c = zSynopsis
8d70: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 [++ii];.
8d80: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 if( c=='4' ){.
8d90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f sqlite3_
8da0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a snprintf(nTemp-j
8db0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 j, zTemp+jj, "%s
8dc0: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 ", zP4);.
8dd0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 }else if( c=='X
8de0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 ' ){. s
8df0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
8e00: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b nTemp-jj, zTemp+
8e10: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a jj, "%s", pOp->z
8e20: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 Comment);.
8e30: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b seenCom = 1;
8e40: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
8e50: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 int v1
8e60: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c = translateP(c,
8e70: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 pOp);.
8e80: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 int v2;.
8e90: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
8ea0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 ntf(nTemp-jj, zT
8eb0: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 emp+jj, "%d", v1
8ec0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 );. if(
8ed0: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 strncmp(zSynops
8ee0: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 is+ii+1, "@P", 2
8ef0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )==0 ){.
8f00: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 ii += 3;.
8f10: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 jj += s
8f20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
8f30: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 Temp+jj);.
8f40: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 v2 = trans
8f50: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b lateP(zSynopsis[
8f60: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 ii], pOp);.
8f70: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 if( strnc
8f80: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b mp(zSynopsis+ii+
8f90: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 1,"+1",2)==0 ){.
8fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69 ii
8fb0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 += 2;.
8fc0: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 v2++;.
8fd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
8fe0: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b if( v2>1 ){
8ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 . s
9000: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
9010: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b nTemp-jj, zTemp+
9020: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 jj, "..%d", v1+v
9030: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2-1);.
9040: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 }. }e
9050: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 lse if( strncmp(
9060: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 zSynopsis+ii+1,
9070: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 "..P3", 4)==0 &&
9080: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 pOp->p3==0 ){.
9090: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d ii +=
90a0: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 4;. }.
90b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
90c0: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 jj += sqlite3S
90d0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a trlen30(zTemp+jj
90e0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a );. }else{.
90f0: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a zTemp[jj
9100: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d ++] = c;. }
9110: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 . }. if( !
9120: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 seenCom && jj<nT
9130: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 emp-5 && pOp->zC
9140: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 omment ){.
9150: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
9160: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 (nTemp-jj, zTemp
9170: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 +jj, "; %s", pOp
9180: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 ->zComment);.
9190: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 jj += sqlite3
91a0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a Strlen30(zTemp+j
91b0: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 j);. }. if
91c0: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 ( jj<nTemp ) zTe
91d0: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 mp[jj] = 0;. }e
91e0: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f lse if( pOp->zCo
91f0: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c mment ){. sql
9200: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
9210: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 emp, zTemp, "%s"
9220: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 , pOp->zComment)
9230: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 ;. jj = sqlit
9240: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 e3Strlen30(zTemp
9250: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
9260: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 zTemp[0] = 0;.
9270: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 jj = 0;. }.
9280: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e return jj;.}.#en
9290: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 dif /* SQLITE_DE
92a0: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 BUG */..#if VDBE
92b0: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 _DISPLAY_P4 && d
92c0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e efined(SQLITE_EN
92d0: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 ABLE_CURSOR_HINT
92e0: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 S)./*.** Transla
92f0: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 te the P4.pExpr
9300: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f value for an OP_
9310: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 CursorHint opcod
9320: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 e into text.** t
9330: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c hat can be displ
9340: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 ayed in the P4 c
9350: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e olumn of EXPLAIN
9360: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 output..*/.stat
9370: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 ic void displayP
9380: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 4Expr(StrAccum *
9390: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b p, Expr *pExpr){
93a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
93b0: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 Op = 0;. switch
93c0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 ( pExpr->op ){.
93d0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e case TK_STRIN
93e0: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 G:. sqlite3
93f0: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c XPrintf(p, "%Q",
9400: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e pExpr->u.zToken
9410: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
9420: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 case TK_INTE
9430: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 GER:. sqlit
9440: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64 e3XPrintf(p, "%d
9450: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c ", pExpr->u.iVal
9460: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b ue);. break
9470: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 ;. case TK_NU
9480: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 LL:. sqlite
9490: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c 3XPrintf(p, "NUL
94a0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b L");. break
94b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 ;. case TK_RE
94c0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 GISTER: {.
94d0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 sqlite3XPrintf(p
94e0: 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 , "r[%d]", pExpr
94f0: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 ->iTable);.
9500: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
9510: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e case TK_COLUMN
9520: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 : {. if( pE
9530: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 xpr->iColumn<0 )
9540: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
9550: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77 3XPrintf(p, "row
9560: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 id");. }els
9570: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 e{. sqlit
9580: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25 e3XPrintf(p, "c%
9590: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e d", (int)pExpr->
95a0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 iColumn);.
95b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 }. break;.
95c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b }. case TK
95d0: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 _LT: zOp =
95e0: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b "LT"; break
95f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 ;. case TK_LE
9600: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 : zOp = "LE
9610: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 "; break;.
9620: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 case TK_GT:
9630: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 zOp = "GT";
9640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
9650: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 case TK_GE:
9660: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 zOp = "GE";
9670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
9680: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f e TK_NE: zO
9690: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 p = "NE"; b
96a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
96b0: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d K_EQ: zOp =
96c0: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 "EQ"; brea
96d0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 k;. case TK_I
96e0: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 S: zOp = "I
96f0: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a S"; break;.
9700: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f case TK_ISNO
9710: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f T: zOp = "ISNO
9720: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 T"; break;.
9730: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 case TK_AND:
9740: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 zOp = "AND";
9750: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
9760: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a se TK_OR: z
9770: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 Op = "OR";
9780: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
9790: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 TK_PLUS: zOp
97a0: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 = "ADD"; bre
97b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f ak;. case TK_
97c0: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 STAR: zOp = "
97d0: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b MUL"; break;
97e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e . case TK_MIN
97f0: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 US: zOp = "SUB
9800: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 "; break;.
9810: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 case TK_REM:
9820: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 zOp = "REM";
9830: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 break;. c
9840: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 ase TK_BITAND:
9850: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 zOp = "BITAND";
9860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
9870: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 TK_BITOR: zOp
9880: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 = "BITOR"; br
9890: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b eak;. case TK
98a0: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 _SLASH: zOp =
98b0: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b "DIV"; break
98c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 ;. case TK_LS
98d0: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 HIFT: zOp = "LS
98e0: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 HIFT"; break;.
98f0: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 case TK_RSHIF
9900: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 T: zOp = "RSHIF
9910: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 T"; break;.
9920: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 case TK_CONCAT:
9930: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b zOp = "CONCAT";
9940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
9950: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f e TK_UMINUS: zO
9960: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 p = "MINUS"; b
9970: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
9980: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d K_UPLUS: zOp =
9990: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 "PLUS"; brea
99a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 k;. case TK_B
99b0: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 ITNOT: zOp = "B
99c0: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a ITNOT"; break;.
99d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a case TK_NOT:
99e0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 zOp = "NOT"
99f0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 ; break;.
9a00: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a case TK_ISNULL:
9a10: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 zOp = "ISNULL"
9a20: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ; break;. ca
9a30: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a se TK_NOTNULL: z
9a40: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 Op = "NOTNULL";
9a50: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 break;.. defa
9a60: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 ult:. sqlit
9a70: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73 e3XPrintf(p, "%s
9a80: 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 ", "expr");.
9a90: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 break;. }..
9aa0: 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 if( zOp ){. s
9ab0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c qlite3XPrintf(p,
9ac0: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 "%s(", zOp);.
9ad0: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 displayP4Expr(
9ae0: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 p, pExpr->pLeft)
9af0: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d ;. if( pExpr-
9b00: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 >pRight ){.
9b10: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d sqlite3StrAccum
9b20: 41 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 Append(p, ",", 1
9b30: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 );. display
9b40: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d P4Expr(p, pExpr-
9b50: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a >pRight);. }.
9b60: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 sqlite3StrAc
9b70: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22 cumAppend(p, ")"
9b80: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 , 1);. }.}.#end
9b90: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c if /* VDBE_DISPL
9ba0: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 AY_P4 && defined
9bb0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 (SQLITE_ENABLE_C
9bc0: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a URSOR_HINTS) */.
9bd0: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c ..#if VDBE_DISPL
9be0: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 AY_P4./*.** Comp
9bf0: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 ute a string tha
9c00: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 t describes the
9c10: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 P4 parameter for
9c20: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 an opcode..** U
9c30: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 se zTemp for any
9c40: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 required tempor
9c50: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 ary buffer space
9c60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 ..*/.static char
9c70: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a *displayP4(Op *
9c80: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 pOp, char *zTemp
9c90: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 , int nTemp){.
9ca0: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d char *zP4 = zTem
9cb0: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b p;. StrAccum x;
9cc0: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 . assert( nTemp
9cd0: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 >=20 );. sqlite
9ce0: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78 3StrAccumInit(&x
9cf0: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d , 0, zTemp, nTem
9d00: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28 p, 0);. switch(
9d10: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a pOp->p4type ){.
9d20: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 case P4_KEYI
9d30: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 NFO: {. int
9d40: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 j;. KeyInf
9d50: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f o *pKeyInfo = pO
9d60: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a p->p4.pKeyInfo;.
9d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b assert( pK
9d80: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 eyInfo->aSortOrd
9d90: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 er!=0 );. s
9da0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 qlite3XPrintf(&x
9db0: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e , "k(%d", pKeyIn
9dc0: 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 29 3b 0a fo->nKeyField);.
9dd0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a for(j=0; j
9de0: 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 <pKeyInfo->nKeyF
9df0: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 ield; j++){.
9e00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f CollSeq *pCo
9e10: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 ll = pKeyInfo->a
9e20: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 Coll[j];.
9e30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f const char *zCo
9e40: 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f ll = pColl ? pCo
9e50: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a ll->zName : "";.
9e60: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 if( strc
9e70: 6d 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 mp(zColl, "BINAR
9e80: 59 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d Y")==0 ) zColl =
9e90: 20 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 "B";. sq
9ea0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c lite3XPrintf(&x,
9eb0: 20 22 2c 25 73 25 73 22 2c 20 70 4b 65 79 49 6e ",%s%s", pKeyIn
9ec0: 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a fo->aSortOrder[j
9ed0: 5d 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 ] ? "-" : "", zC
9ee0: 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 oll);. }.
9ef0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 sqlite3StrAc
9f00: 63 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 29 cumAppend(&x, ")
9f10: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 ", 1);. bre
9f20: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 ak;. }.#ifdef
9f30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 SQLITE_ENABLE_C
9f40: 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 URSOR_HINTS.
9f50: 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a case P4_EXPR: {.
9f60: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 displayP4E
9f70: 78 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e xpr(&x, pOp->p4.
9f80: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 pExpr);. br
9f90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 eak;. }.#endi
9fa0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f f. case P4_CO
9fb0: 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 LLSEQ: {. C
9fc0: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 ollSeq *pColl =
9fd0: 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 pOp->p4.pColl;.
9fe0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 sqlite3XPri
9ff0: 6e 74 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 ntf(&x, "(%.20s)
a000: 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 ", pColl->zName)
a010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
a020: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 }. case P4
a030: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 _FUNCDEF: {.
a040: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 FuncDef *pDef
a050: 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b = pOp->p4.pFunc;
a060: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 . sqlite3XP
a070: 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 rintf(&x, "%s(%d
a080: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c )", pDef->zName,
a090: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 pDef->nArg);.
a0a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
a0b0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c .#if defined(SQL
a0c0: 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 ITE_DEBUG) || de
a0d0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 fined(VDBE_PROFI
a0e0: 4c 45 29 0a 20 20 20 20 63 61 73 65 20 50 34 5f LE). case P4_
a0f0: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 FUNCCTX: {.
a100: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d FuncDef *pDef =
a110: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 pOp->p4.pCtx->p
a120: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 Func;. sqli
a130: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 te3XPrintf(&x, "
a140: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a %s(%d)", pDef->z
a150: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 Name, pDef->nArg
a160: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
a170: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
a180: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 case P4_INT64:
a190: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 {. sqlite3X
a1a0: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 Printf(&x, "%lld
a1b0: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 ", *pOp->p4.pI64
a1c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
a1d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 }. case P
a1e0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 4_INT32: {.
a1f0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 sqlite3XPrintf(
a200: 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 &x, "%d", pOp->p
a210: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 4.i);. brea
a220: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
a230: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 e P4_REAL: {.
a240: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 sqlite3XPrint
a250: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a f(&x, "%.16g", *
a260: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a pOp->p4.pReal);.
a270: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
a280: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d }. case P4_M
a290: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 EM: {. Mem
a2a0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e *pMem = pOp->p4.
a2b0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 pMem;. if(
a2c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pMem->flags & ME
a2d0: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 M_Str ){.
a2e0: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a zP4 = pMem->z;.
a2f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
a300: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pMem->flags & ME
a310: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 M_Int ){.
a320: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 sqlite3XPrintf(
a330: 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d &x, "%lld", pMem
a340: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 ->u.i);. }e
a350: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c lse if( pMem->fl
a360: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 ags & MEM_Real )
a370: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
a380: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 3XPrintf(&x, "%.
a390: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 16g", pMem->u.r)
a3a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 ;. }else if
a3b0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 ( pMem->flags &
a3c0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 MEM_Null ){.
a3d0: 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 zP4 = "NULL"
a3e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
a3f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
a400: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
a410: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 _Blob );.
a420: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b zP4 = "(blob)";
a430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 . }. b
a440: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e reak;. }.#ifn
a450: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
a460: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 VIRTUALTABLE.
a470: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b case P4_VTAB: {
a480: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 . sqlite3_v
a490: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 tab *pVtab = pOp
a4a0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 ->p4.pVtab->pVta
a4b0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 b;. sqlite3
a4c0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76 74 61 XPrintf(&x, "vta
a4d0: 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 b:%p", pVtab);.
a4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
a4f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 }.#endif. cas
a500: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b e P4_INTARRAY: {
a510: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 . int i;.
a520: 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f int *ai = pO
a530: 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 p->p4.ai;.
a540: 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 int n = ai[0];
a550: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c /* The first el
a560: 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 ement of an INTA
a570: 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20 74 RRAY is always t
a580: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 he.
a590: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 ** cou
a5a0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 nt of the number
a5b0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 of elements to
a5c0: 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 follow */.
a5d0: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 3b 20 69 for(i=1; i<=n; i
a5e0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c ++){. sql
a5f0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 ite3XPrintf(&x,
a600: 22 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 ",%d", ai[i]);.
a610: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 }. zTe
a620: 6d 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 mp[0] = '[';.
a630: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 sqlite3StrAcc
a640: 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 umAppend(&x, "]"
a650: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 , 1);. brea
a660: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
a670: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a e P4_SUBPROGRAM:
a680: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 {. sqlite3
a690: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72 6f XPrintf(&x, "pro
a6a0: 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 gram");. br
a6b0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
a6c0: 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 ase P4_ADVANCE:
a6d0: 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d {. zTemp[0]
a6e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 = 0;. brea
a6f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
a700: 65 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 e P4_TABLE: {.
a710: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e sqlite3XPrin
a720: 74 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 tf(&x, "%s", pOp
a730: 2d 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 ->p4.pTab->zName
a740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
a750: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c }. defaul
a760: 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d t: {. zP4 =
a770: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 pOp->p4.z;.
a780: 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a if( zP4==0 ){.
a790: 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 zP4 = zT
a7a0: 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 emp;. zTe
a7b0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 mp[0] = 0;.
a7c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 }. }. }. s
a7d0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 qlite3StrAccumFi
a7e0: 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 nish(&x);. asse
a7f0: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 rt( zP4!=0 );.
a800: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 return zP4;.}.#e
a810: 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 ndif /* VDBE_DIS
a820: 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a PLAY_P4 */../*.*
a830: 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 * Declare to the
a840: 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 Vdbe that the B
a850: 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 Tree object at d
a860: 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 b->aDb[i] is use
a870: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 d..**.** The pre
a880: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 pared statements
a890: 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e need to know in
a8a0: 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d advance the com
a8b0: 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 plete set of.**
a8c0: 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 attached databas
a8d0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 es that will be
a8e0: 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 use. A mask of
a8f0: 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a these databases.
a900: 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 ** is maintained
a910: 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b in p->btreeMask
a920: 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 . The p->lockMa
a930: 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 sk value is the
a940: 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e subset of.** p->
a950: 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 btreeMask of dat
a960: 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c abases that will
a970: 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e require a lock.
a980: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
a990: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 VdbeUsesBtree(Vd
a9a0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 be *p, int i){.
a9b0: 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 assert( i>=0 &&
a9c0: 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 i<p->db->nDb &&
a9d0: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 i<(int)sizeof(y
a9e0: 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 DbMask)*8 );. a
a9f0: 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 ssert( i<(int)si
aa00: 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 zeof(p->btreeMas
aa10: 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b k)*8 );. DbMask
aa20: 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b Set(p->btreeMask
aa30: 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 , i);. if( i!=1
aa40: 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 && sqlite3Btree
aa50: 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e Sharable(p->db->
aa60: 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 aDb[i].pBt) ){.
aa70: 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e DbMaskSet(p->
aa80: 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 lockMask, i);.
aa90: 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 }.}..#if !define
aaa0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 d(SQLITE_OMIT_SH
aab0: 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a ARED_CACHE)./*.*
aac0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 * If SQLite is c
aad0: 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f ompiled to suppo
aae0: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 rt shared-cache
aaf0: 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 mode and to be t
ab00: 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 hreadsafe,.** th
ab10: 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 is routine obtai
ab20: 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 ns the mutex ass
ab30: 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 ociated with eac
ab40: 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 h BtShared struc
ab50: 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 ture.** that may
ab60: 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 be accessed by
ab70: 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 the VM passed as
ab80: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e an argument. In
ab90: 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 doing so it als
aba0: 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 o.** sets the Bt
abb0: 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 Shared.db member
abc0: 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 of each of the
abd0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 BtShared structu
abe0: 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a res, ensuring.**
abf0: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 that the correc
ac00: 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 t busy-handler c
ac10: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b allback is invok
ac20: 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a ed if required..
ac30: 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 **.** If SQLite
ac40: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 is not threadsaf
ac50: 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f e but does suppo
ac60: 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 rt shared-cache
ac70: 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 mode, then.** sq
ac80: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 lite3BtreeEnter(
ac90: 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 ) is invoked to
aca0: 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 set the BtShared
acb0: 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a .db variables.**
acc0: 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 of all of BtSha
acd0: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 red structures a
ace0: 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 ccessible via th
acf0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c e database handl
ad00: 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 e .** associated
ad10: 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a with the VM..**
ad20: 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 .** If SQLite is
ad30: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 not threadsafe
ad40: 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 and does not sup
ad50: 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 port shared-cach
ad60: 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 e mode, this.**
ad70: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f function is a no
ad80: 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 -op..**.** The p
ad90: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c ->btreeMask fiel
ada0: 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f d is a bitmask o
adb0: 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 f all btrees tha
adc0: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a t the prepared .
add0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 ** statement p w
ade0: 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c ill ever use. L
adf0: 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 et N be the numb
ae00: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d er of bits in p-
ae10: 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f >btreeMask.** co
ae20: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 rresponding to b
ae30: 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 trees that use s
ae40: 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 hared cache. Th
ae50: 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f en the runtime o
ae60: 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e f.** this routin
ae70: 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 e is N*N. But a
ae80: 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f s N is rarely mo
ae90: 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 re than 1, this
aea0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 should not.** be
aeb0: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 a problem..*/.v
aec0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 oid sqlite3VdbeE
aed0: 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 nter(Vdbe *p){.
aee0: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 int i;. sqlite
aef0: 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3 *db;. Db *aDb
af00: 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 ;. int nDb;. i
af10: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f f( DbMaskAllZero
af20: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 (p->lockMask) )
af30: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 return; /* The
af40: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 common case */.
af50: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 db = p->db;. a
af60: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 Db = db->aDb;.
af70: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 nDb = db->nDb;.
af80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b for(i=0; i<nDb;
af90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 i++){. if( i
afa0: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 !=1 && DbMaskTes
afb0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 t(p->lockMask,i)
afc0: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 && ALWAYS(aDb[i
afd0: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 ].pBt!=0) ){.
afe0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 sqlite3BtreeE
aff0: 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 nter(aDb[i].pBt)
b000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 ;. }. }.}.#e
b010: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e ndif..#if !defin
b020: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 ed(SQLITE_OMIT_S
b030: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 HARED_CACHE) &&
b040: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 SQLITE_THREADSAF
b050: 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b E>0./*.** Unlock
b060: 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 all of the btre
b070: 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f es previously lo
b080: 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 cked by a call t
b090: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 o sqlite3VdbeEnt
b0a0: 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 er()..*/.static
b0b0: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 SQLITE_NOINLINE
b0c0: 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 void vdbeLeave(V
b0d0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 dbe *p){. int i
b0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b ;. sqlite3 *db;
b0f0: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e . Db *aDb;. in
b100: 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d t nDb;. db = p-
b110: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d >db;. aDb = db-
b120: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 >aDb;. nDb = db
b130: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 ->nDb;. for(i=0
b140: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 ; i<nDb; i++){.
b150: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 if( i!=1 && D
b160: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 bMaskTest(p->loc
b170: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 kMask,i) && ALWA
b180: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 YS(aDb[i].pBt!=0
b190: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 ) ){. sqlit
b1a0: 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 e3BtreeLeave(aDb
b1b0: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a [i].pBt);. }.
b1c0: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 }.}.void sqlit
b1d0: 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 e3VdbeLeave(Vdbe
b1e0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 *p){. if( DbMa
b1f0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 skAllZero(p->loc
b200: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b kMask) ) return;
b210: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 /* The common
b220: 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 case */. vdbeLe
b230: 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 ave(p);.}.#endif
b240: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 ..#if defined(VD
b250: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 BE_PROFILE) || d
b260: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 efined(SQLITE_DE
b270: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 BUG)./*.** Print
b280: 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 a single opcode
b290: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 . This routine
b2a0: 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 is used for debu
b2b0: 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 gging only..*/.v
b2c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 oid sqlite3VdbeP
b2d0: 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 rintOp(FILE *pOu
b2e0: 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 t, int pc, Op *p
b2f0: 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 Op){. char *zP4
b300: 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 ;. char zPtr[50
b310: 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 ];. char zCom[1
b320: 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 00];. static co
b330: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 nst char *zForma
b340: 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 t1 = "%4d %-13s
b350: 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 %4d %4d %4d %-13
b360: 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 s %.2X %s\n";.
b370: 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f if( pOut==0 ) pO
b380: 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a ut = stdout;. z
b390: 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 P4 = displayP4(p
b3a0: 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 Op, zPtr, sizeof
b3b0: 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 (zPtr));.#ifdef
b3c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 SQLITE_ENABLE_EX
b3d0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 PLAIN_COMMENTS.
b3e0: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 displayComment(
b3f0: 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 pOp, zP4, zCom,
b400: 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 sizeof(zCom));.#
b410: 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d else. zCom[0] =
b420: 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 0;.#endif. /*
b430: 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 NB: The sqlite3
b440: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e OpcodeName() fun
b450: 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 ction is impleme
b460: 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 nted by code cre
b470: 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 ated. ** by the
b480: 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 mkopcodeh.awk a
b490: 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b nd mkopcodec.awk
b4a0: 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65 scripts which e
b4b0: 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 xtract the. **
b4c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d information from
b4d0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 the vdbe.c sour
b4e0: 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 ce text */. fpr
b4f0: 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d intf(pOut, zForm
b500: 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 at1, pc, .
b510: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d sqlite3OpcodeNam
b520: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 e(pOp->opcode),
b530: 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 pOp->p1, pOp->p2
b540: 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 , pOp->p3, zP4,
b550: 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a pOp->p5,. z
b560: 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 Com. );. fflus
b570: 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 h(pOut);.}.#endi
b580: 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c f../*.** Initial
b590: 69 7a 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 ize an array of
b5a0: 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 2e 0a 2a N Mem element..*
b5b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e /.static void in
b5c0: 69 74 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a itMemArray(Mem *
b5d0: 70 2c 20 69 6e 74 20 4e 2c 20 73 71 6c 69 74 65 p, int N, sqlite
b5e0: 33 20 2a 64 62 2c 20 75 31 36 20 66 6c 61 67 73 3 *db, u16 flags
b5f0: 29 7b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 2d ){. while( (N--
b600: 29 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 64 62 )>0 ){. p->db
b610: 20 3d 20 64 62 3b 0a 20 20 20 20 70 2d 3e 66 6c = db;. p->fl
b620: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 ags = flags;.
b630: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 p->szMalloc = 0
b640: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
b650: 44 45 42 55 47 0a 20 20 20 20 70 2d 3e 70 53 63 DEBUG. p->pSc
b660: 6f 70 79 46 72 6f 6d 20 3d 20 30 3b 0a 23 65 6e opyFrom = 0;.#en
b670: 64 69 66 0a 20 20 20 20 70 2b 2b 3b 0a 20 20 7d dif. p++;. }
b680: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 .}../*.** Releas
b690: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 e an array of N
b6a0: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a Mem elements.*/.
b6b0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 static void rele
b6c0: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 aseMemArray(Mem
b6d0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 *p, int N){. if
b6e0: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 ( p && N ){.
b6f0: 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e Mem *pEnd = &p[N
b700: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a ];. sqlite3 *
b710: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 db = p->db;.
b720: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 if( db->pnBytesF
b730: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f reed ){. do
b740: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d {. if( p-
b750: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 >szMalloc ) sqli
b760: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
b770: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 >zMalloc);.
b780: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 }while( (++p)<p
b790: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 End );. ret
b7a0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 urn;. }. d
b7b0: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 o{. assert(
b7c0: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c (&p[1])==pEnd |
b7d0: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e | p[0].db==p[1].
b7e0: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 db );. asse
b7f0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 rt( sqlite3VdbeC
b800: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 heckMemInvariant
b810: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f s(p) );.. /
b820: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 * This block is
b830: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 really an inline
b840: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c d version of sql
b850: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 ite3VdbeMemRelea
b860: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 se(). ** th
b870: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 at takes advanta
b880: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 ge of the fact t
b890: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 hat the memory c
b8a0: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 ell value is .
b8b0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 ** being set
b8c0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 to NULL after r
b8d0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e eleasing any dyn
b8e0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a amic resources..
b8f0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a **. *
b900: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 * The justificat
b910: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 ion for duplicat
b920: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 ing code is that
b930: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 according to .
b940: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e ** callgrin
b950: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 d, this causes a
b960: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 certain test ca
b970: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 se to hit the CP
b980: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 U 4.7 . **
b990: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 percent less (x8
b9a0: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 6 linux, gcc ver
b9b0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 sion 4.1.2, -O6)
b9c0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 than if .
b9d0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c ** sqlite3MemRel
b9e0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c ease() were call
b9f0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 ed from here. Wi
ba00: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d th -O2, this jum
ba10: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 ps. ** to 6
ba20: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 .6 percent. The
ba30: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 test case is ins
ba40: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 erting 1000 rows
ba50: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 into a table .
ba60: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 ** with no
ba70: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 indexes using a
ba80: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 single prepared
ba90: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 INSERT statement
baa0: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 , bind() .
bab0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 ** and reset().
bac0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 Inserts are grou
bad0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 ped into a trans
bae0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f action.. */
baf0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 . testcase(
bb00: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f p->flags & MEM_
bb10: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 Agg );. tes
bb20: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 tcase( p->flags
bb30: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 & MEM_Dyn );.
bb40: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e testcase( p->
bb50: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d flags & MEM_Fram
bb60: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 e );. testc
bb70: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 ase( p->flags &
bb80: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 MEM_RowSet );.
bb90: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 if( p->flags
bba0: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 &(MEM_Agg|MEM_Dy
bbb0: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f n|MEM_Frame|MEM_
bbc0: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 RowSet) ){.
bbd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
bbe0: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 mRelease(p);.
bbf0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e }else if( p->
bc00: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 szMalloc ){.
bc10: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
bc20: 65 4e 4e 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c eNN(db, p->zMall
bc30: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e oc);. p->
bc40: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 szMalloc = 0;.
bc50: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e }.. p->
bc60: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 flags = MEM_Unde
bc70: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c fined;. }whil
bc80: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b e( (++p)<pEnd );
bc90: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 . }.}../*.** De
bca0: 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 lete a VdbeFrame
bcb0: 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 object and its
bcc0: 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 contents. VdbeFr
bcd0: 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a ame objects are.
bce0: 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 ** allocated by
bcf0: 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f the OP_Program o
bd00: 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 pcode in sqlite3
bd10: 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 VdbeExec()..*/.v
bd20: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 oid sqlite3VdbeF
bd30: 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 rameDelete(VdbeF
bd40: 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 rame *p){. int
bd50: 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d i;. Mem *aMem =
bd60: 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 VdbeFrameMem(p)
bd70: 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a ;. VdbeCursor *
bd80: 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 *apCsr = (VdbeCu
bd90: 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d rsor **)&aMem[p-
bda0: 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 >nChildMem];. f
bdb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 or(i=0; i<p->nCh
bdc0: 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 ildCsr; i++){.
bdd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 sqlite3VdbeFre
bde0: 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 eCursor(p->v, ap
bdf0: 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 Csr[i]);. }. r
be00: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 eleaseMemArray(a
be10: 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 Mem, p->nChildMe
be20: 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 m);. sqlite3Vdb
be30: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 eDeleteAuxData(p
be40: 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 ->v->db, &p->pAu
be50: 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 xData, -1, 0);.
be60: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 sqlite3DbFree(p
be70: 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a ->v->db, p);.}..
be80: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
be90: 4d 49 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a MIT_EXPLAIN./*.*
bea0: 2a 20 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 * Give a listing
beb0: 20 6f 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 of the program
bec0: 69 6e 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d in the virtual m
bed0: 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 achine..**.** Th
bee0: 65 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 e interface is t
bef0: 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 he same as sqlit
bf00: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 e3VdbeExec(). B
bf10: 75 74 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a ut instead of.**
bf20: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 running the cod
bf30: 65 2c 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 e, it invokes th
bf40: 65 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 e callback once
bf50: 66 6f 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 for each instruc
bf60: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 tion..** This fe
bf70: 61 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f ature is used to
bf80: 20 69 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c implement "EXPL
bf90: 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e AIN"..**.** When
bfa0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 p->explain==1,
bfb0: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e each instruction
bfc0: 20 69 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 is listed. Whe
bfd0: 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d n.** p->explain=
bfe0: 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c =2, only OP_Expl
bff0: 61 69 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 ain instructions
c000: 20 61 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 are listed and
c010: 74 68 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f these.** are sho
c020: 77 6e 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e wn in a differen
c030: 74 20 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 t format. p->ex
c040: 70 6c 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 plain==2 is used
c050: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a to implement.**
c060: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 EXPLAIN QUERY P
c070: 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 LAN..**.** When
c080: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 p->explain==1, f
c090: 69 72 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 irst the main pr
c0a0: 6f 67 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c ogram is listed,
c0b0: 20 74 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a then each of.**
c0c0: 20 74 68 65 20 74 72 69 67 67 65 72 20 73 75 62 the trigger sub
c0d0: 70 72 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 programs are lis
c0e0: 74 65 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a ted one by one..
c0f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
c100: 62 65 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a beList(. Vdbe *
c110: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p
c120: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 /* The VDBE
c130: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 */.){. int nRow
c140: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
c160: 53 74 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f Stop when row co
c170: 75 6e 74 20 72 65 61 63 68 65 73 20 74 68 69 73 unt reaches this
c180: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d */. int nSub =
c190: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
c1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 /* Nu
c1b0: 6d 62 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 mber of sub-vdbe
c1c0: 73 20 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f s seen so far */
c1d0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a . SubProgram **
c1e0: 61 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 apSub = 0;
c1f0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 /* Array
c200: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f of sub-vdbes */
c210: 0a 20 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 . Mem *pSub = 0
c220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
c230: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 /* Memor
c240: 79 20 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 y cell hold arra
c250: 79 20 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f y of subprogs */
c260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
c270: 20 70 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 p->db;
c280: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 /* The d
c290: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
c2a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 on */. int i;
c2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
c2d0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a Loop counter */.
c2e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 int rc = SQLIT
c2f0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 E_OK;
c300: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e /* Return
c310: 20 63 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a code */. Mem *
c320: 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b pMem = &p->aMem[
c330: 31 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 1];
c340: 2f 2a 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 /* First Mem of
c350: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 result set */..
c360: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c assert( p->expl
c370: 61 69 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 ain );. assert(
c380: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
c390: 4d 41 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 MAGIC_RUN );. a
c3a0: 73 73 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 ssert( p->rc==SQ
c3b0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 LITE_OK || p->rc
c3c0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c ==SQLITE_BUSY ||
c3d0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e p->rc==SQLITE_N
c3e0: 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 OMEM );.. /* Ev
c3f0: 65 6e 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f en though this o
c400: 70 63 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 pcode does not u
c410: 73 65 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e se dynamic strin
c420: 67 73 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 gs for. ** the
c430: 72 65 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 result, result c
c440: 6f 6c 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d olumns may becom
c450: 65 20 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 e dynamic if the
c460: 20 75 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a user calls. **
c470: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
c480: 74 65 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e text16(), causin
c490: 67 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 g a translation
c4a0: 74 6f 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 to UTF-16 encodi
c4b0: 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 ng.. */. relea
c4c0: 73 65 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c seMemArray(pMem,
c4d0: 20 38 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 8);. p->pResul
c4e0: 74 53 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 tSet = 0;.. if(
c4f0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e p->rc==SQLITE_N
c500: 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20 OMEM_BKPT ){.
c510: 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 /* This happens
c520: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 if a malloc() i
c530: 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 nside a call to
c540: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
c550: 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 ext() or. **
c560: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 sqlite3_column_t
c570: 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 ext16() failed.
c580: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f */. sqlite3O
c590: 6f 6d 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 omFault(db);.
c5a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 return SQLITE_E
c5b0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 RROR;. }.. /*
c5c0: 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 When the number
c5d0: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 of output rows r
c5e0: 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 eaches nRow, tha
c5f0: 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a t means the. **
c600: 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e listing has fin
c610: 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 ished and sqlite
c620: 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 3_step() should
c630: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f return SQLITE_DO
c640: 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 NE.. ** nRow is
c650: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 the sum of the
c660: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 number of rows i
c670: 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 n the main progr
c680: 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 am, plus. ** th
c690: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d e sum of the num
c6a0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 ber of rows in a
c6b0: 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 70 72 ll trigger subpr
c6c0: 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 ograms encounter
c6d0: 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 ed. ** so far.
c6e0: 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 The nRow value
c6f0: 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 will increase as
c700: 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 75 62 new trigger sub
c710: 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a programs are. *
c720: 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 * encountered, b
c730: 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 ut p->pc will ev
c740: 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 entually catch u
c750: 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a p to nRow.. */.
c760: 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b nRow = p->nOp;
c770: 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 . if( p->explai
c780: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 n==1 ){. /* T
c790: 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 he first 8 memor
c7a0: 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 y cells are used
c7b0: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 for the result
c7c0: 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c set. So we will
c7d0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 . ** commande
c7e0: 65 72 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 er the 9th cell
c7f0: 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 to use as storag
c800: 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f e for an array o
c810: 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a f pointers. *
c820: 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 * to trigger sub
c830: 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 programs. The V
c840: 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 DBE is guarantee
c850: 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 d to have at lea
c860: 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c st 9. ** cell
c870: 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 s. */. asser
c880: 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a t( p->nMem>9 );.
c890: 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 pSub = &p->a
c8a0: 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 Mem[9];. if(
c8b0: 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f pSub->flags&MEM_
c8c0: 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a Blob ){. /*
c8d0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 On the first ca
c8e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 ll to sqlite3_st
c8f0: 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 ep(), pSub will
c900: 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 hold a NULL. It
c910: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 is. ** ini
c920: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c tialized to a BL
c930: 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 OB by the P4_SUB
c940: 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 PROGRAM processi
c950: 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a ng logic below *
c960: 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 /. nSub = p
c970: 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 Sub->n/sizeof(Vd
c980: 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 be*);. apSu
c990: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 b = (SubProgram
c9a0: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 **)pSub->z;.
c9b0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 }. for(i=0; i
c9c0: 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 <nSub; i++){.
c9d0: 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 nRow += apSub
c9e0: 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a [i]->nOp;. }.
c9f0: 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 }.. do{. i
ca00: 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 = p->pc++;. }w
ca10: 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 hile( i<nRow &&
ca20: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 p->explain==2 &&
ca30: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 p->aOp[i].opcod
ca40: 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b e!=OP_Explain );
ca50: 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 . if( i>=nRow )
ca60: 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 {. p->rc = SQ
ca70: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 LITE_OK;. rc
ca80: 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 = SQLITE_DONE;.
ca90: 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 }else if( db->u
caa0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 1.isInterrupted
cab0: 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 ){. p->rc = S
cac0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b QLITE_INTERRUPT;
cad0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 . rc = SQLITE
cae0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 _ERROR;. sqli
caf0: 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 te3VdbeError(p,
cb00: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d sqlite3ErrStr(p-
cb10: 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a >rc));. }else{.
cb20: 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 char *zP4;.
cb30: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 Op *pOp;.
cb40: 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a if( i<p->nOp ){.
cb50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 /* The out
cb60: 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 put line number
cb70: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 is small enough
cb80: 74 68 61 74 20 77 65 20 61 72 65 20 73 74 69 6c that we are stil
cb90: 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a l in the. *
cba0: 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 * main program.
cbb0: 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 */. pOp = &
cbc0: 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d p->aOp[i];. }
cbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 else{. /* W
cbe0: 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 e are currently
cbf0: 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 listing subprogr
cc00: 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 ams. Figure out
cc10: 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 which one and.
cc20: 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 ** pick up
cc30: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 the appropriate
cc40: 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 opcode. */.
cc50: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 int j;. i
cc60: 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 -= p->nOp;.
cc70: 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 for(j=0; i>=apS
cc80: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 ub[j]->nOp; j++)
cc90: 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 {. i -= a
cca0: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 pSub[j]->nOp;.
ccb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 }. pOp
ccc0: 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 = &apSub[j]->aOp
ccd0: 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 [i];. }. i
cce0: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 f( p->explain==1
ccf0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e ){. pMem->
cd00: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
cd10: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 . pMem->u.i
cd20: 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 = i;
cd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
cd40: 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 /* Program
cd50: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 counter */.
cd60: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 pMem++;. .
cd70: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
cd80: 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 MEM_Static|MEM_S
cd90: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 tr|MEM_Term;.
cda0: 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 pMem->z = (ch
cdb0: 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 ar*)sqlite3Opcod
cdc0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 eName(pOp->opcod
cdd0: 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f e); /* Opcode */
cde0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
cdf0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 Mem->z!=0 );.
ce00: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c pMem->n = sql
ce10: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 ite3Strlen30(pMe
ce20: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 m->z);. pMe
ce30: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f m->enc = SQLITE_
ce40: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d UTF8;. pMem
ce50: 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 ++;.. /* Wh
ce60: 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d en an OP_Program
ce70: 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 opcode is encou
ce80: 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f nter (the only o
ce90: 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 pcode that has.
cea0: 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 ** a P4_SUB
ceb0: 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 PROGRAM argument
cec0: 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 ), expand the si
ced0: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 ze of the array
cee0: 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 of subprograms.
cef0: 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 ** kept in
cf00: 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 p->aMem[9].z to
cf10: 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f hold the new pro
cf20: 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 gram - assuming
cf30: 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a this subprogram.
cf40: 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 ** has not
cf50: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 already been se
cf60: 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 en.. */.
cf70: 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 if( pOp->p4ty
cf80: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 pe==P4_SUBPROGRA
cf90: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 M ){. int
cfa0: 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 nByte = (nSub+1
cfb0: 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 )*sizeof(SubProg
cfc0: 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 ram*);. i
cfd0: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f nt j;. fo
cfe0: 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a r(j=0; j<nSub; j
cff0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 ++){. i
d000: 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 f( apSub[j]==pOp
d010: 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 ->p4.pProgram )
d020: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d break;. }
d030: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d . if( j==
d040: 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f nSub && SQLITE_O
d050: 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 K==sqlite3VdbeMe
d060: 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 mGrow(pSub, nByt
d070: 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 e, nSub!=0) ){.
d080: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 20 3d apSub =
d090: 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 (SubProgram **)
d0a0: 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 pSub->z;.
d0b0: 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d apSub[nSub++]
d0c0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 = pOp->p4.pProg
d0d0: 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 ram;. p
d0e0: 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 Sub->flags |= ME
d0f0: 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 M_Blob;.
d100: 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 pSub->n = nSub
d110: 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 *sizeof(SubProgr
d120: 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a am*);. }.
d130: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 }. }..
d140: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
d150: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d MEM_Int;. pM
d160: 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 em->u.i = pOp->p
d170: 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1;
d180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 /* P
d190: 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 1 */. pMem++;
d1a0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 .. pMem->flag
d1b0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 s = MEM_Int;.
d1c0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 pMem->u.i = pOp
d1d0: 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 ->p2;
d1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
d1f0: 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d * P2 */. pMem
d200: 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 ++;.. pMem->f
d210: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
d220: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 pMem->u.i =
d230: 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 pOp->p3;
d240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d250: 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 /* P3 */. p
d260: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 Mem++;.. if(
d270: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c sqlite3VdbeMemCl
d280: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 earAndResize(pMe
d290: 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 m, 100) ){ /* P4
d2a0: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 */. assert
d2b0: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 ( p->db->mallocF
d2c0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 ailed );. r
d2d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 eturn SQLITE_ERR
d2e0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d OR;. }. pM
d2f0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
d300: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 Str|MEM_Term;.
d310: 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 zP4 = displayP
d320: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 4(pOp, pMem->z,
d330: 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b pMem->szMalloc);
d340: 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d . if( zP4!=pM
d350: 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 70 em->z ){. p
d360: 4d 65 6d 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 Mem->n = 0;.
d370: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d sqlite3VdbeMem
d380: 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 SetStr(pMem, zP4
d390: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 , -1, SQLITE_UTF
d3a0: 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 8, 0);. }else
d3b0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 {. assert(
d3c0: 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 pMem->z!=0 );.
d3d0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 pMem->n = sq
d3e0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d lite3Strlen30(pM
d3f0: 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d em->z);. pM
d400: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 em->enc = SQLITE
d410: 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 _UTF8;. }.
d420: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 pMem++;.. if
d430: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 ( p->explain==1
d440: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c ){. if( sql
d450: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 ite3VdbeMemClear
d460: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 AndResize(pMem,
d470: 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 4) ){. as
d480: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c sert( p->db->mal
d490: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 locFailed );.
d4a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
d4b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 TE_ERROR;.
d4c0: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c }. pMem->fl
d4d0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 ags = MEM_Str|ME
d4e0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d M_Term;. pM
d4f0: 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 em->n = 2;.
d500: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
d510: 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 f(3, pMem->z, "%
d520: 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 .2x", pOp->p5);
d530: 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 /* P5 */.
d540: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c pMem->enc = SQL
d550: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 ITE_UTF8;.
d560: 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 pMem++;. .#ifde
d570: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
d580: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 EXPLAIN_COMMENTS
d590: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 . if( sqlit
d5a0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e e3VdbeMemClearAn
d5b0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 dResize(pMem, 50
d5c0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 0) ){. as
d5d0: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c sert( p->db->mal
d5e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 locFailed );.
d5f0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 return SQLI
d600: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 TE_ERROR;.
d610: 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c }. pMem->fl
d620: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 ags = MEM_Str|ME
d630: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d M_Term;. pM
d640: 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 em->n = displayC
d650: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c omment(pOp, zP4,
d660: 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a pMem->z, 500);.
d670: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 pMem->enc
d680: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 = SQLITE_UTF8;.#
d690: 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d else. pMem-
d6a0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c >flags = MEM_Nul
d6b0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 l;
d6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d /* Comm
d6d0: 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 ent */.#endif.
d6e0: 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 }.. p->nRes
d6f0: 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 Column = 8 - 4*(
d700: 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 p->explain-1);.
d710: 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 p->pResultSet
d720: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a = &p->aMem[1];.
d730: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 p->rc = SQLI
d740: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 TE_OK;. rc =
d750: 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a SQLITE_ROW;. }.
d760: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 return rc;.}.#
d770: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f endif /* SQLITE_
d780: 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a OMIT_EXPLAIN */.
d790: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
d7a0: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 EBUG./*.** Print
d7b0: 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 the SQL that wa
d7c0: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 s used to genera
d7d0: 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 te a VDBE progra
d7e0: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 m..*/.void sqlit
d7f0: 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 e3VdbePrintSql(V
d800: 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 dbe *p){. const
d810: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 char *z = 0;.
d820: 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 if( p->zSql ){.
d830: 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a z = p->zSql;.
d840: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e }else if( p->n
d850: 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e Op>=1 ){. con
d860: 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d st VdbeOp *pOp =
d870: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 &p->aOp[0];.
d880: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 if( pOp->opcode
d890: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 ==OP_Init && pOp
d8a0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 ->p4.z!=0 ){.
d8b0: 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a z = pOp->p4.z
d8c0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 ;. while( s
d8d0: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a qlite3Isspace(*z
d8e0: 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 ) ) z++;. }.
d8f0: 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 }. if( z ) pri
d900: 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e ntf("SQL: [%s]\n
d910: 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a ", z);.}.#endif.
d920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 .#if !defined(SQ
d930: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 LITE_OMIT_TRACE)
d940: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 && defined(SQLI
d950: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 TE_ENABLE_IOTRAC
d960: 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 E)./*.** Print a
d970: 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 n IOTRACE messag
d980: 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f e showing SQL co
d990: 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ntent..*/.void s
d9a0: 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 qlite3VdbeIOTrac
d9b0: 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 eSql(Vdbe *p){.
d9c0: 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f int nOp = p->nO
d9d0: 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 p;. VdbeOp *pOp
d9e0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 ;. if( sqlite3I
d9f0: 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 oTrace==0 ) retu
da00: 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 rn;. if( nOp<1
da10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 ) return;. pOp
da20: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 = &p->aOp[0];.
da30: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d if( pOp->opcode=
da40: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d =OP_Init && pOp-
da50: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 >p4.z!=0 ){.
da60: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 int i, j;. ch
da70: 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 ar z[1000];.
da80: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
da90: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 (sizeof(z), z, "
daa0: 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b %s", pOp->p4.z);
dab0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 . for(i=0; sq
dac0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 lite3Isspace(z[i
dad0: 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 ]); i++){}. f
dae0: 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b or(j=0; z[i]; i+
daf0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 +){. if( sq
db00: 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 lite3Isspace(z[i
db10: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 ]) ){. if
db20: 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b ( z[i-1]!=' ' ){
db30: 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b . z[j++
db40: 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 ] = ' ';.
db50: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a }. }else{.
db60: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d z[j++] =
db70: 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 z[i];. }.
db80: 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 }. z[j] =
db90: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 0;. sqlite3Io
dba0: 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 Trace("SQL %s\n"
dbb0: 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 , z);. }.}.#end
dbc0: 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d if /* !SQLITE_OM
dbd0: 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 IT_TRACE && SQLI
dbe0: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 TE_ENABLE_IOTRAC
dbf0: 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73 74 E */../* An inst
dc00: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a ance of this obj
dc10: 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62 75 ect describes bu
dc20: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 lk memory availa
dc30: 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20 62 ble for use.** b
dc40: 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73 20 y subcomponents
dc50: 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73 74 of a prepared st
dc60: 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65 20 atement. Space
dc70: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75 74 is allocated out
dc80: 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62 6c .** of a Reusabl
dc90: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62 79 eSpace object by
dca0: 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65 28 the allocSpace(
dcb0: 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77 2e ) routine below.
dcc0: 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73 61 .*/.struct Reusa
dcd0: 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38 20 bleSpace {. u8
dce0: 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 *pSpace;
dcf0: 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 6d /* Available m
dd00: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e emory */. int n
dd10: 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 Free;
dd20: 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61 69 /* Bytes of avai
dd30: 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a lable memory */.
dd40: 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20 20 int nNeeded;
dd50: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 /* Total
dd60: 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c 64 bytes that could
dd70: 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 not be allocate
dd80: 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79 20 d */.};../* Try
dd90: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79 74 to allocate nByt
dda0: 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79 74 e bytes of 8-byt
ddb0: 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20 6d e aligned bulk m
ddc0: 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a 2a emory for pBuf.*
ddd0: 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73 61 * from the Reusa
dde0: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2e bleSpace object.
ddf0: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 Return a point
de00: 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61 er to the alloca
de10: 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f 6e ted.** memory on
de20: 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69 6e success. If in
de30: 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f 72 sufficient memor
de40: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 69 y is available i
de50: 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62 6c n the.** Reusabl
de60: 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20 69 eSpace object, i
de70: 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75 73 ncrease the Reus
de80: 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64 65 ableSpace.nNeede
de90: 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74 68 d.** value by th
dea0: 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64 20 e amount needed
deb0: 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e and return NULL.
dec0: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20 69 .**.** If pBuf i
ded0: 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79 20 s not initially
dee0: 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e 73 NULL, that means
def0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 that the memory
df00: 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 has already.**
df10: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 62 been allocated b
df20: 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 y a prior call t
df30: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 o this routine,
df40: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 61 so just return a
df50: 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75 66 copy.** of pBuf
df60: 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73 61 and leave Reusa
df70: 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e 67 bleSpace unchang
df80: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 61 ed..**.** This a
df90: 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70 6c llocator is empl
dfa0: 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f 73 oyed to repurpos
dfb0: 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20 61 e unused slots a
dfc0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 t the end of the
dfd0: 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61 79 .** opcode array
dfe0: 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74 61 of prepared sta
dff0: 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65 6d te for other mem
e000: 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68 65 ory needs of the
e010: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 prepared.** sta
e020: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 tement..*/.stati
e030: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 c void *allocSpa
e040: 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65 75 ce(. struct Reu
e050: 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20 20 sableSpace *p,
e060: 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 /* Bulk memory a
e070: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c vailable for all
e080: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 ocation */. voi
e090: 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 d *pBuf,
e0a0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
e0b0: 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c 6c r to a prior all
e0c0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 ocation */. int
e0d0: 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20 20 nByte
e0e0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 /* Bytes
e0f0: 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65 64 of memory needed
e100: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 */.){. assert(
e110: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 EIGHT_BYTE_ALIG
e120: 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65 29 NMENT(p->pSpace)
e130: 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d );. if( pBuf==
e140: 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 0 ){. nByte =
e150: 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a ROUND8(nByte);.
e160: 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d if( nByte <=
e170: 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 p->nFree ){.
e180: 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e p->nFree -= n
e190: 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75 66 Byte;. pBuf
e1a0: 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70 2d = &p->pSpace[p-
e1b0: 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65 6c >nFree];. }el
e1c0: 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e 65 se{. p->nNe
e1d0: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 eded += nByte;.
e1e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 }. }. asser
e1f0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c t( EIGHT_BYTE_AL
e200: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b IGNMENT(pBuf) );
e210: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a . return pBuf;.
e220: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 }../*.** Rewind
e230: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f the VDBE back to
e240: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 the beginning i
e250: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f n preparation fo
e260: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e r.** running it.
e270: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
e280: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 VdbeRewind(Vdbe
e290: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 *p){.#if defined
e2a0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c (SQLITE_DEBUG) |
e2b0: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 | defined(VDBE_P
e2c0: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b ROFILE). int i;
e2d0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 .#endif. assert
e2e0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 ( p!=0 );. asse
e2f0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 rt( p->magic==VD
e300: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 7c 7c BE_MAGIC_INIT ||
e310: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
e320: 4d 41 47 49 43 5f 52 45 53 45 54 20 29 3b 0a 0a MAGIC_RESET );..
e330: 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f 75 6c /* There shoul
e340: 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e d be at least on
e350: 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 e opcode.. */.
e360: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e assert( p->nOp>
e370: 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 0 );.. /* Set t
e380: 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 42 45 he magic to VDBE
e390: 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 _MAGIC_RUN soone
e3a0: 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 6c 61 r rather than la
e3b0: 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 ter. */. p->mag
e3c0: 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f ic = VDBE_MAGIC_
e3d0: 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c RUN;..#ifdef SQL
e3e0: 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 ITE_DEBUG. for(
e3f0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 i=0; i<p->nMem;
e400: 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 i++){. assert
e410: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d ( p->aMem[i].db=
e420: 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 =p->db );. }.#e
e430: 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d ndif. p->pc = -
e440: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 1;. p->rc = SQL
e450: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 ITE_OK;. p->err
e460: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 orAction = OE_Ab
e470: 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 ort;. p->nChang
e480: 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 e = 0;. p->cach
e490: 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d eCtr = 1;. p->m
e4a0: 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 inWriteFileForma
e4b0: 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 t = 255;. p->iS
e4c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 tatement = 0;.
e4d0: 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 p->nFkConstraint
e4e0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 = 0;.#ifdef VDB
e4f0: 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 E_PROFILE. for(
e500: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 i=0; i<p->nOp; i
e510: 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b ++){. p->aOp[
e520: 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 i].cnt = 0;.
e530: 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 p->aOp[i].cycles
e540: 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 = 0;. }.#endif
e550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 .}../*.** Prepar
e560: 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 e a virtual mach
e570: 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f ine for executio
e580: 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 n for the first
e590: 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 time after.** cr
e5a0: 65 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 eating the virtu
e5b0: 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 al machine. Thi
e5c0: 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 s involves thing
e5d0: 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c s such.** as all
e5e0: 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 ocating register
e5f0: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 s and initializi
e600: 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 ng the program c
e610: 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 ounter..** After
e620: 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 the VDBE has be
e630: 20 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e prepped, it can
e640: 20 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 be executed by
e650: 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 one or more.** c
e660: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 alls to sqlite3V
e670: 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a dbeExec(). .**.
e680: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e ** This function
e690: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 may be called e
e6a0: 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 xactly once on e
e6b0: 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 ach virtual mach
e6c0: 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 ine..** After th
e6d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 is routine is ca
e6e0: 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 lled the VM has
e6f0: 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 been "packaged"
e700: 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 and is ready.**
e710: 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 to run. After t
e720: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 his routine is c
e730: 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 alled, further c
e740: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 alls to .** sqli
e750: 74 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 te3VdbeAddOp() f
e760: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f unctions are pro
e770: 68 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 hibited. This r
e780: 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 outine disconnec
e790: 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 ts.** the Vdbe f
e7a0: 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 rom the Parse ob
e7b0: 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 ject that helped
e7c0: 20 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 generate it so
e7d0: 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 that the.** the
e7e0: 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 Vdbe becomes an
e7f0: 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 independent enti
e800: 74 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 ty and the Parse
e810: 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a object can be.*
e820: 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a * destroyed..**.
e830: 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 ** Use the sqlit
e840: 65 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 e3VdbeRewind() p
e850: 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 rocedure to rest
e860: 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 ore a virtual ma
e870: 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f chine back.** to
e880: 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 its initial sta
e890: 74 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 te after it has
e8a0: 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 been run..*/.voi
e8b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b d sqlite3VdbeMak
e8c0: 65 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a eReady(. Vdbe *
e8d0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p,
e8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 /* The
e8f0: 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 VDBE */. Parse
e900: 2a 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 *pParse
e910: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 /* Pars
e920: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 ing context */.)
e930: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b {. sqlite3 *db;
e940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e950: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 /* The databa
e960: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f se connection */
e970: 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 . int nVar;
e980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 /* Number of p
e9a0: 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 arameters */. i
e9b0: 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 nt nMem;
e9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
e9d0: 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 Number of VM me
e9e0: 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a mory registers *
e9f0: 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b /. int nCursor;
ea00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ea10: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
ea20: 63 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 cursors required
ea30: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 */. int nArg;
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ea50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
ea60: 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 f arguments in s
ea70: 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 ubprograms */.
ea80: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 int n;
ea90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
eaa0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a * Loop counter *
eab0: 2f 0a 20 20 73 74 72 75 63 74 20 52 65 75 73 61 /. struct Reusa
eac0: 62 6c 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 bleSpace x;
ead0: 20 20 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 /* Reusable b
eae0: 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 ulk memory */..
eaf0: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b assert( p!=0 );
eb00: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f . assert( p->nO
eb10: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 p>0 );. assert(
eb20: 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 pParse!=0 );.
eb30: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 assert( p->magic
eb40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 ==VDBE_MAGIC_INI
eb50: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 T );. assert( p
eb60: 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 Parse==p->pParse
eb70: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 );. db = p->db
eb80: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e ;. assert( db->
eb90: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 mallocFailed==0
eba0: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 );. nVar = pPar
ebb0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d se->nVar;. nMem
ebc0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b = pParse->nMem;
ebd0: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 . nCursor = pPa
ebe0: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 rse->nTab;. nAr
ebf0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 g = pParse->nMax
ec00: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 45 61 63 Arg;. . /* Eac
ec10: 68 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 h cursor uses a
ec20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 memory cell. Th
ec30: 65 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 e first cursor (
ec40: 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 cursor 0) can.
ec50: 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 ** use aMem[0] w
ec60: 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 hich is not othe
ec70: 72 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68 rwise used by th
ec80: 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 e VDBE program.
ec90: 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 Allocate. ** s
eca0: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 pace at the end
ecb0: 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 of aMem[] for cu
ecc0: 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 rsors 1 and grea
ecd0: 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c ter.. ** See al
ece0: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 so: allocateCurs
ecf0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 or().. */. nMe
ed00: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 m += nCursor;.
ed10: 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 if( nCursor==0 &
ed20: 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b & nMem>0 ) nMem+
ed30: 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 +; /* Space for
ed40: 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 aMem[0] even if
ed50: 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 not used */..
ed60: 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f /* Figure out ho
ed70: 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 w much reusable
ed80: 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 memory is availa
ed90: 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f ble at the end o
eda0: 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 f the. ** opcod
edb0: 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 e array. This e
edc0: 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c xtra memory will
edd0: 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 be reallocated
ede0: 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e for other elemen
edf0: 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 ts. ** of the p
ee00: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
ee10: 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f t.. */. n = RO
ee20: 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a UND8(sizeof(Op)*
ee30: 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 p->nOp);
ee40: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f /* Bytes o
ee50: 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 f opcode memory
ee60: 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 used */. x.pSpa
ee70: 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 ce = &((u8*)p->a
ee80: 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 Op)[n];
ee90: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 /* Unused
eea0: 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f opcode memory */
eeb0: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 . assert( EIGHT
eec0: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 _BYTE_ALIGNMENT(
eed0: 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 x.pSpace) );. x
eee0: 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f .nFree = ROUNDDO
eef0: 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 WN8(pParse->szOp
ef00: 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 Alloc - n); /*
ef10: 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 Bytes of unused
ef20: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 memory */. asse
ef30: 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 rt( x.nFree>=0 )
ef40: 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 ;. assert( EIGH
ef50: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 T_BYTE_ALIGNMENT
ef60: 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 (&x.pSpace[x.nFr
ef70: 65 65 5d 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c ee]) );.. resol
ef80: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e veP2Values(p, &n
ef90: 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 Arg);. p->usesS
efa0: 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 tmtJournal = (u8
efb0: 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 )(pParse->isMult
efc0: 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 iWrite && pParse
efd0: 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 ->mayAbort);. i
efe0: 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 f( pParse->expla
eff0: 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b in && nMem<10 ){
f000: 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a . nMem = 10;.
f010: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 }. p->expired
f020: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f = 0;.. /* Memo
f030: 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 ry for registers
f040: 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 , parameters, cu
f050: 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c rsor, etc, is al
f060: 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f located in one o
f070: 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 r two. ** passe
f080: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 s. On the first
f090: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f pass, we try to
f0a0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 reuse unused me
f0b0: 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a mory at the . *
f0c0: 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 * end of the opc
f0d0: 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 ode array. If w
f0e0: 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 e are unable to
f0f0: 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f satisfy all memo
f100: 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d ry. ** requirem
f110: 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 ents by reusing
f120: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 the opcode array
f130: 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 tail, then the
f140: 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 second. ** pass
f150: 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 will fill in th
f160: 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e e remainder usin
f170: 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 g a fresh memory
f180: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 allocation. .
f190: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 **. ** This tw
f1a0: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 o-pass approach
f1b0: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d that reuses as m
f1c0: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f uch memory as po
f1d0: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a ssible from. **
f1e0: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 the leftover me
f1f0: 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 mory at the end
f200: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 of the opcode ar
f210: 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 ray. This can s
f220: 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a ignificantly. *
f230: 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f * reduce the amo
f240: 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 unt of memory he
f250: 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 ld by a prepared
f260: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f statement.. */
f270: 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e . do {. x.nN
f280: 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 eeded = 0;. p
f290: 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 ->aMem = allocSp
f2a0: 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c ace(&x, p->aMem,
f2b0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d nMem*sizeof(Mem
f2c0: 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 ));. p->aVar
f2d0: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c = allocSpace(&x,
f2e0: 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 p->aVar, nVar*s
f2f0: 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 izeof(Mem));.
f300: 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f p->apArg = allo
f310: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 cSpace(&x, p->ap
f320: 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 Arg, nArg*sizeof
f330: 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e (Mem*));. p->
f340: 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 apCsr = allocSpa
f350: 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c ce(&x, p->apCsr,
f360: 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 nCursor*sizeof(
f370: 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 VdbeCursor*));.#
f380: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
f390: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 BLE_STMT_SCANSTA
f3a0: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 TUS. p->anExe
f3b0: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 c = allocSpace(&
f3c0: 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d x, p->anExec, p-
f3d0: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 >nOp*sizeof(i64)
f3e0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 );.#endif. if
f3f0: 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 ( x.nNeeded==0 )
f400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 break;. x.pS
f410: 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 pace = p->pFree
f420: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f = sqlite3DbMallo
f430: 63 52 61 77 4e 4e 28 64 62 2c 20 78 2e 6e 4e 65 cRawNN(db, x.nNe
f440: 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 eded);. x.nFr
f450: 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a ee = x.nNeeded;.
f460: 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d }while( !db->m
f470: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a allocFailed );..
f480: 20 20 70 2d 3e 70 56 4c 69 73 74 20 3d 20 70 50 p->pVList = pP
f490: 61 72 73 65 2d 3e 70 56 4c 69 73 74 3b 0a 20 20 arse->pVList;.
f4a0: 70 50 61 72 73 65 2d 3e 70 56 4c 69 73 74 20 3d pParse->pVList =
f4b0: 20 20 30 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 0;. p->explai
f4c0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c n = pParse->expl
f4d0: 61 69 6e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d ain;. if( db->m
f4e0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 allocFailed ){.
f4f0: 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 30 3b 0a p->nVar = 0;.
f500: 20 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d p->nCursor =
f510: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 0;. p->nMem
f520: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 = 0;. }else{.
f530: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e p->nCursor = n
f540: 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 2d 3e 6e Cursor;. p->n
f550: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 Var = (ynVar)nVa
f560: 72 3b 0a 20 20 20 20 69 6e 69 74 4d 65 6d 41 72 r;. initMemAr
f570: 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 ray(p->aVar, nVa
f580: 72 2c 20 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 r, db, MEM_Null)
f590: 3b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 ;. p->nMem =
f5a0: 6e 4d 65 6d 3b 0a 20 20 20 20 69 6e 69 74 4d 65 nMem;. initMe
f5b0: 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 mArray(p->aMem,
f5c0: 6e 4d 65 6d 2c 20 64 62 2c 20 4d 45 4d 5f 55 6e nMem, db, MEM_Un
f5d0: 64 65 66 69 6e 65 64 29 3b 0a 20 20 20 20 6d 65 defined);. me
f5e0: 6d 73 65 74 28 70 2d 3e 61 70 43 73 72 2c 20 30 mset(p->apCsr, 0
f5f0: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 , nCursor*sizeof
f600: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a (VdbeCursor*));.
f610: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e #ifdef SQLITE_EN
f620: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 ABLE_STMT_SCANST
f630: 41 54 55 53 0a 20 20 20 20 6d 65 6d 73 65 74 28 ATUS. memset(
f640: 70 2d 3e 61 6e 45 78 65 63 2c 20 30 2c 20 70 2d p->anExec, 0, p-
f650: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 >nOp*sizeof(i64)
f660: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 );.#endif. }.
f670: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e sqlite3VdbeRewin
f680: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 d(p);.}../*.** C
f690: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 lose a VDBE curs
f6a0: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 or and release a
f6b0: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 ll the resources
f6c0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a that cursor .**
f6d0: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 happens to hold
f6e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
f6f0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 3VdbeFreeCursor(
f700: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 Vdbe *p, VdbeCur
f710: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 sor *pCx){. if(
f720: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 pCx==0 ){. r
f730: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 eturn;. }. ass
f740: 65 72 74 28 20 70 43 78 2d 3e 70 42 74 78 3d 3d ert( pCx->pBtx==
f750: 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 0 || pCx->eCurTy
f760: 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 pe==CURTYPE_BTRE
f770: 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 E );. switch( p
f780: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a Cx->eCurType ){.
f790: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 case CURTYPE
f7a0: 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 _SORTER: {.
f7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 sqlite3VdbeSort
f7c0: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 erClose(p->db, p
f7d0: 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b Cx);. break
f7e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
f7f0: 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 CURTYPE_BTREE:
f800: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d {. if( pCx-
f810: 3e 69 73 45 70 68 65 6d 65 72 61 6c 20 29 7b 0a >isEphemeral ){.
f820: 20 20 20 20 20 20 20 20 69 66 28 20 70 43 78 2d if( pCx-
f830: 3e 70 42 74 78 20 29 20 73 71 6c 69 74 65 33 42 >pBtx ) sqlite3B
f840: 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 treeClose(pCx->p
f850: 42 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a Btx);. /*
f860: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f The pCx->pCurso
f870: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 r will be close
f880: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 automatically, i
f890: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a f it exists, by.
f8a0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63 ** the c
f8b0: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 all above. */.
f8c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
f8d0: 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e assert( pCx->
f8e0: 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b uc.pCursor!=0 );
f8f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
f900: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 BtreeCloseCursor
f910: 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 (pCx->uc.pCursor
f920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
f930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 break;. }.#i
f940: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 fndef SQLITE_OMI
f950: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 T_VIRTUALTABLE.
f960: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f case CURTYPE_
f970: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 VTAB: {. sq
f980: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f lite3_vtab_curso
f990: 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e r *pVCur = pCx->
f9a0: 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20 uc.pVCur;.
f9b0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f const sqlite3_mo
f9c0: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 dule *pModule =
f9d0: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d pVCur->pVtab->pM
f9e0: 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73 odule;. ass
f9f0: 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61 ert( pVCur->pVta
fa00: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 b->nRef>0 );.
fa10: 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d pVCur->pVtab-
fa20: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70 >nRef--;. p
fa30: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 Module->xClose(p
fa40: 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65 VCur);. bre
fa50: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ak;. }.#endif
fa60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c . }.}../*.** Cl
fa70: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 ose all cursors
fa80: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 in the current f
fa90: 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 rame..*/.static
faa0: 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72 void closeCursor
fab0: 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70 sInFrame(Vdbe *p
fac0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 ){. if( p->apCs
fad0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a r ){. int i;.
fae0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 for(i=0; i<p
faf0: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b ->nCursor; i++){
fb00: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f . VdbeCurso
fb10: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 r *pC = p->apCsr
fb20: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 [i];. if( p
fb30: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c C ){. sql
fb40: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 ite3VdbeFreeCurs
fb50: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 or(p, pC);.
fb60: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d p->apCsr[i] =
fb70: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0;. }.
fb80: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 }. }.}../*.** C
fb90: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 opy the values s
fba0: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 tored in the Vdb
fbb0: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 eFrame structure
fbc0: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 to its Vdbe. Th
fbd0: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 is.** is used, f
fbe0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e or example, when
fbf0: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 a trigger sub-p
fc00: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 rogram is halted
fc10: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 to restore.** c
fc20: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 ontrol to the ma
fc30: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 in program..*/.i
fc40: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 nt sqlite3VdbeFr
fc50: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 ameRestore(VdbeF
fc60: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 rame *pFrame){.
fc70: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d Vdbe *v = pFram
fc80: 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72 e->v;. closeCur
fc90: 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a sorsInFrame(v);.
fca0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e #ifdef SQLITE_EN
fcb0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 ABLE_STMT_SCANST
fcc0: 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63 ATUS. v->anExec
fcd0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65 = pFrame->anExe
fce0: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61 c;.#endif. v->a
fcf0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 Op = pFrame->aOp
fd00: 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 ;. v->nOp = pFr
fd10: 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 ame->nOp;. v->a
fd20: 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d Mem = pFrame->aM
fd30: 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 em;. v->nMem =
fd40: 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 pFrame->nMem;.
fd50: 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d v->apCsr = pFram
fd60: 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e e->apCsr;. v->n
fd70: 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d Cursor = pFrame-
fd80: 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 >nCursor;. v->d
fd90: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 b->lastRowid = p
fda0: 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 Frame->lastRowid
fdb0: 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d ;. v->nChange =
fdc0: 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 pFrame->nChange
fdd0: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e ;. v->db->nChan
fde0: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 ge = pFrame->nDb
fdf0: 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65 Change;. sqlite
fe00: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 3VdbeDeleteAuxDa
fe10: 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 ta(v->db, &v->pA
fe20: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a uxData, -1, 0);.
fe30: 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 v->pAuxData =
fe40: 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 pFrame->pAuxData
fe50: 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 ;. pFrame->pAux
fe60: 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75 Data = 0;. retu
fe70: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d rn pFrame->pc;.}
fe80: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c ../*.** Close al
fe90: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a l cursors..**.**
fea0: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e Also release an
feb0: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 y dynamic memory
fec0: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 held by the VM
fed0: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d in the Vdbe.aMem
fee0: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c memory .** cell
fef0: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 array. This is
ff00: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 necessary as the
ff10: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 memory cell arr
ff20: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a ay may contain.*
ff30: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 * pointers to Vd
ff40: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c beFrame objects,
ff50: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 which may in tu
ff60: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 rn contain point
ff70: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 ers to.** open c
ff80: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 ursors..*/.stati
ff90: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 c void closeAllC
ffa0: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b ursors(Vdbe *p){
ffb0: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 . if( p->pFrame
ffc0: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d ){. VdbeFram
ffd0: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 e *pFrame;. f
ffe0: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 or(pFrame=p->pFr
fff0: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 ame; pFrame->pPa
10000 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 rent; pFrame=pFr
10010 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 ame->pParent);.
10020 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 sqlite3VdbeFr
10030 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d ameRestore(pFram
10040 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d e);. p->pFram
10050 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 e = 0;. p->nF
10060 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 rame = 0;. }.
10070 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d assert( p->nFram
10080 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 e==0 );. closeC
10090 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 ursorsInFrame(p)
100a0 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 ;. if( p->aMem
100b0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 ){. releaseMe
100c0 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 mArray(p->aMem,
100d0 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 p->nMem);. }.
100e0 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 while( p->pDelFr
100f0 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 ame ){. VdbeF
10100 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e rame *pDel = p->
10110 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 pDelFrame;. p
10120 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 ->pDelFrame = pD
10130 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 el->pParent;.
10140 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d sqlite3VdbeFram
10150 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 eDelete(pDel);.
10160 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 }.. /* Delete
10170 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f any auxdata allo
10180 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 cations made by
10190 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 the VM */. if(
101a0 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 p->pAuxData ) sq
101b0 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 lite3VdbeDeleteA
101c0 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70 uxData(p->db, &p
101d0 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 ->pAuxData, -1,
101e0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 0);. assert( p-
101f0 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a >pAuxData==0 );.
10200 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 }../*.** Set the
10210 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c number of resul
10220 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 t columns that w
10230 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 ill be returned
10240 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 by this SQL.** s
10250 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 tatement. This i
10260 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d s now set at com
10270 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 pile time, rathe
10280 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a r than during.**
10290 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 execution of th
102a0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 e vdbe program s
102b0 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 o that sqlite3_c
102c0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 olumn_count() ca
102d0 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f n.** be called o
102e0 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 n an SQL stateme
102f0 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 nt before sqlite
10300 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 3_step()..*/.voi
10310 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 d sqlite3VdbeSet
10320 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c NumCols(Vdbe *p,
10330 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 int nResColumn)
10340 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c {. int n;. sql
10350 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 ite3 *db = p->db
10360 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 52 65 73 ;.. if( p->nRes
10370 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 72 65 Column ){. re
10380 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d leaseMemArray(p-
10390 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 >aColName, p->nR
103a0 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 esColumn*COLNAME
103b0 5f 4e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 _N);. sqlite3
103c0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 DbFree(db, p->aC
103d0 6f 6c 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 6e olName);. }. n
103e0 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f = nResColumn*CO
103f0 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 LNAME_N;. p->nR
10400 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 esColumn = (u16)
10410 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d nResColumn;. p-
10420 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d >aColName = (Mem
10430 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f *)sqlite3DbMallo
10440 63 52 61 77 4e 4e 28 64 62 2c 20 73 69 7a 65 6f cRawNN(db, sizeo
10450 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 f(Mem)*n );. if
10460 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 ( p->aColName==0
10470 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 6e 69 ) return;. ini
10480 74 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f tMemArray(p->aCo
10490 6c 4e 61 6d 65 2c 20 6e 2c 20 64 62 2c 20 4d 45 lName, n, db, ME
104a0 4d 5f 4e 75 6c 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a M_Null);.}../*.*
104b0 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f * Set the name o
104c0 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c f the idx'th col
104d0 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e umn to be return
104e0 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 ed by the SQL st
104f0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d atement..** zNam
10500 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e e must be a poin
10510 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 ter to a nul ter
10520 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a minated string..
10530 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 **.** This call
10540 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 must be made aft
10550 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c er a call to sql
10560 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f ite3VdbeSetNumCo
10570 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 ls()..**.** The
10580 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c final parameter,
10590 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f xDel, must be o
105a0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e ne of SQLITE_DYN
105b0 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 AMIC, SQLITE_STA
105c0 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 TIC.** or SQLITE
105d0 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 _TRANSIENT. If i
105e0 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 t is SQLITE_DYNA
105f0 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 MIC, then the bu
10600 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 ffer pointed.**
10610 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c to by zName will
10620 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71 6c be freed by sql
10630 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68 65 ite3DbFree() whe
10640 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64 65 n the vdbe is de
10650 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 stroyed..*/.int
10660 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f sqlite3VdbeSetCo
10670 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 lName(. Vdbe *p
10680 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
10690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 /* Vdb
106a0 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 e being configur
106b0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c ed */. int idx,
106c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
106d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 /* Inde
106e0 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d x of column zNam
106f0 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a e applies to */.
10700 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 int var,
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10720 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 /* One of the
10730 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 COLNAME_* const
10740 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 ants */. const
10750 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 char *zName,
10760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f /* Po
10770 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 inter to buffer
10780 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 containing name
10790 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c */. void (*xDel
107a0 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 )(void*)
107b0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 /* Memory
107c0 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 management strat
107d0 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f egy for zName */
107e0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 .){. int rc;.
107f0 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 Mem *pColName;.
10800 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e assert( idx<p->
10810 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 nResColumn );.
10820 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e assert( var<COLN
10830 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 AME_N );. if( p
10840 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c ->db->mallocFail
10850 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 ed ){. assert
10860 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c ( !zName || xDel
10870 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 !=SQLITE_DYNAMIC
10880 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 );. return S
10890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 QLITE_NOMEM_BKPT
108a0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
108b0 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 29 p->aColName!=0 )
108c0 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 26 ;. pColName = &
108d0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 78 (p->aColName[idx
108e0 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c 75 +var*p->nResColu
108f0 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c mn]);. rc = sql
10900 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 ite3VdbeMemSetSt
10910 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 6d r(pColName, zNam
10920 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 e, -1, SQLITE_UT
10930 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 73 F8, xDel);. ass
10940 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 7a ert( rc!=0 || !z
10950 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 6d Name || (pColNam
10960 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 72 e->flags&MEM_Ter
10970 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 m)!=0 );. retur
10980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 n rc;.}../*.** A
10990 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 read or write t
109a0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6f ransaction may o
109b0 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 74 r may not be act
109c0 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 20 ive on database
109d0 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 66 handle.** db. If
109e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 a transaction i
109f0 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 74 s active, commit
10a00 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 73 it. If there is
10a10 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e a.** write-tran
10a20 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e 67 saction spanning
10a30 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 more than one d
10a40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 atabase file, th
10a50 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 61 is routine.** ta
10a60 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 20 kes care of the
10a70 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 74 master journal t
10a80 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 74 rickery..*/.stat
10a90 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d 69 ic int vdbeCommi
10aa0 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 t(sqlite3 *db, V
10ab0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 dbe *p){. int i
10ac0 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 3d ;. int nTrans =
10ad0 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 0; /* Number o
10ae0 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 68 f databases with
10af0 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 65 an active write
10b00 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 -transaction.
10b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10b20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e 64 ** that are cand
10b30 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77 6f idates for a two
10b40 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75 73 -phase commit us
10b50 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20 20 ing a.
10b60 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73 74 ** mast
10b70 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 er-journal */.
10b80 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f int rc = SQLITE_
10b90 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58 63 OK;. int needXc
10ba0 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66 64 ommit = 0;..#ifd
10bb0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 ef SQLITE_OMIT_V
10bc0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f 2a IRTUALTABLE. /*
10bd0 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69 6f With this optio
10be0 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53 79 n, sqlite3VtabSy
10bf0 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64 20 nc() is defined
10c00 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20 20 to be simply .
10c10 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f 20 ** SQLITE_OK so
10c20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20 0a p is not used. .
10c30 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 */. UNUSED_PA
10c40 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e 64 RAMETER(p);.#end
10c50 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65 20 if.. /* Before
10c60 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 65 doing anything e
10c70 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78 53 lse, call the xS
10c80 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 66 ync() callback f
10c90 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72 74 or any. ** virt
10ca0 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c 65 ual module table
10cb0 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68 69 s written in thi
10cc0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 s transaction. T
10cd0 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a 20 his has to. **
10ce0 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20 64 be done before d
10cf0 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74 68 etermining wheth
10d00 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 er a master jour
10d10 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20 2a nal file is . *
10d20 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20 61 * required, as a
10d30 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 n xSync() callba
10d40 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61 74 ck may add an at
10d50 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 0a tached database.
10d60 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61 6e ** to the tran
10d70 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 saction.. */.
10d80 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 rc = sqlite3Vtab
10d90 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20 20 Sync(db, p);..
10da0 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 /* This loop det
10db0 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 ermines (a) if t
10dc0 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 he commit hook s
10dd0 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 hould be invoked
10de0 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f and. ** (b) ho
10df0 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 w many database
10e00 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 files have open
10e10 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f write transactio
10e20 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e ns, not . ** in
10e30 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 cluding the temp
10e40 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 database. (b) i
10e50 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 s important beca
10e60 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e use if more than
10e70 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 . ** one datab
10e80 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 ase file has an
10e90 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 open write trans
10ea0 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 action, a master
10eb0 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 journal. ** fi
10ec0 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20 66 le is required f
10ed0 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d or an atomic com
10ee0 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 mit.. */ . for
10ef0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 (i=0; rc==SQLITE
10f00 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 _OK && i<db->nDb
10f10 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 ; i++){ . Btr
10f20 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
10f30 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 b[i].pBt;. if
10f40 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 ( sqlite3BtreeIs
10f50 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a InTrans(pBt) ){.
10f60 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 /* Whether
10f70 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62 61 or not a databa
10f80 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61 20 se might need a
10f90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 64 master journal d
10fa0 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20 20 epends upon.
10fb0 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61 6c ** its journal
10fc0 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74 68 mode (among oth
10fd0 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68 69 er things). Thi
10fe0 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d 69 s matrix determi
10ff0 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20 20 nes which.
11000 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 73 ** journal modes
11010 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a 6f use a master jo
11020 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68 20 urnal and which
11030 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 do not */.
11040 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 static const u8
11050 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b 0a aMJNeeded[] = {.
11060 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45 54 /* DELET
11070 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20 20 E */ 1,.
11080 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20 20 /* PERSIST
11090 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a */ 1,. /*
110a0 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30 2c OFF */ 0,
110b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 4e . /* TRUN
110c0 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20 20 CATE */ 1,.
110d0 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20 20 /* MEMORY
110e0 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f */ 0,. /
110f0 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20 30 * WAL */ 0
11100 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 . };.
11110 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20 Pager *pPager;
11120 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63 69 /* Pager associ
11130 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a 2f ated with pBt */
11140 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d . needXcomm
11150 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 it = 1;. sq
11160 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 lite3BtreeEnter(
11170 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61 67 pBt);. pPag
11180 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 er = sqlite3Btre
11190 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 ePager(pBt);.
111a0 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 if( db->aDb[i
111b0 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21 3d ].safety_level!=
111c0 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f 55 PAGER_SYNCHRONOU
111d0 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26 20 S_OFF. &&
111e0 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74 65 aMJNeeded[sqlite
111f0 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61 6c 3PagerGetJournal
11200 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20 20 Mode(pPager)].
11210 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20 20 ){ .
11220 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b 0a assert( i!=1 );.
11230 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b 2b nTrans++
11240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
11250 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 rc = sqlite3Page
11260 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 70 rExclusiveLock(p
11270 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 Pager);. sq
11280 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 lite3BtreeLeave(
11290 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a pBt);. }. }.
112a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
112b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 _OK ){. retur
112c0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 n rc;. }.. /*
112d0 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 If there are any
112e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 write-transacti
112f0 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f ons at all, invo
11300 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f ke the commit ho
11310 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 ok */. if( need
11320 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 Xcommit && db->x
11330 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 CommitCallback )
11340 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 {. rc = db->x
11350 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 CommitCallback(d
11360 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a b->pCommitArg);.
11370 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 if( rc ){.
11380 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
11390 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d E_CONSTRAINT_COM
113a0 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 MITHOOK;. }.
113b0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d }.. /* The sim
113c0 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f ple case - no mo
113d0 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 re than one data
113e0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 base file (not c
113f0 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a ounting the. **
11400 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 TEMP database)
11410 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f has a transactio
11420 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 n active. Ther
11430 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 e is no need for
11440 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 the. ** master
11450 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 -journal.. **.
11460 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 ** If the retur
11470 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 n value of sqlit
11480 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 e3BtreeGetFilena
11490 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c me() is a zero l
114a0 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e ength. ** strin
114b0 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 g, it means the
114c0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 main database is
114d0 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 :memory: or a t
114e0 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 emp file. In .
114f0 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 ** that case we
11500 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 do not support
11510 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c atomic multi-fil
11520 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 e commits, so us
11530 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 e the . ** simp
11540 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f le case then too
11550 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d .. */. if( 0==
11560 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
11570 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 sqlite3BtreeGetF
11580 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b ilename(db->aDb[
11590 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 0].pBt)). || n
115a0 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 Trans<=1. ){.
115b0 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 for(i=0; rc==S
115c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 QLITE_OK && i<db
115d0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 ->nDb; i++){.
115e0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
115f0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
11600 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b if( pBt ){
11610 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 . rc = sq
11620 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
11630 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 PhaseOne(pBt, 0)
11640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
11650 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 . /* Do the c
11660 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c ommit only if al
11670 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 l databases succ
11680 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 essfully complet
11690 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 e phase 1. .
116a0 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 ** If one of the
116b0 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 BtreeCommitPhas
116c0 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 eOne() calls fai
116d0 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 ls, this indicat
116e0 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 es an. ** IO
116f0 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 error while dele
11700 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 ting or truncati
11710 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c ng a journal fil
11720 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c e. It is unlikel
11730 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f y,. ** but co
11740 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 uld happen. In t
11750 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e his case abandon
11760 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 processing and
11770 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 return the error
11780 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 .. */. for
11790 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 (i=0; rc==SQLITE
117a0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 _OK && i<db->nDb
117b0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 ; i++){. Bt
117c0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 ree *pBt = db->a
117d0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 Db[i].pBt;.
117e0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 if( pBt ){.
117f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
11800 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
11810 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 Two(pBt, 0);.
11820 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 }. }. i
11830 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
11840 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
11850 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 3VtabCommit(db);
11860 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a . }. }.. /*
11870 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 The complex cas
11880 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d e - There is a m
11890 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d ulti-file write-
118a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 transaction acti
118b0 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 ve.. ** This re
118c0 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 quires a master
118d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 journal file to
118e0 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 ensure the trans
118f0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 action is. ** c
11900 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 ommitted atomica
11910 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 lly.. */.#ifnde
11920 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 f SQLITE_OMIT_DI
11930 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 SKIO. else{.
11940 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 sqlite3_vfs *pV
11950 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 fs = db->pVfs;.
11960 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 char *zMaster
11970 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d = 0; /* File-
11980 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 name for the mas
11990 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 ter journal */.
119a0 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a char const *z
119b0 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 MainFile = sqlit
119c0 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 e3BtreeGetFilena
119d0 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 me(db->aDb[0].pB
119e0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f t);. sqlite3_
119f0 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 file *pMaster =
11a00 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 0;. i64 offse
11a10 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 t = 0;. int r
11a20 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 es;. int retr
11a30 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 yCount = 0;.
11a40 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a int nMainFile;..
11a50 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 /* Select a
11a60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
11a70 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 ile name */.
11a80 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 nMainFile = sqli
11a90 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 te3Strlen30(zMai
11aa0 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 nFile);. zMas
11ab0 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 ter = sqlite3MPr
11ac0 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 intf(db, "%s-mjX
11ad0 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 XXXXX9XXz", zMai
11ae0 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 nFile);. if(
11af0 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 zMaster==0 ) ret
11b00 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
11b10 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a _BKPT;. do {.
11b20 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f u32 iRando
11b30 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 m;. if( ret
11b40 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 ryCount ){.
11b50 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e if( retryCoun
11b60 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 t>100 ){.
11b70 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 sqlite3_log(S
11b80 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 QLITE_FULL, "MJ
11b90 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 delete: %s", zMa
11ba0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 ster);.
11bb0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 sqlite3OsDelete
11bc0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 (pVfs, zMaster,
11bd0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 0);. br
11be0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c eak;. }el
11bf0 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e se if( retryCoun
11c00 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 t==1 ){.
11c10 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 sqlite3_log(SQ
11c20 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 LITE_FULL, "MJ c
11c30 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 ollide: %s", zMa
11c40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d ster);. }
11c50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 . }. r
11c60 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 etryCount++;.
11c70 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f sqlite3_rando
11c80 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 mness(sizeof(iRa
11c90 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 ndom), &iRandom)
11ca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
11cb0 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d snprintf(13, &zM
11cc0 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d aster[nMainFile]
11cd0 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 , "-mj%06X9%02X"
11ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
11cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11d00 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 (iRandom>>8)&0x
11d10 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 ffffff, iRandom&
11d20 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 0xff);. /*
11d30 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d The antipenultim
11d40 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 ate character of
11d50 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 the master jour
11d60 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 nal name must.
11d70 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f ** be "9" to
11d80 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c avoid name coll
11d90 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e isions when usin
11da0 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e g 8+3 filenames.
11db0 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 */. assert
11dc0 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 ( zMaster[sqlite
11dd0 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 3Strlen30(zMaste
11de0 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 r)-3]=='9' );.
11df0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 sqlite3FileS
11e00 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 uffix3(zMainFile
11e10 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 , zMaster);.
11e20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
11e30 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 Access(pVfs, zMa
11e40 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 ster, SQLITE_ACC
11e50 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 ESS_EXISTS, &res
11e60 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 );. }while( r
11e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 c==SQLITE_OK &&
11e80 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 res );. if( r
11e90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
11ea0 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 /* Open th
11eb0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
11ec0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 . */. rc =
11ed0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c sqlite3OsOpenMal
11ee0 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 loc(pVfs, zMaste
11ef0 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 r, &pMaster, .
11f00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f SQLITE_O
11f10 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 PEN_READWRITE|SQ
11f20 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 LITE_OPEN_CREATE
11f30 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 |. SQLI
11f40 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 TE_OPEN_EXCLUSIV
11f50 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 E|SQLITE_OPEN_MA
11f60 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a STER_JOURNAL, 0.
11f70 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 );. }.
11f80 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 if( rc!=SQLIT
11f90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 E_OK ){. sq
11fa0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
11fb0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 zMaster);.
11fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d return rc;. }
11fd0 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 . . /* Write
11fe0 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 the name of each
11ff0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 database file i
12000 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f n the transactio
12010 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 n into the new.
12020 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 ** master jou
12030 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e rnal file. If an
12040 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 error occurs at
12050 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 this point clos
12060 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c e. ** and del
12070 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a ete the master j
12080 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c ournal file. All
12090 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 the individual
120a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 journal files.
120b0 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 ** still have
120c0 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 'null' as the ma
120d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 ster journal poi
120e0 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 nter, so they wi
120f0 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 ll roll. ** b
12100 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c ack independentl
12110 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f y if a failure o
12120 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 ccurs.. */.
12130 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
12140 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nDb; i++){.
12150 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 Btree *pBt = d
12160 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 b->aDb[i].pBt;.
12170 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 if( sqlite3
12180 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 BtreeIsInTrans(p
12190 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 Bt) ){. c
121a0 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 har const *zFile
121b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 = sqlite3BtreeG
121c0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 etJournalname(pB
121d0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 t);. if(
121e0 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 zFile==0 ){.
121f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 continue;
12200 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 /* Ignore TEMP
12210 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 and :memory: dat
12220 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 abases */.
12230 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 }. asse
12240 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 rt( zFile[0]!=0
12250 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 );. rc =
12260 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 sqlite3OsWrite(p
12270 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 Master, zFile, s
12280 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
12290 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 File)+1, offset)
122a0 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 ;. offset
122b0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 += sqlite3Strle
122c0 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 n30(zFile)+1;.
122d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 if( rc!=SQ
122e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
122f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c sqlite3OsCl
12300 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 oseFree(pMaster)
12310 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 ;. sqli
12320 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 te3OsDelete(pVfs
12330 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 , zMaster, 0);.
12340 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
12350 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 DbFree(db, zMast
12360 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 er);. r
12370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 eturn rc;.
12380 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
12390 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 }.. /* Sync t
123a0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
123b0 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 l file. If the I
123c0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 OCAP_SEQUENTIAL
123d0 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c device. ** fl
123e0 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 ag is set this i
123f0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a s not required..
12400 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 */. if( 0
12410 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 ==(sqlite3OsDevi
12420 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 ceCharacteristic
12430 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 s(pMaster)&SQLIT
12440 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 E_IOCAP_SEQUENTI
12450 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 AL). && SQLI
12460 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c TE_OK!=(rc = sql
12470 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 ite3OsSync(pMast
12480 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f er, SQLITE_SYNC_
12490 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a NORMAL)). ){.
124a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 sqlite3OsC
124b0 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 loseFree(pMaster
124c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 );. sqlite3
124d0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a OsDelete(pVfs, z
124e0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 Master, 0);.
124f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
12500 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 db, zMaster);.
12510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 return rc;.
12520 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e }.. /* Syn
12530 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c c all the db fil
12540 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 es involved in t
12550 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 he transaction.
12560 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 The same call.
12570 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 ** sets the ma
12580 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 ster journal poi
12590 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 nter in each ind
125a0 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e ividual journal.
125b0 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 If. ** an er
125c0 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c ror occurs here,
125d0 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 do not delete t
125e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
125f0 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 l file.. **.
12600 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 ** If the err
12610 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 or occurs during
12620 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 the first call
12630 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 to. ** sqlite
12640 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 3BtreeCommitPhas
12650 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 eOne(), then the
12660 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 re is a chance t
12670 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d hat the. ** m
12680 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
12690 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 le will be orpha
126a0 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e ned. But we cann
126b0 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 ot delete it,.
126c0 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 ** in case the
126d0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
126e0 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 file name was wr
126f0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a itten into the j
12700 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 ournal. ** fi
12710 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 le before the fa
12720 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a ilure occurred..
12730 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 */. for(i
12740 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f =0; rc==SQLITE_O
12750 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 K && i<db->nDb;
12760 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 i++){ . Btr
12770 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
12780 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 b[i].pBt;.
12790 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 if( pBt ){.
127a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 rc = sqlite3B
127b0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f treeCommitPhaseO
127c0 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 ne(pBt, zMaster)
127d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
127e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f sqlite3OsClo
127f0 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b seFree(pMaster);
12800 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 . assert( rc!
12810 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a =SQLITE_BUSY );.
12820 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
12830 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 TE_OK ){. s
12840 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
12850 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 zMaster);.
12860 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 return rc;.
12870 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 }.. /* Delete
12880 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 the master jour
12890 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 nal file. This c
128a0 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 ommits the trans
128b0 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 action. After.
128c0 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 ** doing this
128d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 the directory is
128e0 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 synced again be
128f0 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 fore any individ
12900 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 ual. ** trans
12910 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 action files are
12920 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f deleted.. */
12930 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
12940 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 3OsDelete(pVfs,
12950 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 zMaster, 1);.
12960 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
12970 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 b, zMaster);.
12980 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 zMaster = 0;.
12990 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
129a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 return rc;.
129b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 }.. /* All f
129c0 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 6f iles and directo
129d0 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 64 ries have alread
129e0 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 y been synced, s
129f0 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a o the following.
12a00 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 ** calls to
12a10 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d sqlite3BtreeComm
12a20 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 65 itPhaseTwo() are
12a30 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 only closing fi
12a40 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 les and. ** d
12a50 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 eleting or trunc
12a60 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 ating journals.
12a70 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 If something goe
12a80 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 s wrong while.
12a90 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 ** this is hap
12aa0 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 pening we don't
12ab0 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 really care. The
12ac0 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 integrity of th
12ad0 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 e. ** transac
12ae0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 tion is already
12af0 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 20 guaranteed, but
12b00 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c 64 some stray 'cold
12b10 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a ' journals. *
12b20 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 61 * may be lying a
12b30 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 round. Returning
12b40 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 77 an error code w
12b50 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 72 on't help matter
12b60 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 s.. */. di
12b70 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f sable_simulated_
12b80 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 io_errors();.
12b90 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e sqlite3BeginBen
12ba0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 ignMalloc();.
12bb0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e for(i=0; i<db->
12bc0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 nDb; i++){ .
12bd0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 Btree *pBt = d
12be0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 b->aDb[i].pBt;.
12bf0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a if( pBt ){.
12c00 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 sqlite3B
12c10 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 treeCommitPhaseT
12c20 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 wo(pBt, 1);.
12c30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 }. }. sq
12c40 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 lite3EndBenignMa
12c50 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 lloc();. enab
12c60 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f le_simulated_io_
12c70 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 errors();.. s
12c80 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 qlite3VtabCommit
12c90 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 (db);. }.#endif
12ca0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d .. return rc;.}
12cb0 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f ../* .** This ro
12cc0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 61 utine checks tha
12cd0 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 t the sqlite3.nV
12ce0 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 20 dbeActive count
12cf0 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 variable.** matc
12d00 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f hes the number o
12d10 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 20 f vdbe's in the
12d20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 64 list sqlite3.pVd
12d30 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 be that are.** c
12d40 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 2e urrently active.
12d50 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 An assertion fa
12d60 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 63 ils if the two c
12d70 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 ounts do not mat
12d80 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 ch..** This is a
12d90 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d n internal self-
12da0 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 check only - it
12db0 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 is not an essent
12dc0 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a ial processing.*
12dd0 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 * step..**.** Th
12de0 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 is is a no-op if
12df0 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 6e NDEBUG is defin
12e00 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e ed..*/.#ifndef N
12e10 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f 69 DEBUG.static voi
12e20 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 d checkActiveVdb
12e30 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 eCnt(sqlite3 *db
12e40 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 ){. Vdbe *p;.
12e50 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 int cnt = 0;. i
12e60 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 nt nWrite = 0;.
12e70 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a int nRead = 0;.
12e80 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b p = db->pVdbe;
12e90 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 . while( p ){.
12ea0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 if( sqlite3_s
12eb0 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 65 tmt_busy((sqlite
12ec0 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 3_stmt*)p) ){.
12ed0 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 cnt++;.
12ee0 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 if( p->readOnly
12ef0 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a ==0 ) nWrite++;.
12f00 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 if( p->bIs
12f10 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b 2b Reader ) nRead++
12f20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 ;. }. p =
12f30 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 p->pNext;. }.
12f40 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d assert( cnt==db-
12f50 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b 0a >nVdbeActive );.
12f60 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 65 assert( nWrite
12f70 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 ==db->nVdbeWrite
12f80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 52 );. assert( nR
12f90 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 ead==db->nVdbeRe
12fa0 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 ad );.}.#else.#d
12fb0 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 76 efine checkActiv
12fc0 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 eVdbeCnt(x).#end
12fd0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 if../*.** If the
12fe0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 Vdbe passed as
12ff0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 the first argume
13000 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 nt opened a stat
13010 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f ement-transactio
13020 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e n,.** close it n
13030 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 ow. Argument eOp
13040 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 must be either
13050 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
13060 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 CK or.** SAVEPOI
13070 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 NT_RELEASE. If i
13080 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 t is SAVEPOINT_R
13090 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 OLLBACK, then th
130a0 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 e statement.** t
130b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f ransaction is ro
130c0 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f lled back. If eO
130d0 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 p is SAVEPOINT_R
130e0 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 ELEASE, then the
130f0 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 .** statement t
13100 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f ransaction is co
13110 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 mmitted..**.** I
13120 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 f an IO error oc
13130 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f curs, an SQLITE_
13140 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 IOERR_XXX error
13150 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 code is returned
13160 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 . .** Otherwise
13170 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 SQLITE_OK..*/.st
13180 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e atic SQLITE_NOIN
13190 4c 49 4e 45 20 69 6e 74 20 76 64 62 65 43 6c 6f LINE int vdbeClo
131a0 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 seStatement(Vdbe
131b0 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 *p, int eOp){.
131c0 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 sqlite3 *const
131d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e db = p->db;. in
131e0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b t rc = SQLITE_OK
131f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e ;. int i;. con
13200 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e st int iSavepoin
13210 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e t = p->iStatemen
13220 74 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 t-1;.. assert(
13230 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 eOp==SAVEPOINT_R
13240 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d OLLBACK || eOp==
13250 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
13260 45 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 E);. assert( db
13270 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 ->nStatement>0 )
13280 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 ;. assert( p->i
13290 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e Statement==(db->
132a0 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e nStatement+db->n
132b0 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 Savepoint) );..
132c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e for(i=0; i<db->
132d0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 nDb; i++){ .
132e0 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 int rc2 = SQLITE
132f0 5f 4f 4b 3b 0a 20 20 20 20 42 74 72 65 65 20 2a _OK;. Btree *
13300 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d pBt = db->aDb[i]
13310 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 42 .pBt;. if( pB
13320 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 t ){. if( e
13330 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f Op==SAVEPOINT_RO
13340 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 LLBACK ){.
13350 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 rc2 = sqlite3B
13360 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 treeSavepoint(pB
13370 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c t, SAVEPOINT_ROL
13380 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e LBACK, iSavepoin
13390 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 t);. }.
133a0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 if( rc2==SQLIT
133b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 E_OK ){.
133c0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc2 = sqlite3Btr
133d0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c eeSavepoint(pBt,
133e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 SAVEPOINT_RELEA
133f0 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b SE, iSavepoint);
13400 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
13410 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
13420 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){. rc =
13430 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 rc2;. }.
13440 20 20 7d 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 }. }. db->nS
13450 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 70 2d tatement--;. p-
13460 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b >iStatement = 0;
13470 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 .. if( rc==SQLI
13480 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 TE_OK ){. if(
13490 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f eOp==SAVEPOINT_
134a0 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 ROLLBACK ){.
134b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 rc = sqlite3Vt
134c0 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 abSavepoint(db,
134d0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
134e0 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b CK, iSavepoint);
134f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 . }. if( r
13500 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
13510 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
13520 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 e3VtabSavepoint(
13530 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 db, SAVEPOINT_RE
13540 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e LEASE, iSavepoin
13550 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 t);. }. }..
13560 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 /* If the state
13570 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
13580 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 is being rolled
13590 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 back, also rest
135a0 6f 72 65 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 ore the . ** da
135b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 tabase handles d
135c0 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 eferred constrai
135d0 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 nt counter to th
135e0 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 e value it had w
135f0 68 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20 73 74 hen . ** the st
13600 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 atement transact
13610 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 ion was opened.
13620 20 2a 2f 0a 20 20 69 66 28 20 65 4f 70 3d 3d 53 */. if( eOp==S
13630 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
13640 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 44 65 K ){. db->nDe
13650 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e ferredCons = p->
13660 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 nStmtDefCons;.
13670 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 db->nDeferredI
13680 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d mmCons = p->nStm
13690 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 7d tDefImmCons;. }
136a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
136b0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 int sqlite3VdbeC
136c0 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 loseStatement(Vd
136d0 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b be *p, int eOp){
136e0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6e 53 . if( p->db->nS
136f0 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 tatement && p->i
13700 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 Statement ){.
13710 20 72 65 74 75 72 6e 20 76 64 62 65 43 6c 6f 73 return vdbeClos
13720 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 4f eStatement(p, eO
13730 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e p);. }. return
13740 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a SQLITE_OK;.}...
13750 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 /*.** This funct
13760 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 ion is called wh
13770 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e en a transaction
13780 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 opened by the d
13790 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 atabase .** hand
137a0 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 le associated wi
137b0 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 th the VM passed
137c0 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 as an argument
137d0 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a is about to be .
137e0 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 ** committed. If
137f0 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 there are outst
13800 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 anding deferred
13810 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 foreign key cons
13820 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 traint.** violat
13830 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c ions, return SQL
13840 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 ITE_ERROR. Other
13850 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e wise, SQLITE_OK.
13860 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 .**.** If there
13870 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 are outstanding
13880 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e FK violations an
13890 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 d this function
138a0 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 returns .** SQLI
138b0 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 TE_ERROR, set th
138c0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 e result of the
138d0 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e VM to SQLITE_CON
138e0 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b STRAINT_FOREIGNK
138f0 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 EY.** and write
13900 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 an error message
13910 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 to it. Then ret
13920 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 urn SQLITE_ERROR
13930 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c ..*/.#ifndef SQL
13940 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e ITE_OMIT_FOREIGN
13950 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 _KEY.int sqlite3
13960 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 VdbeCheckFk(Vdbe
13970 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 *p, int deferre
13980 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 d){. sqlite3 *d
13990 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 b = p->db;. if(
139a0 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 (deferred && (d
139b0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 b->nDeferredCons
139c0 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d +db->nDeferredIm
139d0 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c mCons)>0) . ||
139e0 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 (!deferred && p
139f0 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e ->nFkConstraint>
13a00 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 0) . ){. p->
13a10 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 rc = SQLITE_CONS
13a20 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 TRAINT_FOREIGNKE
13a30 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 Y;. p->errorA
13a40 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 ction = OE_Abort
13a50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 ;. sqlite3Vdb
13a60 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 eError(p, "FOREI
13a70 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e GN KEY constrain
13a80 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 t failed");.
13a90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
13aa0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 ROR;. }. retur
13ab0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 n SQLITE_OK;.}.#
13ac0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 endif../*.** Thi
13ad0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c s routine is cal
13ae0 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 led the when a V
13af0 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c DBE tries to hal
13b00 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a t. If the VDBE.
13b10 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e ** has made chan
13b20 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 ges and is in au
13b30 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 tocommit mode, t
13b40 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 hen commit those
13b50 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 .** changes. If
13b60 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e a rollback is n
13b70 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 eeded, then do t
13b80 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a he rollback..**.
13b90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
13ba0 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 is the only way
13bb0 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 to move the stat
13bc0 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a e of a VM from.*
13bd0 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 * SQLITE_MAGIC_R
13be0 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 UN to SQLITE_MAG
13bf0 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 IC_HALT. It is
13c00 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 harmless to.** c
13c10 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d all this on a VM
13c20 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 that is in the
13c30 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c SQLITE_MAGIC_HAL
13c40 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 T state..**.** R
13c50 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 eturn an error c
13c60 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d ode. If the com
13c70 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f mit could not co
13c80 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f mplete because o
13c90 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e f.** lock conten
13ca0 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c tion, return SQL
13cb0 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 ITE_BUSY. If SQ
13cc0 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 LITE_BUSY is ret
13cd0 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 urned, it.** mea
13ce0 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 ns the close did
13cf0 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 not happen and
13d00 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 needs to be repe
13d10 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c ated..*/.int sql
13d20 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 ite3VdbeHalt(Vdb
13d30 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b e *p){. int rc;
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13d50 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 /* Used
13d60 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 to store transi
13d70 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 ent return codes
13d80 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 */. sqlite3 *d
13d90 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a b = p->db;.. /*
13da0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 This function c
13db0 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 ontains the logi
13dc0 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 c that determine
13dd0 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 s if a statement
13de0 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 or. ** transac
13df0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d tion will be com
13e00 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 mitted or rolled
13e10 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c back as a resul
13e20 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 t of the. ** ex
13e30 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 ecution of this
13e40 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e virtual machine.
13e50 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 . **. ** If a
13e60 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 ny of the follow
13e70 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 ing errors occur
13e80 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 :. **. **
13e90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a SQLITE_NOMEM. *
13ea0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 * SQLITE_IOE
13eb0 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 RR. ** SQLI
13ec0 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 TE_FULL. **
13ed0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 SQLITE_INTERRUP
13ee0 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e T. **. ** Then
13ef0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 the internal ca
13f00 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 che might have b
13f10 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 een left in an i
13f20 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a nconsistent. **
13f30 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 state. We need
13f40 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 to rollback the
13f50 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 statement trans
13f60 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 action, if there
13f70 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 is. ** one, or
13f80 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 the complete tr
13f90 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 ansaction if the
13fa0 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 re is no stateme
13fb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a nt transaction..
13fc0 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 6d */.. if( p->m
13fd0 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 agic!=VDBE_MAGIC
13fe0 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 _RUN ){. retu
13ff0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 rn SQLITE_OK;.
14000 7d 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c }. if( db->mall
14010 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 ocFailed ){.
14020 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e p->rc = SQLITE_N
14030 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 OMEM_BKPT;. }.
14040 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 closeAllCursors
14050 28 70 29 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 (p);. checkActi
14060 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a veVdbeCnt(db);..
14070 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f /* No commit o
14080 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 r rollback neede
14090 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d d if the program
140a0 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f never started o
140b0 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 r if the. ** SQ
140c0 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 L statement does
140d0 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 not read or wri
140e0 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 te a database fi
140f0 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d le. */. if( p-
14100 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 >pc>=0 && p->bIs
14110 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e Reader ){. in
14120 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d t mrc; /* Prim
14130 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 ary error code f
14140 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 rom p->rc */.
14150 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f int eStatementO
14160 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 p = 0;. int i
14170 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 sSpecialError;
14180 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 /* Set
14190 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 to true if a 's
141a0 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f pecial' error */
141b0 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c .. /* Lock al
141c0 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 l btrees used by
141d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a the statement *
141e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 /. sqlite3Vdb
141f0 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 eEnter(p);..
14200 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 /* Check for one
14210 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 of the special
14220 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 errors */. mr
14230 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 c = p->rc & 0xff
14240 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 ;. isSpecialE
14250 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 rror = mrc==SQLI
14260 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d TE_NOMEM || mrc=
14270 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 =SQLITE_IOERR.
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14290 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 || mrc==SQLIT
142a0 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d E_INTERRUPT || m
142b0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b rc==SQLITE_FULL;
142c0 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 . if( isSpeci
142d0 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 alError ){.
142e0 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 /* If the query
142f0 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 was read-only a
14300 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 nd the error cod
14310 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 e is SQLITE_INTE
14320 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a RRUPT, . **
14330 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 no rollback is
14340 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 necessary. Other
14350 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 wise, at least a
14360 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 savepoint .
14370 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e ** transaction
14380 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 must be rolled
14390 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 back to restore
143a0 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 the database to
143b0 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 a . ** cons
143c0 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 istent state..
143d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 **. **
143e0 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 Even if the stat
143f0 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e ement is read-on
14400 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 ly, it is import
14410 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 ant to perform.
14420 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d ** a statem
14430 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 ent or transacti
14440 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 on rollback oper
14450 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 ation. If the er
14460 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 ror . ** oc
14470 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 curred while wri
14480 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 ting to the jour
14490 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c nal, sub-journal
144a0 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 or database.
144b0 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 ** file as pa
144c0 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 rt of an effort
144d0 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 to free up cache
144e0 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 space (see func
144f0 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 tion. ** pa
14500 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 gerStress() in p
14510 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c ager.c), the rol
14520 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 lback is require
14530 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 d to restore .
14540 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 ** the pager
14550 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 to a consistent
14560 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f state.. */
14570 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 . if( !p->r
14580 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d eadOnly || mrc!=
14590 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 SQLITE_INTERRUPT
145a0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
145b0 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d (mrc==SQLITE_NOM
145c0 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 EM || mrc==SQLIT
145d0 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 E_FULL) && p->us
145e0 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b esStmtJournal ){
145f0 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 . eStat
14600 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f ementOp = SAVEPO
14610 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 INT_ROLLBACK;.
14620 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
14630 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 /* We are
14640 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 forced to roll
14650 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 back the active
14660 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 transaction. Bef
14670 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 ore doing.
14680 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 ** so, abort
14690 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 any other state
146a0 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c ments this handl
146b0 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 e currently has
146c0 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 active..
146d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 */. s
146e0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c qlite3RollbackAl
146f0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f l(db, SQLITE_ABO
14700 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 RT_ROLLBACK);.
14710 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 sqlite3C
14720 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 loseSavepoints(d
14730 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 b);. db
14740 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 ->autoCommit = 1
14750 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e ;. p->n
14760 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 Change = 0;.
14770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
14780 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 }.. /* Chec
14790 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 k for immediate
147a0 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c foreign key viol
147b0 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 ations. */. i
147c0 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 f( p->rc==SQLITE
147d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c _OK ){. sql
147e0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 ite3VdbeCheckFk(
147f0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a p, 0);. }. .
14800 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 /* If the au
14810 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 to-commit flag i
14820 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 s set and this i
14830 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 s the only activ
14840 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a e writer . **
14850 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 VM, then we do
14860 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 either a commit
14870 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 or rollback of t
14880 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 he current trans
14890 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a action. . **.
148a0 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 ** Note: Thi
148b0 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e s block also run
148c0 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 s if one of the
148d0 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 special errors h
148e0 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 andled . ** a
148f0 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 bove has occurre
14900 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 d. . */. i
14910 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 f( !sqlite3VtabI
14920 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 nSync(db) .
14930 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 && db->autoCommi
14940 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e t . && db->n
14950 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 VdbeWrite==(p->r
14960 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 eadOnly==0) .
14970 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d ){. if( p-
14980 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c >rc==SQLITE_OK |
14990 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f | (p->errorActio
149a0 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 n==OE_Fail && !i
149b0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 sSpecialError) )
149c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 {. rc = s
149d0 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 qlite3VdbeCheckF
149e0 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 k(p, 1);.
149f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
14a00 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 OK ){.
14a10 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 if( NEVER(p->rea
14a20 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 dOnly) ){.
14a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
14a40 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 eLeave(p);.
14a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 return SQ
14a60 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 LITE_ERROR;.
14a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
14a80 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f rc = SQLITE_CO
14a90 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e NSTRAINT_FOREIGN
14aa0 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c KEY;. }el
14ab0 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f se{ . /
14ac0 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 * The auto-commi
14ad0 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 t flag is true,
14ae0 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d the vdbe program
14af0 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 was successful
14b00 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 . ** or
14b10 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c hit an 'OR FAIL
14b20 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 ' constraint and
14b30 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 there are no de
14b40 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 ferred foreign.
14b50 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 ** key
14b60 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 constraints to h
14b70 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 old up the trans
14b80 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 action. This mea
14b90 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 ns a commit .
14ba0 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 ** is req
14bb0 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 uired. */.
14bc0 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d rc = vdbeCom
14bd0 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 mit(db, p);.
14be0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
14bf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 ( rc==SQLITE_BUS
14c00 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 Y && p->readOnly
14c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
14c20 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 lite3VdbeLeave(p
14c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 );. ret
14c40 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b urn SQLITE_BUSY;
14c50 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 . }else i
14c60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
14c70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d ){. p-
14c80 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 >rc = rc;.
14c90 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 sqlite3Rollb
14ca0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 ackAll(db, SQLIT
14cb0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 E_OK);.
14cc0 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b p->nChange = 0;
14cd0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
14ce0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 db->nD
14cf0 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b eferredCons = 0;
14d00 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e . db->n
14d10 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 DeferredImmCons
14d20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 = 0;. d
14d30 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c b->flags &= ~SQL
14d40 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 ITE_DeferFKs;.
14d50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 sqlite3C
14d60 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 ommitInternalCha
14d70 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 nges(db);.
14d80 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b }. }else{
14d90 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
14da0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 RollbackAll(db,
14db0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 SQLITE_OK);.
14dc0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d p->nChange =
14dd0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0;. }.
14de0 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 db->nStatement
14df0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 = 0;. }else
14e00 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 if( eStatementOp
14e10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 ==0 ){. if(
14e20 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f p->rc==SQLITE_O
14e30 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 K || p->errorAct
14e40 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a ion==OE_Fail ){.
14e50 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 eStateme
14e60 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 ntOp = SAVEPOINT
14e70 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 _RELEASE;.
14e80 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 }else if( p->err
14e90 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f orAction==OE_Abo
14ea0 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 rt ){. eS
14eb0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 tatementOp = SAV
14ec0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b EPOINT_ROLLBACK;
14ed0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
14ee0 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c sqlite3Rol
14ef0 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c lbackAll(db, SQL
14f00 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 ITE_ABORT_ROLLBA
14f10 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c CK);. sql
14f20 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 ite3CloseSavepoi
14f30 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 nts(db);.
14f40 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 db->autoCommit
14f50 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e = 1;. p->
14f60 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 nChange = 0;.
14f70 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 }. }. .
14f80 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 /* If eStateme
14f90 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f ntOp is non-zero
14fa0 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 , then a stateme
14fb0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e nt transaction n
14fc0 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 eeds to. ** b
14fd0 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 e committed or r
14fe0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c olled back. Call
14ff0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 sqlite3VdbeClos
15000 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a eStatement() to.
15010 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 ** do so. If
15020 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 this operation
15030 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 returns an error
15040 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e , and the curren
15050 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 t statement.
15060 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 ** error code is
15070 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 SQLITE_OK or SQ
15080 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c LITE_CONSTRAINT,
15090 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 then promote th
150a0 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 e. ** current
150b0 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 statement error
150c0 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 code.. */.
150d0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 if( eStatement
150e0 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d Op ){. rc =
150f0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 sqlite3VdbeClos
15100 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 eStatement(p, eS
15110 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 tatementOp);.
15120 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 if( rc ){.
15130 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d if( p->rc==
15140 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d SQLITE_OK || (p-
15150 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 >rc&0xff)==SQLIT
15160 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a E_CONSTRAINT ){.
15170 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 p->rc
15180 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 = rc;.
15190 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
151a0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 , p->zErrMsg);.
151b0 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 p->zErr
151c0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 Msg = 0;.
151d0 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 }. sqlit
151e0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 e3RollbackAll(db
151f0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 , SQLITE_ABORT_R
15200 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 OLLBACK);.
15210 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 sqlite3CloseSa
15220 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 vepoints(db);.
15230 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f db->autoCo
15240 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 mmit = 1;.
15250 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 p->nChange = 0
15260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
15270 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 . /* If thi
15280 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c s was an INSERT,
15290 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 UPDATE or DELET
152a0 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 E and no stateme
152b0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 nt transaction.
152c0 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 ** has been r
152d0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 olled back, upda
152e0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 te the database
152f0 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 connection chang
15300 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 e-counter. .
15310 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 */. if( p->ch
15320 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 angeCntOn ){.
15330 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e if( eStatemen
15340 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 tOp!=SAVEPOINT_R
15350 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 OLLBACK ){.
15360 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 sqlite3VdbeSe
15370 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e tChanges(db, p->
15380 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 nChange);.
15390 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 }else{. s
153a0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 qlite3VdbeSetCha
153b0 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 nges(db, 0);.
153c0 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 }. p->nC
153d0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d hange = 0;. }
153e0 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 .. /* Release
153f0 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 the locks */.
15400 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 sqlite3VdbeLea
15410 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a ve(p);. }.. /*
15420 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 We have success
15430 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 fully halted and
15440 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 closed the VM.
15450 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 Record this fac
15460 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 t. */. if( p->p
15470 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e c>=0 ){. db->
15480 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 nVdbeActive--;.
15490 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f if( !p->readO
154a0 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 nly ) db->nVdbeW
154b0 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 rite--;. if(
154c0 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 p->bIsReader ) d
154d0 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a b->nVdbeRead--;.
154e0 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e assert( db->
154f0 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d nVdbeActive>=db-
15500 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 >nVdbeRead );.
15510 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 assert( db->nV
15520 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 dbeRead>=db->nVd
15530 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 beWrite );. a
15540 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 ssert( db->nVdbe
15550 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a Write>=0 );. }.
15560 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 p->magic = VDB
15570 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 E_MAGIC_HALT;.
15580 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 checkActiveVdbeC
15590 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 nt(db);. if( db
155a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
155b0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 {. p->rc = SQ
155c0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b LITE_NOMEM_BKPT;
155d0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 . }.. /* If th
155e0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c e auto-commit fl
155f0 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 ag is set to tru
15600 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b e, then any lock
15610 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 s that were held
15620 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 . ** by connect
15630 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 ion db have now
15640 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 been released. C
15650 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 all sqlite3Conne
15660 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 ctionUnlocked()
15670 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 . ** to invoke
15680 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c any required unl
15690 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 ock-notify callb
156a0 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 acks.. */. if(
156b0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 db->autoCommit
156c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f ){. sqlite3Co
156d0 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 nnectionUnlocked
156e0 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 (db);. }.. ass
156f0 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 ert( db->nVdbeAc
15700 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 tive>0 || db->au
15710 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 toCommit==0 || d
15720 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 b->nStatement==0
15730 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d );. return (p-
15740 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 >rc==SQLITE_BUSY
15750 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a ? SQLITE_BUSY :
15760 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a SQLITE_OK);.}..
15770 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 ./*.** Each VDBE
15780 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c holds the resul
15790 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 t of the most re
157a0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 cent sqlite3_ste
157b0 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 p() call.** in p
157c0 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 ->rc. This rout
157d0 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 ine sets that re
157e0 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c sult back to SQL
157f0 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 ITE_OK..*/.void
15800 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 sqlite3VdbeReset
15810 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 StepResult(Vdbe
15820 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 *p){. p->rc = S
15830 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a QLITE_OK;.}../*.
15840 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f ** Copy the erro
15850 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 r code and error
15860 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 message belongi
15870 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 ng to the VDBE p
15880 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 assed.** as the
15890 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 first argument t
158a0 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 o its database h
158b0 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 andle (so that t
158c0 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 hey will be .**
158d0 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c returned by call
158e0 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 s to sqlite3_err
158f0 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 code() and sqlit
15900 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a e3_errmsg())..**
15910 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
15920 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 n does not clear
15930 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 the VDBE error
15940 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c code or message,
15950 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 just.** copies
15960 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 them to the data
15970 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a base handle..*/.
15980 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 int sqlite3VdbeT
15990 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 ransferError(Vdb
159a0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 e *p){. sqlite3
159b0 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 *db = p->db;.
159c0 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a int rc = p->rc;.
159d0 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 if( p->zErrMsg
159e0 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e ){. db->bBen
159f0 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 ignMalloc++;.
15a00 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e sqlite3BeginBen
15a10 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 ignMalloc();.
15a20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 if( db->pErr==0
15a30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 ) db->pErr = sq
15a40 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 lite3ValueNew(db
15a50 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 );. sqlite3Va
15a60 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 lueSetStr(db->pE
15a70 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d rr, -1, p->zErrM
15a80 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c sg, SQLITE_UTF8,
15a90 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e SQLITE_TRANSIEN
15aa0 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 T);. sqlite3E
15ab0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 ndBenignMalloc()
15ac0 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 ;. db->bBenig
15ad0 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 7d 65 6c nMalloc--;. }el
15ae0 73 65 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 se if( db->pErr
15af0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 ){. sqlite3Va
15b00 6c 75 65 53 65 74 4e 75 6c 6c 28 64 62 2d 3e 70 lueSetNull(db->p
15b10 45 72 72 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e Err);. }. db->
15b20 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 errCode = rc;.
15b30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 return rc;.}..#i
15b40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 fdef SQLITE_ENAB
15b50 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 LE_SQLLOG./*.**
15b60 49 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e If an SQLITE_CON
15b70 46 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 FIG_SQLLOG hook
15b80 69 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e is registered an
15b90 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 d the VM has bee
15ba0 6e 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b n run, .** invok
15bb0 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 e it..*/.static
15bc0 76 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 void vdbeInvokeS
15bd0 71 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a qllog(Vdbe *v){.
15be0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f if( sqlite3Glo
15bf0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f balConfig.xSqllo
15c00 67 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 g && v->rc==SQLI
15c10 54 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c TE_OK && v->zSql
15c20 20 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a && v->pc>=0 ){.
15c30 20 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e char *zExpan
15c40 64 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 ded = sqlite3Vdb
15c50 65 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d eExpandSql(v, v-
15c60 3e 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 >zSql);. asse
15c70 72 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e rt( v->db->init.
15c80 62 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 busy==0 );. i
15c90 66 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a f( zExpanded ){.
15ca0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f sqlite3Glo
15cb0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f balConfig.xSqllo
15cc0 67 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c g(. sql
15cd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 ite3GlobalConfig
15ce0 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e .pSqllogArg, v->
15cf0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 db, zExpanded, 1
15d00 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 . );.
15d10 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d sqlite3DbFree(v-
15d20 3e 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b >db, zExpanded);
15d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c . }. }.}.#el
15d40 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 se.# define vdbe
15d50 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a InvokeSqllog(x).
15d60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c #endif../*.** Cl
15d70 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 ean up a VDBE af
15d80 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 ter execution bu
15d90 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 t do not delete
15da0 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 the VDBE just ye
15db0 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 t..** Write any
15dc0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 error messages i
15dd0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 nto *pzErrMsg.
15de0 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c Return the resul
15df0 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 t code..**.** Af
15e00 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 ter this routine
15e10 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 is run, the VDB
15e20 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 E should be read
15e30 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 y to be executed
15e40 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a .** again..**.**
15e50 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 To look at it a
15e60 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 nother way, this
15e70 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 routine resets
15e80 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 the state of the
15e90 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 .** virtual mach
15ea0 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 ine from VDBE_MA
15eb0 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f GIC_RUN or VDBE_
15ec0 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 MAGIC_HALT back
15ed0 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 to.** VDBE_MAGIC
15ee0 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 _INIT..*/.int sq
15ef0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 lite3VdbeReset(V
15f00 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 dbe *p){. sqlit
15f10 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 e3 *db;. db = p
15f20 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 ->db;.. /* If t
15f30 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 he VM did not ru
15f40 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 n to completion
15f50 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 or if it encount
15f60 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 ered an. ** err
15f70 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 or, then it migh
15f80 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 t not have been
15f90 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e halted properly.
15fa0 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 So halt. ** i
15fb0 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 t now.. */. sq
15fc0 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 lite3VdbeHalt(p)
15fd0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 ;.. /* If the V
15fe0 44 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 DBE has be run e
15ff0 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 ven partially, t
16000 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 hen transfer the
16010 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a error code. **
16020 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 and error messa
16030 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 ge from the VDBE
16040 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 into the main d
16050 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 atabase structur
16060 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 e. But. ** if
16070 74 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 the VDBE has jus
16080 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 t been set to ru
16090 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 n but has not ac
160a0 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 tually executed
160b0 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 any. ** instruc
160c0 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 tions yet, leave
160d0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 the main databa
160e0 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 se error informa
160f0 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a tion unchanged..
16100 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 */. if( p->pc
16110 3e 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 >=0 ){. vdbeI
16120 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a nvokeSqllog(p);.
16130 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 sqlite3VdbeT
16140 72 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b ransferError(p);
16150 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f . if( p->runO
16160 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 nlyOnce ) p->exp
16170 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 ired = 1;. }els
16180 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 e if( p->rc && p
16190 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 ->expired ){.
161a0 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 /* The expired
161b0 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 flag was set on
161c0 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 the VDBE before
161d0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 the first call.
161e0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 ** to sqlite3
161f0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e _step(). For con
16200 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 sistency (since
16210 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 sqlite3_step() w
16220 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 as. ** called
16230 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 ), set the datab
16240 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 ase error in thi
16250 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a s case as well..
16260 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 */. sqlit
16270 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 e3ErrorWithMsg(d
16280 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 b, p->rc, p->zEr
16290 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c rMsg ? "%s" : 0,
162a0 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 p->zErrMsg);.
162b0 7d 0a 0a 20 20 2f 2a 20 52 65 73 65 74 20 72 65 }.. /* Reset re
162c0 67 69 73 74 65 72 20 63 6f 6e 74 65 6e 74 73 20 gister contents
162d0 61 6e 64 20 72 65 63 6c 61 69 6d 20 65 72 72 6f and reclaim erro
162e0 72 20 6d 65 73 73 61 67 65 20 6d 65 6d 6f 72 79 r message memory
162f0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 .. */.#ifdef SQ
16300 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 LITE_DEBUG. /*
16310 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29 Execute assert()
16320 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 statements to e
16330 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56 nsure that the V
16340 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 dbe.apCsr[] and
16350 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b . ** Vdbe.aMem[
16360 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c ] arrays have al
16370 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e ready been clean
16380 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 ed up. */. int
16390 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 i;. if( p->apC
163a0 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c sr ) for(i=0; i<
163b0 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 p->nCursor; i++)
163c0 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 assert( p->apCs
163d0 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 r[i]==0 );. if(
163e0 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 p->aMem ){.
163f0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d for(i=0; i<p->nM
16400 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 em; i++) assert(
16410 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 p->aMem[i].flag
16420 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 s==MEM_Undefined
16430 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 );. }.#endif.
16440 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
16450 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a b, p->zErrMsg);.
16460 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 p->zErrMsg = 0
16470 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 ;. p->pResultSe
16480 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 61 76 t = 0;.. /* Sav
16490 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f e profiling info
164a0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 rmation from thi
164b0 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f s VDBE run.. */
164c0 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f .#ifdef VDBE_PRO
164d0 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c FILE. {. FIL
164e0 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 E *out = fopen("
164f0 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 vdbe_profile.out
16500 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 ", "a");. if(
16510 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e out ){. in
16520 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e t i;. fprin
16530 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 tf(out, "---- ")
16540 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b ;. for(i=0;
16550 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b i<p->nOp; i++){
16560 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 . fprintf
16570 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d (out, "%02x", p-
16580 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b >aOp[i].opcode);
16590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 . }. f
165a0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 printf(out, "\n"
165b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e );. if( p->
165c0 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 zSql ){.
165d0 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a char c, pc = 0;.
165e0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 fprintf(
165f0 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 out, "-- ");.
16600 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 for(i=0; (c
16610 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d = p->zSql[i])!=
16620 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 0; i++){.
16630 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 if( pc=='\n'
16640 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 ) fprintf(out, "
16650 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 -- ");.
16660 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 putc(c, out);.
16670 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b pc = c;
16680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
16690 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 if( pc!='\n'
166a0 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 ) fprintf(out, "
166b0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 \n");. }.
166c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 for(i=0; i<p
166d0 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 ->nOp; i++){.
166e0 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 char zHdr[1
166f0 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 00];. sql
16700 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 ite3_snprintf(si
16710 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 zeof(zHdr), zHdr
16720 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 , "%6u %12llu %8
16730 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 llu ",.
16740 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c p->aOp[i].cnt,
16750 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 . p->a
16760 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 Op[i].cycles,.
16770 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b p->aOp[
16780 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f i].cnt>0 ? p->aO
16790 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 p[i].cycles/p->a
167a0 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 Op[i].cnt : 0.
167b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 );.
167c0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 fprintf(out, "%
167d0 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 s", zHdr);.
167e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 sqlite3VdbePr
167f0 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 intOp(out, i, &p
16800 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 ->aOp[i]);.
16810 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 }. fclose(
16820 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a out);. }. }.
16830 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 69 #endif. p->magi
16840 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 c = VDBE_MAGIC_R
16850 45 53 45 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 ESET;. return p
16860 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 ->rc & db->errMa
16870 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c sk;.}. ./*.** Cl
16880 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 ean up and delet
16890 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 e a VDBE after e
168a0 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 xecution. Retur
168b0 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 n an integer whi
168c0 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 ch is.** the res
168d0 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 ult code. Write
168e0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 any error messa
168f0 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a ge text into *pz
16900 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 ErrMsg..*/.int s
16910 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 qlite3VdbeFinali
16920 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 ze(Vdbe *p){. i
16930 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
16940 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 K;. if( p->magi
16950 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 c==VDBE_MAGIC_RU
16960 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 N || p->magic==V
16970 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 DBE_MAGIC_HALT )
16980 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 {. rc = sqlit
16990 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a e3VdbeReset(p);.
169a0 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 assert( (rc
169b0 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b & p->db->errMask
169c0 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 )==rc );. }. s
169d0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
169e0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 (p);. return rc
169f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 61 ;.}../*.** If pa
16a00 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20 6c rameter iOp is l
16a10 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 ess than zero, t
16a20 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 hen invoke the d
16a30 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a 2a estructor for.**
16a40 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20 64 all auxiliary d
16a50 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75 72 ata pointers cur
16a60 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62 79 rently cached by
16a70 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 the VM passed a
16a80 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 s.** the first a
16a90 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f rgument..**.** O
16aa0 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72 65 r, if iOp is gre
16ab0 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 ater than or equ
16ac0 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e al to zero, then
16ad0 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 the destructor
16ae0 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f 6b is.** only invok
16af0 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75 78 ed for those aux
16b00 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e iliary data poin
16b10 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79 20 ters created by
16b20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75 6e the user .** fun
16b30 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62 79 ction invoked by
16b40 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e the OP_Function
16b50 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74 72 opcode at instr
16b60 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a 2a uction iOp of .*
16b70 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64 20 * VM pVdbe, and
16b80 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a 2a only then if:.**
16b90 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73 73 .** * the ass
16ba0 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f 6e ociated function
16bb0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 parameter is th
16bc0 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72 20 e 32nd or later
16bd0 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20 20 (counting.**
16be0 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20 72 from left to r
16bf0 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 ight), or.**.**
16c00 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73 70 * the corresp
16c10 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61 72 onding bit in ar
16c20 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20 63 gument mask is c
16c30 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65 20 lear (where the
16c40 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66 75 first.** fu
16c50 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 nction parameter
16c60 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 corresponds to
16c70 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f 0a bit 0 etc.)..*/.
16c80 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
16c90 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73 71 DeleteAuxData(sq
16ca0 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44 61 lite3 *db, AuxDa
16cb0 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f 70 ta **pp, int iOp
16cc0 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 77 , int mask){. w
16cd0 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 hile( *pp ){.
16ce0 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d AuxData *pAux =
16cf0 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 *pp;. if( (i
16d00 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 Op<0). || (p
16d10 41 75 78 2d 3e 69 41 75 78 4f 70 3d 3d 69 4f 70 Aux->iAuxOp==iOp
16d20 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 41 . && pA
16d30 75 78 2d 3e 69 41 75 78 41 72 67 3e 3d 30 0a 20 ux->iAuxArg>=0.
16d40 20 20 20 20 20 20 20 20 20 26 26 20 28 70 41 75 && (pAu
16d50 78 2d 3e 69 41 75 78 41 72 67 3e 33 31 20 7c 7c x->iAuxArg>31 ||
16d60 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 !(mask & MASKBI
16d70 54 33 32 28 70 41 75 78 2d 3e 69 41 75 78 41 72 T32(pAux->iAuxAr
16d80 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 g)))). ){.
16d90 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75 testcase( pAu
16da0 78 2d 3e 69 41 75 78 41 72 67 3d 3d 33 31 20 29 x->iAuxArg==31 )
16db0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 ;. if( pAux
16dc0 2d 3e 78 44 65 6c 65 74 65 41 75 78 20 29 7b 0a ->xDeleteAux ){.
16dd0 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 pAux->xD
16de0 65 6c 65 74 65 41 75 78 28 70 41 75 78 2d 3e 70 eleteAux(pAux->p
16df0 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Aux);. }.
16e00 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e *pp = pAux->
16e10 70 4e 65 78 74 41 75 78 3b 0a 20 20 20 20 20 20 pNextAux;.
16e20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
16e30 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c , pAux);. }el
16e40 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 se{. pp= &p
16e50 41 75 78 2d 3e 70 4e 65 78 74 41 75 78 3b 0a 20 Aux->pNextAux;.
16e60 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a }. }.}../*.*
16e70 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 * Free all memor
16e80 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
16e90 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 h the Vdbe passe
16ea0 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 d as the second
16eb0 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 argument,.** exc
16ec0 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 ept for object i
16ed0 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 tself, which is
16ee0 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a preserved..**.**
16ef0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 The difference
16f00 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e between this fun
16f10 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 ction and sqlite
16f20 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 3VdbeDelete() is
16f30 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c that.** VdbeDel
16f40 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e ete() also unlin
16f50 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d ks the Vdbe from
16f60 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 the list of VMs
16f70 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
16f80 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 .** the database
16f90 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 connection and
16fa0 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 frees the object
16fb0 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 itself..*/.void
16fc0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 sqlite3VdbeClea
16fd0 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 rObject(sqlite3
16fe0 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 *db, Vdbe *p){.
16ff0 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 SubProgram *pSu
17000 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 61 73 73 b, *pNext;. ass
17010 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c ert( p->db==0 ||
17020 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 p->db==db );.
17030 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 releaseMemArray(
17040 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e p->aColName, p->
17050 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 nResColumn*COLNA
17060 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 ME_N);. for(pSu
17070 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 b=p->pProgram; p
17080 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 Sub; pSub=pNext)
17090 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 {. pNext = pS
170a0 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 ub->pNext;. v
170b0 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 dbeFreeOpArray(d
170c0 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 b, pSub->aOp, pS
170d0 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 ub->nOp);. sq
170e0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
170f0 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 pSub);. }. if(
17100 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f p->magic!=VDBE_
17110 4d 41 47 49 43 5f 49 4e 49 54 20 29 7b 0a 20 20 MAGIC_INIT ){.
17120 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 releaseMemArra
17130 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 y(p->aVar, p->nV
17140 61 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 ar);. sqlite3
17150 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 56 DbFree(db, p->pV
17160 4c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 List);. sqlit
17170 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e e3DbFree(db, p->
17180 70 46 72 65 65 29 3b 0a 20 20 7d 0a 20 20 76 64 pFree);. }. vd
17190 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 beFreeOpArray(db
171a0 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 , p->aOp, p->nOp
171b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 );. sqlite3DbFr
171c0 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 ee(db, p->aColNa
171d0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 me);. sqlite3Db
171e0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c Free(db, p->zSql
171f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
17200 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 _ENABLE_STMT_SCA
17210 4e 53 54 41 54 55 53 0a 20 20 7b 0a 20 20 20 20 NSTATUS. {.
17220 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 int i;. for(i
17230 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 =0; i<p->nScan;
17240 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 i++){. sqli
17250 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
17260 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 >aScan[i].zName)
17270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 ;. }. sqli
17280 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
17290 3e 61 53 63 61 6e 29 3b 0a 20 20 7d 0a 23 65 6e >aScan);. }.#en
172a0 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c dif.}../*.** Del
172b0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 ete an entire VD
172c0 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 BE..*/.void sqli
172d0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 te3VdbeDelete(Vd
172e0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 be *p){. sqlite
172f0 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 3 *db;.. if( NE
17300 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 VER(p==0) ) retu
17310 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 rn;. db = p->db
17320 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 ;. assert( sqli
17330 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 te3_mutex_held(d
17340 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 b->mutex) );. s
17350 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f qlite3VdbeClearO
17360 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 bject(db, p);.
17370 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a if( p->pPrev ){.
17380 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e p->pPrev->pN
17390 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a ext = p->pNext;.
173a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 }else{. ass
173b0 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d ert( db->pVdbe==
173c0 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 p );. db->pVd
173d0 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 be = p->pNext;.
173e0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 }. if( p->pNex
173f0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 t ){. p->pNex
17400 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 t->pPrev = p->pP
17410 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 rev;. }. p->ma
17420 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 gic = VDBE_MAGIC
17430 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d _DEAD;. p->db =
17440 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 0;. sqlite3DbF
17450 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a 7d 0a reeNN(db, p);.}.
17460 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f ./*.** The curso
17470 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 r "p" has a pend
17480 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 ing seek operati
17490 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 on that has not
174a0 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 yet been.** carr
174b0 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 ied out. Seek t
174c0 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 he cursor now.
174d0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 If an error occu
174e0 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 rs, return.** th
174f0 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 e appropriate er
17500 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 ror code..*/.sta
17510 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e tic int SQLITE_N
17520 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 OINLINE handleDe
17530 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 ferredMoveto(Vdb
17540 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 eCursor *p){. i
17550 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 nt res, rc;.#ifd
17560 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 ef SQLITE_TEST.
17570 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 extern int sqli
17580 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 te3_search_count
17590 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 ;.#endif. asser
175a0 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f t( p->deferredMo
175b0 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 veto );. assert
175c0 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a ( p->isTable );.
175d0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 assert( p->eCu
175e0 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 rType==CURTYPE_B
175f0 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 TREE );. rc = s
17600 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 qlite3BtreeMovet
17610 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e oUnpacked(p->uc.
17620 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d pCursor, 0, p->m
17630 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 ovetoTarget, 0,
17640 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 &res);. if( rc
17650 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 ) return rc;. i
17660 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 f( res!=0 ) retu
17670 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
17680 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 T_BKPT;.#ifdef S
17690 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c QLITE_TEST. sql
176a0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e ite3_search_coun
176b0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d t++;.#endif. p-
176c0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 >deferredMoveto
176d0 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 = 0;. p->cacheS
176e0 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 tatus = CACHE_ST
176f0 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 ALE;. return SQ
17700 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
17710 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 * Something has
17720 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 moved cursor "p"
17730 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 out of place.
17740 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 Maybe the row it
17750 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 was.** pointed
17760 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f to was deleted o
17770 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 ut from under it
17780 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 . Or maybe the
17790 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 btree was.** reb
177a0 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 alanced. Whatev
177b0 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 er the cause, tr
177c0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 y to restore "p"
177d0 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 to the place it
177e0 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 .** is supposed
177f0 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 to be pointing.
17800 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 If the row was
17810 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d deleted out from
17820 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 under the.** cu
17830 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 rsor, set the cu
17840 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f rsor to point to
17850 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a a NULL row..*/.
17860 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 static int SQLIT
17870 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c E_NOINLINE handl
17880 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 eMovedCursor(Vdb
17890 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 eCursor *p){. i
178a0 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f nt isDifferentRo
178b0 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 w, rc;. assert(
178c0 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 p->eCurType==CU
178d0 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 RTYPE_BTREE );.
178e0 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 assert( p->uc.p
178f0 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 Cursor!=0 );. a
17900 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 ssert( sqlite3Bt
17910 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 reeCursorHasMove
17920 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 d(p->uc.pCursor)
17930 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 );. rc = sqlit
17940 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 e3BtreeCursorRes
17950 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 tore(p->uc.pCurs
17960 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 or, &isDifferent
17970 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 Row);. p->cache
17980 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 Status = CACHE_S
17990 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 TALE;. if( isDi
179a0 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e fferentRow ) p->
179b0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 nullRow = 1;. r
179c0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a eturn rc;.}../*.
179d0 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 ** Check to ensu
179e0 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 re that the curs
179f0 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 or is valid. Re
17a00 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 store the cursor
17a10 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 .** if need be.
17a20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 Return any I/O
17a30 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 error from the r
17a40 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e estore operation
17a50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
17a60 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 VdbeCursorRestor
17a70 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 e(VdbeCursor *p)
17a80 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 {. assert( p->e
17a90 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 CurType==CURTYPE
17aa0 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 _BTREE );. if(
17ab0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 sqlite3BtreeCurs
17ac0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 orHasMoved(p->uc
17ad0 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 .pCursor) ){.
17ae0 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f return handleMo
17af0 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 vedCursor(p);.
17b00 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 }. return SQLIT
17b10 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d E_OK;.}../*.** M
17b20 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 ake sure the cur
17b30 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 sor p is ready t
17b40 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 o read or write
17b50 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 the row to which
17b60 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 it.** was last
17b70 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 positioned. Ret
17b80 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 urn an error cod
17b90 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c e if an OOM faul
17ba0 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a t or I/O error.*
17bb0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 * prevents us fr
17bc0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 om positioning t
17bd0 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 he cursor to its
17be0 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f correct positio
17bf0 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f n..**.** If a Mo
17c00 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 veTo operation i
17c10 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 s pending on the
17c20 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 given cursor, t
17c30 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d hen do that.** M
17c40 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e oveTo now. If n
17c50 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e o move is pendin
17c60 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 g, check to see
17c70 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 if the row has b
17c80 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f een.** deleted o
17c90 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 ut from under th
17ca0 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 e cursor and if
17cb0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 it has, mark the
17cc0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c row as.** a NUL
17cd0 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 L row..**.** If
17ce0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c the cursor is al
17cf0 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 ready pointing t
17d00 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f o the correct ro
17d10 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 w and that row h
17d20 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 as.** not been d
17d30 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 eleted out from
17d40 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 under the cursor
17d50 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 , then this rout
17d60 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a ine is a no-op..
17d70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
17d80 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 beCursorMoveto(V
17d90 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 dbeCursor **pp,
17da0 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 int *piCol){. V
17db0 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a dbeCursor *p = *
17dc0 70 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d pp;. assert( p-
17dd0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 >eCurType==CURTY
17de0 50 45 5f 42 54 52 45 45 20 7c 7c 20 70 2d 3e 65 PE_BTREE || p->e
17df0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 CurType==CURTYPE
17e00 5f 50 53 45 55 44 4f 20 29 3b 0a 20 20 69 66 28 _PSEUDO );. if(
17e10 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 p->deferredMove
17e20 74 6f 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 4d to ){. int iM
17e30 61 70 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 61 ap;. if( p->a
17e40 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 AltMap && (iMap
17e50 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a = p->aAltMap[1+*
17e60 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 piCol])>0 ){.
17e70 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 *pp = p->pAlt
17e80 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 2a 70 Cursor;. *p
17e90 69 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b iCol = iMap - 1;
17ea0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
17eb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 LITE_OK;. }.
17ec0 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 return handle
17ed0 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 DeferredMoveto(p
17ee0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c );. }. if( sql
17ef0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 ite3BtreeCursorH
17f00 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 asMoved(p->uc.pC
17f10 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 ursor) ){. re
17f20 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 turn handleMoved
17f30 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 Cursor(p);. }.
17f40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
17f50 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 K;.}../*.** The
17f60 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 following functi
17f70 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 ons:.**.** sqlit
17f80 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
17f90 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 ().** sqlite3Vdb
17fa0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 eSerialTypeLen()
17fb0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 .** sqlite3VdbeS
17fc0 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 erialLen().** sq
17fd0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 lite3VdbeSerialP
17fe0 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 ut().** sqlite3V
17ff0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a dbeSerialGet().*
18000 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 *.** encapsulate
18010 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 the code that s
18020 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 erializes values
18030 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 for storage in
18040 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 SQLite.** data a
18050 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 nd index records
18060 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 . Each serialize
18070 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 d value consists
18080 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c of a.** 'serial
18090 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f -type' and a blo
180a0 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 b of data. The s
180b0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e erial type is an
180c0 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 8-byte unsigned
180d0 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f .** integer, sto
180e0 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e red as a varint.
180f0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c .**.** In an SQL
18100 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 ite index record
18110 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 , the serial typ
18120 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 e is stored dire
18130 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 ctly before.** t
18140 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 he blob of data
18150 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f that it correspo
18160 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 nds to. In a tab
18170 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 le record, all s
18180 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 erial.** types a
18190 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 re stored at the
181a0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 start of the re
181b0 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c cord, and the bl
181c0 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a obs of data at.*
181d0 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 * the end. Hence
181e0 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 these functions
181f0 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 allow the calle
18200 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a r to handle the.
18210 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 ** serial-type a
18220 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 nd data blob sep
18230 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 arately..**.** T
18240 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 he following tab
18250 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 le describes the
18260 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 various storage
18270 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 classes for dat
18280 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 a:.**.** seria
18290 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 l type by
182a0 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 tes of data
182b0 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d type.** -----
182c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d --------- --
182d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 -------------
182e0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
182f0 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 .** 0
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
18310 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c NULL
18320 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 .** 1
18330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
18340 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e sign
18350 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 ed integer.**
18360 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2
18370 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 2
18380 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 signed int
18390 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 eger.** 3
183a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
183b0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 3
183c0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a signed integer.*
183d0 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 * 4
183e0 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 4
183f0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 signed
18400 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 integer.**
18410 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5
18420 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 6
18430 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 signed integ
18440 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 er.** 6
18450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18460 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 8 si
18470 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 gned integer.**
18480 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 7
18490 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 8
184a0 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f IEEE flo
184b0 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 at.** 8
184c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
184d0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 0 In
184e0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 teger constant 0
184f0 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 .** 9
18500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
18510 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 Inte
18520 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a ger constant 1.*
18530 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 * 10,11
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18550 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 reserv
18560 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e ed for expansion
18570 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 .** N>=12 and
18580 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 even (N-1
18590 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 2)/2 BLOB
185a0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 .** N>=13 and
185b0 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 odd (N-1
185c0 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 3)/2 text
185d0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 .**.** The 8 and
185e0 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 9 types were ad
185f0 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 ded in 3.3.0, fi
18600 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 le format 4. Pr
18610 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 ior versions.**
18620 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e of SQLite will n
18630 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 ot understand th
18640 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 ose serial types
18650 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 ..*/../*.** Retu
18660 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 rn the serial-ty
18670 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 pe for the value
18680 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e stored in pMem.
18690 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 .*/.u32 sqlite3V
186a0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 dbeSerialType(Me
186b0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c m *pMem, int fil
186c0 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 e_format, u32 *p
186d0 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 Len){. int flag
186e0 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b s = pMem->flags;
186f0 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 . u32 n;.. ass
18700 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a ert( pLen!=0 );.
18710 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f if( flags&MEM_
18720 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 Null ){. *pLe
18730 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 n = 0;. retur
18740 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 n 0;. }. if( f
18750 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a lags&MEM_Int ){.
18760 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 /* Figure ou
18770 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65 t whether to use
18780 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 1, 2, 4, 6 or 8
18790 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 bytes. */.# d
187a0 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 efine MAX_6BYTE
187b0 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30 ((((i64)0x000080
187c0 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 00)<<32)-1).
187d0 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e i64 i = pMem->u.
187e0 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20 i;. u64 u;.
187f0 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 if( i<0 ){.
18800 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d u = ~i;. }
18810 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 else{. u =
18820 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 i;. }. if(
18830 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 u<=127 ){.
18840 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26 if( (i&1)==i &&
18850 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 file_format>=4
18860 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e ){. *pLen
18870 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 = 0;. re
18880 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 turn 8+(u32)u;.
18890 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
188a0 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 *pLen = 1;.
188b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b return 1;
188c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
188d0 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 if( u<=32767
188e0 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 ){ *pLen = 2; re
188f0 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 turn 2; }. if
18900 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 ( u<=8388607 ){
18910 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 *pLen = 3; retur
18920 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 n 3; }. if( u
18930 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20 <=2147483647 ){
18940 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 *pLen = 4; retur
18950 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 n 4; }. if( u
18960 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a <=MAX_6BYTE ){ *
18970 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e pLen = 6; return
18980 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 5; }. *pLen
18990 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 = 8;. return
189a0 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 6;. }. if( fla
189b0 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 gs&MEM_Real ){.
189c0 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 *pLen = 8;.
189d0 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a return 7;. }.
189e0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e assert( pMem->
189f0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
18a00 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 || flags&(MEM_S
18a10 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a tr|MEM_Blob) );.
18a20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e assert( pMem->
18a30 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 n>=0 );. n = (u
18a40 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 32)pMem->n;. if
18a50 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 ( flags & MEM_Ze
18a60 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 ro ){. n += p
18a70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 Mem->u.nZero;.
18a80 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 }. *pLen = n;.
18a90 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b return ((n*2) +
18aa0 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 12 + ((flags&ME
18ab0 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a M_Str)!=0));.}..
18ac0 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 /*.** The sizes
18ad0 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73 for serial types
18ae0 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a less than 128.*
18af0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 /.static const u
18b00 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 8 sqlite3SmallTy
18b10 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 peSizes[] = {.
18b20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20 /* 0 1
18b30 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20 2 3 4 5
18b40 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20 6 7 8 9
18b50 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 */ ./* 0 */
18b60 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 0, 1, 2, 3,
18b70 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 4, 6, 8, 8,
18b80 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 0, 0,./* 10
18b90 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 */ 0, 0, 0,
18ba0 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 0, 1, 1, 2,
18bb0 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 2, 3, 3,./*
18bc0 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 20 */ 4, 4,
18bd0 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 5, 5, 6, 6,
18be0 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 7, 7, 8, 8,./
18bf0 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 * 30 */ 9, 9
18c00 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 , 10, 10, 11, 11
18c10 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 , 12, 12, 13, 13
18c20 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c ,./* 40 */ 14,
18c30 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 14, 15, 15, 16,
18c40 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 16, 17, 17, 18,
18c50 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 18,./* 50 */
18c60 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 19, 19, 20, 20,
18c70 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 21, 21, 22, 22,
18c80 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 23, 23,./* 60 *
18c90 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 / 24, 24, 25, 2
18ca0 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 5, 26, 26, 27, 2
18cb0 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 7, 28, 28,./* 7
18cc0 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 0 */ 29, 29, 30
18cd0 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 , 30, 31, 31, 32
18ce0 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a , 32, 33, 33,./*
18cf0 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 80 */ 34, 34,
18d00 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 35, 35, 36, 36,
18d10 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 37, 37, 38, 38,
18d20 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 ./* 90 */ 39,
18d30 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 39, 40, 40, 41,
18d40 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 41, 42, 42, 43,
18d50 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 43,./* 100 */ 4
18d60 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 4, 44, 45, 45, 4
18d70 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 6, 46, 47, 47, 4
18d80 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 8, 48,./* 110 */
18d90 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 49, 49, 50, 50
18da0 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 , 51, 51, 52, 52
18db0 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 , 53, 53,./* 120
18dc0 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c */ 54, 54, 55,
18dd0 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 55, 56, 56, 57,
18de0 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 57.};../*.** Re
18df0 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 turn the length
18e00 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72 of the data corr
18e10 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 esponding to the
18e20 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c supplied serial
18e30 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 -type..*/.u32 sq
18e40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
18e50 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61 ypeLen(u32 seria
18e60 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73 l_type){. if( s
18e70 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 erial_type>=128
18e80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73 ){. return (s
18e90 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 erial_type-12)/2
18ea0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 ;. }else{. a
18eb0 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 ssert( serial_ty
18ec0 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20 pe<12 .
18ed0 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 || sqlite3Sma
18ee0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 llTypeSizes[seri
18ef0 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 al_type]==(seria
18f00 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29 l_type - 12)/2 )
18f10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c ;. return sql
18f20 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a ite3SmallTypeSiz
18f30 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b es[serial_type];
18f40 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 . }.}.u8 sqlite
18f50 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69 3VdbeOneByteSeri
18f60 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72 alTypeLen(u8 ser
18f70 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 ial_type){. ass
18f80 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 ert( serial_type
18f90 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e <128 );. return
18fa0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 sqlite3SmallTyp
18fb0 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 eSizes[serial_ty
18fc0 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 pe]; .}../*.**
18fd0 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 If we are on an
18fe0 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 architecture wit
18ff0 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 h mixed-endian f
19000 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e loating .** poin
19010 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 ts (ex: ARM7) th
19020 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 en swap the lowe
19030 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 r 4 bytes with t
19040 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 he .** upper 4 b
19050 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 ytes. Return th
19060 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 e result..**.**
19070 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 For most archite
19080 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 ctures, this is
19090 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 a no-op..**.** (
190a0 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 later): It is r
190b0 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 eported to me th
190c0 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 at the mixed-end
190d0 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f ian problem.** o
190e0 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 n ARM7 is an iss
190f0 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 ue with GCC, not
19100 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 with the ARM7 c
19110 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a hip. It seems.*
19120 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 * that early ver
19130 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f sions of GCC sto
19140 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 red the two word
19150 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a s of a 64-bit.**
19160 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 float in the wr
19170 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 ong order. And
19180 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 that error has b
19190 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a een propagated.*
191a0 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 * ever since. T
191b0 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 he blame is not
191c0 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 necessarily with
191d0 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a GCC, though..**
191e0 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 GCC might have
191f0 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 just copying the
19200 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 problem from a
19210 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a prior compiler..
19220 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c ** I am also tol
19230 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 d that newer ver
19240 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 sions of GCC tha
19250 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 t follow a diffe
19260 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 rent.** ABI get
19270 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 the byte order r
19280 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 ight..**.** Deve
19290 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c lopers using SQL
192a0 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 ite on an ARM7 s
192b0 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e hould compile an
192c0 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 d run their.** a
192d0 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 pplication using
192e0 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d -DSQLITE_DEBUG=
192f0 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 1 at least once.
19300 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 With DEBUG.**
19310 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 enabled, some as
19320 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c serts below will
19330 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 ensure that the
19340 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a byte order of.*
19350 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 * floating point
19360 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 values is corre
19370 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d ct..**.** (2007-
19380 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 08-30) Frank va
19390 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 n Vugt has studi
193a0 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 ed this problem
193b0 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 closely.** and h
193c0 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 as send his find
193d0 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 ings to the SQLi
193e0 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 te developers.
193f0 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 Frank.** writes
19400 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 that some Linux
19410 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c kernels offer fl
19420 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 oating point har
19430 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 dware.** emulati
19440 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c on that uses onl
19450 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 y 32-bit mantiss
19460 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 as instead of a
19470 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 full .** 48-bits
19480 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 as required by
19490 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 the IEEE standar
194a0 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 d. (This is the
194b0 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 .** CONFIG_FPE_F
194c0 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 ASTFPE option.)
194d0 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 On such systems
194e0 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 , floating point
194f0 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e .** byte swappin
19500 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 g becomes very c
19510 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 omplicated. To
19520 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a avoid problems,.
19530 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 ** the necessary
19540 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 byte swapping i
19550 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 s carried out us
19560 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 ing a 64-bit int
19570 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 eger.** rather t
19580 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f han a 64-bit flo
19590 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 at. Frank assur
195a0 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 es us that the c
195b0 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b ode here.** work
195c0 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 s for him. We,
195d0 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 the developers,
195e0 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 have no way to i
195f0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 ndependently.**
19600 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 verify this, but
19610 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 Frank seems to
19620 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 know what he is
19630 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a talking about.**
19640 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d so we trust him
19650 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 ..*/.#ifdef SQLI
19660 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f TE_MIXED_ENDIAN_
19670 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 64BIT_FLOAT.stat
19680 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 ic u64 floatSwap
19690 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f (u64 in){. unio
196a0 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 n {. u64 r;.
196b0 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d u32 i[2];. }
196c0 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 u;. u32 t;..
196d0 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 u.r = in;. t =
196e0 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d u.i[0];. u.i[0]
196f0 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 = u.i[1];. u.i
19700 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 [1] = t;. retur
19710 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e n u.r;.}.# defin
19720 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 e swapMixedEndia
19730 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 nFloat(X) X = f
19740 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 loatSwap(X).#els
19750 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d e.# define swapM
19760 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 ixedEndianFloat(
19770 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a X).#endif../*.**
19780 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 Write the seria
19790 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 lized data blob
197a0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 for the value st
197b0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 ored in pMem int
197c0 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 o .** buf. It is
197d0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 assumed that th
197e0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c e caller has all
197f0 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e ocated sufficien
19800 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 t space..** Retu
19810 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 rn the number of
19820 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a bytes written..
19830 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 **.** nBuf is th
19840 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 e amount of spac
19850 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e e left in buf[].
19860 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 The caller is
19870 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 responsible.** f
19880 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e or allocating en
19890 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 ough space to bu
198a0 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 f[] to hold the
198b0 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 entire field, ex
198c0 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 clusive.** of th
198d0 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 e pMem->u.nZero
198e0 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f bytes for a MEM_
198f0 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a Zero value..**.*
19900 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d * Return the num
19910 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 ber of bytes act
19920 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e ually written in
19930 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e to buf[]. The n
19940 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 umber.** of byte
19950 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 s in the zero-fi
19960 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 lled tail is inc
19970 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 luded in the ret
19980 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a urn value only.*
19990 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 * if those bytes
199a0 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 were zeroed in
199b0 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 buf[]..*/ .u32 s
199c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
199d0 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d Put(u8 *buf, Mem
199e0 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 *pMem, u32 seri
199f0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 al_type){. u32
19a00 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 len;.. /* Integ
19a10 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 er and Real */.
19a20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 if( serial_type
19a30 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 <=7 && serial_ty
19a40 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 pe>0 ){. u64
19a50 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 v;. u32 i;.
19a60 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 if( serial_typ
19a70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 e==7 ){. as
19a80 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d sert( sizeof(v)=
19a90 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e =sizeof(pMem->u.
19aa0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 r) );. memc
19ab0 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e py(&v, &pMem->u.
19ac0 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 r, sizeof(v));.
19ad0 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e swapMixedEn
19ae0 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 dianFloat(v);.
19af0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 }else{. v
19b00 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 = pMem->u.i;.
19b10 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 }. len = i
19b20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 = sqlite3SmallTy
19b30 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 peSizes[serial_t
19b40 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 ype];. assert
19b50 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b ( i>0 );. do{
19b60 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 . buf[--i]
19b70 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a = (u8)(v&0xFF);.
19b80 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 v >>= 8;.
19b90 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a }while( i );.
19ba0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a return len;.
19bb0 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 }.. /* String
19bc0 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 or blob */. if
19bd0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 ( serial_type>=1
19be0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 2 ){. assert(
19bf0 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 pMem->n + ((pMe
19c00 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a m->flags & MEM_Z
19c10 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 ero)?pMem->u.nZe
19c20 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20 ro:0).
19c30 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 == (int)sqlit
19c40 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
19c50 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 Len(serial_type)
19c60 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d );. len = pM
19c70 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c em->n;. if( l
19c80 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75 en>0 ) memcpy(bu
19c90 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 f, pMem->z, len)
19ca0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e ;. return len
19cb0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c ;. }.. /* NULL
19cc0 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 or constants 0
19cd0 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e or 1 */. return
19ce0 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 0;.}../* Input
19cf0 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63 "x" is a sequenc
19d00 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68 e of unsigned ch
19d10 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65 aracters that re
19d20 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 present a.** big
19d30 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e -endian integer.
19d40 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75 Return the equ
19d50 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 ivalent native i
19d60 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e nteger.*/.#defin
19d70 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 e ONE_BYTE_INT(x
19d80 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d ) ((i8)(x)[0]
19d90 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 ).#define TWO_BY
19da0 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35 TE_INT(x) (25
19db0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 6*(i8)((x)[0])|(
19dc0 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 x)[1]).#define T
19dd0 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 HREE_BYTE_INT(x)
19de0 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78 (65536*(i8)((x
19df0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 )[0])|((x)[1]<<8
19e00 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e )|(x)[2]).#defin
19e10 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 e FOUR_BYTE_UINT
19e20 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b (x) (((u32)(x)[
19e30 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 0]<<24)|((x)[1]<
19e40 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 <16)|((x)[2]<<8)
19e50 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 |(x)[3]).#define
19e60 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 FOUR_BYTE_INT(x
19e70 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29 ) (16777216*(i8)
19e80 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d ((x)[0])|((x)[1]
19e90 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 <<16)|((x)[2]<<8
19ea0 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a )|(x)[3])../*.**
19eb0 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 Deserialize the
19ec0 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 data blob point
19ed0 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 ed to by buf as
19ee0 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 serial type seri
19ef0 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 al_type.** and s
19f00 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 tore the result
19f10 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e in pMem. Return
19f20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
19f30 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a ytes read..**.**
19f40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 This function i
19f50 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 s implemented as
19f60 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f two separate ro
19f70 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f utines for perfo
19f80 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 rmance..** The f
19f90 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65 ew cases that re
19fa0 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 quire local vari
19fb0 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e ables are broken
19fc0 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61 out into a sepa
19fd0 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 rate.** routine
19fe0 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 so that in most
19ff0 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65 cases the overhe
1a000 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 ad of moving the
1a010 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a stack pointer.*
1a020 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f * is avoided..*/
1a030 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c .static u32 SQL
1a040 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 ITE_NOINLINE ser
1a050 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 ialGet(. const
1a060 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 unsigned char *b
1a070 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 uf, /* Buffe
1a080 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 r to deserialize
1a090 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 from */. u32 s
1a0a0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 erial_type,
1a0b0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 /* Seri
1a0c0 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 al type to deser
1a0d0 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 ialize */. Mem
1a0e0 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 *pMem
1a0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d /* Mem
1a100 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 ory cell to writ
1a110 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a e value into */.
1a120 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55 ){. u64 x = FOU
1a130 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29 R_BYTE_UINT(buf)
1a140 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52 ;. u32 y = FOUR
1a150 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 _BYTE_UINT(buf+4
1a160 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 );. x = (x<<32)
1a170 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69 + y;. if( seri
1a180 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 al_type==6 ){.
1a190 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 /* EVIDENCE-OF
1a1a0 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20 : R-29851-52272
1a1b0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 Value is a big-e
1a1c0 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 ndian 64-bit.
1a1d0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d ** twos-complem
1a1e0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a ent integer. */.
1a1f0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 pMem->u.i =
1a200 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 *(i64*)&x;. p
1a210 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
1a220 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61 _Int;. testca
1a230 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 se( pMem->u.i<0
1a240 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
1a250 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 /* EVIDENCE-OF:
1a260 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61 R-57343-49114 Va
1a270 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 lue is a big-end
1a280 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30 ian IEEE 754-200
1a290 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 8 64-bit. **
1a2a0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e floating point n
1a2b0 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 umber. */.#if !d
1a2c0 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26 efined(NDEBUG) &
1a2d0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 & !defined(SQLIT
1a2e0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f E_OMIT_FLOATING_
1a2f0 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 POINT). /* Ve
1a300 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65 rify that intege
1a310 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 rs and floating
1a320 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65 point values use
1a330 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a the same. **
1a340 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 byte order. Or
1a350 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45 , that if SQLITE
1a360 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 _MIXED_ENDIAN_64
1a370 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 BIT_FLOAT is.
1a380 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 ** defined that
1a390 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 64-bit floating
1a3a0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 point values re
1a3b0 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 ally are mixed.
1a3c0 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 ** endian..
1a3d0 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 */. static
1a3e0 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28 const u64 t1 = (
1a3f0 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29 (u64)0x3ff00000)
1a400 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63 <<32;. static
1a410 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 const double r1
1a420 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 = 1.0;. u64
1a430 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 t2 = t1;. swa
1a440 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 pMixedEndianFloa
1a450 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72 t(t2);. asser
1a460 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 t( sizeof(r1)==s
1a470 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d izeof(t2) && mem
1a480 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69 cmp(&r1, &t2, si
1a490 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a zeof(r1))==0 );.
1a4a0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 #endif. asser
1a4b0 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 t( sizeof(x)==8
1a4c0 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e && sizeof(pMem->
1a4d0 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 u.r)==8 );. s
1a4e0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c wapMixedEndianFl
1a4f0 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 oat(x);. memc
1a500 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 py(&pMem->u.r, &
1a510 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 x, sizeof(x));.
1a520 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
1a530 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d sqlite3IsNaN(pM
1a540 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e em->u.r) ? MEM_N
1a550 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a ull : MEM_Real;.
1a560 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a }. return 8;.
1a570 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 }.u32 sqlite3Vdb
1a580 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f eSerialGet(. co
1a590 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
1a5a0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 r *buf, /* B
1a5b0 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 uffer to deseria
1a5c0 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 lize from */. u
1a5d0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 32 serial_type,
1a5e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1a5f0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 Serial type to d
1a600 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 eserialize */.
1a610 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 Mem *pMem
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a630 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 Memory cell to
1a640 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f write value into
1a650 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 */.){. switch(
1a660 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a serial_type ){.
1a670 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f case 10: /
1a680 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 * Reserved for f
1a690 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 uture use */.
1a6a0 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 case 11: /* R
1a6b0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 eserved for futu
1a6c0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 re use */. ca
1a6d0 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c se 0: { /* Null
1a6e0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 */. /* EVI
1a6f0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 DENCE-OF: R-2407
1a700 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73 8-09375 Value is
1a710 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 a NULL. */.
1a720 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
1a730 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 MEM_Null;.
1a740 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 break;. }.
1a750 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 case 1: {.
1a760 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a /* EVIDENCE-OF:
1a770 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56 R-44885-25196 V
1a780 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74 alue is an 8-bit
1a790 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 twos-complement
1a7a0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 . ** intege
1a7b0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d r. */. pMem
1a7c0 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 ->u.i = ONE_BYTE
1a7d0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 _INT(buf);.
1a7e0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
1a7f0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 EM_Int;. te
1a800 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e stcase( pMem->u.
1a810 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 i<0 );. ret
1a820 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 1;. }.
1a830 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d case 2: { /* 2-
1a840 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 byte signed inte
1a850 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 ger */. /*
1a860 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 EVIDENCE-OF: R-4
1a870 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65 9794-35026 Value
1a880 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e is a big-endian
1a890 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 16-bit. **
1a8a0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 twos-complement
1a8b0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 integer. */.
1a8c0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 pMem->u.i = T
1a8d0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 WO_BYTE_INT(buf)
1a8e0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c ;. pMem->fl
1a8f0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 ags = MEM_Int;.
1a900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 testcase( p
1a910 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 Mem->u.i<0 );.
1a920 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 return 2;.
1a930 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 }. case 3:
1a940 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e { /* 3-byte sign
1a950 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 ed integer */.
1a960 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d /* EVIDENCE-
1a970 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30 OF: R-37839-5430
1a980 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 1 Value is a big
1a990 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 -endian 24-bit.
1a9a0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d ** twos-com
1a9b0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e plement integer.
1a9c0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e */. pMem->
1a9d0 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45 u.i = THREE_BYTE
1a9e0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 _INT(buf);.
1a9f0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
1aa00 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 EM_Int;. te
1aa10 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e stcase( pMem->u.
1aa20 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 i<0 );. ret
1aa30 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 3;. }.
1aa40 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d case 4: { /* 4-
1aa50 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 byte signed inte
1aa60 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 ger */. /*
1aa70 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 EVIDENCE-OF: R-0
1aa80 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65 1849-26079 Value
1aa90 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e is a big-endian
1aaa0 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 32-bit. **
1aab0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 twos-complement
1aac0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 integer. */.
1aad0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 pMem->u.i = F
1aae0 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 OUR_BYTE_INT(buf
1aaf0 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 );.#ifdef __HP_c
1ab00 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b c . /* Work
1ab10 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 around a sign-e
1ab20 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 xtension bug in
1ab30 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 the HP compiler
1ab40 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 for HP/UX */.
1ab50 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78 if( buf[0]&0x
1ab60 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 80 ) pMem->u.i |
1ab70 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30 30 = 0xffffffff8000
1ab80 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 0000LL;.#endif.
1ab90 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
1aba0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
1abb0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d testcase( pMem
1abc0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 ->u.i<0 );.
1abd0 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d return 4;. }
1abe0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f . case 5: { /
1abf0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 * 6-byte signed
1ac00 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 integer */.
1ac10 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a /* EVIDENCE-OF:
1ac20 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56 R-50385-09674 V
1ac30 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e alue is a big-en
1ac40 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 dian 48-bit.
1ac50 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 ** twos-comple
1ac60 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f ment integer. */
1ac70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 . pMem->u.i
1ac80 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e = FOUR_BYTE_UIN
1ac90 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36 T(buf+2) + (((i6
1aca0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 4)1)<<32)*TWO_BY
1acb0 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 TE_INT(buf);.
1acc0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
1acd0 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 MEM_Int;.
1ace0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e testcase( pMem->
1acf0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 u.i<0 );. r
1ad00 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 eturn 6;. }.
1ad10 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 case 6: /*
1ad20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 8-byte signed in
1ad30 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 teger */. cas
1ad40 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 e 7: { /* IEEE f
1ad50 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f loating point */
1ad60 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20 . /* These
1ad70 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 use local variab
1ad80 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 les, so do them
1ad90 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f in a separate ro
1ada0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 utine. ** t
1adb0 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74 o avoid having t
1adc0 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65 o move the frame
1add0 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 pointer in the
1ade0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 common case */.
1adf0 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69 return seri
1ae00 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c alGet(buf,serial
1ae10 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 _type,pMem);.
1ae20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20 }. case 8:
1ae30 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a /* Integer 0 *
1ae40 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20 /. case 9: {
1ae50 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f /* Integer 1 */
1ae60 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e . /* EVIDEN
1ae70 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 CE-OF: R-12976-2
1ae80 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68 2893 Value is th
1ae90 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a e integer 0. */.
1aea0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 /* EVIDENC
1aeb0 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 E-OF: R-18143-12
1aec0 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65 121 Value is the
1aed0 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 integer 1. */.
1aee0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d pMem->u.i =
1aef0 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a serial_type-8;.
1af00 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 pMem->flag
1af10 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 s = MEM_Int;.
1af20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 return 0;.
1af30 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 }. default:
1af40 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 {. /* EVIDE
1af50 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d NCE-OF: R-14606-
1af60 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61 31564 Value is a
1af70 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e BLOB that is (N
1af80 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a -12)/2 bytes in.
1af90 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e ** length.
1afa0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e . ** EVIDEN
1afb0 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 CE-OF: R-28401-0
1afc0 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20 0140 Value is a
1afd0 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65 string in the te
1afe0 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a xt encoding and.
1aff0 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f ** (N-13)/
1b000 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 2 bytes in lengt
1b010 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 h. */. stat
1b020 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c ic const u16 aFl
1b030 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f ag[] = { MEM_Blo
1b040 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d b|MEM_Ephem, MEM
1b050 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d _Str|MEM_Ephem }
1b060 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 ;. pMem->z
1b070 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 = (char *)buf;.
1b080 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 pMem->n = (
1b090 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f serial_type-12)/
1b0a0 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 2;. pMem->f
1b0b0 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 lags = aFlag[ser
1b0c0 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 ial_type&1];.
1b0d0 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e return pMem->
1b0e0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 n;. }. }. r
1b0f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a eturn 0;.}./*.**
1b100 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 This routine is
1b110 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 used to allocat
1b120 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 e sufficient spa
1b130 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b ce for an Unpack
1b140 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 edRecord.** stru
1b150 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 cture large enou
1b160 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69 gh to be used wi
1b170 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 th sqlite3VdbeRe
1b180 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a cordUnpack() if.
1b190 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67 ** the first arg
1b1a0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 ument is a point
1b1b0 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 er to KeyInfo st
1b1c0 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f ructure pKeyInfo
1b1d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 ..**.** The spac
1b1e0 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f e is either allo
1b1f0 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69 cated using sqli
1b200 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 te3DbMallocRaw()
1b210 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a or from within.
1b220 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 ** the unaligned
1b230 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76 buffer passed v
1b240 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e ia the second an
1b250 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 d third argument
1b260 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a s (presumably.**
1b270 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49 stack space). I
1b280 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 f the former, th
1b290 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 en *ppFree is se
1b2a0 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 t to a pointer t
1b2b0 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 hat should.** be
1b2c0 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 eventually free
1b2d0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 d by the caller
1b2e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 using sqlite3DbF
1b2f0 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 ree(). Or, if th
1b300 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e e .** allocation
1b310 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 comes from the
1b320 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62 pSpace/szSpace b
1b330 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69 uffer, *ppFree i
1b340 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a s set to NULL.**
1b350 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e before returnin
1b360 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f g..**.** If an O
1b370 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c OM error occurs,
1b380 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 NULL is returne
1b390 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 d..*/.UnpackedRe
1b3a0 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62 cord *sqlite3Vdb
1b3b0 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 eAllocUnpackedRe
1b3c0 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 cord(. KeyInfo
1b3d0 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 *pKeyInfo
1b3e0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72 /* Descr
1b3f0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 iption of the re
1b400 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 cord */.){. Unp
1b410 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 ackedRecord *p;
1b420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1b430 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 Unpacked record
1b440 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 to return */. i
1b450 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 nt nByte;
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1b470 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 * Number of byte
1b480 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a s required for *
1b490 70 20 2a 2f 0a 20 20 6e 42 79 74 65 20 3d 20 52 p */. nByte = R
1b4a0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 OUND8(sizeof(Unp
1b4b0 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 ackedRecord)) +
1b4c0 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 sizeof(Mem)*(pKe
1b4d0 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 6c 64 yInfo->nKeyField
1b4e0 2b 31 29 3b 0a 20 20 70 20 3d 20 28 55 6e 70 61 +1);. p = (Unpa
1b4f0 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c ckedRecord *)sql
1b500 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 ite3DbMallocRaw(
1b510 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 pKeyInfo->db, nB
1b520 79 74 65 29 3b 0a 20 20 69 66 28 20 21 70 20 29 yte);. if( !p )
1b530 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e return 0;. p->
1b540 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 aMem = (Mem*)&((
1b550 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 char*)p)[ROUND8(
1b560 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 sizeof(UnpackedR
1b570 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 ecord))];. asse
1b580 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 rt( pKeyInfo->aS
1b590 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 ortOrder!=0 );.
1b5a0 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 p->pKeyInfo = p
1b5b0 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 KeyInfo;. p->nF
1b5c0 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d ield = pKeyInfo-
1b5d0 3e 6e 4b 65 79 46 69 65 6c 64 20 2b 20 31 3b 0a >nKeyField + 1;.
1b5e0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f return p;.}../
1b5f0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e *.** Given the n
1b600 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e Key-byte encodin
1b610 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e g of a record in
1b620 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 pKey[], populat
1b630 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b e the .** Unpack
1b640 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 edRecord structu
1b650 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 re indicated by
1b660 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d the fourth argum
1b670 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 ent with the.**
1b680 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 contents of the
1b690 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a decoded record..
1b6a0 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 */ .void sqlite3
1b6b0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b VdbeRecordUnpack
1b6c0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 (. KeyInfo *pKe
1b6d0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e yInfo, /* In
1b6e0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 formation about
1b6f0 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 the record forma
1b700 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c t */. int nKey,
1b710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1b720 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e Size of the bin
1b730 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 ary record */.
1b740 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
1b750 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 , /* The bi
1b760 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 nary record */.
1b770 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
1b780 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c *p /* Popul
1b790 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 ate this structu
1b7a0 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e re before return
1b7b0 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e ing. */.){. con
1b7c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
1b7d0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 *aKey = (const
1b7e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
1b7f0 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a pKey;. int d; .
1b800 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 u32 idx;
1b810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b820 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 /* Offset in a
1b830 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 Key[] to read fr
1b840 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 om */. u16 u;
1b850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b860 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 /* Unsig
1b870 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 ned loop counter
1b880 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b */. u32 szHdr;
1b890 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 . Mem *pMem = p
1b8a0 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 ->aMem;.. p->de
1b8b0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 fault_rc = 0;.
1b8c0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 assert( EIGHT_BY
1b8d0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 TE_ALIGNMENT(pMe
1b8e0 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 m) );. idx = ge
1b8f0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 tVarint32(aKey,
1b900 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a szHdr);. d = sz
1b910 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 Hdr;. u = 0;.
1b920 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 while( idx<szHdr
1b930 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 && d<=nKey ){.
1b940 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 u32 serial_ty
1b950 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 pe;.. idx +=
1b960 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 getVarint32(&aKe
1b970 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 y[idx], serial_t
1b980 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e ype);. pMem->
1b990 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e enc = pKeyInfo->
1b9a0 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 enc;. pMem->d
1b9b0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 b = pKeyInfo->db
1b9c0 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 ;. /* pMem->f
1b9d0 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c lags = 0; // sql
1b9e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 ite3VdbeSerialGe
1b9f0 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 t() will set thi
1ba00 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 s for us */.
1ba10 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d pMem->szMalloc =
1ba20 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 0;. pMem->z
1ba30 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 = 0;. d += sq
1ba40 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 lite3VdbeSerialG
1ba50 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 et(&aKey[d], ser
1ba60 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b ial_type, pMem);
1ba70 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 . pMem++;.
1ba80 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e if( (++u)>=p->n
1ba90 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 Field ) break;.
1baa0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d }. assert( u<=
1bab0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 pKeyInfo->nKeyFi
1bac0 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e eld + 1 );. p->
1bad0 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 nField = u;.}..#
1bae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
1baf0 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 UG./*.** This fu
1bb00 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 nction compares
1bb10 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 two index or tab
1bb20 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 le record keys i
1bb30 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a n the same way.*
1bb40 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 * as the sqlite3
1bb50 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
1bb60 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c e() routine. Unl
1bb70 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f ike VdbeRecordCo
1bb80 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 mpare(),.** this
1bb90 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 function deseri
1bba0 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 alizes and compa
1bbb0 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 res values using
1bbc0 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 the.** sqlite3V
1bbd0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 dbeSerialGet() a
1bbe0 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d nd sqlite3MemCom
1bbf0 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 pare() functions
1bc00 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 . It is used.**
1bc10 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 in assert() stat
1bc20 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 ements to ensure
1bc30 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 that the optimi
1bc40 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 zed code in.** s
1bc50 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 qlite3VdbeRecord
1bc60 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e Compare() return
1bc70 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 s results with t
1bc80 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 hese two primiti
1bc90 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 ves..**.** Retur
1bca0 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 n true if the re
1bcb0 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 sult of comparis
1bcc0 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 on is equivalent
1bcd0 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c to desiredResul
1bce0 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c t..** Return fal
1bcf0 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 se if there is a
1bd00 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a disagreement..*
1bd10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 /.static int vdb
1bd20 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 eRecordCompareDe
1bd30 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 bug(. int nKey1
1bd40 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b , const void *pK
1bd50 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 ey1, /* Left key
1bd60 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 */. const Unpa
1bd70 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 ckedRecord *pPKe
1bd80 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 y2, /* Right key
1bd90 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 */. int desire
1bda0 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 dResult
1bdb0 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 /* Correct a
1bdc0 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 nswer */.){. u3
1bdd0 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 2 d1;
1bde0 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 /* Offset into
1bdf0 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 aKey[] of next d
1be00 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 ata element */.
1be10 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 u32 idx1;
1be20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e /* Offset in
1be30 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 to aKey[] of nex
1be40 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 t header element
1be50 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 */. u32 szHdr1
1be60 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 ; /* Numb
1be70 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 er of bytes in h
1be80 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 eader */. int i
1be90 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d = 0;. int rc =
1bea0 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 0;. const unsi
1beb0 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 gned char *aKey1
1bec0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e = (const unsign
1bed0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b ed char *)pKey1;
1bee0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 . KeyInfo *pKey
1bef0 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 Info;. Mem mem1
1bf00 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 ;.. pKeyInfo =
1bf10 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f pPKey2->pKeyInfo
1bf20 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f ;. if( pKeyInfo
1bf30 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e ->db==0 ) return
1bf40 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 1;. mem1.enc =
1bf50 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a pKeyInfo->enc;.
1bf60 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 mem1.db = pKey
1bf70 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d Info->db;. /* m
1bf80 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 em1.flags = 0;
1bf90 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 // Will be initi
1bfa0 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 alized by sqlite
1bfb0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 3VdbeSerialGet()
1bfc0 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 */. VVA_ONLY(
1bfd0 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 mem1.szMalloc =
1bfe0 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 0; ) /* Only nee
1bff0 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 ded by assert()
1c000 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 statements */..
1c010 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 /* Compilers ma
1c020 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 y complain that
1c030 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 mem1.u.i is pote
1c040 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 ntially uninitia
1c050 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 lized.. ** We c
1c060 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 ould initialize
1c070 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 it, as shown her
1c080 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 e, to silence th
1c090 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a ose complaints..
1c0a0 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 ** But in fact
1c0b0 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 , mem1.u.i will
1c0c0 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 never actually b
1c0d0 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c e used uninitial
1c0e0 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 ized, and doing
1c0f0 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 . ** the unnece
1c100 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 ssary initializa
1c110 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 tion has a measu
1c120 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 rable negative p
1c130 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 erformance. **
1c140 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 impact, since th
1c150 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 is routine is a
1c160 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 very high runner
1c170 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 . And so, we ch
1c180 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e oose. ** to ign
1c190 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 ore the compiler
1c1a0 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 warnings and le
1c1b0 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c ave this variabl
1c1c0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e e uninitialized.
1c1d0 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 . */. /* mem1
1c1e0 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f .u.i = 0; // no
1c1f0 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 t needed, here t
1c200 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c o silence compil
1c210 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 er warning */.
1c220 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 . idx1 = getVar
1c230 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 int32(aKey1, szH
1c240 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 dr1);. if( szHd
1c250 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 r1>98307 ) retur
1c260 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 n SQLITE_CORRUPT
1c270 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b ;. d1 = szHdr1;
1c280 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 . assert( pKeyI
1c290 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d nfo->nAllField>=
1c2a0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c pPKey2->nField |
1c2b0 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a | CORRUPT_DB );.
1c2c0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e assert( pKeyIn
1c2d0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d fo->aSortOrder!=
1c2e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
1c2f0 4b 65 79 49 6e 66 6f 2d 3e 6e 4b 65 79 46 69 65 KeyInfo->nKeyFie
1c300 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 ld>0 );. assert
1c310 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c ( idx1<=szHdr1 |
1c320 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a | CORRUPT_DB );.
1c330 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 do{. u32 se
1c340 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 rial_type1;..
1c350 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72 /* Read the ser
1c360 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68 ial types for th
1c370 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 e next element i
1c380 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 n each key. */.
1c390 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61 idx1 += getVa
1c3a0 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64 rint32( aKey1+id
1c3b0 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 x1, serial_type1
1c3c0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 );.. /* Veri
1c3d0 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73 fy that there is
1c3e0 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63 enough key spac
1c3f0 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 e remaining to a
1c400 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 void. ** a bu
1c410 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20 ffer overread.
1c420 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 The "d1+serial_t
1c430 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65 ype1+2" subexpre
1c440 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a ssion will. *
1c450 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61 * always be grea
1c460 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 ter than or equa
1c470 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 l to the amount
1c480 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20 of required key
1c490 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 space.. ** Us
1c4a0 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61 e that approxima
1c4b0 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 tion to avoid th
1c4c0 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65 e more expensive
1c4d0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 call to. **
1c4e0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
1c4f0 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 lTypeLen() in th
1c500 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 e common case..
1c510 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 */. if( d1
1c520 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e +serial_type1+2>
1c530 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 (u32)nKey1.
1c540 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62 && d1+sqlite3Vdb
1c550 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 eSerialTypeLen(s
1c560 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 erial_type1)>(u3
1c570 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 2)nKey1 . ){.
1c580 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
1c590 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 }.. /* Extra
1c5a0 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f ct the values to
1c5b0 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 be compared..
1c5c0 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 */. d1 += s
1c5d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
1c5e0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 Get(&aKey1[d1],
1c5f0 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d serial_type1, &m
1c600 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f em1);.. /* Do
1c610 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a the comparison.
1c620 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 */. rc =
1c630 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 sqlite3MemCompar
1c640 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 e(&mem1, &pPKey2
1c650 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 ->aMem[i], pKeyI
1c660 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a nfo->aColl[i]);.
1c670 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b if( rc!=0 ){
1c680 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d . assert( m
1c690 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 em1.szMalloc==0
1c6a0 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 ); /* See comme
1c6b0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 nt below */.
1c6c0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e if( pKeyInfo->
1c6d0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b aSortOrder[i] ){
1c6e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 . rc = -r
1c6f0 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 c; /* Invert th
1c700 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53 e result for DES
1c710 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f C sort order. */
1c720 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 . }. g
1c730 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65 oto debugCompare
1c740 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 End;. }. i
1c750 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 ++;. }while( id
1c760 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 x1<szHdr1 && i<p
1c770 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b PKey2->nField );
1c780 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 .. /* No memory
1c790 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 allocation is e
1c7a0 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 ver used on mem1
1c7b0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 . Prove this us
1c7c0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c ing. ** the fol
1c7d0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e lowing assert().
1c7e0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28 If the assert(
1c7f0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 ) fails, it indi
1c800 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d cates a. ** mem
1c810 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e ory leak and a n
1c820 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 eed to call sqli
1c830 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
1c840 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 e(&mem1).. */.
1c850 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a assert( mem1.sz
1c860 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 Malloc==0 );..
1c870 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 /* rc==0 here me
1c880 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 ans that one of
1c890 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 the keys ran out
1c8a0 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 of fields and.
1c8b0 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c ** all the fiel
1c8c0 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f ds up to that po
1c8d0 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 int were equal.
1c8e0 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 Return the defau
1c8f0 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 lt_rc. ** value
1c900 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b . */. rc = pPK
1c910 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b ey2->default_rc;
1c920 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e ..debugCompareEn
1c930 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 d:. if( desired
1c940 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d Result==0 && rc=
1c950 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 =0 ) return 1;.
1c960 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 if( desiredResu
1c970 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72 lt<0 && rc<0 ) r
1c980 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 eturn 1;. if( d
1c990 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26 esiredResult>0 &
1c9a0 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20 & rc>0 ) return
1c9b0 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 1;. if( CORRUPT
1c9c0 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a _DB ) return 1;.
1c9d0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e if( pKeyInfo->
1c9e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
1c9f0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 ) return 1;. r
1ca00 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 eturn 0;.}.#endi
1ca10 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 f..#ifdef SQLITE
1ca20 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 _DEBUG./*.** Cou
1ca30 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 nt the number of
1ca40 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 fields (a.k.a.
1ca50 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 columns) in the
1ca60 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a record given by.
1ca70 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 ** pKey,nKey. T
1ca80 68 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 he verify that t
1ca90 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 his count is les
1caa0 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 s than or equal
1cab0 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 to the.** limit
1cac0 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 given by pKeyInf
1cad0 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 2e 0a 2a 2a o->nAllField..**
1cae0 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 .** If this cons
1caf0 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 traint is not sa
1cb00 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e tisfied, it mean
1cb10 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d s that the high-
1cb20 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 speed.** vdbeRec
1cb30 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 ordCompareInt()
1cb40 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f and vdbeRecordCo
1cb50 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f mpareString() ro
1cb60 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e utines will.** n
1cb70 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c ot work correctl
1cb80 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65 y. If this asse
1cb90 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c rt() ever fires,
1cba0 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 it probably mea
1cbb0 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b ns.** that the K
1cbc0 65 79 49 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 eyInfo.nKeyField
1cbd0 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 41 6c 6c or KeyInfo.nAll
1cbe0 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 Field values wer
1cbf0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e e computed.** in
1cc00 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 correctly..*/.st
1cc10 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 atic void vdbeAs
1cc20 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 sertFieldCountWi
1cc30 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e thinLimits(. in
1cc40 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f t nKey, const vo
1cc50 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 id *pKey, /* T
1cc60 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 he record to ver
1cc70 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 ify */ . const
1cc80 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 KeyInfo *pKeyInf
1cc90 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 o /* Compa
1cca0 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 re size with thi
1ccb0 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a s KeyInfo */.){.
1ccc0 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 int nField = 0
1ccd0 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 ;. u32 szHdr;.
1cce0 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 u32 idx;. u32
1ccf0 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 notUsed;. const
1cd00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1cd10 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e aKey = (const un
1cd20 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 signed char*)pKe
1cd30 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 y;.. if( CORRUP
1cd40 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 T_DB ) return;.
1cd50 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 idx = getVarint
1cd60 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 32(aKey, szHdr);
1cd70 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e . assert( nKey>
1cd80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
1cd90 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 szHdr<=(u32)nKey
1cda0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 );. while( idx
1cdb0 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 <szHdr ){. id
1cdc0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 x += getVarint32
1cdd0 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 (aKey+idx, notUs
1cde0 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b ed);. nField+
1cdf0 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 +;. }. assert(
1ce00 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 nField <= pKeyI
1ce10 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 20 29 nfo->nAllField )
1ce20 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 ;.}.#else.# defi
1ce30 6e 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65 ne vdbeAssertFie
1ce40 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d ldCountWithinLim
1ce50 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 its(A,B,C).#endi
1ce60 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 f../*.** Both *p
1ce70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 Mem1 and *pMem2
1ce80 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 contain string v
1ce90 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 alues. Compare t
1cea0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a he two values.**
1ceb0 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 using the colla
1cec0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 tion sequence pC
1ced0 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 oll. As usual, r
1cee0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 eturn a negative
1cef0 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f , zero.** or po
1cf00 73 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 sitive value if
1cf10 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 *pMem1 is less t
1cf20 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 han, equal to or
1cf30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a greater than .*
1cf40 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 * *pMem2, respec
1cf50 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 tively. Similar
1cf60 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 in spirit to "rc
1cf70 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a = (*pMem1) - (*
1cf80 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 pMem2);"..*/.sta
1cf90 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 tic int vdbeComp
1cfa0 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 areMemString(.
1cfb0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 const Mem *pMem1
1cfc0 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 ,. const Mem *p
1cfd0 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f Mem2,. const Co
1cfe0 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 llSeq *pColl,.
1cff0 75 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 u8 *prcErr
1d000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d010 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 /* If an OOM occ
1d020 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 urs, set to SQLI
1d030 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 TE_NOMEM */.){.
1d040 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d if( pMem1->enc=
1d050 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 =pColl->enc ){.
1d060 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 /* The string
1d070 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e s are already in
1d080 20 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 the correct enc
1d090 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 oding. Call the
1d0a0 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 . ** compari
1d0b0 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 son function dir
1d0c0 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 ectly */. ret
1d0d0 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 urn pColl->xCmp(
1d0e0 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 pColl->pUser,pMe
1d0f0 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 m1->n,pMem1->z,p
1d100 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a Mem2->n,pMem2->z
1d110 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
1d120 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 int rc;. cons
1d130 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b t void *v1, *v2;
1d140 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 . Mem c1;.
1d150 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c Mem c2;. sql
1d160 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 ite3VdbeMemInit(
1d170 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 &c1, pMem1->db,
1d180 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 MEM_Null);. s
1d190 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 qlite3VdbeMemIni
1d1a0 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 t(&c2, pMem1->db
1d1b0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 , MEM_Null);.
1d1c0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
1d1d0 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 hallowCopy(&c1,
1d1e0 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d pMem1, MEM_Ephem
1d1f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 );. sqlite3Vd
1d200 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 beMemShallowCopy
1d210 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d (&c2, pMem2, MEM
1d220 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 _Ephem);. v1
1d230 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 = sqlite3ValueTe
1d240 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 xt((sqlite3_valu
1d250 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 e*)&c1, pColl->e
1d260 6e 63 29 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 nc);. v2 = sq
1d270 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 lite3ValueText((
1d280 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 sqlite3_value*)&
1d290 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b c2, pColl->enc);
1d2a0 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 . if( (v1==0
1d2b0 7c 7c 20 76 32 3d 3d 30 29 20 29 7b 0a 20 20 20 || v2==0) ){.
1d2c0 20 20 20 69 66 28 20 70 72 63 45 72 72 20 29 20 if( prcErr )
1d2d0 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 *prcErr = SQLITE
1d2e0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 _NOMEM_BKPT;.
1d2f0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d rc = 0;. }
1d300 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d else{. rc =
1d310 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f pColl->xCmp(pCo
1d320 6c 6c 2d 3e 70 55 73 65 72 2c 20 63 31 2e 6e 2c ll->pUser, c1.n,
1d330 20 76 31 2c 20 63 32 2e 6e 2c 20 76 32 29 3b 0a v1, c2.n, v2);.
1d340 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
1d350 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
1d360 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 &c1);. sqlite
1d370 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
1d380 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e &c2);. return
1d390 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a rc;. }.}../*.*
1d3a0 2a 20 54 68 65 20 69 6e 70 75 74 20 70 42 6c 6f * The input pBlo
1d3b0 62 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 b is guaranteed
1d3c0 74 6f 20 62 65 20 61 20 42 6c 6f 62 20 74 68 61 to be a Blob tha
1d3d0 74 20 69 73 20 6e 6f 74 20 6d 61 72 6b 65 64 0a t is not marked.
1d3e0 2a 2a 20 77 69 74 68 20 4d 45 4d 5f 5a 65 72 6f ** with MEM_Zero
1d3f0 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 . Return true i
1d400 66 20 69 74 20 63 6f 75 6c 64 20 62 65 20 61 20 f it could be a
1d410 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 zero-blob..*/.st
1d420 61 74 69 63 20 69 6e 74 20 69 73 41 6c 6c 5a 65 atic int isAllZe
1d430 72 6f 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a ro(const char *z
1d440 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 , int n){. int
1d450 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c i;. for(i=0; i<
1d460 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 n; i++){. if(
1d470 20 7a 5b 69 5d 20 29 20 72 65 74 75 72 6e 20 30 z[i] ) return 0
1d480 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 ;. }. return 1
1d490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 ;.}../*.** Compa
1d4a0 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52 re two blobs. R
1d4b0 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 eturn negative,
1d4c0 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 zero, or positiv
1d4d0 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a e if the first.*
1d4e0 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 * is less than,
1d4f0 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 equal to, or gre
1d500 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 ater than the se
1d510 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65 cond, respective
1d520 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c ly..** If one bl
1d530 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f ob is a prefix o
1d540 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65 f the other, the
1d550 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73 n the shorter is
1d560 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a the lessor..*/.
1d570 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f static SQLITE_NO
1d580 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74 INLINE int sqlit
1d590 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f e3BlobCompare(co
1d5a0 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f nst Mem *pB1, co
1d5b0 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 nst Mem *pB2){.
1d5c0 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 6e 31 int c;. int n1
1d5d0 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 = pB1->n;. int
1d5e0 20 6e 32 20 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 n2 = pB2->n;..
1d5f0 20 2f 2a 20 49 74 20 69 73 20 70 6f 73 73 69 62 /* It is possib
1d600 6c 65 20 74 6f 20 68 61 76 65 20 61 20 42 6c 6f le to have a Blo
1d610 62 20 76 61 6c 75 65 20 74 68 61 74 20 68 61 73 b value that has
1d620 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 some non-zero c
1d630 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c ontent. ** foll
1d640 6f 77 65 64 20 62 79 20 7a 65 72 6f 20 63 6f 6e owed by zero con
1d650 74 65 6e 74 2e 20 20 42 75 74 20 74 68 61 74 20 tent. But that
1d660 6f 6e 6c 79 20 63 6f 6d 65 73 20 75 70 20 66 6f only comes up fo
1d670 72 20 42 6c 6f 62 73 20 66 6f 72 6d 65 64 0a 20 r Blobs formed.
1d680 20 2a 2a 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 ** by the OP_Ma
1d690 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2c keRecord opcode,
1d6a0 20 61 6e 64 20 73 75 63 68 20 42 6c 6f 62 73 20 and such Blobs
1d6b0 6e 65 76 65 72 20 67 65 74 20 70 61 73 73 65 64 never get passed
1d6c0 20 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 into. ** sqlit
1d6d0 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 2e 20 e3MemCompare().
1d6e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 42 */. assert( (pB
1d6f0 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 1->flags & MEM_Z
1d700 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 ero)==0 || n1==0
1d710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70 );. assert( (p
1d720 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f B2->flags & MEM_
1d730 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d Zero)==0 || n2==
1d740 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 70 42 31 0 );.. if( (pB1
1d750 2d 3e 66 6c 61 67 73 7c 70 42 32 2d 3e 66 6c 61 ->flags|pB2->fla
1d760 67 73 29 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 gs) & MEM_Zero )
1d770 7b 0a 20 20 20 20 69 66 28 20 70 42 31 2d 3e 66 {. if( pB1->f
1d780 6c 61 67 73 20 26 20 70 42 32 2d 3e 66 6c 61 67 lags & pB2->flag
1d790 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a s & MEM_Zero ){.
1d7a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 return pB1
1d7b0 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 70 42 32 2d ->u.nZero - pB2-
1d7c0 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 >u.nZero;. }e
1d7d0 6c 73 65 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 lse if( pB1->fla
1d7e0 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b gs & MEM_Zero ){
1d7f0 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41 6c . if( !isAl
1d800 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 lZero(pB2->z, pB
1d810 32 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20 2d 2->n) ) return -
1d820 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 1;. return
1d830 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e pB1->u.nZero - n
1d840 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 2;. }else{.
1d850 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 if( !isAllZe
1d860 72 6f 28 70 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e ro(pB1->z, pB1->
1d870 6e 29 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a n) ) return +1;.
1d880 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 31 20 return n1
1d890 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a - pB2->u.nZero;.
1d8a0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 }. }. c =
1d8b0 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 memcmp(pB1->z, p
1d8c0 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e B2->z, n1>n2 ? n
1d8d0 32 20 3a 20 6e 31 29 3b 0a 20 20 69 66 28 20 63 2 : n1);. if( c
1d8e0 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 ) return c;. r
1d8f0 65 74 75 72 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d eturn n1 - n2;.}
1d900 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d ../*.** Do a com
1d910 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 parison between
1d920 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64 20 a 64-bit signed
1d930 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36 34 integer and a 64
1d940 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f -bit floating-po
1d950 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 int.** number.
1d960 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c Return negative,
1d970 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 zero, or positi
1d980 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 20 ve if the first
1d990 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74 68 (i64) is less th
1d9a0 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c an,.** equal to,
1d9b0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e or greater than
1d9c0 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 the second (dou
1d9d0 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 ble)..*/.static
1d9e0 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46 6c int sqlite3IntFl
1d9f0 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20 69 oatCompare(i64 i
1da00 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 , double r){. i
1da10 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f f( sizeof(LONGDO
1da20 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a UBLE_TYPE)>8 ){.
1da30 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 LONGDOUBLE_T
1da40 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 YPE x = (LONGDOU
1da50 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 BLE_TYPE)i;.
1da60 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72 6e if( x<r ) return
1da70 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 -1;. if( x>r
1da80 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 ) return +1;.
1da90 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 return 0;. }e
1daa0 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a lse{. i64 y;.
1dab0 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 double s;.
1dac0 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37 32 if( r<-9223372
1dad0 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20 29 036854775808.0 )
1dae0 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 return +1;.
1daf0 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33 36 if( r>9223372036
1db00 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72 65 854775807.0 ) re
1db10 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d turn -1;. y =
1db20 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66 28 (i64)r;. if(
1db30 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d 31 i<y ) return -1
1db40 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29 7b ;. if( i>y ){
1db50 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53 4d . if( y==SM
1db60 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26 20 ALLEST_INT64 &&
1db70 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d r>0.0 ) return -
1db80 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 1;. return
1db90 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 +1;. }. s
1dba0 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 = (double)i;.
1dbb0 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75 72 if( s<r ) retur
1dbc0 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73 3e n -1;. if( s>
1dbd0 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 r ) return +1;.
1dbe0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
1dbf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 .}../*.** Compar
1dc00 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f 6e e the values con
1dc10 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74 77 tained by the tw
1dc20 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 o memory cells,
1dc30 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 returning.** neg
1dc40 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 ative, zero or p
1dc50 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d 31 ositive if pMem1
1dc60 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
1dc70 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 qual to, or grea
1dc80 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d ter.** than pMem
1dc90 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 2. Sorting order
1dca0 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 is NULL's first
1dcb0 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 , followed by nu
1dcc0 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73 0a mbers (integers.
1dcd0 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73 6f ** and reals) so
1dce0 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 rted numerically
1dcf0 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 , followed by te
1dd00 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74 68 xt ordered by th
1dd10 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 e collating.** s
1dd20 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e equence pColl an
1dd30 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 d finally blob's
1dd40 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d 63 ordered by memc
1dd50 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 mp()..**.** Two
1dd60 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65 20 NULL values are
1dd70 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61 6c considered equal
1dd80 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f by this functio
1dd90 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 n..*/.int sqlite
1dda0 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 3MemCompare(cons
1ddb0 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f t Mem *pMem1, co
1ddc0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 nst Mem *pMem2,
1ddd0 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 const CollSeq *p
1dde0 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c Coll){. int f1,
1ddf0 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 f2;. int combi
1de00 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 ned_flags;.. f1
1de10 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b = pMem1->flags;
1de20 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 . f2 = pMem2->f
1de30 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 lags;. combined
1de40 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a _flags = f1|f2;.
1de50 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62 69 assert( (combi
1de60 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f ned_flags & MEM_
1de70 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a RowSet)==0 );. .
1de80 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 /* If one valu
1de90 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 e is NULL, it is
1dea0 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 6f less than the o
1deb0 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76 61 ther. If both va
1dec0 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 lues. ** are NU
1ded0 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 LL, return 0..
1dee0 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 */. if( combine
1def0 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c d_flags&MEM_Null
1df00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 ){. return (
1df10 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 f2&MEM_Null) - (
1df20 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 f1&MEM_Null);.
1df30 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 }.. /* At least
1df40 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f 20 one of the two
1df50 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d 62 values is a numb
1df60 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f er. */. if( co
1df70 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 mbined_flags&(ME
1df80 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 M_Int|MEM_Real)
1df90 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 ){. if( (f1 &
1dfa0 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d f2 & MEM_Int)!=
1dfb0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 0 ){. if( p
1dfc0 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d Mem1->u.i < pMem
1dfd0 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2->u.i ) return
1dfe0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d -1;. if( pM
1dff0 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 em1->u.i > pMem2
1e000 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2b ->u.i ) return +
1e010 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 1;. return
1e020 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 0;. }. if(
1e030 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f (f1 & f2 & MEM_
1e040 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 Real)!=0 ){.
1e050 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 if( pMem1->u.r
1e060 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 < pMem2->u.r )
1e070 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 return -1;.
1e080 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 if( pMem1->u.r
1e090 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 > pMem2->u.r ) r
1e0a0 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 eturn +1;.
1e0b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
1e0c0 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f if( (f1&MEM_
1e0d0 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 Int)!=0 ){.
1e0e0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 if( (f2&MEM_Rea
1e0f0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 l)!=0 ){.
1e100 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 return sqlite3I
1e110 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 ntFloatCompare(p
1e120 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 Mem1->u.i, pMem2
1e130 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 ->u.r);. }e
1e140 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 lse{. ret
1e150 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a urn -1;. }.
1e160 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 }. if( (f
1e170 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 1&MEM_Real)!=0 )
1e180 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 {. if( (f2&
1e190 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 MEM_Int)!=0 ){.
1e1a0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 73 return -s
1e1b0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f qlite3IntFloatCo
1e1c0 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 mpare(pMem2->u.i
1e1d0 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 , pMem1->u.r);.
1e1e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
1e1f0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 return -1;.
1e200 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
1e210 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a return +1;. }.
1e220 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c . /* If one val
1e230 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 61 ue is a string a
1e240 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 nd the other is
1e250 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 a blob, the stri
1e260 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a ng is less.. **
1e270 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74 72 If both are str
1e280 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 ings, compare us
1e290 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e ing the collatin
1e2a0 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a g functions.. *
1e2b0 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 /. if( combined
1e2c0 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 _flags&MEM_Str )
1e2d0 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 {. if( (f1 &
1e2e0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 MEM_Str)==0 ){.
1e2f0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 return 1;.
1e300 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 32 }. if( (f2
1e310 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 & MEM_Str)==0 )
1e320 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d {. return -
1e330 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 1;. }.. as
1e340 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 sert( pMem1->enc
1e350 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 ==pMem2->enc ||
1e360 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f pMem1->db->mallo
1e370 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 cFailed );. a
1e380 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e ssert( pMem1->en
1e390 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c c==SQLITE_UTF8 |
1e3a0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 | . p
1e3b0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 Mem1->enc==SQLIT
1e3c0 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 E_UTF16LE || pMe
1e3d0 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f m1->enc==SQLITE_
1e3e0 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 UTF16BE );..
1e3f0 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e /* The collation
1e400 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20 62 sequence must b
1e410 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68 69 e defined at thi
1e420 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 s point, even if
1e430 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65 72 . ** the user
1e440 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f 6c deletes the col
1e450 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 lation sequence
1e460 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20 70 after the vdbe p
1e470 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a rogram is. **
1e480 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73 20 compiled (this
1e490 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 was not always t
1e4a0 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f he case).. */
1e4b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 43 . assert( !pC
1e4c0 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 oll || pColl->xC
1e4d0 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 mp );.. if( p
1e4e0 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 Coll ){. re
1e4f0 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 turn vdbeCompare
1e500 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c MemString(pMem1,
1e510 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 pMem2, pColl, 0
1e520 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 );. }. /*
1e530 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 If a NULL pointe
1e540 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73 20 r was passed as
1e550 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 the collate func
1e560 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 tion, fall throu
1e570 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 gh. ** to the
1e580 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20 75 blob case and u
1e590 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f se memcmp(). */
1e5a0 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 . }. . /* Both
1e5b0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20 values must be
1e5c0 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 blobs. Compare
1e5d0 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 using memcmp().
1e5e0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71 6c */. return sql
1e5f0 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 ite3BlobCompare(
1e600 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d pMem1, pMem2);.}
1e610 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 .../*.** The fir
1e620 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 st argument pass
1e630 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 ed to this funct
1e640 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c 2d ion is a serial-
1e650 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 type that.** cor
1e660 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 responds to an i
1e670 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c nteger - all val
1e680 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e ues between 1 an
1e690 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a d 9 inclusive .*
1e6a0 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65 20 * except 7. The
1e6b0 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f second points to
1e6c0 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 a buffer contai
1e6d0 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72 20 ning an integer
1e6e0 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 value.** seriali
1e6f0 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f zed according to
1e700 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 serial_type. Th
1e710 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 is function dese
1e720 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 rializes.** and
1e730 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 returns the valu
1e740 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 e..*/.static i64
1e750 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f 64 vdbeRecordDecod
1e760 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c 5f eInt(u32 serial_
1e770 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a type, const u8 *
1e780 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a aKey){. u32 y;.
1e790 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 assert( CORRUP
1e7a0 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f T_DB || (serial_
1e7b0 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69 61 type>=1 && seria
1e7c0 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65 72 l_type<=9 && ser
1e7d0 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a ial_type!=7) );.
1e7e0 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c switch( serial
1e7f0 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 _type ){. cas
1e800 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31 3a e 0:. case 1:
1e810 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 . testcase(
1e820 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b aKey[0]&0x80 );
1e830 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f 4e . return ON
1e840 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 E_BYTE_INT(aKey)
1e850 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20 20 ;. case 2:.
1e860 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b testcase( aK
1e870 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 ey[0]&0x80 );.
1e880 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 return TWO_B
1e890 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 YTE_INT(aKey);.
1e8a0 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20 20 case 3:.
1e8b0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b testcase( aKey[
1e8c0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 0]&0x80 );.
1e8d0 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42 59 return THREE_BY
1e8e0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 TE_INT(aKey);.
1e8f0 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 case 4: {.
1e900 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 testcase( aKey
1e910 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 [0]&0x80 );.
1e920 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f y = FOUR_BYTE_
1e930 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 UINT(aKey);.
1e940 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 return (i64)*(
1e950 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 int*)&y;. }.
1e960 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 case 5: {.
1e970 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 testcase( aKe
1e980 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 y[0]&0x80 );.
1e990 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 return FOUR_B
1e9a0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 YTE_UINT(aKey+2)
1e9b0 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 + (((i64)1)<<32
1e9c0 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 )*TWO_BYTE_INT(a
1e9d0 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Key);. }.
1e9e0 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 case 6: {.
1e9f0 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 u64 x = FOUR_BYT
1ea00 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 E_UINT(aKey);.
1ea10 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b testcase( aK
1ea20 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 ey[0]&0x80 );.
1ea30 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 x = (x<<32)
1ea40 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 | FOUR_BYTE_UINT
1ea50 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 (aKey+4);.
1ea60 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 36 return (i64)*(i6
1ea70 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 4*)&x;. }. }
1ea80 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 .. return (seri
1ea90 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a al_type - 8);.}.
1eaa0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 ./*.** This func
1eab0 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 tion compares th
1eac0 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 e two table rows
1ead0 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72 64 or index record
1eae0 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 s.** specified b
1eaf0 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d y {nKey1, pKey1}
1eb00 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49 74 and pPKey2. It
1eb10 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 returns a negat
1eb20 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 ive, zero.** or
1eb30 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65 72 positive integer
1eb40 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73 73 if key1 is less
1eb50 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 than, equal to
1eb60 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 or .** greater t
1eb70 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20 7b han key2. The {
1eb80 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 nKey1, pKey1} ke
1eb90 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f 62 y must be a blob
1eba0 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74 .** created by t
1ebb0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 he OP_MakeRecord
1ebc0 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20 56 opcode of the V
1ebd0 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79 32 DBE. The pPKey2
1ebe0 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65 20 .** key must be
1ebf0 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75 63 a parsed key suc
1ec00 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 h as obtained fr
1ec10 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 om.** sqlite3Vdb
1ec20 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a eParseRecord..**
1ec30 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20 .** If argument
1ec40 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 bSkip is non-zer
1ec50 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 o, it is assumed
1ec60 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 that the caller
1ec70 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 has already.**
1ec80 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 determined that
1ec90 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 the first fields
1eca0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72 65 of the keys are
1ecb0 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 equal..**.** Ke
1ecc0 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e y1 and Key2 do n
1ecd0 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 ot have to conta
1ece0 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 in the same numb
1ecf0 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 er of fields. If
1ed00 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 all .** fields
1ed10 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20 62 that appear in b
1ed20 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71 75 oth keys are equ
1ed30 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32 2d al, then pPKey2-
1ed40 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20 0a >default_rc is .
1ed50 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a ** returned..**.
1ed60 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20 63 ** If database c
1ed70 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69 73 orruption is dis
1ed80 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50 4b covered, set pPK
1ed90 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 ey2->errCode to
1eda0 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 .** SQLITE_CORRU
1edb0 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30 2e PT and return 0.
1edc0 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 If an OOM error
1edd0 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c is encountered,
1ede0 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 .** pPKey2->err
1edf0 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 53 Code is set to S
1ee00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c QLITE_NOMEM and,
1ee10 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 if it is not NU
1ee20 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f LL, the.** mallo
1ee30 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73 65 c-failed flag se
1ee40 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68 61 t on database ha
1ee50 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b ndle (pPKey2->pK
1ee60 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a eyInfo->db)..*/.
1ee70 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 int sqlite3VdbeR
1ee80 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 ecordCompareWith
1ee90 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 Skip(. int nKey
1eea0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 1, const void *p
1eeb0 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 Key1, /* Left
1eec0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 key */. Unpacke
1eed0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c dRecord *pPKey2,
1eee0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 /* Righ
1eef0 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 t key */. int b
1ef00 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20 20 Skip
1ef10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 /* If
1ef20 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65 20 true, skip the
1ef30 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 first field */.)
1ef40 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 {. u32 d1;
1ef50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ef60 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e /* Offset in
1ef70 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 to aKey[] of nex
1ef80 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a t data element *
1ef90 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 /. int i;
1efa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1efb0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 /* Index of
1efc0 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63 6f next field to co
1efd0 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 mpare */. u32 s
1efe0 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20 20 zHdr1;
1eff0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 /* Si
1f000 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65 61 ze of record hea
1f010 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a der in bytes */.
1f020 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 u32 idx1;
1f030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f040 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 /* Offset of f
1f050 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65 61 irst type in hea
1f060 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 der */. int rc
1f070 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
1f080 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 /* Retu
1f090 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 rn value */. Me
1f0a0 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79 32 m *pRhs = pPKey2
1f0b0 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a ->aMem; /*
1f0c0 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20 70 Next field of p
1f0d0 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 PKey2 to compare
1f0e0 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 */. KeyInfo *p
1f0f0 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 KeyInfo = pPKey2
1f100 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f ->pKeyInfo;. co
1f110 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 nst unsigned cha
1f120 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 r *aKey1 = (cons
1f130 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
1f140 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d *)pKey1;. Mem m
1f150 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 em1;.. /* If bS
1f160 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68 65 kip is true, the
1f170 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 n the caller has
1f180 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d 69 already determi
1f190 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 ned that the fir
1f1a0 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d st. ** two elem
1f1b0 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79 73 ents in the keys
1f1c0 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78 20 are equal. Fix
1f1d0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61 63 the various stac
1f1e0 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 k variables so.
1f1f0 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72 6f ** that this ro
1f200 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d utine begins com
1f210 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73 65 paring at the se
1f220 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 cond field. */.
1f230 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 if( bSkip ){.
1f240 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69 64 u32 s1;. id
1f250 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72 69 x1 = 1 + getVari
1f260 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 nt32(&aKey1[1],
1f270 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 s1);. szHdr1
1f280 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 = aKey1[0];.
1f290 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 d1 = szHdr1 + sq
1f2a0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
1f2b0 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 ypeLen(s1);.
1f2c0 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73 2b i = 1;. pRhs+
1f2d0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 +;. }else{.
1f2e0 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 idx1 = getVarint
1f2f0 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 32(aKey1, szHdr1
1f300 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 );. d1 = szHd
1f310 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e 28 r1;. if( d1>(
1f320 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 unsigned)nKey1 )
1f330 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d { . pPKey2-
1f340 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 >errCode = (u8)S
1f350 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1f360 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e PT;. return
1f370 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 0; /* Corrupti
1f380 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 on */. }.
1f390 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 i = 0;. }.. VV
1f3a0 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d A_ONLY( mem1.szM
1f3b0 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 alloc = 0; ) /*
1f3c0 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 Only needed by a
1f3d0 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e ssert() statemen
1f3e0 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 ts */. assert(
1f3f0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f pPKey2->pKeyInfo
1f400 2d 3e 6e 41 6c 6c 46 69 65 6c 64 3e 3d 70 50 4b ->nAllField>=pPK
1f410 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 ey2->nField .
1f420 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 || CORRUPT_D
1f430 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 B );. assert( p
1f440 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1f450 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 >aSortOrder!=0 )
1f460 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 ;. assert( pPKe
1f470 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 4b y2->pKeyInfo->nK
1f480 65 79 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 eyField>0 );. a
1f490 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 ssert( idx1<=szH
1f4a0 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 dr1 || CORRUPT_D
1f4b0 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 B );. do{. u
1f4c0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 32 serial_type;.
1f4d0 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 . /* RHS is a
1f4e0 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 n integer */.
1f4f0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 if( pRhs->flags
1f500 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 & MEM_Int ){.
1f510 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 serial_type
1f520 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 = aKey1[idx1];.
1f530 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 testcase( s
1f540 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 erial_type==12 )
1f550 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 ;. if( seri
1f560 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 al_type>=10 ){.
1f570 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a rc = +1;.
1f580 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
1f590 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 serial_type==0 )
1f5a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d {. rc = -
1f5b0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 1;. }else i
1f5c0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d f( serial_type==
1f5d0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 7 ){. sql
1f5e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 ite3VdbeSerialGe
1f5f0 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 t(&aKey1[d1], se
1f600 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 rial_type, &mem1
1f610 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 );. rc =
1f620 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 -sqlite3IntFloat
1f630 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e Compare(pRhs->u.
1f640 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 i, mem1.u.r);.
1f650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1f660 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62 i64 lhs = vdb
1f670 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 eRecordDecodeInt
1f680 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 (serial_type, &a
1f690 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 Key1[d1]);.
1f6a0 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68 i64 rhs = pRh
1f6b0 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 s->u.i;.
1f6c0 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 if( lhs<rhs ){.
1f6d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 rc = -1
1f6e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 ;. }else
1f6f0 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 if( lhs>rhs ){.
1f700 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 rc = +1
1f710 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
1f720 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
1f730 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f * RHS is real */
1f740 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 . else if( pR
1f750 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f hs->flags & MEM_
1f760 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 Real ){. se
1f770 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 rial_type = aKey
1f780 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 1[idx1];. i
1f790 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d f( serial_type>=
1f7a0 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 10 ){. /*
1f7b0 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32 Serial types 12
1f7c0 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20 or greater are
1f7d0 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 strings and blob
1f7e0 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a s (greater than.
1f7f0 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 ** numbe
1f800 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e rs). Types 10 an
1f810 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74 d 11 are current
1f820 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72 ly "reserved for
1f830 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20 future .
1f840 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20 ** use", so it
1f850 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d doesn't really m
1f860 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72 atter what the r
1f870 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 esults of compar
1f880 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 ing. ** t
1f890 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 hem to numberic
1f8a0 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a values are. */.
1f8b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b rc = +1;
1f8c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
1f8d0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 serial_type==0
1f8e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
1f8f0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b -1;. }else{
1f900 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
1f910 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 VdbeSerialGet(&a
1f920 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c Key1[d1], serial
1f930 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 _type, &mem1);.
1f940 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 if( seria
1f950 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 l_type==7 ){.
1f960 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e if( mem1.
1f970 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b u.r<pRhs->u.r ){
1f980 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 . rc
1f990 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 = -1;.
1f9a0 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 }else if( mem1.u
1f9b0 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a .r>pRhs->u.r ){.
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d rc =
1f9d0 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d +1;. }
1f9e0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
1f9f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 rc = s
1fa00 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f qlite3IntFloatCo
1fa10 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 mpare(mem1.u.i,
1fa20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 pRhs->u.r);.
1fa30 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
1fa40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 }.. /* RHS
1fa50 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 is a string */.
1fa60 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 else if( pRhs
1fa70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 ->flags & MEM_St
1fa80 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 r ){. getVa
1fa90 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 rint32(&aKey1[id
1faa0 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 x1], serial_type
1fab0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 );. testcas
1fac0 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d e( serial_type==
1fad0 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 12 );. if(
1fae0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 serial_type<12 )
1faf0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d {. rc = -
1fb00 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 1;. }else i
1fb10 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 f( !(serial_type
1fb20 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20 & 0x01) ){.
1fb30 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 rc = +1;.
1fb40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1fb50 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 mem1.n = (seri
1fb60 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 al_type - 12) /
1fb70 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 2;. testc
1fb80 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 ase( (d1+mem1.n)
1fb90 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 ==(unsigned)nKey
1fba0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 1 );. tes
1fbb0 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e tcase( (d1+mem1.
1fbc0 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 n+1)==(unsigned)
1fbd0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 nKey1 );.
1fbe0 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 if( (d1+mem1.n)
1fbf0 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 > (unsigned)nKe
1fc00 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 y1 ){.
1fc10 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 pPKey2->errCode
1fc20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 = (u8)SQLITE_COR
1fc30 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 RUPT_BKPT;.
1fc40 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 return 0;
1fc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1fc60 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 Corruption */.
1fc70 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
1fc80 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c pKeyInfo->aColl
1fc90 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 [i] ){.
1fca0 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 mem1.enc = pKey
1fcb0 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 Info->enc;.
1fcc0 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 mem1.db = p
1fcd0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 KeyInfo->db;.
1fce0 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 mem1.flag
1fcf0 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 s = MEM_Str;.
1fd00 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 mem1.z =
1fd10 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 (char*)&aKey1[d1
1fd20 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 ];. rc
1fd30 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d = vdbeCompareMem
1fd40 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20 String(.
1fd50 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 &mem1, pRh
1fd60 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f s, pKeyInfo->aCo
1fd70 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e ll[i], &pPKey2->
1fd80 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20 errCode.
1fd90 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c );. }el
1fda0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e se{. in
1fdb0 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d t nCmp = MIN(mem
1fdc0 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 1.n, pRhs->n);.
1fdd0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 rc = me
1fde0 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c mcmp(&aKey1[d1],
1fdf0 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b pRhs->z, nCmp);
1fe00 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 . if( r
1fe10 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 c==0 ) rc = mem1
1fe20 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 .n - pRhs->n; .
1fe30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
1fe40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
1fe50 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a HS is a blob */.
1fe60 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 else if( pRh
1fe70 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 s->flags & MEM_B
1fe80 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73 lob ){. ass
1fe90 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61 67 ert( (pRhs->flag
1fea0 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 s & MEM_Zero)==0
1feb0 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29 || pRhs->n==0 )
1fec0 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e ;. getVarin
1fed0 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d t32(&aKey1[idx1]
1fee0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a , serial_type);.
1fef0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1ff00 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 serial_type==12
1ff10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 );. if( ser
1ff20 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 ial_type<12 || (
1ff30 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 serial_type & 0x
1ff40 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 01) ){. r
1ff50 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 c = -1;. }e
1ff60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 lse{. int
1ff70 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f nStr = (serial_
1ff80 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a type - 12) / 2;.
1ff90 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
1ffa0 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e ( (d1+nStr)==(un
1ffb0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a signed)nKey1 );.
1ffc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
1ffd0 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 ( (d1+nStr+1)==(
1ffe0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 unsigned)nKey1 )
1fff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 ;. if( (d
20000 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 1+nStr) > (unsig
20010 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 ned)nKey1 ){.
20020 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 pPKey2->e
20030 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c rrCode = (u8)SQL
20040 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
20050 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 ;. retu
20060 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 rn 0;
20070 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 /* Corrupti
20080 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 on */. }e
20090 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c lse if( pRhs->fl
200a0 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 ags & MEM_Zero )
200b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 {. if(
200c0 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73 !isAllZero((cons
200d0 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 t char*)&aKey1[d
200e0 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20 20 1],nStr) ){.
200f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a rc = 1;.
20100 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }else{
20110 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 . rc
20120 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 75 = nStr - pRhs->u
20130 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20 .nZero;.
20140 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 }. }els
20150 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 e{. int
20160 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 nCmp = MIN(nStr
20170 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 , pRhs->n);.
20180 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d rc = memcm
20190 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 p(&aKey1[d1], pR
201a0 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 hs->z, nCmp);.
201b0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
201c0 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 0 ) rc = nStr -
201d0 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 pRhs->n;.
201e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
201f0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 .. /* RHS is
20200 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 null */. else
20210 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 {. serial_t
20220 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 ype = aKey1[idx1
20230 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 ];. rc = (s
20240 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a erial_type!=0);.
20250 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 }.. if( r
20260 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 c!=0 ){. if
20270 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 ( pKeyInfo->aSor
20280 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 tOrder[i] ){.
20290 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 rc = -rc;.
202a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 }. ass
202b0 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 ert( vdbeRecordC
202c0 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 ompareDebug(nKey
202d0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 1, pKey1, pPKey2
202e0 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 , rc) );. a
202f0 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 ssert( mem1.szMa
20300 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 lloc==0 ); /* S
20310 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 ee comment below
20320 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e */. return
20330 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 rc;. }..
20340 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b i++;. pRhs++;
20350 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 . d1 += sqlit
20360 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
20370 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 Len(serial_type)
20380 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 ;. idx1 += sq
20390 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 lite3VarintLen(s
203a0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d erial_type);. }
203b0 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 while( idx1<(uns
203c0 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 igned)szHdr1 &&
203d0 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 i<pPKey2->nField
203e0 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 && d1<=(unsigne
203f0 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a d)nKey1 );.. /*
20400 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 No memory alloc
20410 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 ation is ever us
20420 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f ed on mem1. Pro
20430 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 ve this using.
20440 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** the following
20450 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 assert(). If t
20460 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c he assert() fail
20470 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 s, it indicates
20480 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 a. ** memory le
20490 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f ak and a need to
204a0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 call sqlite3Vdb
204b0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d eMemRelease(&mem
204c0 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 1). */. assert
204d0 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d ( mem1.szMalloc=
204e0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d =0 );.. /* rc==
204f0 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 0 here means tha
20500 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 t one or both of
20510 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 the keys ran ou
20520 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a t of fields and.
20530 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 ** all the fie
20540 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 lds up to that p
20550 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e oint were equal.
20560 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 Return the defa
20570 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 ult_rc. ** valu
20580 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 e. */. assert(
20590 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 CORRUPT_DB .
205a0 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 || vdbeRecor
205b0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b dCompareDebug(nK
205c0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 ey1, pKey1, pPKe
205d0 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 y2, pPKey2->defa
205e0 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 ult_rc) .
205f0 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d || pKeyInfo->db-
20600 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 >mallocFailed.
20610 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 );. pPKey2->eqS
20620 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 een = 1;. retur
20630 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c n pPKey2->defaul
20640 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 t_rc;.}.int sqli
20650 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d te3VdbeRecordCom
20660 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 pare(. int nKey
20670 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 1, const void *p
20680 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 Key1, /* Left
20690 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 key */. Unpacke
206a0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 dRecord *pPKey2
206b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 /* Righ
206c0 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 t key */.){. re
206d0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 turn sqlite3Vdbe
206e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 RecordCompareWit
206f0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 hSkip(nKey1, pKe
20700 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a y1, pPKey2, 0);.
20710 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 }.../*.** This f
20720 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 unction is an op
20730 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 timized version
20740 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 of sqlite3VdbeRe
20750 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a cordCompare() .*
20760 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 * that (a) the f
20770 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 irst field of pP
20780 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 Key2 is an integ
20790 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 er, and (b) the
207a0 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 .** size-of-head
207b0 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 er varint at the
207c0 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 start of (pKey1
207d0 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 /nKey1) fits in
207e0 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 a single.** byte
207f0 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 (i.e. is less t
20800 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 han 128)..**.**
20810 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e To avoid concern
20820 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f s about buffer o
20830 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 verreads, this r
20840 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 outine is only u
20850 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 sed.** on schema
20860 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 s where the maxi
20870 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 mum valid header
20880 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 size is 63 byte
20890 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 s or less..*/.st
208a0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 atic int vdbeRec
208b0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 ordCompareInt(.
208c0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 int nKey1, cons
208d0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f t void *pKey1, /
208e0 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 * Left key */.
208f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a UnpackedRecord *
20900 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a pPKey2 /*
20910 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b Right key */.){
20920 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 . const u8 *aKe
20930 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a y = &((const u8*
20940 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 )pKey1)[*(const
20950 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 u8*)pKey1 & 0x3F
20960 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f ];. int serial_
20970 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 type = ((const u
20980 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 8*)pKey1)[1];.
20990 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 int res;. u32 y
209a0 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 ;. u64 x;. i64
209b0 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a v;. i64 lhs;..
209c0 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c vdbeAssertFiel
209d0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 dCountWithinLimi
209e0 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c ts(nKey1, pKey1,
209f0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 pPKey2->pKeyInf
20a00 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a o);. assert( (*
20a10 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 (u8*)pKey1)<=0x3
20a20 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 F || CORRUPT_DB
20a30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 );. switch( ser
20a40 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 ial_type ){.
20a50 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 case 1: { /* 1-b
20a60 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
20a70 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 er */. lhs
20a80 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 = ONE_BYTE_INT(a
20a90 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 Key);. test
20aa0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 case( lhs<0 );.
20ab0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
20ac0 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 }. case 2: {
20ad0 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 /* 2-byte signed
20ae0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 integer */.
20af0 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 lhs = TWO_BYTE
20b00 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 _INT(aKey);.
20b10 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c testcase( lhs<
20b20 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 0 );. break
20b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
20b40 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 3: { /* 3-byte
20b50 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a signed integer *
20b60 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 /. lhs = TH
20b70 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 REE_BYTE_INT(aKe
20b80 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 y);. testca
20b90 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 se( lhs<0 );.
20ba0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
20bb0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a case 4: { /*
20bc0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 4-byte signed i
20bd0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 nteger */.
20be0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 y = FOUR_BYTE_UI
20bf0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 NT(aKey);.
20c00 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 lhs = (i64)*(int
20c10 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 *)&y;. test
20c20 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 case( lhs<0 );.
20c30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
20c40 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 }. case 5: {
20c50 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 /* 6-byte signed
20c60 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 integer */.
20c70 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 lhs = FOUR_BYT
20c80 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b E_UINT(aKey+2) +
20c90 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a (((i64)1)<<32)*
20ca0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 TWO_BYTE_INT(aKe
20cb0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 y);. testca
20cc0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 se( lhs<0 );.
20cd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
20ce0 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a case 6: { /*
20cf0 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 8-byte signed i
20d00 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 nteger */.
20d10 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 x = FOUR_BYTE_UI
20d20 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 NT(aKey);.
20d30 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f x = (x<<32) | FO
20d40 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 UR_BYTE_UINT(aKe
20d50 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 y+4);. lhs
20d60 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 = *(i64*)&x;.
20d70 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 testcase( lhs
20d80 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 <0 );. brea
20d90 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
20da0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 e 8: . lhs
20db0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b = 0;. break
20dc0 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 ;. case 9:.
20dd0 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 lhs = 1;.
20de0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f break;.. /
20df0 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c * This case coul
20e00 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 d be removed wit
20e10 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 hout changing th
20e20 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e e results of run
20e30 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 ning. ** this
20e40 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 code. Including
20e50 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74 it causes gcc t
20e60 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 o generate a fas
20e70 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 ter switch .
20e80 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 ** statement (si
20e90 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 nce the range of
20ea0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20 switch targets
20eb0 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 now starts at ze
20ec0 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 ro and. ** is
20ed0 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 contiguous) but
20ee0 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 does not cause
20ef0 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f any duplicate co
20f00 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 de to be generat
20f10 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 ed. ** (as gc
20f20 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 c is clever enou
20f30 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 gh to combine th
20f40 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 e two like cases
20f50 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a ). Other . **
20f60 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 compilers might
20f70 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f be similar. */
20f80 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 . case 0: ca
20f90 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 se 7:. retu
20fa0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 rn sqlite3VdbeRe
20fb0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 cordCompare(nKey
20fc0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 1, pKey1, pPKey2
20fd0 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a );.. default:
20fe0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 . return sq
20ff0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 lite3VdbeRecordC
21000 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b ompare(nKey1, pK
21010 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 ey1, pPKey2);.
21020 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d }.. v = pPKey2-
21030 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 >aMem[0].u.i;.
21040 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 if( v>lhs ){.
21050 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 res = pPKey2->r
21060 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 1;. }else if( v
21070 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 <lhs ){. res
21080 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 = pPKey2->r2;.
21090 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 }else if( pPKey2
210a0 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 ->nField>1 ){.
210b0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 /* The first f
210c0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f ields of the two
210d0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e keys are equal.
210e0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 Compare the tra
210f0 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 iling . ** fi
21100 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 elds. */. re
21110 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 s = sqlite3VdbeR
21120 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 ecordCompareWith
21130 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 Skip(nKey1, pKey
21140 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 1, pPKey2, 1);.
21150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 }else{. /* T
21160 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 he first fields
21170 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 of the two keys
21180 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 are equal and th
21190 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c ere are no trail
211a0 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 ing. ** field
211b0 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 s. Return pPKey2
211c0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 ->default_rc in
211d0 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 this case. */.
211e0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e res = pPKey2->
211f0 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 default_rc;.
21200 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d pPKey2->eqSeen =
21210 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 1;. }.. asser
21220 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d t( vdbeRecordCom
21230 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c pareDebug(nKey1,
21240 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 pKey1, pPKey2,
21250 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e res) );. return
21260 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 res;.}../*.** T
21270 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
21280 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 an optimized ver
21290 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 sion of sqlite3V
212a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
212b0 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 () .** that (a)
212c0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 the first field
212d0 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 of pPKey2 is a s
212e0 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 tring, that (b)
212f0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a the first field.
21300 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c ** uses the coll
21310 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 ation sequence B
21320 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 INARY and (c) th
21330 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 at the size-of-h
21340 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a eader varint .**
21350 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 at the start of
21360 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 (pKey1/nKey1) f
21370 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 its in a single
21380 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 byte..*/.static
21390 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f int vdbeRecordCo
213a0 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 mpareString(. i
213b0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 nt nKey1, const
213c0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 void *pKey1, /*
213d0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e Left key */. Un
213e0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 packedRecord *pP
213f0 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 Key2 /* R
21400 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 ight key */.){.
21410 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 const u8 *aKey1
21420 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b = (const u8*)pK
21430 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 ey1;. int seria
21440 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 l_type;. int re
21450 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 s;.. assert( pP
21460 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c Key2->aMem[0].fl
21470 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b ags & MEM_Str );
21480 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 . vdbeAssertFie
21490 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d ldCountWithinLim
214a0 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 its(nKey1, pKey1
214b0 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e , pPKey2->pKeyIn
214c0 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 fo);. getVarint
214d0 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 32(&aKey1[1], se
214e0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 rial_type);. if
214f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 ( serial_type<12
21500 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 ){. res = pP
21510 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f Key2->r1; /
21520 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 * (pKey1/nKey1)
21530 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 is a number or a
21540 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 null */. }else
21550 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 if( !(serial_ty
21560 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 pe & 0x01) ){ .
21570 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d res = pPKey2-
21580 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b >r2; /* (pK
21590 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 ey1/nKey1) is a
215a0 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b blob */. }else{
215b0 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 . int nCmp;.
215c0 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 int nStr;.
215d0 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 int szHdr = aKe
215e0 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 y1[0];.. nStr
215f0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d = (serial_type-
21600 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 12) / 2;. if(
21610 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 (szHdr + nStr)
21620 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 > nKey1 ){.
21630 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 pPKey2->errCode
21640 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f = (u8)SQLITE_CO
21650 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 RRUPT_BKPT;.
21660 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f return 0; /
21670 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a * Corruption */.
21680 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d }. nCmp =
21690 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d MIN( pPKey2->aM
216a0 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b em[0].n, nStr );
216b0 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d . res = memcm
216c0 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c p(&aKey1[szHdr],
216d0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d pPKey2->aMem[0]
216e0 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 .z, nCmp);..
216f0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 if( res==0 ){.
21700 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d res = nStr -
21710 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d pPKey2->aMem[0]
21720 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 .n;. if( re
21730 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 s==0 ){.
21740 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 if( pPKey2->nFie
21750 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 ld>1 ){.
21760 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 res = sqlite3V
21770 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
21780 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 WithSkip(nKey1,
21790 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 pKey1, pPKey2, 1
217a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 );. }else
217b0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 {. res
217c0 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c = pPKey2->defaul
217d0 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 t_rc;.
217e0 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d pPKey2->eqSeen =
217f0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 1;. }.
21800 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 }else if( re
21810 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 s>0 ){. r
21820 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b es = pPKey2->r2;
21830 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
21840 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 res = pPKe
21850 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a y2->r1;. }.
21860 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 }else if( re
21870 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 s>0 ){. res
21880 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 = pPKey2->r2;.
21890 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
218a0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 res = pPKey2->r1
218b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 ;. }. }.. a
218c0 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 ssert( vdbeRecor
218d0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b dCompareDebug(nK
218e0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 ey1, pKey1, pPKe
218f0 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20 y2, res).
21900 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 || CORRUPT_DB.
21910 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e || pPKey2->
21920 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 pKeyInfo->db->ma
21930 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a llocFailed. );.
21940 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
21950 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 ./*.** Return a
21960 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 pointer to an sq
21970 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 lite3VdbeRecordC
21980 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 ompare() compati
21990 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 ble function.**
219a0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d suitable for com
219b0 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 paring serialize
219c0 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 d records to the
219d0 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 unpacked record
219e0 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 passed.** as th
219f0 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e e only argument.
21a00 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 .*/.RecordCompar
21a10 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e e sqlite3VdbeFin
21a20 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 dCompare(Unpacke
21a30 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f dRecord *p){. /
21a40 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f * varintRecordCo
21a50 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 mpareInt() and v
21a60 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 arintRecordCompa
21a70 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 reString() both
21a80 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 assume. ** that
21a90 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 the size-of-hea
21aa0 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 der varint that
21ab0 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74 occurs at the st
21ac0 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f art of each reco
21ad0 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 rd. ** fits in
21ae0 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 a single byte (i
21af0 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 .e. is 127 or le
21b00 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 ss). varintRecor
21b10 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 dCompareInt().
21b20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 ** also assumes
21b30 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 that it is safe
21b40 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 to overread a bu
21b50 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 ffer by at least
21b60 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d the . ** maxim
21b70 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 um possible lega
21b80 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c l header size pl
21b90 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 us 8 bytes. Beca
21ba0 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a use there is. *
21bb0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 * guaranteed to
21bc0 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 be at least 74 (
21bd0 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 but not 136) byt
21be0 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f es of padding fo
21bf0 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a llowing each. *
21c00 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 * buffer passed
21c10 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 to varintRecordC
21c20 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 ompareInt() this
21c30 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e makes it conven
21c40 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d ient to. ** lim
21c50 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 it the size of t
21c60 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 he header to 64
21c70 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 bytes in cases w
21c80 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66 here the first f
21c90 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 ield. ** is an
21ca0 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 integer.. **.
21cb0 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77 ** The easiest w
21cc0 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 ay to enforce th
21cd0 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 is limit is to c
21ce0 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 onsider only rec
21cf0 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 ords with. ** 1
21d00 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 3 fields or less
21d10 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66 . If the first f
21d20 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 ield is an integ
21d30 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 er, the maximum
21d40 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 legal. ** heade
21d50 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 r size is (12*5
21d60 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 + 1 + 1) bytes.
21d70 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 4b 65 */. if( p->pKe
21d80 79 49 6e 66 6f 2d 3e 6e 41 6c 6c 46 69 65 6c 64 yInfo->nAllField
21d90 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 <=13 ){. int
21da0 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b flags = p->aMem[
21db0 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 0].flags;. if
21dc0 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 ( p->pKeyInfo->a
21dd0 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a SortOrder[0] ){.
21de0 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b p->r1 = 1;
21df0 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d . p->r2 = -
21e00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 1;. }else{.
21e10 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a p->r1 = -1;.
21e20 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b p->r2 = 1;
21e30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 . }. if( (
21e40 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 flags & MEM_Int)
21e50 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){. return
21e60 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 vdbeRecordCompa
21e70 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 reInt;. }.
21e80 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 testcase( flags
21e90 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 & MEM_Real );.
21ea0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 testcase( fla
21eb0 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b gs & MEM_Null );
21ec0 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 . testcase( f
21ed0 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 lags & MEM_Blob
21ee0 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 );. if( (flag
21ef0 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 s & (MEM_Real|ME
21f00 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 M_Null|MEM_Blob)
21f10 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 )==0 && p->pKeyI
21f20 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 nfo->aColl[0]==0
21f30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 ){. assert
21f40 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 ( flags & MEM_St
21f50 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 r );. retur
21f60 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 n vdbeRecordComp
21f70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d areString;. }
21f80 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 . }.. return s
21f90 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 qlite3VdbeRecord
21fa0 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a Compare;.}../*.*
21fb0 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 * pCur points at
21fc0 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 an index entry
21fd0 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 created using th
21fe0 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 e OP_MakeRecord
21ff0 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 opcode..** Read
22000 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c the rowid (the l
22010 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 ast field in the
22020 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f record) and sto
22030 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e re it in *rowid.
22040 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 .** Return SQLIT
22050 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 E_OK if everythi
22060 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 ng works, or an
22070 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 error code other
22080 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 wise..**.** pCur
22090 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 might be pointi
220a0 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 ng to text obtai
220b0 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 ned from a corru
220c0 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 pt database file
220d0 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 ..** So the cont
220e0 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 ent cannot be tr
220f0 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f usted. Do appro
22100 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e priate checks on
22110 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f the content..*/
22120 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
22130 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 IdxRowid(sqlite3
22140 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a *db, BtCursor *
22150 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 pCur, i64 *rowid
22160 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 ){. i64 nCellKe
22170 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b y = 0;. int rc;
22180 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 . u32 szHdr;
22190 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
221a0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 the header */.
221b0 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 u32 typeRowid;
221c0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 /* Serial type
221d0 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f of the rowid */
221e0 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b . u32 lenRowid;
221f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 /* Size of
22200 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d the rowid */. M
22210 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 em m, v;.. /* G
22220 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 et the size of t
22230 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 he index entry.
22240 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e Only indices en
22250 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 tries of less.
22260 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 ** than 2GiB are
22270 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 support - anyth
22280 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 ing large must b
22290 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 e database corru
222a0 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 ption.. ** Any
222b0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 corruption is de
222c0 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 tected in sqlite
222d0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 3BtreeParseCellP
222e0 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f tr(), though, so
222f0 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 . ** this code
22300 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d can safely assum
22310 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 e that nCellKey
22320 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a is 32-bits . *
22330 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 /. assert( sqli
22340 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 te3BtreeCursorIs
22350 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 Valid(pCur) );.
22360 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 nCellKey = sqli
22370 74 65 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 te3BtreePayloadS
22380 69 7a 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 ize(pCur);. ass
22390 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 ert( (nCellKey &
223a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 SQLITE_MAX_U32)
223b0 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 ==(u64)nCellKey
223c0 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e );.. /* Read in
223d0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f the complete co
223e0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 ntent of the ind
223f0 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 ex entry */. sq
22400 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 lite3VdbeMemInit
22410 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 (&m, db, 0);. r
22420 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d c = sqlite3VdbeM
22430 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 emFromBtree(pCur
22440 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b , 0, (u32)nCellK
22450 65 79 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 ey, &m);. if( r
22460 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 c ){. return
22470 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 rc;. }.. /* Th
22480 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 e index entry mu
22490 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 st begin with a
224a0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 header size */.
224b0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 (void)getVarint
224c0 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 32((u8*)m.z, szH
224d0 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 dr);. testcase(
224e0 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 szHdr==3 );. t
224f0 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d estcase( szHdr==
22500 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c m.n );. if( unl
22510 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c ikely(szHdr<3 ||
22520 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 (int)szHdr>m.n)
22530 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 ){. goto idx
22540 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f _rowid_corruptio
22550 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 n;. }.. /* The
22560 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 last field of t
22570 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 he index should
22580 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 be an integer -
22590 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 the ROWID.. **
225a0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 Verify that the
225b0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c last entry reall
225c0 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e y is an integer.
225d0 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 */. (void)getV
225e0 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e arint32((u8*)&m.
225f0 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 z[szHdr-1], type
22600 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 Rowid);. testca
22610 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 se( typeRowid==1
22620 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
22630 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a typeRowid==2 );.
22640 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
22650 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 Rowid==3 );. te
22660 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
22670 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 d==4 );. testca
22680 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 se( typeRowid==5
22690 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
226a0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a typeRowid==6 );.
226b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
226c0 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 Rowid==8 );. te
226d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
226e0 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e d==9 );. if( un
226f0 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 likely(typeRowid
22700 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e <1 || typeRowid>
22710 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 9 || typeRowid==
22720 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 7) ){. goto i
22730 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 dx_rowid_corrupt
22740 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f ion;. }. lenRo
22750 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 wid = sqlite3Sma
22760 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 llTypeSizes[type
22770 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 Rowid];. testca
22780 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a se( (u32)m.n==sz
22790 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a Hdr+lenRowid );.
227a0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 if( unlikely((
227b0 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 u32)m.n<szHdr+le
227c0 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 nRowid) ){. g
227d0 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f oto idx_rowid_co
227e0 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 rruption;. }..
227f0 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e /* Fetch the in
22800 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e teger off the en
22810 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 d of the index r
22820 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 ecord */. sqlit
22830 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 e3VdbeSerialGet(
22840 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 (u8*)&m.z[m.n-le
22850 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 nRowid], typeRow
22860 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 id, &v);. *rowi
22870 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c d = v.u.i;. sql
22880 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 ite3VdbeMemRelea
22890 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e se(&m);. return
228a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f SQLITE_OK;.. /
228b0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 * Jump here if d
228c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 atabase corrupti
228d0 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 on is detected a
228e0 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a fter m has been.
228f0 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 ** allocated.
22900 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 Free the m obje
22910 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 ct and return SQ
22920 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f LITE_CORRUPT. */
22930 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 .idx_rowid_corru
22940 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 ption:. testcas
22950 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 e( m.szMalloc!=0
22960 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 );. sqlite3Vdb
22970 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b eMemRelease(&m);
22980 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
22990 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d _CORRUPT_BKPT;.}
229a0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 ../*.** Compare
229b0 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 the key of the i
229c0 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 ndex entry that
229d0 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 cursor pC is poi
229e0 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 nting to against
229f0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 .** the key stri
22a00 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e ng in pUnpacked.
22a10 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 Write into *pR
22a20 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 es a number.** t
22a30 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c hat is negative,
22a40 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 zero, or positi
22a50 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 ve if pC is less
22a60 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c than, equal to,
22a70 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 .** or greater t
22a80 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 han pUnpacked.
22a90 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b Return SQLITE_OK
22aa0 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a on success..**.
22ab0 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 ** pUnpacked is
22ac0 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 either created w
22ad0 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f ithout a rowid o
22ae0 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 r is truncated s
22af0 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 o that it.** omi
22b00 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 ts the rowid at
22b10 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f the end. The ro
22b20 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f wid at the end o
22b30 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 f the index entr
22b40 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 y.** is ignored
22b50 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c as well. Hence,
22b60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e this routine on
22b70 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 ly compares the
22b80 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 prefixes .** of
22b90 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 the keys prior t
22ba0 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 o the final rowi
22bb0 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 d, not the entir
22bc0 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 e key..*/.int sq
22bd0 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 lite3VdbeIdxKeyC
22be0 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 ompare(. sqlite
22bf0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 3 *db,
22c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 /* Da
22c10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
22c20 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f n */. VdbeCurso
22c30 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 r *pC,
22c40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 /* The c
22c50 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 ursor to compare
22c60 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e against */. Un
22c70 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 packedRecord *pU
22c80 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f npacked, /
22c90 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 * Unpacked versi
22ca0 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 on of key */. i
22cb0 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 nt *res
22cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22cd0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d /* Write the com
22ce0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 parison result h
22cf0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 ere */.){. i64
22d00 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 nCellKey = 0;.
22d10 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 int rc;. BtCurs
22d20 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 or *pCur;. Mem
22d30 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 m;.. assert( pC
22d40 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 ->eCurType==CURT
22d50 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 YPE_BTREE );. p
22d60 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 Cur = pC->uc.pCu
22d70 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 rsor;. assert(
22d80 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 sqlite3BtreeCurs
22d90 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 orIsValid(pCur)
22da0 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 );. nCellKey =
22db0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c sqlite3BtreePayl
22dc0 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 oadSize(pCur);.
22dd0 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c /* nCellKey wil
22de0 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 l always be betw
22df0 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 een 0 and 0xffff
22e00 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 ffff because of
22e10 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 the way. ** tha
22e20 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c t btreeParseCell
22e30 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 Ptr() and sqlite
22e40 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 3GetVarint32() a
22e50 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a re implemented *
22e60 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 /. if( nCellKey
22e70 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e <=0 || nCellKey>
22e80 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 0x7fffffff ){.
22e90 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 *res = 0;.
22ea0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
22eb0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a RRUPT_BKPT;. }.
22ec0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d sqlite3VdbeMem
22ed0 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b Init(&m, db, 0);
22ee0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 . rc = sqlite3V
22ef0 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 dbeMemFromBtree(
22f00 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 pCur, 0, (u32)nC
22f10 65 6c 6c 4b 65 79 2c 20 26 6d 29 3b 0a 20 20 69 ellKey, &m);. i
22f20 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 f( rc ){. ret
22f30 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 urn rc;. }. *r
22f40 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 es = sqlite3Vdbe
22f50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e RecordCompare(m.
22f60 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 n, m.z, pUnpacke
22f70 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 d);. sqlite3Vdb
22f80 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b eMemRelease(&m);
22f90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
22fa0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 _OK;.}../*.** Th
22fb0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 is routine sets
22fc0 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 the value to be
22fd0 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 returned by subs
22fe0 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a equent calls to.
22ff0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 ** sqlite3_chang
23000 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 es() on the data
23010 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 base handle 'db'
23020 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 . .*/.void sqlit
23030 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 e3VdbeSetChanges
23040 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e (sqlite3 *db, in
23050 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 t nChange){. as
23060 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 sert( sqlite3_mu
23070 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 tex_held(db->mut
23080 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 ex) );. db->nCh
23090 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a ange = nChange;.
230a0 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e db->nTotalChan
230b0 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d ge += nChange;.}
230c0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c ../*.** Set a fl
230d0 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 ag in the vdbe t
230e0 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 o update the cha
230f0 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e nge counter when
23100 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 it is finalised
23110 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f .** or reset..*/
23120 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
23130 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 eCountChanges(Vd
23140 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 be *v){. v->cha
23150 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a ngeCntOn = 1;.}.
23160 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 ./*.** Mark ever
23170 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 y prepared state
23180 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 ment associated
23190 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 with a database
231a0 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 connection.** as
231b0 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 expired..**.**
231c0 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 An expired state
231d0 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 ment means that
231e0 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 recompilation of
231f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 the statement i
23200 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 s.** recommend.
23210 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 Statements expi
23220 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 re when things h
23230 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 appen that make
23240 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d their.** program
23250 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d s obsolete. Rem
23260 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e oving user-defin
23270 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 ed functions or
23280 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 collating.** seq
23290 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 uences, or chang
232a0 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 ing an authoriza
232b0 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 tion function ar
232c0 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a e the types of.*
232d0 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 * things that ma
232e0 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 ke prepared stat
232f0 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e ements obsolete.
23300 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
23310 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 ExpirePreparedSt
23320 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 atements(sqlite3
23330 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 *db){. Vdbe *p
23340 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e ;. for(p = db->
23350 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 pVdbe; p; p=p->p
23360 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 Next){. p->ex
23370 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d pired = 1;. }.}
23380 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
23390 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f he database asso
233a0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 ciated with the
233b0 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 Vdbe..*/.sqlite3
233c0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 *sqlite3VdbeDb(
233d0 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 Vdbe *v){. retu
233e0 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a rn v->db;.}../*.
233f0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 ** Return the SQ
23400 4c 49 54 45 5f 50 52 45 50 41 52 45 20 66 6c 61 LITE_PREPARE fla
23410 67 73 20 66 6f 72 20 61 20 56 64 62 65 2e 0a 2a gs for a Vdbe..*
23420 2f 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 /.u8 sqlite3Vdbe
23430 50 72 65 70 61 72 65 46 6c 61 67 73 28 56 64 62 PrepareFlags(Vdb
23440 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 e *v){. return
23450 76 2d 3e 70 72 65 70 46 6c 61 67 73 3b 0a 7d 0a v->prepFlags;.}.
23460 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 ./*.** Return a
23470 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 pointer to an sq
23480 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 lite3_value stru
23490 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 cture containing
234a0 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 the value bound
234b0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 .** parameter iV
234c0 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 ar of VM v. Exce
234d0 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 pt, if the value
234e0 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c is an SQL NULL,
234f0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e return .** 0 in
23500 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 stead. Unless it
23510 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 is NULL, apply
23520 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e affinity aff (on
23530 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f e of the SQLITE_
23540 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e AFF_*.** constan
23550 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 ts) to the value
23560 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e before returnin
23570 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 g it..**.** The
23580 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d returned value m
23590 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20 ust be freed by
235a0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 the caller using
235b0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 sqlite3ValueFre
235c0 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f e()..*/.sqlite3_
235d0 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 value *sqlite3Vd
235e0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 beGetBoundValue(
235f0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 Vdbe *v, int iVa
23600 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 r, u8 aff){. as
23610 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a sert( iVar>0 );.
23620 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d if( v ){. M
23630 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 em *pMem = &v->a
23640 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 Var[iVar-1];.
23650 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 2d assert( (v->db-
23660 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f >flags & SQLITE_
23670 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 29 EnableQPSG)==0 )
23680 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d ;. if( 0==(pM
23690 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f em->flags & MEM_
236a0 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 Null) ){. s
236b0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 qlite3_value *pR
236c0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 et = sqlite3Valu
236d0 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 eNew(v->db);.
236e0 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20 if( pRet ){.
236f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
23700 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a beMemCopy((Mem *
23710 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 )pRet, pMem);.
23720 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c sqlite3Val
23730 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28 ueApplyAffinity(
23740 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 pRet, aff, SQLIT
23750 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d E_UTF8);. }
23760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52 . return pR
23770 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 et;. }. }.
23780 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a return 0;.}../*.
23790 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c ** Configure SQL
237a0 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73 variable iVar s
237b0 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61 o that binding a
237c0 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74 new value to it
237d0 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 signals.** to s
237e0 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a qlite3_reoptimiz
237f0 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70 e() that re-prep
23800 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d aring the statem
23810 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a ent may result.*
23820 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75 * in a better qu
23830 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 ery plan..*/.voi
23840 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 d sqlite3VdbeSet
23850 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c Varmask(Vdbe *v,
23860 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73 int iVar){. as
23870 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a sert( iVar>0 );.
23880 20 20 61 73 73 65 72 74 28 20 28 76 2d 3e 64 62 assert( (v->db
23890 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 ->flags & SQLITE
238a0 5f 45 6e 61 62 6c 65 51 50 53 47 29 3d 3d 30 20 _EnableQPSG)==0
238b0 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 3d 33 );. if( iVar>=3
238c0 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 2 ){. v->expm
238d0 61 73 6b 20 7c 3d 20 30 78 38 30 30 30 30 30 30 ask |= 0x8000000
238e0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 0;. }else{.
238f0 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 v->expmask |= ((
23900 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 u32)1 << (iVar-1
23910 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a ));. }.}../*.**
23920 20 43 61 75 73 65 20 61 20 66 75 6e 63 74 69 6f Cause a functio
23930 6e 20 74 6f 20 74 68 72 6f 77 20 61 6e 20 65 72 n to throw an er
23940 72 6f 72 20 69 66 20 69 74 20 77 61 73 20 63 61 ror if it was ca
23950 6c 6c 20 66 72 6f 6d 20 4f 50 5f 50 75 72 65 46 ll from OP_PureF
23960 75 6e 63 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 unc.** rather th
23970 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2e 0a an OP_Function..
23980 2a 2a 0a 2a 2a 20 4f 50 5f 50 75 72 65 46 75 6e **.** OP_PureFun
23990 63 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 c means that the
239a0 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 function must b
239b0 65 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2c e deterministic,
239c0 20 61 6e 64 20 73 68 6f 75 6c 64 0a 2a 2a 20 74 and should.** t
239d0 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 hrow an error if
239e0 20 69 74 20 69 73 20 67 69 76 65 6e 20 69 6e 70 it is given inp
239f0 75 74 73 20 74 68 61 74 20 77 6f 75 6c 64 20 6d uts that would m
23a00 61 6b 65 20 69 74 20 6e 6f 6e 2d 64 65 74 65 72 ake it non-deter
23a10 6d 69 6e 69 73 74 69 63 2e 0a 2a 2a 20 54 68 69 ministic..** Thi
23a20 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 s routine is inv
23a30 6f 6b 65 64 20 62 79 20 64 61 74 65 2f 74 69 6d oked by date/tim
23a40 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 e functions that
23a50 20 75 73 65 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 use non-determi
23a60 6e 69 73 74 69 63 0a 2a 2a 20 66 65 61 74 75 72 nistic.** featur
23a70 65 73 20 73 75 63 68 20 61 73 20 27 6e 6f 77 27 es such as 'now'
23a80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
23a90 4e 6f 74 50 75 72 65 46 75 6e 63 28 73 71 6c 69 NotPureFunc(sqli
23aa0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 te3_context *pCt
23ab0 78 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 x){.#ifdef SQLIT
23ac0 45 5f 45 4e 41 42 4c 45 5f 53 54 41 54 33 5f 4f E_ENABLE_STAT3_O
23ad0 52 5f 53 54 41 54 34 0a 20 20 69 66 28 20 70 43 R_STAT4. if( pC
23ae0 74 78 2d 3e 70 56 64 62 65 3d 3d 30 20 29 20 72 tx->pVdbe==0 ) r
23af0 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a eturn 1;.#endif.
23b00 20 20 69 66 28 20 70 43 74 78 2d 3e 70 56 64 62 if( pCtx->pVdb
23b10 65 2d 3e 61 4f 70 5b 70 43 74 78 2d 3e 69 4f 70 e->aOp[pCtx->iOp
23b20 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 50 75 72 ].opcode==OP_Pur
23b30 65 46 75 6e 63 20 29 7b 0a 20 20 20 20 73 71 6c eFunc ){. sql
23b40 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f ite3_result_erro
23b50 72 28 70 43 74 78 2c 20 0a 20 20 20 20 20 20 20 r(pCtx, .
23b60 22 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 "non-determinist
23b70 69 63 20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 69 ic function in i
23b80 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e 20 ndex expression
23b90 6f 72 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 or CHECK constra
23ba0 69 6e 74 22 2c 0a 20 20 20 20 20 20 20 2d 31 29 int",. -1)
23bb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
23bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a }. return 1;.
23bd0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 }..#ifndef SQLIT
23be0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 E_OMIT_VIRTUALTA
23bf0 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 BLE./*.** Transf
23c00 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 er error message
23c10 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 text from an sq
23c20 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d lite3_vtab.zErrM
23c30 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a sg (text stored.
23c40 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 ** in memory obt
23c50 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 ained from sqlit
23c60 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 e3_malloc) into
23c70 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 a Vdbe.zErrMsg (
23c80 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 text stored.** i
23c90 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 n memory obtaine
23ca0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 d from sqlite3Db
23cb0 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 Malloc)..*/.void
23cc0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f sqlite3VtabImpo
23cd0 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 rtErrmsg(Vdbe *p
23ce0 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a , sqlite3_vtab *
23cf0 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 pVtab){. if( pV
23d00 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a tab->zErrMsg ){.
23d10 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 sqlite3 *db
23d20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c = p->db;. sql
23d30 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
23d40 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 ->zErrMsg);.
23d50 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c p->zErrMsg = sql
23d60 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c ite3DbStrDup(db,
23d70 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 pVtab->zErrMsg)
23d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
23d90 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 ee(pVtab->zErrMs
23da0 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a g);. pVtab->z
23db0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a ErrMsg = 0;. }.
23dc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 }.#endif /* SQLI
23dd0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
23de0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 ABLE */..#ifdef
23df0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 SQLITE_ENABLE_PR
23e00 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a EUPDATE_HOOK../*
23e10 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e .** If the secon
23e20 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f d argument is no
23e30 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 t NULL, release
23e40 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 any allocations
23e50 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 associated .** w
23e60 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 ith the memory c
23e70 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 ells in the p->a
23e80 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 Mem[] array. Als
23e90 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 o free the Unpac
23ea0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 kedRecord.** str
23eb0 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 ucture itself, u
23ec0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 sing sqlite3DbFr
23ed0 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 ee()..**.** This
23ee0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 function is use
23ef0 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b d to free Unpack
23f00 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 edRecord structu
23f10 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 res allocated by
23f20 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 .** the vdbeUnpa
23f30 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 ckRecord() funct
23f40 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 ion found in vdb
23f50 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 eapi.c..*/.stati
23f60 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 c void vdbeFreeU
23f70 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 npacked(sqlite3
23f80 2a 64 62 2c 20 69 6e 74 20 6e 46 69 65 6c 64 2c *db, int nField,
23f90 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
23fa0 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a *p){. if( p ){.
23fb0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 int i;. f
23fc0 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 69 65 6c 64 or(i=0; i<nField
23fd0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 ; i++){. Me
23fe0 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d m *pMem = &p->aM
23ff0 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 em[i];. if(
24000 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 pMem->zMalloc )
24010 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 sqlite3VdbeMemR
24020 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 elease(pMem);.
24030 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 }. sqlite3D
24040 62 46 72 65 65 4e 4e 28 64 62 2c 20 70 29 3b 0a bFreeNN(db, p);.
24050 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 }.}.#endif /*
24060 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 SQLITE_ENABLE_PR
24070 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a EUPDATE_HOOK */.
24080 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
24090 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f NABLE_PREUPDATE_
240a0 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b HOOK./*.** Invok
240b0 65 20 74 68 65 20 70 72 65 2d 75 70 64 61 74 65 e the pre-update
240c0 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69 73 20 69 hook. If this i
240d0 73 20 61 6e 20 55 50 44 41 54 45 20 6f 72 20 44 s an UPDATE or D
240e0 45 4c 45 54 45 20 70 72 65 2d 75 70 64 61 74 65 ELETE pre-update
240f0 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 call,.** then c
24100 75 72 73 6f 72 20 70 61 73 73 65 64 20 61 73 20 ursor passed as
24110 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d the second argum
24120 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 ent should point
24130 20 74 6f 20 74 68 65 20 72 6f 77 20 61 62 6f 75 to the row abou
24140 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70 64 61 74 t.** to be updat
24150 65 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 e or deleted. If
24160 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e the application
24170 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 70 calls sqlite3_p
24180 72 65 75 70 64 61 74 65 5f 6f 6c 64 28 29 2c 0a reupdate_old(),.
24190 2a 2a 20 74 68 65 20 72 65 71 75 69 72 65 64 20 ** the required
241a0 76 61 6c 75 65 20 77 69 6c 6c 20 62 65 20 72 65 value will be re
241b0 61 64 20 66 72 6f 6d 20 74 68 65 20 72 6f 77 20 ad from the row
241c0 74 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74 the cursor point
241d0 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 s to..*/.void sq
241e0 6c 69 74 65 33 56 64 62 65 50 72 65 55 70 64 61 lite3VdbePreUpda
241f0 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62 65 20 2a teHook(. Vdbe *
24200 76 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 v,
24210 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 /* Vdb
24220 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f e pre-update hoo
24230 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 k is invoked by
24240 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 */. VdbeCursor
24250 2a 70 43 73 72 2c 20 20 20 20 20 20 20 20 20 20 *pCsr,
24260 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 74 /* Cursor t
24270 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20 76 61 6c o grab old.* val
24280 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e ues from */. in
24290 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 t op,
242a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
242b0 20 53 51 4c 49 54 45 5f 49 4e 53 45 52 54 2c 20 SQLITE_INSERT,
242c0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 UPDATE or DELETE
242d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
242e0 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20 *zDb,
242f0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 /* Databas
24300 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54 61 62 6c e name */. Tabl
24310 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 e *pTab,
24320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d /* M
24330 6f 64 69 66 69 65 64 20 74 61 62 6c 65 20 2a 2f odified table */
24340 0a 20 20 69 36 34 20 69 4b 65 79 31 2c 20 20 20 . i64 iKey1,
24350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
24360 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6b 65 /* Initial ke
24370 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 y value */. int
24380 20 69 52 65 67 20 20 20 20 20 20 20 20 20 20 20 iReg
24390 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
243a0 52 65 67 69 73 74 65 72 20 66 6f 72 20 6e 65 77 Register for new
243b0 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a .* record */.){.
243c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
243d0 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20 69 4b 65 v->db;. i64 iKe
243e0 79 32 3b 0a 20 20 50 72 65 55 70 64 61 74 65 20 y2;. PreUpdate
243f0 70 72 65 75 70 64 61 74 65 3b 0a 20 20 63 6f 6e preupdate;. con
24400 73 74 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 st char *zTbl =
24410 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 pTab->zName;. s
24420 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 66 tatic const u8 f
24430 61 6b 65 53 6f 72 74 4f 72 64 65 72 20 3d 20 30 akeSortOrder = 0
24440 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d ;.. assert( db-
24450 3e 70 50 72 65 55 70 64 61 74 65 3d 3d 30 20 29 >pPreUpdate==0 )
24460 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 72 65 75 ;. memset(&preu
24470 70 64 61 74 65 2c 20 30 2c 20 73 69 7a 65 6f 66 pdate, 0, sizeof
24480 28 50 72 65 55 70 64 61 74 65 29 29 3b 0a 20 20 (PreUpdate));.
24490 69 66 28 20 48 61 73 52 6f 77 69 64 28 70 54 61 if( HasRowid(pTa
244a0 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4b 65 b)==0 ){. iKe
244b0 79 31 20 3d 20 69 4b 65 79 32 20 3d 20 30 3b 0a y1 = iKey2 = 0;.
244c0 20 20 20 20 70 72 65 75 70 64 61 74 65 2e 70 50 preupdate.pP
244d0 6b 20 3d 20 73 71 6c 69 74 65 33 50 72 69 6d 61 k = sqlite3Prima
244e0 72 79 4b 65 79 49 6e 64 65 78 28 70 54 61 62 29 ryKeyIndex(pTab)
244f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 ;. }else{. i
24500 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 55 50 f( op==SQLITE_UP
24510 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 69 4b DATE ){. iK
24520 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b 69 52 ey2 = v->aMem[iR
24530 65 67 5d 2e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c eg].u.i;. }el
24540 73 65 7b 0a 20 20 20 20 20 20 69 4b 65 79 32 20 se{. iKey2
24550 3d 20 69 4b 65 79 31 3b 0a 20 20 20 20 7d 0a 20 = iKey1;. }.
24560 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 }.. assert( pC
24570 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 sr->nField==pTab
24580 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c ->nCol . |
24590 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d | (pCsr->nField=
245a0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 =pTab->nCol+1 &&
245b0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 op==SQLITE_DELE
245c0 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a TE && iReg==-1).
245d0 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 );.. preupdat
245e0 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 e.v = v;. preup
245f0 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72 date.pCsr = pCsr
24600 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70 ;. preupdate.op
24610 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 = op;. preupda
24620 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65 te.iNewReg = iRe
24630 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b g;. preupdate.k
24640 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a eyinfo.db = db;.
24650 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 preupdate.keyi
24660 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 nfo.enc = ENC(db
24670 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b );. preupdate.k
24680 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 eyinfo.nKeyField
24690 20 3d 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 = pTab->nCol;.
246a0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e preupdate.keyin
246b0 66 6f 2e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 fo.aSortOrder =
246c0 28 75 38 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 (u8*)&fakeSortOr
246d0 64 65 72 3b 0a 20 20 70 72 65 75 70 64 61 74 65 der;. preupdate
246e0 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a .iKey1 = iKey1;.
246f0 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 preupdate.iKey
24700 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 2 = iKey2;. pre
24710 75 70 64 61 74 65 2e 70 54 61 62 20 3d 20 70 54 update.pTab = pT
24720 61 62 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 ab;.. db->pPreU
24730 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 61 pdate = &preupda
24740 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 te;. db->xPreUp
24750 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d dateCallback(db-
24760 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c 20 >pPreUpdateArg,
24770 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 db, op, zDb, zTb
24780 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 l, iKey1, iKey2)
24790 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 ;. db->pPreUpda
247a0 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 te = 0;. sqlite
247b0 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 3DbFree(db, preu
247c0 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a pdate.aRecord);.
247d0 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b vdbeFreeUnpack
247e0 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 ed(db, preupdate
247f0 2e 6b 65 79 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 .keyinfo.nKeyFie
24800 6c 64 2b 31 2c 20 70 72 65 75 70 64 61 74 65 2e ld+1, preupdate.
24810 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 pUnpacked);. vd
24820 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 beFreeUnpacked(d
24830 62 2c 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 b, preupdate.key
24840 69 6e 66 6f 2e 6e 4b 65 79 46 69 65 6c 64 2b 31 info.nKeyField+1
24850 2c 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 , preupdate.pNew
24860 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 Unpacked);. if(
24870 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 preupdate.aNew
24880 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 ){. int i;.
24890 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 for(i=0; i<pCs
248a0 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b r->nField; i++){
248b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 . sqlite3Vd
248c0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 beMemRelease(&pr
248d0 65 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 eupdate.aNew[i])
248e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 ;. }. sqli
248f0 74 65 33 44 62 46 72 65 65 4e 4e 28 64 62 2c 20 te3DbFreeNN(db,
24900 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 3b preupdate.aNew);
24910 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a . }.}.#endif /*
24920 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 SQLITE_ENABLE_P
24930 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f REUPDATE_HOOK */
24940 0a .