0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65 /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 ing:.**.** Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 d not evil..**
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 ive others..**
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69 used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20 ng, destroying,
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20 * a VDBE (or an
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61 "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72 the outside wor
0200: 6c 64 2e 29 20 20 50 72 69 6f 72 0a 2a 2a 20 74 ld.) Prior.** t
0210: 6f 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 37 2c o version 2.8.7,
0220: 20 61 6c 6c 20 74 68 69 73 20 63 6f 64 65 20 77 all this code w
0230: 61 73 20 63 6f 6d 62 69 6e 65 64 20 69 6e 74 6f as combined into
0240: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 the vdbe.c sour
0250: 63 65 20 66 69 6c 65 2e 0a 2a 2a 20 42 75 74 20 ce file..** But
0260: 74 68 61 74 20 66 69 6c 65 20 77 61 73 20 67 65 that file was ge
0270: 74 74 69 6e 67 20 74 6f 6f 20 62 69 67 20 73 6f tting too big so
0280: 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 this subroutine
0290: 73 20 77 65 72 65 20 73 70 6c 69 74 20 6f 75 74 s were split out
02a0: 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 ..*/.#include "s
02b0: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 qliteInt.h".#inc
02c0: 6c 75 64 65 20 22 76 64 62 65 49 6e 74 2e 68 22 lude "vdbeInt.h"
02d0: 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 ..../*.** When d
02e0: 65 62 75 67 67 69 6e 67 20 74 68 65 20 63 6f 64 ebugging the cod
02f0: 65 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 61 e generator in a
0300: 20 73 79 6d 62 6f 6c 69 63 20 64 65 62 75 67 67 symbolic debugg
0310: 65 72 2c 20 6f 6e 65 20 63 61 6e 0a 2a 2a 20 73 er, one can.** s
0320: 65 74 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 et the sqlite3Vd
0330: 62 65 41 64 64 6f 70 54 72 61 63 65 20 74 6f 20 beAddopTrace to
0340: 31 20 61 6e 64 20 61 6c 6c 20 6f 70 63 6f 64 65 1 and all opcode
0350: 73 20 77 69 6c 6c 20 62 65 20 70 72 69 6e 74 65 s will be printe
0360: 64 0a 2a 2a 20 61 73 20 74 68 65 79 20 61 72 65 d.** as they are
0370: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 69 6e added to the in
0380: 73 74 72 75 63 74 69 6f 6e 20 73 74 72 65 61 6d struction stream
0390: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 ..*/.#ifdef SQLI
03a0: 54 45 5f 44 45 42 55 47 0a 69 6e 74 20 73 71 6c TE_DEBUG.int sql
03b0: 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 72 61 ite3VdbeAddopTra
03c0: 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a ce = 0;.#endif..
03d0: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 ./*.** Create a
03e0: 6e 65 77 20 76 69 72 74 75 61 6c 20 64 61 74 61 new virtual data
03f0: 62 61 73 65 20 65 6e 67 69 6e 65 2e 0a 2a 2f 0a base engine..*/.
0400: 56 64 62 65 20 2a 73 71 6c 69 74 65 33 56 64 62 Vdbe *sqlite3Vdb
0410: 65 43 72 65 61 74 65 28 73 71 6c 69 74 65 33 20 eCreate(sqlite3
0420: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b *db){. Vdbe *p;
0430: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 . p = sqlite3Db
0440: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 MallocZero(db, s
0450: 69 7a 65 6f 66 28 56 64 62 65 29 20 29 3b 0a 20 izeof(Vdbe) );.
0460: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 if( p==0 ) retu
0470: 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 rn 0;. p->db =
0480: 64 62 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 db;. if( db->pV
0490: 64 62 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 70 dbe ){. db->p
04a0: 56 64 62 65 2d 3e 70 50 72 65 76 20 3d 20 70 3b Vdbe->pPrev = p;
04b0: 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 78 74 20 . }. p->pNext
04c0: 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 70 = db->pVdbe;. p
04d0: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 64 ->pPrev = 0;. d
04e0: 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b 0a 20 20 b->pVdbe = p;.
04f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f p->magic = VDBE_
0500: 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 MAGIC_INIT;. re
0510: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a turn p;.}../*.**
0520: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 53 51 Remember the SQ
0530: 4c 20 73 74 72 69 6e 67 20 66 6f 72 20 61 20 70 L string for a p
0540: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
0550: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 t..*/.void sqlit
0560: 65 33 56 64 62 65 53 65 74 53 71 6c 28 56 64 62 e3VdbeSetSql(Vdb
0570: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 e *p, const char
0580: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 69 6e 74 20 *z, int n, int
0590: 69 73 50 72 65 70 61 72 65 56 32 29 7b 0a 20 20 isPrepareV2){.
05a0: 61 73 73 65 72 74 28 20 69 73 50 72 65 70 61 72 assert( isPrepar
05b0: 65 56 32 3d 3d 31 20 7c 7c 20 69 73 50 72 65 70 eV2==1 || isPrep
05c0: 61 72 65 56 32 3d 3d 30 20 29 3b 0a 20 20 69 66 areV2==0 );. if
05d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b ( p==0 ) return;
05e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f .#ifdef SQLITE_O
05f0: 4d 49 54 5f 54 52 41 43 45 0a 20 20 69 66 28 20 MIT_TRACE. if(
0600: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72 !isPrepareV2 ) r
0610: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 eturn;.#endif.
0620: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d assert( p->zSql=
0630: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20 =0 );. p->zSql
0640: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 = sqlite3DbStrND
0650: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b up(p->db, z, n);
0660: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56 . p->isPrepareV
0670: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72 2 = (u8)isPrepar
0680: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 eV2;.}../*.** Re
0690: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73 turn the SQL ass
06a0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70 ociated with a p
06b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e repared statemen
06c0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 t.*/.const char
06d0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c *sqlite3_sql(sql
06e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 ite3_stmt *pStmt
06f0: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28 ){. Vdbe *p = (
0700: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20 Vdbe *)pStmt;.
0710: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e return (p && p->
0720: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70 isPrepareV2) ? p
0730: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f ->zSql : 0;.}../
0740: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f *.** Swap all co
0750: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 ntent between tw
0760: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65 o VDBE structure
0770: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 s..*/.void sqlit
0780: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20 e3VdbeSwap(Vdbe
0790: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a *pA, Vdbe *pB){.
07a0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d Vdbe tmp, *pTm
07b0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b p;. char *zTmp;
07c0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64 . assert( pA->d
07d0: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74 b==pB->db );. t
07e0: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 mp = *pA;. *pA
07f0: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 = *pB;. *pB = t
0800: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d mp;. pTmp = pA-
0810: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e >pNext;. pA->pN
0820: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b ext = pB->pNext;
0830: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 . pB->pNext = p
0840: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 Tmp;. pTmp = pA
0850: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 ->pPrev;. pA->p
0860: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 Prev = pB->pPrev
0870: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 ;. pB->pPrev =
0880: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 pTmp;. zTmp = p
0890: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a A->zSql;. pA->z
08a0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a Sql = pB->zSql;.
08b0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d pB->zSql = zTm
08c0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 p;. pB->isPrepa
08d0: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 reV2 = pA->isPre
08e0: 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 69 66 64 65 pareV2;.}..#ifde
08f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f f SQLITE_DEBUG./
0900: 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 61 63 69 6e *.** Turn tracin
0910: 67 20 6f 6e 20 6f 72 20 6f 66 66 0a 2a 2f 0a 76 g on or off.*/.v
0920: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 54 oid sqlite3VdbeT
0930: 72 61 63 65 28 56 64 62 65 20 2a 70 2c 20 46 49 race(Vdbe *p, FI
0940: 4c 45 20 2a 74 72 61 63 65 29 7b 0a 20 20 70 2d LE *trace){. p-
0950: 3e 74 72 61 63 65 20 3d 20 74 72 61 63 65 3b 0a >trace = trace;.
0960: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 }.#endif../*.**
0970: 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e Resize the Vdbe.
0980: 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 aOp array so tha
0990: 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 t it is at least
09a0: 20 6f 6e 65 20 6f 70 20 6c 61 72 67 65 72 20 74 one op larger t
09b0: 68 61 6e 20 0a 2a 2a 20 69 74 20 77 61 73 2e 0a han .** it was..
09c0: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d **.** If an out-
09d0: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 of-memory error
09e0: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73 occurs while res
09f0: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c izing the array,
0a00: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 return.** SQLIT
0a10: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 E_NOMEM. In this
0a20: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61 case Vdbe.aOp a
0a30: 6e 64 20 56 64 62 65 2e 6e 4f 70 41 6c 6c 6f 63 nd Vdbe.nOpAlloc
0a40: 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 remain .** unch
0a50: 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20 73 anged (this is s
0a60: 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 o that any opcod
0a70: 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 es already alloc
0a80: 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 ated can be .**
0a90: 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f correctly deallo
0aa0: 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 cated along with
0ab0: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 the rest of the
0ac0: 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 Vdbe)..*/.stati
0ad0: 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 c int growOpArra
0ae0: 79 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 56 64 y(Vdbe *p){. Vd
0af0: 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 69 6e beOp *pNew;. in
0b00: 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 t nNew = (p->nOp
0b10: 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c Alloc ? p->nOpAl
0b20: 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28 31 30 loc*2 : (int)(10
0b30: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 29 3b 24/sizeof(Op)));
0b40: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 . pNew = sqlite
0b50: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 3DbRealloc(p->db
0b60: 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 , p->aOp, nNew*s
0b70: 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 izeof(Op));. if
0b80: 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d ( pNew ){. p-
0b90: 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 >nOpAlloc = sqli
0ba0: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 te3DbMallocSize(
0bb0: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 2f 73 69 7a p->db, pNew)/siz
0bc0: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 70 2d 3e eof(Op);. p->
0bd0: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a aOp = pNew;. }.
0be0: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f return (pNew ?
0bf0: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c SQLITE_OK : SQL
0c00: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d 0a 0a 2f ITE_NOMEM);.}../
0c10: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 *.** Add a new i
0c20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 nstruction to th
0c30: 65 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 e list of instru
0c40: 63 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 ctions current i
0c50: 6e 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 n the.** VDBE.
0c60: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 Return the addre
0c70: 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e ss of the new in
0c80: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a struction..**.**
0c90: 20 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a Parameters:.**.
0ca0: 2a 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 ** p
0cb0: 20 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f Pointer to
0cc0: 20 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 the VDBE.**.**
0cd0: 20 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 op
0ce0: 20 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f The opcode fo
0cf0: 72 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 r this instructi
0d00: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 on.**.** p1,
0d10: 70 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 p2, p3 Oper
0d20: 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 ands.**.** Use t
0d30: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 he sqlite3VdbeRe
0d40: 73 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e solveLabel() fun
0d50: 63 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 ction to fix an
0d60: 61 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 address and.** t
0d70: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 he sqlite3VdbeCh
0d80: 61 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f angeP4() functio
0d90: 6e 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 n to change the
0da0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a value of the P4.
0db0: 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 ** operand..*/.i
0dc0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
0dd0: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e dOp3(Vdbe *p, in
0de0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e t op, int p1, in
0df0: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 t p2, int p3){.
0e00: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 int i;. VdbeOp
0e10: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d *pOp;.. i = p-
0e20: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 >nOp;. assert(
0e30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
0e40: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 AGIC_INIT );. a
0e50: 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f ssert( op>0 && o
0e60: 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 p<0xff );. if(
0e70: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29 p->nOpAlloc<=i )
0e80: 7b 0a 20 20 20 20 69 66 28 20 67 72 6f 77 4f 70 {. if( growOp
0e90: 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 Array(p) ){.
0ea0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 return 1;.
0eb0: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b }. }. p->nOp++
0ec0: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f ;. pOp = &p->aO
0ed0: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 p[i];. pOp->opc
0ee0: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 ode = (u8)op;.
0ef0: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 pOp->p5 = 0;. p
0f00: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 Op->p1 = p1;. p
0f10: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 Op->p2 = p2;. p
0f20: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 Op->p3 = p3;. p
0f30: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 Op->p4.p = 0;.
0f40: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 pOp->p4type = P4
0f50: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 _NOTUSED;.#ifdef
0f60: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 SQLITE_DEBUG.
0f70: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 pOp->zComment =
0f80: 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 0;. if( sqlite3
0f90: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 VdbeAddopTrace )
0fa0: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e sqlite3VdbePrin
0fb0: 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f tOp(0, i, &p->aO
0fc0: 70 5b 69 5d 29 3b 0a 23 65 6e 64 69 66 0a 23 69 p[i]);.#endif.#i
0fd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c fdef VDBE_PROFIL
0fe0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 E. pOp->cycles
0ff0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 = 0;. pOp->cnt
1000: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 = 0;.#endif. re
1010: 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73 71 turn i;.}.int sq
1020: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 lite3VdbeAddOp0(
1030: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 29 Vdbe *p, int op)
1040: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 {. return sqlit
1050: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 e3VdbeAddOp3(p,
1060: 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a op, 0, 0, 0);.}.
1070: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 int sqlite3VdbeA
1080: 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20 69 ddOp1(Vdbe *p, i
1090: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b 0a nt op, int p1){.
10a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
10b0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 VdbeAddOp3(p, op
10c0: 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 , p1, 0, 0);.}.i
10d0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
10e0: 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69 6e dOp2(Vdbe *p, in
10f0: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e t op, int p1, in
1100: 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e 20 t p2){. return
1110: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
1120: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 3(p, op, p1, p2,
1130: 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 0);.}.../*.** A
1140: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 dd an opcode tha
1150: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 t includes the p
1160: 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 4 value as a poi
1170: 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c nter..*/.int sql
1180: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a ite3VdbeAddOp4(.
1190: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 Vdbe *p,
11a0: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 /* Add the
11b0: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 opcode to this
11c0: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 VM */. int op,
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
11e0: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f he new opcode */
11f0: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 . int p1,
1200: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 /* The P1
1210: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e operand */. in
1220: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 t p2,
1230: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 /* The P2 oper
1240: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c and */. int p3,
1250: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1260: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a The P3 operand *
1270: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a /. const char *
1280: 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 zP4, /* The P
1290: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 4 operand */. i
12a0: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 nt p4type
12b0: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 /* P4 operand
12c0: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e type */.){. in
12d0: 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 t addr = sqlite3
12e0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 VdbeAddOp3(p, op
12f0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 , p1, p2, p3);.
1300: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
1310: 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 geP4(p, addr, zP
1320: 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 4, p4type);. re
1330: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a turn addr;.}../*
1340: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61 .** Add an OP_Pa
1350: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65 rseSchema opcode
1360: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 . This routine
1370: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72 is broken out fr
1380: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 om.** sqlite3Vdb
1390: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20 eAddOp4() since
13a0: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f it needs to also
13b0: 20 6c 6f 63 61 6c 20 61 6c 6c 20 62 74 72 65 65 local all btree
13c0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 s..**.** The zWh
13d0: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 ere string must
13e0: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e have been obtain
13f0: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f ed from sqlite3_
1400: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 malloc()..** Thi
1410: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 s routine will t
1420: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 ake ownership of
1430: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d the allocated m
1440: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 emory..*/.void s
1450: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 qlite3VdbeAddPar
1460: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 seSchemaOp(Vdbe
1470: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 *p, int iDb, cha
1480: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e r *zWhere){. in
1490: 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64 72 20 t j;. int addr
14a0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 = sqlite3VdbeAdd
14b0: 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 Op3(p, OP_ParseS
14c0: 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 chema, iDb, 0, 0
14d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
14e0: 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 ChangeP4(p, addr
14f0: 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e , zWhere, P4_DYN
1500: 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 AMIC);. for(j=0
1510: 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 ; j<p->db->nDb;
1520: 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 j++) sqlite3Vdbe
1530: 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b UsesBtree(p, j);
1540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
1550: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 opcode that inc
1560: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c ludes the p4 val
1570: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 ue as an integer
1580: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
1590: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 VdbeAddOp4Int(.
15a0: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 Vdbe *p,
15b0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 /* Add the
15c0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 opcode to this V
15d0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 M */. int op,
15e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
15f0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a e new opcode */.
1600: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 int p1,
1610: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 /* The P1
1620: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
1630: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 p2,
1640: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 /* The P2 opera
1650: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 nd */. int p3,
1660: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1670: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f he P3 operand */
1680: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 . int p4
1690: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 /* The P4
16a0: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 operand as an i
16b0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 nteger */.){. i
16c0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 nt addr = sqlite
16d0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 3VdbeAddOp3(p, o
16e0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a p, p1, p2, p3);.
16f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 sqlite3VdbeCha
1700: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 ngeP4(p, addr, S
1710: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 QLITE_INT_TO_PTR
1720: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b (p4), P4_INT32);
1730: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a . return addr;.
1740: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 }../*.** Create
1750: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c a new symbolic l
1760: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 abel for an inst
1770: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 ruction that has
1780: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f yet to be.** co
1790: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c ded. The symbol
17a0: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c ic label is real
17b0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 ly just a negati
17c0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a ve number. The.
17d0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 ** label can be
17e0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 used as the P2 v
17f0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 alue of an opera
1800: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 tion. Later, wh
1810: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 en.** the label
1820: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 is resolved to a
1830: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 specific addres
1840: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c s, the VDBE will
1850: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 scan.** through
1860: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c its operation l
1870: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 ist and change a
1880: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 ll values of P2
1890: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 which match.** t
18a0: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 he label into th
18b0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 e resolved addre
18c0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 ss..**.** The VD
18d0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 BE knows that a
18e0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 P2 value is a la
18f0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 bel because labe
1900: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 ls are.** always
1910: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 negative and P2
1920: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 values are supp
1930: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 ose to be non-ne
1940: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 gative..** Hence
1950: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 , a negative P2
1960: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c value is a label
1970: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f that has yet to
1980: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a be resolved..**
1990: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 .** Zero is retu
19a0: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 rned if a malloc
19b0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 () fails..*/.int
19c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 sqlite3VdbeMake
19d0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a Label(Vdbe *p){.
19e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 int i;. i = p
19f0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 ->nLabel++;. as
1a00: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
1a10: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
1a20: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e );. if( i>=p->n
1a30: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 LabelAlloc ){.
1a40: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 int n = p->nLa
1a50: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a belAlloc*2 + 5;.
1a60: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 p->aLabel =
1a70: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 sqlite3DbRealloc
1a80: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d OrFree(p->db, p-
1a90: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 >aLabel,.
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 n*sizeof(p->aLab
1ad0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e el[0]));. p->
1ae0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 nLabelAlloc = sq
1af0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a lite3DbMallocSiz
1b00: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 e(p->db, p->aLab
1b10: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c el)/sizeof(p->aL
1b20: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 abel[0]);. }.
1b30: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b if( p->aLabel ){
1b40: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 . p->aLabel[i
1b50: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 ] = -1;. }. re
1b60: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a turn -1-i;.}../*
1b70: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 .** Resolve labe
1b80: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 l "x" to be the
1b90: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e address of the n
1ba0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 ext instruction
1bb0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 to.** be inserte
1bc0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 d. The paramete
1bd0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 r "x" must have
1be0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 been obtained fr
1bf0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 om.** a prior ca
1c00: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 ll to sqlite3Vdb
1c10: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f eMakeLabel()..*/
1c20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
1c30: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 eResolveLabel(Vd
1c40: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 be *p, int x){.
1c50: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 int j = -1-x;.
1c60: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 assert( p->magi
1c70: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e c==VDBE_MAGIC_IN
1c80: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 IT );. assert(
1c90: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 j>=0 && j<p->nLa
1ca0: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e bel );. if( p->
1cb0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d aLabel ){. p-
1cc0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e >aLabel[j] = p->
1cd0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a nOp;. }.}../*.*
1ce0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 * Mark the VDBE
1cf0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 as one that can
1d00: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 only be run one
1d10: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 time..*/.void sq
1d20: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 lite3VdbeRunOnly
1d30: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 Once(Vdbe *p){.
1d40: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 p->runOnlyOnce
1d50: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 = 1;.}..#ifdef S
1d60: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 QLITE_DEBUG /* s
1d70: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 qlite3AssertMayA
1d80: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a bort() logic */.
1d90: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f ./*.** The follo
1da0: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 wing type and fu
1db0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 nction are used
1dc0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 to iterate throu
1dd0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a gh all opcodes.*
1de0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e * in a Vdbe main
1df0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 program and eac
1e00: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f h of the sub-pro
1e10: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 grams (triggers)
1e20: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f it may .** invo
1e30: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 ke directly or i
1e40: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 ndirectly. It sh
1e50: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 ould be used as
1e60: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 follows:.**.**
1e70: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 Op *pOp;.** V
1e80: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b dbeOpIter sIter;
1e90: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 .**.** memset(
1ea0: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f &sIter, 0, sizeo
1eb0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 f(sIter));.**
1ec0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 sIter.v = v;
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ee0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 // v is
1ef0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a of type Vdbe* .*
1f00: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 * while( (pOp
1f10: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 = opIterNext(&sI
1f20: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 ter)) ){.**
1f30: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 // Do something
1f40: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a with pOp.** }.
1f50: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 ** sqlite3DbFr
1f60: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e ee(v->db, sIter.
1f70: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 apSub);.** .*/.t
1f80: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 ypedef struct Vd
1f90: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 beOpIter VdbeOpI
1fa0: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 ter;.struct Vdbe
1fb0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 OpIter {. Vdbe
1fc0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *v;
1fd0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f /* Vdbe to
1fe0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 iterate through
1ff0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 the opcodes of
2000: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 */. SubProgram
2010: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 **apSub;
2020: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 /* Array of subp
2030: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 rograms */. int
2040: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 nSub;
2050: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
2060: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 r of entries in
2070: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 apSub */. int i
2080: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 Addr;
2090: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 /* Address
20a0: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 of next instruc
20b0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a tion to return *
20c0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 /. int iSub;
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
20e0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 * 0 = main progr
20f0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 am, 1 = first su
2100: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a b-program etc. *
2110: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a /.};.static Op *
2120: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f opIterNext(VdbeO
2130: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 pIter *p){. Vdb
2140: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f e *v = p->v;. O
2150: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f p *pRet = 0;. O
2160: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f p *aOp;. int nO
2170: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 p;.. if( p->iSu
2180: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 b<=p->nSub ){..
2190: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d if( p->iSub==
21a0: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 0 ){. aOp =
21b0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e v->aOp;. n
21c0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 Op = v->nOp;.
21d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f }else{. aO
21e0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e p = p->apSub[p->
21f0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 iSub-1]->aOp;.
2200: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 nOp = p->apS
2210: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e ub[p->iSub-1]->n
2220: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 Op;. }. as
2230: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e sert( p->iAddr<n
2240: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 Op );.. pRet
2250: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d = &aOp[p->iAddr]
2260: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b ;. p->iAddr++
2270: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 ;. if( p->iAd
2280: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 dr==nOp ){.
2290: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 p->iSub++;.
22a0: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a p->iAddr = 0;.
22b0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 }. . if(
22c0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 pRet->p4type==P
22d0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 4_SUBPROGRAM ){.
22e0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 int nByte
22f0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 = (p->nSub+1)*si
2300: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a zeof(SubProgram*
2310: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a );. int j;.
2320: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a for(j=0; j
2330: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a <p->nSub; j++){.
2340: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 if( p->a
2350: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 pSub[j]==pRet->p
2360: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 4.pProgram ) bre
2370: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
2380: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 if( j==p->nSub
2390: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 ){. p->a
23a0: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 pSub = sqlite3Db
23b0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d ReallocOrFree(v-
23c0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e >db, p->apSub, n
23d0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 Byte);. i
23e0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a f( !p->apSub ){.
23f0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d pRet =
2400: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 0;. }els
2410: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e e{. p->
2420: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d apSub[p->nSub++]
2430: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f = pRet->p4.pPro
2440: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a gram;. }.
2450: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
2460: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 }.. return pRet
2470: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b ;.}../*.** Check
2480: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 if the program
2490: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d stored in the VM
24a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
24b0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 pParse may.** t
24c0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 hrow an ABORT ex
24d0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 ception (causing
24e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 the statement,
24f0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 but not entire t
2500: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f ransaction.** to
2510: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 be rolled back)
2520: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e . This condition
2530: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 is true if the
2540: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 main program or
2550: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 any.** sub-progr
2560: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 ams contains any
2570: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
2580: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 g:.**.** * OP
2590: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 _Halt with P1=SQ
25a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 LITE_CONSTRAINT
25b0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e and P2=OE_Abort.
25c0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 .** * OP_Halt
25d0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 IfNull with P1=S
25e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
25f0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 and P2=OE_Abort
2600: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 ..** * OP_Des
2610: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f troy.** * OP_
2620: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 VUpdate.** *
2630: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 OP_VRename.**
2640: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 * OP_FkCounter
2650: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 with P2==0 (imme
2660: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 diate foreign ke
2670: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a y constraint).**
2680: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 .** Then check t
2690: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 hat the value of
26a0: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 Parse.mayAbort
26b0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a is true if an.**
26c0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 ABORT may be th
26d0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f rown, or false o
26e0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e therwise. Return
26f0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 true if it does
2700: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 .** match, or fa
2710: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 lse otherwise. T
2720: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
2730: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 intended to be u
2740: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f sed as.** part o
2750: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 f an assert stat
2760: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d ement in the com
2770: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 piler. Similar t
2780: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 o:.**.** asser
2790: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 t( sqlite3VdbeAs
27a0: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 sertMayAbort(pPa
27b0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 rse->pVdbe, pPar
27c0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b se->mayAbort) );
27d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
27e0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 dbeAssertMayAbor
27f0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d t(Vdbe *v, int m
2800: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 ayAbort){. int
2810: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 hasAbort = 0;.
2820: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f Op *pOp;. VdbeO
2830: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d pIter sIter;. m
2840: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c emset(&sIter, 0,
2850: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b sizeof(sIter));
2860: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a . sIter.v = v;.
2870: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d . while( (pOp =
2880: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 opIterNext(&sIt
2890: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 er))!=0 ){. i
28a0: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d nt opcode = pOp-
28b0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 >opcode;. if(
28c0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 opcode==OP_Dest
28d0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f roy || opcode==O
28e0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 P_VUpdate || opc
28f0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 ode==OP_VRename
2900: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
2910: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 OMIT_FOREIGN_KEY
2920: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 . || (opcode
2930: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 ==OP_FkCounter &
2940: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 & pOp->p1==0 &&
2950: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e pOp->p2==1) .#en
2960: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 dif. || ((op
2970: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c code==OP_Halt ||
2980: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 opcode==OP_Halt
2990: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 IfNull) . &
29a0: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 & (pOp->p1==SQLI
29b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 TE_CONSTRAINT &&
29c0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f pOp->p2==OE_Abo
29d0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 rt)). ){.
29e0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a hasAbort = 1;.
29f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
2a00: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 }. }. sqlite3
2a10: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 DbFree(v->db, sI
2a20: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f ter.apSub);.. /
2a30: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
2a40: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 hasAbort==mayAb
2a50: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c ort. Or if a mal
2a60: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 loc failure occu
2a70: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c red.. ** If mal
2a80: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e loc failed, then
2a90: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f the while() loo
2aa0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 p above may not
2ab0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 have iterated.
2ac0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f ** through all o
2ad0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 pcodes and hasAb
2ae0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 ort may be set i
2af0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 ncorrectly. Retu
2b00: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 rn. ** true for
2b10: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 this case to pr
2b20: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 event the assert
2b30: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 () in the caller
2b40: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f s frame. ** fro
2b50: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 m failing. */.
2b60: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d return ( v->db-
2b70: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c >mallocFailed ||
2b80: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 hasAbort==mayAb
2b90: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 ort );.}.#endif
2ba0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 /* SQLITE_DEBUG
2bb0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 - the sqlite3Ass
2bc0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 ertMayAbort() fu
2bd0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a nction */../*.**
2be0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 Loop through th
2bf0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e e program lookin
2c00: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 g for P2 values
2c10: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 that are negativ
2c20: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 e.** on jump ins
2c30: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 tructions. Each
2c40: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 such value is a
2c50: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 label. Resolve
2c60: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 the.** label by
2c70: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 setting the P2
2c80: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 value to its cor
2c90: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 rect non-zero va
2ca0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 lue..**.** This
2cb0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
2cc0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c d once after all
2cd0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 opcodes have be
2ce0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a en inserted..**.
2cf0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 ** Variable *pMa
2d00: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 xFuncArgs is set
2d10: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 to the maximum
2d20: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 value of any P2
2d30: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 argument .** to
2d40: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 an OP_Function,
2d50: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 OP_AggStep or OP
2d60: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e _VFilter opcode.
2d70: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 This is used by
2d80: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 .** sqlite3Vdbe
2d90: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 MakeReady() to s
2da0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 ize the Vdbe.apA
2db0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a rg[] array..**.*
2dc0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 * The Op.opflags
2dd0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e field is set on
2de0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f all opcodes..*/
2df0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 .static void res
2e00: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 olveP2Values(Vdb
2e10: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 e *p, int *pMaxF
2e20: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 uncArgs){. int
2e30: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 i;. int nMaxArg
2e40: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 s = *pMaxFuncArg
2e50: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 s;. Op *pOp;.
2e60: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d int *aLabel = p-
2e70: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 >aLabel;. p->re
2e80: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f adOnly = 1;. fo
2e90: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d r(pOp=p->aOp, i=
2ea0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 p->nOp-1; i>=0;
2eb0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 i--, pOp++){.
2ec0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 u8 opcode = pOp
2ed0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 ->opcode;.. p
2ee0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 Op->opflags = sq
2ef0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 lite3OpcodePrope
2f00: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 rty[opcode];.
2f10: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f if( opcode==OP_
2f20: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f Function || opco
2f30: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 de==OP_AggStep )
2f40: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d {. if( pOp-
2f50: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e >p5>nMaxArgs ) n
2f60: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 MaxArgs = pOp->p
2f70: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 5;. }else if(
2f80: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 (opcode==OP_Tra
2f90: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d nsaction && pOp-
2fa0: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 >p2!=0) || opcod
2fb0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a e==OP_Vacuum ){.
2fc0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c p->readOnl
2fd0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 y = 0;.#ifndef S
2fe0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 QLITE_OMIT_VIRTU
2ff0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 ALTABLE. }els
3000: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 e if( opcode==OP
3010: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 _VUpdate ){.
3020: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d if( pOp->p2>nM
3030: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 axArgs ) nMaxArg
3040: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 s = pOp->p2;.
3050: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 }else if( opcod
3060: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b e==OP_VFilter ){
3070: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 . int n;.
3080: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e assert( p->n
3090: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 Op - i >= 3 );.
30a0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 assert( pOp
30b0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f [-1].opcode==OP_
30c0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 Integer );.
30d0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b n = pOp[-1].p1;
30e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 . if( n>nMa
30f0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 xArgs ) nMaxArgs
3100: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 = n;.#endif.
3110: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70 }.. if( (pOp
3120: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c ->opflags & OPFL
3130: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f G_JUMP)!=0 && pO
3140: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 p->p2<0 ){.
3150: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d assert( -1-pOp-
3160: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b >p2<p->nLabel );
3170: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d . pOp->p2 =
3180: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e aLabel[-1-pOp->
3190: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 p2];. }. }.
31a0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 sqlite3DbFree(p
31b0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 ->db, p->aLabel)
31c0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 ;. p->aLabel =
31d0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 0;.. *pMaxFuncA
31e0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a rgs = nMaxArgs;.
31f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
3200: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 the address of t
3210: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 he next instruct
3220: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 ion to be insert
3230: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 ed..*/.int sqlit
3240: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 e3VdbeCurrentAdd
3250: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 r(Vdbe *p){. as
3260: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
3270: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
3280: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e );. return p->n
3290: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 Op;.}../*.** Thi
32a0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
32b0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ns a pointer to
32c0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 the array of opc
32d0: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 odes associated
32e0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 with.** the Vdbe
32f0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 passed as the f
3300: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 irst argument. I
3310: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 t is the callers
3320: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a responsibility.
3330: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f ** to arrange fo
3340: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 r the returned a
3350: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 rray to be event
3360: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e ually freed usin
3370: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 g the .** vdbeFr
3380: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 eeOpArray() func
3390: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f tion..**.** Befo
33a0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 re returning, *p
33b0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 nOp is set to th
33c0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 e number of entr
33d0: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 ies in the retur
33e0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c ned.** array. Al
33f0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 so, *pnMaxArg is
3400: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 set to the larg
3410: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e er of its curren
3420: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 t value and .**
3430: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e the number of en
3440: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 tries in the Vdb
3450: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 e.apArg[] array
3460: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 required to exec
3470: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 ute the .** retu
3480: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f rned program..*/
3490: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 .VdbeOp *sqlite3
34a0: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 VdbeTakeOpArray(
34b0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e Vdbe *p, int *pn
34c0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 Op, int *pnMaxAr
34d0: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f g){. VdbeOp *aO
34e0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 p = p->aOp;. as
34f0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d sert( aOp && !p-
3500: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
3510: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b d );.. /* Check
3520: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 that sqlite3Vdb
3530: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 eUsesBtree() was
3540: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 not called on t
3550: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 his VM */. asse
3560: 72 74 28 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b rt( p->btreeMask
3570: 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 ==0 );.. resolv
3580: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d eP2Values(p, pnM
3590: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 axArg);. *pnOp
35a0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 = p->nOp;. p->a
35b0: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e Op = 0;. return
35c0: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 aOp;.}../*.** A
35d0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 dd a whole list
35e0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f of operations to
35f0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 the operation s
3600: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74 68 tack. Return th
3610: 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66 20 e.** address of
3620: 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 the first operat
3630: 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69 6e ion added..*/.in
3640: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 t sqlite3VdbeAdd
3650: 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c 20 OpList(Vdbe *p,
3660: 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70 4c int nOp, VdbeOpL
3670: 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 29 7b ist const *aOp){
3680: 0a 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 . int addr;. a
3690: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d ssert( p->magic=
36a0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 =VDBE_MAGIC_INIT
36b0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 );. if( p->nOp
36c0: 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 6e 4f 70 41 + nOp > p->nOpA
36d0: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 lloc && growOpAr
36e0: 72 61 79 28 70 29 20 29 7b 0a 20 20 20 20 72 65 ray(p) ){. re
36f0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 61 64 turn 0;. }. ad
3700: 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 dr = p->nOp;. i
3710: 66 28 20 41 4c 57 41 59 53 28 6e 4f 70 3e 30 29 f( ALWAYS(nOp>0)
3720: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
3730: 20 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f VdbeOpList co
3740: 6e 73 74 20 2a 70 49 6e 20 3d 20 61 4f 70 3b 0a nst *pIn = aOp;.
3750: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e for(i=0; i<n
3760: 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e 2b 2b 29 7b Op; i++, pIn++){
3770: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 . int p2 =
3780: 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 20 20 20 56 pIn->p2;. V
3790: 64 62 65 4f 70 20 2a 70 4f 75 74 20 3d 20 26 70 dbeOp *pOut = &p
37a0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 3b 0a 20 ->aOp[i+addr];.
37b0: 20 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 pOut->opcod
37c0: 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 6f 64 65 3b e = pIn->opcode;
37d0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 . pOut->p1
37e0: 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 20 20 20 20 = pIn->p1;.
37f0: 20 69 66 28 20 70 32 3c 30 20 26 26 20 28 73 71 if( p2<0 && (sq
3800: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 lite3OpcodePrope
3810: 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 rty[pOut->opcode
3820: 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 ] & OPFLG_JUMP)!
3830: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4f =0 ){. pO
3840: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20 ut->p2 = addr +
3850: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20 ADDR(p2);.
3860: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 }else{. p
3870: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 Out->p2 = p2;.
3880: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74 }. pOut
3890: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a ->p3 = pIn->p3;.
38a0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 pOut->p4ty
38b0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b pe = P4_NOTUSED;
38c0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e . pOut->p4.
38d0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75 p = 0;. pOu
38e0: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 t->p5 = 0;.#ifde
38f0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 f SQLITE_DEBUG.
3900: 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d pOut->zComm
3910: 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 ent = 0;. i
3920: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 f( sqlite3VdbeAd
3930: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 dopTrace ){.
3940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 sqlite3VdbeP
3950: 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 rintOp(0, i+addr
3960: 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 , &p->aOp[i+addr
3970: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 ]);. }.#end
3980: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e if. }. p->
3990: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a nOp += nOp;. }.
39a0: 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d return addr;.}
39b0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 ../*.** Change t
39c0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 he value of the
39d0: 50 31 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 P1 operand for a
39e0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 specific instru
39f0: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 ction..** This r
3a00: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c outine is useful
3a10: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 when a large pr
3a20: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 ogram is loaded
3a30: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 from a.** static
3a40: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c array using sql
3a50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 ite3VdbeAddOpLis
3a60: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f t but we want to
3a70: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d make a.** few m
3a80: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 inor changes to
3a90: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a the program..*/.
3aa0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
3ab0: 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 ChangeP1(Vdbe *p
3ac0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e 74 20 , int addr, int
3ad0: 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 val){. assert(
3ae0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 p!=0 );. assert
3af0: 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 20 69 ( addr>=0 );. i
3b00: 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 20 29 f( p->nOp>addr )
3b10: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 {. p->aOp[add
3b20: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d r].p1 = val;. }
3b30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 .}../*.** Change
3b40: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 the value of th
3b50: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72 e P2 operand for
3b60: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 a specific inst
3b70: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 ruction..** This
3b80: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 routine is usef
3b90: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61 ul for setting a
3ba0: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f jump destinatio
3bb0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 n..*/.void sqlit
3bc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 e3VdbeChangeP2(V
3bd0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 dbe *p, int addr
3be0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 , int val){. as
3bf0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 sert( p!=0 );.
3c00: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 assert( addr>=0
3c10: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e );. if( p->nOp>
3c20: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 addr ){. p->a
3c30: 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20 76 61 Op[addr].p2 = va
3c40: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 l;. }.}../*.**
3c50: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 Change the value
3c60: 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65 72 61 of the P3 opera
3c70: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 nd for a specifi
3c80: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a c instruction..*
3c90: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
3ca0: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20 beChangeP3(Vdbe
3cb0: 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 69 6e *p, int addr, in
3cc0: 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 t val){. assert
3cd0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 ( p!=0 );. asse
3ce0: 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b 0a 20 rt( addr>=0 );.
3cf0: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 64 72 if( p->nOp>addr
3d00: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 ){. p->aOp[a
3d10: 64 64 72 5d 2e 70 33 20 3d 20 76 61 6c 3b 0a 20 ddr].p3 = val;.
3d20: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e }.}../*.** Chan
3d30: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 ge the value of
3d40: 74 68 65 20 50 35 20 6f 70 65 72 61 6e 64 20 66 the P5 operand f
3d50: 6f 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 or the most rece
3d60: 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 64 20 6f 70 ntly.** added op
3d70: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 eration..*/.void
3d80: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
3d90: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 geP5(Vdbe *p, u8
3da0: 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 val){. assert(
3db0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 p!=0 );. if( p
3dc0: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 ->aOp ){. ass
3dd0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b ert( p->nOp>0 );
3de0: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e . p->aOp[p->n
3df0: 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 61 6c 3b 0a Op-1].p5 = val;.
3e00: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 }.}../*.** Cha
3e10: 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72 61 nge the P2 opera
3e20: 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f nd of instructio
3e30: 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20 69 n addr so that i
3e40: 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 t points to.** t
3e50: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 he address of th
3e60: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 e next instructi
3e70: 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a on to be coded..
3e80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
3e90: 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62 65 dbeJumpHere(Vdbe
3ea0: 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a *p, int addr){.
3eb0: 20 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d assert( addr>=
3ec0: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 0 );. sqlite3Vd
3ed0: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 beChangeP2(p, ad
3ee0: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a dr, p->nOp);.}..
3ef0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e ./*.** If the in
3f00: 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75 put FuncDef stru
3f10: 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72 cture is ephemer
3f20: 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74 al, then free it
3f30: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e . If.** the Fun
3f40: 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65 cDef is not ephe
3f50: 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f rmal, then do no
3f60: 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 thing..*/.static
3f70: 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65 void freeEpheme
3f80: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69 ralFunction(sqli
3f90: 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66 te3 *db, FuncDef
3fa0: 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 41 *pDef){. if( A
3fb0: 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20 28 LWAYS(pDef) && (
3fc0: 70 44 65 66 2d 3e 66 6c 61 67 73 20 26 20 53 51 pDef->flags & SQ
3fd0: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 LITE_FUNC_EPHEM)
3fe0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 !=0 ){. sqlit
3ff0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 e3DbFree(db, pDe
4000: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 f);. }.}..stati
4010: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f c void vdbeFreeO
4020: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a pArray(sqlite3 *
4030: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f , Op *, int);../
4040: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34 *.** Delete a P4
4050: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73 value if necess
4060: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ary..*/.static v
4070: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74 oid freeP4(sqlit
4080: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 e3 *db, int p4ty
4090: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 pe, void *p4){.
40a0: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61 if( p4 ){. a
40b0: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20 ssert( db );.
40c0: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20 switch( p4type
40d0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 ){. case P4
40e0: 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 _REAL:. cas
40f0: 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 e P4_INT64:.
4100: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 case P4_DYNAMI
4110: 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 C:. case P4
4120: 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 20 20 20 20 _KEYINFO:.
4130: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 case P4_INTARRAY
4140: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f :. case P4_
4150: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 3a KEYINFO_HANDOFF:
4160: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 {. sqlit
4170: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29 e3DbFree(db, p4)
4180: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
4190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 . }. c
41a0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 ase P4_MPRINTF:
41b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 {. if( db
41c0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d ->pnBytesFreed==
41d0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 0 ) sqlite3_free
41e0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 (p4);. br
41f0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
4200: 20 20 20 63 61 73 65 20 50 34 5f 56 44 42 45 46 case P4_VDBEF
4210: 55 4e 43 3a 20 7b 0a 20 20 20 20 20 20 20 20 56 UNC: {. V
4220: 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 46 75 dbeFunc *pVdbeFu
4230: 6e 63 20 3d 20 28 56 64 62 65 46 75 6e 63 20 2a nc = (VdbeFunc *
4240: 29 70 34 3b 0a 20 20 20 20 20 20 20 20 66 72 65 )p4;. fre
4250: 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 eEphemeralFuncti
4260: 6f 6e 28 64 62 2c 20 70 56 64 62 65 46 75 6e 63 on(db, pVdbeFunc
4270: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 ->pFunc);.
4280: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 if( db->pnByte
4290: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 sFreed==0 ) sqli
42a0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 te3VdbeDeleteAux
42b0: 44 61 74 61 28 70 56 64 62 65 46 75 6e 63 2c 20 Data(pVdbeFunc,
42c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 0);. sqli
42d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 56 te3DbFree(db, pV
42e0: 64 62 65 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 dbeFunc);.
42f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
4300: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 . case P4_F
4310: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20 UNCDEF: {.
4320: 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 freeEphemeralF
4330: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75 6e unction(db, (Fun
4340: 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20 20 cDef*)p4);.
4350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
4360: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f }. case P4_
4370: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 MEM: {. i
4380: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 f( db->pnBytesFr
4390: 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 eed==0 ){.
43a0: 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 sqlite3Value
43b0: 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76 61 Free((sqlite3_va
43c0: 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 lue*)p4);.
43d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
43e0: 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65 6d Mem *p = (Mem
43f0: 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20 20 *)p4;.
4400: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
4410: 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 , p->zMalloc);.
4420: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
4430: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 DbFree(db, p);.
4440: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
4450: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
4460: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 case P4_VT
4470: 41 42 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 AB : {. i
4480: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 f( db->pnBytesFr
4490: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 eed==0 ) sqlite3
44a0: 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 VtabUnlock((VTab
44b0: 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 le *)p4);.
44c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
44d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a . }. }.}../*
44e0: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 .** Free the spa
44f0: 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 ce allocated for
4500: 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 aOp and any p4
4510: 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 values allocated
4520: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f for the.** opco
4530: 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 des contained wi
4540: 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 thin. If aOp is
4550: 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 not NULL it is a
4560: 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 ssumed to contai
4570: 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 n .** nOp entrie
4580: 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f s. .*/.static vo
4590: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 id vdbeFreeOpArr
45a0: 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 ay(sqlite3 *db,
45b0: 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 Op *aOp, int nOp
45c0: 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a ){. if( aOp ){.
45d0: 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 Op *pOp;.
45e0: 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f for(pOp=aOp; pO
45f0: 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 p<&aOp[nOp]; pOp
4600: 2b 2b 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 ++){. freeP
4610: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 4(db, pOp->p4typ
4620: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 e, pOp->p4.p);.#
4630: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
4640: 55 47 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 UG. sqlite3
4650: 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e DbFree(db, pOp->
4660: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 zComment);.#endi
4670: 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d f . }. }
4680: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 . sqlite3DbFree
4690: 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a (db, aOp);.}../*
46a0: 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 .** Link the Sub
46b0: 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 Program object p
46c0: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 assed as the sec
46d0: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 ond argument int
46e0: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 o the linked.**
46f0: 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 list at Vdbe.pSu
4700: 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c bProgram. This l
4710: 69 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 ist is used to d
4720: 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 elete all sub-pr
4730: 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 ogram.** objects
4740: 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 when the VM is
4750: 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 no longer requir
4760: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ed..*/.void sqli
4770: 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 te3VdbeLinkSubPr
4780: 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 ogram(Vdbe *pVdb
4790: 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 e, SubProgram *p
47a0: 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 ){. p->pNext =
47b0: 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b pVdbe->pProgram;
47c0: 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 . pVdbe->pProgr
47d0: 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a am = p;.}../*.**
47e0: 20 43 68 61 6e 67 65 20 4e 20 6f 70 63 6f 64 65 Change N opcode
47f0: 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 61 64 s starting at ad
4800: 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 2e 0a 2a 2f dr to No-ops..*/
4810: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
4820: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 eChangeToNoop(Vd
4830: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c be *p, int addr,
4840: 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 int N){. if( p
4850: 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 ->aOp ){. Vdb
4860: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 eOp *pOp = &p->a
4870: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 Op[addr];. sq
4880: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
4890: 62 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 4e 2d b;. while( N-
48a0: 2d 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65 50 - ){. freeP
48b0: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 4(db, pOp->p4typ
48c0: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 e, pOp->p4.p);.
48d0: 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c memset(pOp,
48e0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 0, sizeof(pOp[0
48f0: 5d 29 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e ]));. pOp->
4900: 6f 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 opcode = OP_Noop
4910: 3b 0a 20 20 20 20 20 20 70 4f 70 2b 2b 3b 0a 20 ;. pOp++;.
4920: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a }. }.}../*.*
4930: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c * Change the val
4940: 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 65 ue of the P4 ope
4950: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 rand for a speci
4960: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e fic instruction.
4970: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
4980: 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 is useful when
4990: 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d 20 a large program
49a0: 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 61 is loaded from a
49b0: 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 79 .** static array
49c0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 64 using sqlite3Vd
49d0: 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 20 beAddOpList but
49e0: 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 20 we want to make
49f0: 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 63 a.** few minor c
4a00: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 72 hanges to the pr
4a10: 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ogram..**.** If
4a20: 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 34 n>=0 then the P4
4a30: 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 61 operand is dyna
4a40: 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 mic, meaning tha
4a50: 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 74 t a copy of.** t
4a60: 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 64 he string is mad
4a70: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 e into memory ob
4a80: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 tained from sqli
4a90: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a te3_malloc()..**
4aa0: 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d 30 A value of n==0
4ab0: 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 65 means copy byte
4ac0: 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 61 s of zP4 up to a
4ad0: 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 nd including the
4ae0: 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 62 .** first null b
4af0: 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 65 yte. If n>0 the
4b00: 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 73 n copy n+1 bytes
4b10: 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a 2a 2a 20 49 of zP4..**.** I
4b20: 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 f n==P4_KEYINFO
4b30: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 7a 50 it means that zP
4b40: 34 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 4 is a pointer t
4b50: 6f 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 o a KeyInfo stru
4b60: 63 74 75 72 65 2e 0a 2a 2a 20 41 20 63 6f 70 79 cture..** A copy
4b70: 20 69 73 20 6d 61 64 65 20 6f 66 20 74 68 65 20 is made of the
4b80: 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 KeyInfo structur
4b90: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 e into memory ob
4ba0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 tained from.** s
4bb0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 2c 20 74 qlite3_malloc, t
4bc0: 6f 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 o be freed when
4bd0: 74 68 65 20 56 64 62 65 20 69 73 20 66 69 6e 61 the Vdbe is fina
4be0: 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d 3d 50 34 5f lized..** n==P4_
4bf0: 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 KEYINFO_HANDOFF
4c00: 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 7a indicates that z
4c10: 50 34 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 4b P4 points to a K
4c20: 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 eyInfo structure
4c30: 0a 2a 2a 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 .** stored in me
4c40: 6d 6f 72 79 20 74 68 61 74 20 74 68 65 20 63 61 mory that the ca
4c50: 6c 6c 65 72 20 68 61 73 20 6f 62 74 61 69 6e 65 ller has obtaine
4c60: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d d from sqlite3_m
4c70: 61 6c 6c 6f 63 2e 20 54 68 65 20 0a 2a 2a 20 63 alloc. The .** c
4c80: 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 6e 6f 74 aller should not
4c90: 20 66 72 65 65 20 74 68 65 20 61 6c 6c 6f 63 61 free the alloca
4ca0: 74 69 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 tion, it will be
4cb0: 20 66 72 65 65 64 20 77 68 65 6e 20 74 68 65 20 freed when the
4cc0: 56 64 62 65 20 69 73 0a 2a 2a 20 66 69 6e 61 6c Vdbe is.** final
4cd0: 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 ized..** .** Oth
4ce0: 65 72 20 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 er values of n (
4cf0: 50 34 5f 53 54 41 54 49 43 2c 20 50 34 5f 43 4f P4_STATIC, P4_CO
4d00: 4c 4c 53 45 51 20 65 74 63 2e 29 20 69 6e 64 69 LLSEQ etc.) indi
4d10: 63 61 74 65 20 74 68 61 74 20 7a 50 34 20 70 6f cate that zP4 po
4d20: 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 ints.** to a str
4d30: 69 6e 67 20 6f 72 20 73 74 72 75 63 74 75 72 65 ing or structure
4d40: 20 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 that is guarant
4d50: 65 65 64 20 74 6f 20 65 78 69 73 74 20 66 6f 72 eed to exist for
4d60: 20 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 the lifetime of
4d70: 0a 2a 2a 20 74 68 65 20 56 64 62 65 2e 20 49 6e .** the Vdbe. In
4d80: 20 74 68 65 73 65 20 63 61 73 65 73 20 77 65 20 these cases we
4d90: 63 61 6e 20 6a 75 73 74 20 63 6f 70 79 20 74 68 can just copy th
4da0: 65 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a e pointer..**.**
4db0: 20 49 66 20 61 64 64 72 3c 30 20 74 68 65 6e 20 If addr<0 then
4dc0: 63 68 61 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 change P4 on the
4dd0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 most recently i
4de0: 6e 73 65 72 74 65 64 20 69 6e 73 74 72 75 63 74 nserted instruct
4df0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ion..*/.void sql
4e00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 ite3VdbeChangeP4
4e10: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 (Vdbe *p, int ad
4e20: 64 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a dr, const char *
4e30: 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f zP4, int n){. O
4e40: 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 p *pOp;. sqlite
4e50: 33 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 3 *db;. assert(
4e60: 20 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 p!=0 );. db =
4e70: 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 p->db;. assert(
4e80: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f p->magic==VDBE_
4e90: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 MAGIC_INIT );.
4ea0: 69 66 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c if( p->aOp==0 ||
4eb0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
4ec0: 64 20 29 7b 0a 20 20 20 20 69 66 20 28 20 6e 21 d ){. if ( n!
4ed0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 26 26 20 6e =P4_KEYINFO && n
4ee0: 21 3d 50 34 5f 56 54 41 42 20 29 20 7b 0a 20 20 !=P4_VTAB ) {.
4ef0: 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20 6e freeP4(db, n
4f00: 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 72 2a , (void*)*(char*
4f10: 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d 0a 20 *)&zP4);. }.
4f20: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 return;. }.
4f30: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e assert( p->nOp>
4f40: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 0 );. assert( a
4f50: 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 ddr<p->nOp );.
4f60: 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 if( addr<0 ){.
4f70: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 addr = p->nOp
4f80: 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d - 1;. }. pOp =
4f90: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a &p->aOp[addr];.
4fa0: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 freeP4(db, pOp
4fb0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 ->p4type, pOp->p
4fc0: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 4.p);. pOp->p4.
4fd0: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d p = 0;. if( n==
4fe0: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 P4_INT32 ){.
4ff0: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 /* Note: this ca
5000: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 st is safe, beca
5010: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 use the origin d
5020: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e ata point was an
5030: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 int. ** that
5040: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 was cast to a (
5050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a const char *). *
5060: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 /. pOp->p4.i
5070: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f = SQLITE_PTR_TO_
5080: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f INT(zP4);. pO
5090: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 p->p4type = P4_I
50a0: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 NT32;. }else if
50b0: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 ( zP4==0 ){.
50c0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 pOp->p4.p = 0;.
50d0: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d pOp->p4type =
50e0: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d P4_NOTUSED;. }
50f0: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b else if( n==P4_K
5100: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 4b 65 EYINFO ){. Ke
5110: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b yInfo *pKeyInfo;
5120: 0a 20 20 20 20 69 6e 74 20 6e 46 69 65 6c 64 2c . int nField,
5130: 20 6e 42 79 74 65 3b 0a 0a 20 20 20 20 6e 46 69 nByte;.. nFi
5140: 65 6c 64 20 3d 20 28 28 4b 65 79 49 6e 66 6f 2a eld = ((KeyInfo*
5150: 29 7a 50 34 29 2d 3e 6e 46 69 65 6c 64 3b 0a 20 )zP4)->nField;.
5160: 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f nByte = sizeo
5170: 66 28 2a 70 4b 65 79 49 6e 66 6f 29 20 2b 20 28 f(*pKeyInfo) + (
5180: 6e 46 69 65 6c 64 2d 31 29 2a 73 69 7a 65 6f 66 nField-1)*sizeof
5190: 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c (pKeyInfo->aColl
51a0: 5b 30 5d 29 20 2b 20 6e 46 69 65 6c 64 3b 0a 20 [0]) + nField;.
51b0: 20 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 73 71 pKeyInfo = sq
51c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 lite3DbMallocRaw
51d0: 28 30 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 (0, nByte);.
51e0: 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f pOp->p4.pKeyInfo
51f0: 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 = pKeyInfo;.
5200: 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 20 29 7b if( pKeyInfo ){
5210: 0a 20 20 20 20 20 20 75 38 20 2a 61 53 6f 72 74 . u8 *aSort
5220: 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 6d 65 6d Order;. mem
5230: 63 70 79 28 28 63 68 61 72 2a 29 70 4b 65 79 49 cpy((char*)pKeyI
5240: 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 79 74 65 20 nfo, zP4, nByte
5250: 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 - nField);.
5260: 20 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 70 4b aSortOrder = pK
5270: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 eyInfo->aSortOrd
5280: 65 72 3b 0a 20 20 20 20 20 20 69 66 28 20 61 53 er;. if( aS
5290: 6f 72 74 4f 72 64 65 72 20 29 7b 0a 20 20 20 20 ortOrder ){.
52a0: 20 20 20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 pKeyInfo->aS
52b0: 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 6e 73 69 ortOrder = (unsi
52c0: 67 6e 65 64 20 63 68 61 72 2a 29 26 70 4b 65 79 gned char*)&pKey
52d0: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6e 46 69 65 Info->aColl[nFie
52e0: 6c 64 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d ld];. mem
52f0: 63 70 79 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 cpy(pKeyInfo->aS
5300: 6f 72 74 4f 72 64 65 72 2c 20 61 53 6f 72 74 4f ortOrder, aSortO
5310: 72 64 65 72 2c 20 6e 46 69 65 6c 64 29 3b 0a 20 rder, nField);.
5320: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 }. pOp
5330: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 ->p4type = P4_KE
5340: 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 65 6c 73 65 YINFO;. }else
5350: 7b 0a 20 20 20 20 20 20 70 2d 3e 64 62 2d 3e 6d {. p->db->m
5360: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b allocFailed = 1;
5370: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 . pOp->p4ty
5380: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b pe = P4_NOTUSED;
5390: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 . }. }else i
53a0: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f f( n==P4_KEYINFO
53b0: 5f 48 41 4e 44 4f 46 46 20 29 7b 0a 20 20 20 20 _HANDOFF ){.
53c0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 pOp->p4.p = (voi
53d0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d d*)zP4;. pOp-
53e0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 >p4type = P4_KEY
53f0: 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 INFO;. }else if
5400: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a ( n==P4_VTAB ){.
5410: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 pOp->p4.p =
5420: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 (void*)zP4;.
5430: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 pOp->p4type = P4
5440: 5f 56 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 _VTAB;. sqlit
5450: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 e3VtabLock((VTab
5460: 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 le *)zP4);. a
5470: 73 73 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 ssert( ((VTable
5480: 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 *)zP4)->db==p->d
5490: 62 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 b );. }else if(
54a0: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d n<0 ){. pOp-
54b0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a >p4.p = (void*)z
54c0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 P4;. pOp->p4t
54d0: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 ype = (signed ch
54e0: 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ar)n;. }else{.
54f0: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 if( n==0 ) n
5500: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 = sqlite3Strlen3
5510: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 0(zP4);. pOp-
5520: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 >p4.z = sqlite3D
5530: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 bStrNDup(p->db,
5540: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 zP4, n);. pOp
5550: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 ->p4type = P4_DY
5560: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 NAMIC;. }.}..#i
5570: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a fndef NDEBUG./*.
5580: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f ** Change the co
5590: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 74 68 65 mment on the the
55a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 most recently c
55b0: 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e oded instruction
55c0: 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 . Or.** insert
55d0: 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 a No-op and add
55e0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 the comment to t
55f0: 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 hat new instruct
5600: 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 ion. This.** ma
5610: 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 kes the code eas
5620: 69 65 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 ier to read duri
5630: 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e ng debugging. N
5640: 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 one of this happ
5650: 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 ens.** in a prod
5660: 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f uction build..*/
5670: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
5680: 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 eComment(Vdbe *p
5690: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
56a0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 ormat, ...){. v
56b0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 a_list ap;. if(
56c0: 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 !p ) return;.
56d0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 assert( p->nOp>0
56e0: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b || p->aOp==0 );
56f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f . assert( p->aO
5700: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 p==0 || p->aOp[p
5710: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e ->nOp-1].zCommen
5720: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d t==0 || p->db->m
5730: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
5740: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 if( p->nOp ){.
5750: 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 char **pz = &
5760: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d p->aOp[p->nOp-1]
5770: 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 .zComment;. v
5780: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 a_start(ap, zFor
5790: 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 mat);. sqlite
57a0: 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 3DbFree(p->db, *
57b0: 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 pz);. *pz = s
57c0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 qlite3VMPrintf(p
57d0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 ->db, zFormat, a
57e0: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 p);. va_end(a
57f0: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 p);. }.}.void s
5800: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f qlite3VdbeNoopCo
5810: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 mment(Vdbe *p, c
5820: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d onst char *zForm
5830: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c at, ...){. va_l
5840: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70 ist ap;. if( !p
5850: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 71 6c ) return;. sql
5860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 28 70 ite3VdbeAddOp0(p
5870: 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 61 73 , OP_Noop);. as
5880: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c sert( p->nOp>0 |
5890: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 | p->aOp==0 );.
58a0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d assert( p->aOp=
58b0: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e =0 || p->aOp[p->
58c0: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d nOp-1].zComment=
58d0: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c =0 || p->db->mal
58e0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 locFailed );. i
58f0: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 f( p->nOp ){.
5900: 20 63 68 61 72 20 2a 2a 70 7a 20 3d 20 26 70 2d char **pz = &p-
5910: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a >aOp[p->nOp-1].z
5920: 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 20 76 61 5f Comment;. va_
5930: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
5940: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 t);. sqlite3D
5950: 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 2a 70 7a bFree(p->db, *pz
5960: 29 3b 0a 20 20 20 20 2a 70 7a 20 3d 20 73 71 6c );. *pz = sql
5970: 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e ite3VMPrintf(p->
5980: 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 db, zFormat, ap)
5990: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 ;. va_end(ap)
59a0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 ;. }.}.#endif
59b0: 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 2f 2a /* NDEBUG */../*
59c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f .** Return the o
59d0: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65 pcode for a give
59e0: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74 n address. If t
59f0: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31 he address is -1
5a00: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e , then.** return
5a10: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 the most recent
5a20: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f ly inserted opco
5a30: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d de..**.** If a m
5a40: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e emory allocation
5a50: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 error has occur
5a60: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 red prior to the
5a70: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73 calling of this
5a80: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65 .** routine, the
5a90: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 n a pointer to a
5aa0: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69 dummy VdbeOp wi
5ab0: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 ll be returned.
5ac0: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 That opcode.**
5ad0: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20 is readable but
5ae0: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68 not writable, th
5af0: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20 ough it is cast
5b00: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61 to a writable va
5b10: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 lue..** The retu
5b20: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70 rn of a dummy op
5b30: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 code allows the
5b40: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65 call to continue
5b50: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 functioning.**
5b60: 61 66 74 65 72 20 61 20 4f 4f 4d 20 66 61 75 6c after a OOM faul
5b70: 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 t without having
5b80: 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65 65 to check to see
5b90: 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20 66 if the return f
5ba0: 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 rom .** this rou
5bb0: 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64 20 tine is a valid
5bc0: 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62 65 pointer. But be
5bd0: 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79 2e cause the dummy.
5be0: 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 opcode is 0,.**
5bf0: 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 dummy will never
5c00: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 be written to.
5c10: 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69 65 This is verifie
5c20: 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65 63 d by code inspec
5c30: 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 tion and.** by r
5c40: 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c 67 unning with Valg
5c50: 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 41 62 6f 75 rind..**.** Abou
5c60: 74 20 74 68 65 20 23 69 66 64 65 66 20 53 51 4c t the #ifdef SQL
5c70: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 3a 20 ITE_OMIT_TRACE:
5c80: 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 Normally, this
5c90: 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 routine is never
5ca0: 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 6e 6c 65 73 called.** unles
5cb0: 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 20 54 68 69 s p->nOp>0. Thi
5cc0: 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 s is because in
5cd0: 74 68 65 20 61 62 73 65 6e 73 65 20 6f 66 20 53 the absense of S
5ce0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 QLITE_OMIT_TRACE
5cf0: 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 72 61 63 65 ,.** an OP_Trace
5d00: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 instruction is
5d10: 61 6c 77 61 79 73 20 69 6e 73 65 72 74 65 64 20 always inserted
5d20: 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 by sqlite3VdbeGe
5d30: 74 28 29 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a t() as soon as.*
5d40: 2a 20 61 20 6e 65 77 20 56 44 42 45 20 69 73 20 * a new VDBE is
5d50: 63 72 65 61 74 65 64 2e 20 20 53 6f 20 77 65 20 created. So we
5d60: 61 72 65 20 66 72 65 65 20 74 6f 20 73 65 74 20 are free to set
5d70: 61 64 64 72 20 74 6f 20 70 2d 3e 6e 4f 70 2d 31 addr to p->nOp-1
5d80: 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 without.** havi
5d90: 6e 67 20 74 6f 20 64 6f 75 62 6c 65 2d 63 68 65 ng to double-che
5da0: 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 ck to make sure
5db0: 74 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 20 that the result
5dc0: 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e is non-negative.
5dd0: 20 42 75 74 0a 2a 2a 20 69 66 20 53 51 4c 49 54 But.** if SQLIT
5de0: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 69 73 20 E_OMIT_TRACE is
5df0: 64 65 66 69 6e 65 64 2c 20 74 68 65 20 4f 50 5f defined, the OP_
5e00: 54 72 61 63 65 20 69 73 20 6f 6d 69 74 74 65 64 Trace is omitted
5e10: 20 61 6e 64 20 77 65 20 64 6f 20 6e 65 65 64 20 and we do need
5e20: 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 74 68 65 20 to.** check the
5e30: 76 61 6c 75 65 20 6f 66 20 70 2d 3e 6e 4f 70 2d value of p->nOp-
5e40: 31 20 62 65 66 6f 72 65 20 63 6f 6e 74 69 6e 75 1 before continu
5e50: 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a ing..*/.VdbeOp *
5e60: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 sqlite3VdbeGetOp
5e70: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 (Vdbe *p, int ad
5e80: 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 dr){. /* C89 sp
5e90: 65 63 69 66 69 65 73 20 74 68 61 74 20 74 68 65 ecifies that the
5ea0: 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 constant "dummy
5eb0: 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 " will be initia
5ec0: 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a lized to all. *
5ed0: 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 * zeros, which i
5ee0: 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 s correct. MSVC
5ef0: 20 67 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 generates a war
5f00: 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 ning, neverthele
5f10: 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 ss. */. static
5f20: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 64 75 6d const VdbeOp dum
5f30: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 my; /* Ignore t
5f40: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 he MSVC warning
5f50: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c about no initial
5f60: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 izer */. assert
5f70: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
5f80: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
5f90: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 23 if( addr<0 ){.#
5fa0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 ifdef SQLITE_OMI
5fb0: 54 5f 54 52 41 43 45 0a 20 20 20 20 69 66 28 20 T_TRACE. if(
5fc0: 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 72 65 74 75 p->nOp==0 ) retu
5fd0: 72 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d rn (VdbeOp*)&dum
5fe0: 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 my;.#endif. a
5ff0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 ddr = p->nOp - 1
6000: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
6010: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 (addr>=0 && addr
6020: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 <p->nOp) || p->d
6030: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
6040: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e );. if( p->db->
6050: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a mallocFailed ){.
6060: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65 return (Vdbe
6070: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 Op*)&dummy;. }e
6080: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 lse{. return
6090: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 &p->aOp[addr];.
60a0: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e }.}..#if !defin
60b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 ed(SQLITE_OMIT_E
60c0: 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64 65 66 69 XPLAIN) || !defi
60d0: 6e 65 64 28 4e 44 45 42 55 47 29 20 5c 0a 20 20 ned(NDEBUG) \.
60e0: 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 || defined(VD
60f0: 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 BE_PROFILE) || d
6100: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 efined(SQLITE_DE
6110: 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 BUG)./*.** Compu
6120: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 te a string that
6130: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 describes the P
6140: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 4 parameter for
6150: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 an opcode..** Us
6160: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 e zTemp for any
6170: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 required tempora
6180: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e ry buffer space.
6190: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 .*/.static char
61a0: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 *displayP4(Op *p
61b0: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c Op, char *zTemp,
61c0: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 int nTemp){. c
61d0: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 har *zP4 = zTemp
61e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d ;. assert( nTem
61f0: 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 p>=20 );. switc
6200: 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 h( pOp->p4type )
6210: 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 {. case P4_KE
6220: 59 49 4e 46 4f 5f 53 54 41 54 49 43 3a 0a 20 20 YINFO_STATIC:.
6230: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 case P4_KEYINF
6240: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 O: {. int i
6250: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e , j;. KeyIn
6260: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 fo *pKeyInfo = p
6270: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b Op->p4.pKeyInfo;
6280: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 . sqlite3_s
6290: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
62a0: 54 65 6d 70 2c 20 22 6b 65 79 69 6e 66 6f 28 25 Temp, "keyinfo(%
62b0: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 d", pKeyInfo->nF
62c0: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d ield);. i =
62d0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
62e0: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66 (zTemp);. f
62f0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e or(j=0; j<pKeyIn
6300: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 fo->nField; j++)
6310: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 {. CollSe
6320: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 q *pColl = pKeyI
6330: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 nfo->aColl[j];.
6340: 20 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c if( pColl
6350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e ){. in
6360: 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 t n = sqlite3Str
6370: 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3e 7a 4e 61 len30(pColl->zNa
6380: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 me);. i
6390: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 f( i+n>nTemp-6 )
63a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 {. me
63b0: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 mcpy(&zTemp[i],"
63c0: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 ,...",4);.
63d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
63e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
63f0: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 zTemp[i++] =
6400: 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 20 20 69 ',';. i
6410: 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f f( pKeyInfo->aSo
6420: 72 74 4f 72 64 65 72 20 26 26 20 70 4b 65 79 49 rtOrder && pKeyI
6430: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b nfo->aSortOrder[
6440: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 j] ){.
6450: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 zTemp[i++] = '
6460: 2d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a -';. }.
6470: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 memcpy
6480: 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 70 43 6f 6c (&zTemp[i], pCol
6490: 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 29 3b 0a 20 l->zName,n+1);.
64a0: 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b i += n;
64b0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 . }else i
64c0: 66 28 20 69 2b 34 3c 6e 54 65 6d 70 2d 36 20 29 f( i+4<nTemp-6 )
64d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 {. memc
64e0: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 6e py(&zTemp[i],",n
64f0: 69 6c 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 il",4);.
6500: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 i += 4;.
6510: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
6520: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 zTemp[i++] = '
6530: 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b )';. zTemp[
6540: 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 i] = 0;. as
6550: 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b sert( i<nTemp );
6560: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
6570: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f }. case P4_
6580: 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 COLLSEQ: {.
6590: 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 CollSeq *pColl
65a0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b = pOp->p4.pColl;
65b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 . sqlite3_s
65c0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
65d0: 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 65 71 28 25 Temp, "collseq(%
65e0: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a .20s)", pColl->z
65f0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 Name);. bre
6600: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
6610: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b se P4_FUNCDEF: {
6620: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a . FuncDef *
6630: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 pDef = pOp->p4.p
6640: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 Func;. sqli
6650: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 te3_snprintf(nTe
6660: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 mp, zTemp, "%s(%
6670: 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 d)", pDef->zName
6680: 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 , pDef->nArg);.
6690: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
66a0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e }. case P4_IN
66b0: 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c T64: {. sql
66c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
66d0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c emp, zTemp, "%ll
66e0: 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 d", *pOp->p4.pI6
66f0: 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 4);. break;
6700: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
6710: 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 P4_INT32: {.
6720: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
6730: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
6740: 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 "%d", pOp->p4.i
6750: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
6760: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 }. case P
6770: 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 4_REAL: {.
6780: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
6790: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 (nTemp, zTemp, "
67a0: 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 %.16g", *pOp->p4
67b0: 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 .pReal);. b
67c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
67d0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 case P4_MEM: {.
67e0: 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d Mem *pMem =
67f0: 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 pOp->p4.pMem;.
6800: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4d assert( (pM
6810: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f em->flags & MEM_
6820: 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a 20 20 20 20 Null)==0 );.
6830: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 if( pMem->flag
6840: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 s & MEM_Str ){.
6850: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 zP4 = pMe
6860: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 m->z;. }els
6870: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 e if( pMem->flag
6880: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 s & MEM_Int ){.
6890: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
68a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
68b0: 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 70 4d Temp, "%lld", pM
68c0: 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 em->u.i);.
68d0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e }else if( pMem->
68e0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c flags & MEM_Real
68f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
6900: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 te3_snprintf(nTe
6910: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e 31 36 mp, zTemp, "%.16
6920: 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 3b 0a 20 20 g", pMem->r);.
6930: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
6940: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d assert( pMem-
6950: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f >flags & MEM_Blo
6960: 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 b );. zP4
6970: 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 = "(blob)";.
6980: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b }. break
6990: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 ;. }.#ifndef
69a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 SQLITE_OMIT_VIRT
69b0: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 UALTABLE. cas
69c0: 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 e P4_VTAB: {.
69d0: 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 sqlite3_vtab
69e0: 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 *pVtab = pOp->p4
69f0: 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 .pVtab->pVtab;.
6a00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
6a10: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 rintf(nTemp, zTe
6a20: 6d 70 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 mp, "vtab:%p:%p"
6a30: 2c 20 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e , pVtab, pVtab->
6a40: 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 pModule);.
6a50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e break;. }.#en
6a60: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f dif. case P4_
6a70: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 INTARRAY: {.
6a80: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
6a90: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
6aa0: 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 "intarray");.
6ab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
6ac0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 . case P4_SUB
6ad0: 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 PROGRAM: {.
6ae0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
6af0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 f(nTemp, zTemp,
6b00: 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 "program");.
6b10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
6b20: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 default: {.
6b30: 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 zP4 = pOp->p
6b40: 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4.z;. if( z
6b50: 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 P4==0 ){.
6b60: 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 zP4 = zTemp;.
6b70: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d zTemp[0] =
6b80: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0;. }.
6b90: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 }. }. assert(
6ba0: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 zP4!=0 );. retu
6bb0: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 rn zP4;.}.#endif
6bc0: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 ../*.** Declare
6bd0: 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 to the Vdbe that
6be0: 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 the BTree objec
6bf0: 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 t at db->aDb[i]
6c00: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 is used..**.** T
6c10: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 he prepared stat
6c20: 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b ements need to k
6c30: 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 now in advance t
6c40: 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 he complete set
6c50: 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 of.** attached d
6c60: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 74 68 atabases that th
6c70: 65 79 20 77 69 6c 6c 20 62 65 20 75 73 69 6e 67 ey will be using
6c80: 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 . A mask of the
6c90: 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 se databases.**
6ca0: 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e is maintained in
6cb0: 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 61 6e p->btreeMask an
6cc0: 64 20 69 73 20 75 73 65 64 20 66 6f 72 20 6c 6f d is used for lo
6cd0: 63 6b 69 6e 67 20 61 6e 64 20 6f 74 68 65 72 20 cking and other
6ce0: 70 75 72 70 6f 73 65 73 2e 0a 2a 2f 0a 76 6f 69 purposes..*/.voi
6cf0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 d sqlite3VdbeUse
6d00: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 sBtree(Vdbe *p,
6d10: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 int i){. assert
6d20: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 ( i>=0 && i<p->d
6d30: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 b->nDb && i<(int
6d40: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 )sizeof(yDbMask)
6d50: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 *8 );. assert(
6d60: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d i<(int)sizeof(p-
6d70: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b >btreeMask)*8 );
6d80: 0a 20 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 . p->btreeMask
6d90: 7c 3d 20 28 28 79 44 62 4d 61 73 6b 29 31 29 3c |= ((yDbMask)1)<
6da0: 3c 69 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 <i;. if( i!=1 &
6db0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 & sqlite3BtreeSh
6dc0: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 arable(p->db->aD
6dd0: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 b[i].pBt) ){.
6de0: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 7c 3d 20 p->lockMask |=
6df0: 28 28 79 44 62 4d 61 73 6b 29 31 29 3c 3c 69 3b ((yDbMask)1)<<i;
6e00: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 . }.}..#if !def
6e10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
6e20: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 _SHARED_CACHE) &
6e30: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 & SQLITE_THREADS
6e40: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 AFE>0./*.** If S
6e50: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 QLite is compile
6e60: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 d to support sha
6e70: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 red-cache mode a
6e80: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 nd to be threads
6e90: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 afe,.** this rou
6ea0: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 tine obtains the
6eb0: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 mutex associate
6ec0: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68 d with each BtSh
6ed0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a ared structure.*
6ee0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 * that may be ac
6ef0: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d cessed by the VM
6f00: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 passed as an ar
6f10: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 gument. In doing
6f20: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 so it also.** s
6f30: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 ets the BtShared
6f40: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 .db member of ea
6f50: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 ch of the BtShar
6f60: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 ed structures, e
6f70: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 nsuring.** that
6f80: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 the correct busy
6f90: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 -handler callbac
6fa0: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 k is invoked if
6fb0: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 required..**.**
6fc0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 If SQLite is not
6fd0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 threadsafe but
6fe0: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 does support sha
6ff0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 red-cache mode,
7000: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 then.** sqlite3B
7010: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 treeEnter() is i
7020: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 nvoked to set th
7030: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 e BtShared.db va
7040: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c riables.** of al
7050: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 l of BtShared st
7060: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69 ructures accessi
7070: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61 ble via the data
7080: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 base handle .**
7090: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
70a0: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 the VM..**.** If
70b0: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 SQLite is not t
70c0: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f hreadsafe and do
70d0: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 es not support s
70e0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 hared-cache mode
70f0: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 , this.** functi
7100: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a on is a no-op..*
7110: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 *.** The p->btre
7120: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 eMask field is a
7130: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 bitmask of all
7140: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20 btrees that the
7150: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 prepared .** sta
7160: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 tement p will ev
7170: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 er use. Let N b
7180: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 e the number of
7190: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 bits in p->btree
71a0: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f Mask.** correspo
71b0: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 nding to btrees
71c0: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 that use shared
71d0: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 cache. Then the
71e0: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 runtime of.** t
71f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e his routine is N
7200: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 *N. But as N is
7210: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 rarely more tha
7220: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 n 1, this should
7230: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f not.** be a pro
7240: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 blem..*/.void sq
7250: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 lite3VdbeEnter(V
7260: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 dbe *p){. int i
7270: 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 73 6b ;. yDbMask mask
7280: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b ;. sqlite3 *db;
7290: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e . Db *aDb;. in
72a0: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 2d 3e t nDb;. if( p->
72b0: 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 72 65 lockMask==0 ) re
72c0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f turn; /* The co
72d0: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 mmon case */. d
72e0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 b = p->db;. aDb
72f0: 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 = db->aDb;. nD
7300: 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 b = db->nDb;. f
7310: 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 3b 20 or(i=0, mask=1;
7320: 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 73 6b i<nDb; i++, mask
7330: 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 20 69 += mask){. i
7340: 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 73 6b f( i!=1 && (mask
7350: 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 21 & p->lockMask)!
7360: 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 =0 && ALWAYS(aDb
7370: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 [i].pBt!=0) ){.
7380: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 sqlite3Btre
7390: 65 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 eEnter(aDb[i].pB
73a0: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a t);. }. }.}.
73b0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 #endif..#if !def
73c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 ined(SQLITE_OMIT
73d0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 _SHARED_CACHE) &
73e0: 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 & SQLITE_THREADS
73f0: 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f AFE>0./*.** Unlo
7400: 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 ck all of the bt
7410: 72 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 rees previously
7420: 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c locked by a call
7430: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 to sqlite3VdbeE
7440: 6e 74 65 72 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 nter()..*/.void
7450: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 sqlite3VdbeLeave
7460: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 (Vdbe *p){. int
7470: 20 69 3b 0a 20 20 79 44 62 4d 61 73 6b 20 6d 61 i;. yDbMask ma
7480: 73 6b 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 sk;. sqlite3 *d
7490: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 b;. Db *aDb;.
74a0: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 70 int nDb;. if( p
74b0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 3d 3d 30 20 29 20 ->lockMask==0 )
74c0: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 return; /* The
74d0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 common case */.
74e0: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 db = p->db;. a
74f0: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 Db = db->aDb;.
7500: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 nDb = db->nDb;.
7510: 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d 31 for(i=0, mask=1
7520: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 2c 20 6d 61 ; i<nDb; i++, ma
7530: 73 6b 20 2b 3d 20 6d 61 73 6b 29 7b 0a 20 20 20 sk += mask){.
7540: 20 69 66 28 20 69 21 3d 31 20 26 26 20 28 6d 61 if( i!=1 && (ma
7550: 73 6b 20 26 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b sk & p->lockMask
7560: 29 21 3d 30 20 26 26 20 41 4c 57 41 59 53 28 61 )!=0 && ALWAYS(a
7570: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b Db[i].pBt!=0) ){
7580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 . sqlite3Bt
7590: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e reeLeave(aDb[i].
75a0: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a pBt);. }. }.
75b0: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 }.#endif..#if de
75c0: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 fined(VDBE_PROFI
75d0: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 LE) || defined(S
75e0: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a QLITE_DEBUG)./*.
75f0: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c ** Print a singl
7600: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 e opcode. This
7610: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 routine is used
7620: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e for debugging on
7630: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ly..*/.void sqli
7640: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 te3VdbePrintOp(F
7650: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 ILE *pOut, int p
7660: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 c, Op *pOp){. c
7670: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 har *zP4;. char
7680: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 zPtr[50];. sta
7690: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
76a0: 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 zFormat1 = "%4d
76b0: 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 %-13s %4d %4d %4
76c0: 64 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e d %-4s %.2X %s\n
76d0: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 ";. if( pOut==0
76e0: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 ) pOut = stdout
76f0: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 ;. zP4 = displa
7700: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 yP4(pOp, zPtr, s
7710: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 izeof(zPtr));.
7720: 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 fprintf(pOut, zF
7730: 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 ormat1, pc, .
7740: 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 sqlite3Opcode
7750: 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 Name(pOp->opcode
7760: 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d ), pOp->p1, pOp-
7770: 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 >p2, pOp->p3, zP
7780: 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 4, pOp->p5,.#ifd
7790: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a ef SQLITE_DEBUG.
77a0: 20 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d pOp->zComm
77b0: 65 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d ent ? pOp->zComm
77c0: 65 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 ent : "".#else.
77d0: 20 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 "".#endif.
77e0: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 );. fflush(pOu
77f0: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a t);.}.#endif../*
7800: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 .** Release an a
7810: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c rray of N Mem el
7820: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 ements.*/.static
7830: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d void releaseMem
7840: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e Array(Mem *p, in
7850: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 t N){. if( p &&
7860: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 N ){. Mem *p
7870: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 End;. sqlite3
7880: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 *db = p->db;.
7890: 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c u8 malloc_fail
78a0: 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 ed = db->mallocF
78b0: 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 ailed;. if( d
78c0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 b->pnBytesFreed
78d0: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e ){. for(pEn
78e0: 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b d=&p[N]; p<pEnd;
78f0: 20 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 p++){. s
7900: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
7910: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 p->zMalloc);.
7920: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 }. retu
7930: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f rn;. }. fo
7940: 72 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c r(pEnd=&p[N]; p<
7950: 70 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 pEnd; p++){.
7960: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d assert( (&p[1]
7970: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e )==pEnd || p[0].
7980: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a db==p[1].db );..
7990: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c /* This bl
79a0: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e ock is really an
79b0: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e inlined version
79c0: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d of sqlite3VdbeM
79d0: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 emRelease().
79e0: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 ** that takes
79f0: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 advantage of the
7a00: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d fact that the m
7a10: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 emory cell value
7a20: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 is . ** be
7a30: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 ing set to NULL
7a40: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 after releasing
7a50: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f any dynamic reso
7a60: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a urces.. **.
7a70: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 ** The jus
7a80: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 tification for d
7a90: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 uplicating code
7aa0: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e is that accordin
7ab0: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 g to . ** c
7ac0: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 allgrind, this c
7ad0: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 auses a certain
7ae0: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 test case to hit
7af0: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 the CPU 4.7 .
7b00: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c ** percent l
7b10: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 ess (x86 linux,
7b20: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e gcc version 4.1.
7b30: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 2, -O6) than if
7b40: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 . ** sqlite
7b50: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 3MemRelease() we
7b60: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 re called from h
7b70: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 ere. With -O2, t
7b80: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 his jumps.
7b90: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e ** to 6.6 percen
7ba0: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 t. The test case
7bb0: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 is inserting 10
7bc0: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 00 rows into a t
7bd0: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 able . ** w
7be0: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 ith no indexes u
7bf0: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 sing a single pr
7c00: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 epared INSERT st
7c10: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 atement, bind()
7c20: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 . ** and re
7c30: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 set(). Inserts a
7c40: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 re grouped into
7c50: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 a transaction..
7c60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
7c70: 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f ( p->flags&(MEM_
7c80: 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f Agg|MEM_Dyn|MEM_
7c90: 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 Frame|MEM_RowSet
7ca0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c ) ){. sql
7cb0: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 ite3VdbeMemRelea
7cc0: 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c se(p);. }el
7cd0: 73 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f se if( p->zMallo
7ce0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c c ){. sql
7cf0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
7d00: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 ->zMalloc);.
7d10: 20 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d p->zMalloc =
7d20: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 0;. }..
7d30: 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 p->flags = ME
7d40: 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 M_Null;. }.
7d50: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c db->mallocFail
7d60: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c ed = malloc_fail
7d70: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a ed;. }.}../*.**
7d80: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 Delete a VdbeFr
7d90: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 ame object and i
7da0: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 ts contents. Vdb
7db0: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 eFrame objects a
7dc0: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 re.** allocated
7dd0: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 by the OP_Progra
7de0: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 m opcode in sqli
7df0: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a te3VdbeExec()..*
7e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
7e10: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 beFrameDelete(Vd
7e20: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 beFrame *p){. i
7e30: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 nt i;. Mem *aMe
7e40: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d m = VdbeFrameMem
7e50: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f (p);. VdbeCurso
7e60: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 r **apCsr = (Vdb
7e70: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d eCursor **)&aMem
7e80: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a [p->nChildMem];.
7e90: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
7ea0: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b nChildCsr; i++){
7eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
7ec0: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c FreeCursor(p->v,
7ed0: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a apCsr[i]);. }.
7ee0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 releaseMemArra
7ef0: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c y(aMem, p->nChil
7f00: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 dMem);. sqlite3
7f10: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c DbFree(p->v->db,
7f20: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 p);.}..#ifndef
7f30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c SQLITE_OMIT_EXPL
7f40: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 AIN./*.** Give a
7f50: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 listing of the
7f60: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 program in the v
7f70: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a irtual machine..
7f80: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 **.** The interf
7f90: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 ace is the same
7fa0: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 as sqlite3VdbeEx
7fb0: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 ec(). But inste
7fc0: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 ad of.** running
7fd0: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e the code, it in
7fe0: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 vokes the callba
7ff0: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 ck once for each
8000: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a instruction..**
8010: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 This feature is
8020: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 used to impleme
8030: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a nt "EXPLAIN"..**
8040: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c .** When p->expl
8050: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 ain==1, each ins
8060: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 truction is list
8070: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e ed. When.** p->
8080: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 explain==2, only
8090: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 OP_Explain inst
80a0: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 ructions are lis
80b0: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a ted and these.**
80c0: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 are shown in a
80d0: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 different format
80e0: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 . p->explain==2
80f0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c is used to impl
8100: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e ement.** EXPLAIN
8110: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a QUERY PLAN..**.
8120: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 ** When p->expla
8130: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 in==1, first the
8140: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 main program is
8150: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 listed, then ea
8160: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 ch of.** the tri
8170: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 gger subprograms
8180: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 are listed one
8190: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 by one..*/.int s
81a0: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a qlite3VdbeList(.
81b0: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 Vdbe *p
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
81d0: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 he VDBE */.){.
81e0: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 int nRow;
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8200: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 /* Stop whe
8210: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 n row count reac
8220: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e hes this */. in
8230: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 t nSub = 0;
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8250: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
8260: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 sub-vdbes seen s
8270: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 o far */. SubPr
8280: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 ogram **apSub =
8290: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0;
82a0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d /* Array of sub-
82b0: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a vdbes */. Mem *
82c0: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 pSub = 0;
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
82e0: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 /* Memory cell h
82f0: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 old array of sub
8300: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 progs */. sqlit
8310: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 e3 *db = p->db;
8320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8330: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 /* The database
8340: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 connection */.
8350: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 int i;
8360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8370: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 /* Loop cou
8380: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 nter */. int rc
8390: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 = SQLITE_OK;
83a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
83b0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f * Return code */
83c0: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 . Mem *pMem = p
83d0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 ->pResultSet = &
83e0: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f 2a 20 p->aMem[1]; /*
83f0: 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 First Mem of res
8400: 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 ult set */.. as
8410: 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e sert( p->explain
8420: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d );. assert( p-
8430: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
8440: 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 IC_RUN );. asse
8450: 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 rt( p->rc==SQLIT
8460: 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 E_OK || p->rc==S
8470: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d QLITE_BUSY || p-
8480: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 >rc==SQLITE_NOME
8490: 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 M );.. /* Even
84a0: 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f though this opco
84b0: 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 de does not use
84c0: 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 dynamic strings
84d0: 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 for. ** the res
84e0: 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 ult, result colu
84f0: 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 mns may become d
8500: 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 ynamic if the us
8510: 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 er calls. ** sq
8520: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 lite3_column_tex
8530: 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 t16(), causing a
8540: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 translation to
8550: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e UTF-16 encoding.
8560: 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d . */. releaseM
8570: 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 emArray(pMem, 8)
8580: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d ;.. if( p->rc==
8590: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a SQLITE_NOMEM ){.
85a0: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 /* This happ
85b0: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 ens if a malloc(
85c0: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 ) inside a call
85d0: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d to sqlite3_colum
85e0: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 n_text() or.
85f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d ** sqlite3_colum
8600: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 n_text16() faile
8610: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d d. */. db->m
8620: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b allocFailed = 1;
8630: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
8640: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 TE_ERROR;. }..
8650: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d /* When the num
8660: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f ber of output ro
8670: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c ws reaches nRow,
8680: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a that means the.
8690: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 ** listing has
86a0: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 finished and sq
86b0: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f lite3_step() sho
86c0: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 uld return SQLIT
86d0: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f E_DONE.. ** nRo
86e0: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 w is the sum of
86f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f the number of ro
8700: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 ws in the main p
8710: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a rogram, plus. *
8720: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 * the sum of the
8730: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 number of rows
8740: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 in all trigger s
8750: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 ubprograms encou
8760: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 ntered. ** so f
8770: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 ar. The nRow va
8780: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 lue will increas
8790: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 e as new trigger
87a0: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 subprograms are
87b0: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 . ** encountere
87c0: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c d, but p->pc wil
87d0: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 l eventually cat
87e0: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 ch up to nRow..
87f0: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e */. nRow = p->
8800: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 nOp;. if( p->ex
8810: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 plain==1 ){.
8820: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d /* The first 8 m
8830: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 emory cells are
8840: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 used for the res
8850: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 ult set. So we
8860: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d will. ** comm
8870: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 andeer the 9th c
8880: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 ell to use as st
8890: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 orage for an arr
88a0: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 ay of pointers.
88b0: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 ** to trigger
88c0: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 subprograms. T
88d0: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 he VDBE is guara
88e0: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 nteed to have at
88f0: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 least 9. **
8900: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 cells. */. a
8910: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 ssert( p->nMem>9
8920: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 );. pSub = &
8930: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 p->aMem[9];.
8940: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 if( pSub->flags&
8950: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 MEM_Blob ){.
8960: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 /* On the firs
8970: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 t call to sqlite
8980: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 3_step(), pSub w
8990: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e ill hold a NULL.
89a0: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a It is. **
89b0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 initialized to
89c0: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 a BLOB by the P4
89d0: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 _SUBPROGRAM proc
89e0: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c essing logic bel
89f0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 ow */. nSub
8a00: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f = pSub->n/sizeo
8a10: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 f(Vdbe*);.
8a20: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 apSub = (SubProg
8a30: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a ram **)pSub->z;.
8a40: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d }. for(i=
8a50: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0; i<nSub; i++){
8a60: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 . nRow += a
8a70: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 pSub[i]->nOp;.
8a80: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 }. }.. do{.
8a90: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a i = p->pc++;.
8aa0: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 }while( i<nRow
8ab0: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d && p->explain==
8ac0: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 2 && p->aOp[i].o
8ad0: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 pcode!=OP_Explai
8ae0: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 n );. if( i>=nR
8af0: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 ow ){. p->rc
8b00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 = SQLITE_OK;.
8b10: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e rc = SQLITE_DON
8b20: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 E;. }else if( d
8b30: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 b->u1.isInterrup
8b40: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 ted ){. p->rc
8b50: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 = SQLITE_INTERR
8b60: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 UPT;. rc = SQ
8b70: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 LITE_ERROR;.
8b80: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 sqlite3SetString
8b90: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 (&p->zErrMsg, db
8ba0: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 , "%s", sqlite3E
8bb0: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 rrStr(p->rc));.
8bc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 }else{. char
8bd0: 20 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 *z;. Op *pOp
8be0: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e ;. if( i<p->n
8bf0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 Op ){. /* T
8c00: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e he output line n
8c10: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 umber is small e
8c20: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 nough that we ar
8c30: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 e still in the.
8c40: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f ** main pro
8c50: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 gram. */. p
8c60: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b Op = &p->aOp[i];
8c70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
8c80: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 /* We are curr
8c90: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 ently listing su
8ca0: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 bprograms. Figu
8cb0: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 re out which one
8cc0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 and. ** pi
8cd0: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 ck up the approp
8ce0: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f riate opcode. */
8cf0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 . int j;.
8d00: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b i -= p->nOp;
8d10: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 . for(j=0;
8d20: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 i>=apSub[j]->nOp
8d30: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; j++){.
8d40: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e i -= apSub[j]->n
8d50: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 Op;. }.
8d60: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a pOp = &apSub[j
8d70: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d ]->aOp[i];. }
8d80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c . if( p->expl
8d90: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 ain==1 ){.
8da0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
8db0: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 M_Int;. pMe
8dc0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 m->type = SQLITE
8dd0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 _INTEGER;.
8de0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 pMem->u.i = i;
8df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
8e10: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 Program counter
8e20: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b */. pMem++
8e30: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d ;. . pMem-
8e40: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 >flags = MEM_Sta
8e50: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f tic|MEM_Str|MEM_
8e60: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d Term;. pMem
8e70: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c ->z = (char*)sql
8e80: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 ite3OpcodeName(p
8e90: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a Op->opcode); /*
8ea0: 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 Opcode */.
8eb0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a assert( pMem->z
8ec0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 !=0 );. pMe
8ed0: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 m->n = sqlite3St
8ee0: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b rlen30(pMem->z);
8ef0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 . pMem->typ
8f00: 65 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b e = SQLITE_TEXT;
8f10: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 . pMem->enc
8f20: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a = SQLITE_UTF8;.
8f30: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 pMem++;..
8f40: 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 /* When an
8f50: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 OP_Program opcod
8f60: 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 e is encounter (
8f70: 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 the only opcode
8f80: 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a that has. *
8f90: 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 * a P4_SUBPROGRA
8fa0: 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 M argument), exp
8fb0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 and the size of
8fc0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 the array of sub
8fd0: 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a programs. *
8fe0: 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 * kept in p->aMe
8ff0: 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 m[9].z to hold t
9000: 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d he new program -
9010: 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 assuming this s
9020: 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 ubprogram.
9030: 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 ** has not alrea
9040: 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 dy been seen..
9050: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 */. if(
9060: 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 pOp->p4type==P4
9070: 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 _SUBPROGRAM ){.
9080: 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 int nByte
9090: 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 = (nSub+1)*size
90a0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b of(SubProgram*);
90b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a . int j;.
90c0: 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b for(j=0;
90d0: 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 j<nSub; j++){.
90e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 if( apS
90f0: 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 ub[j]==pOp->p4.p
9100: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b Program ) break;
9110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
9120: 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 if( j==nSub &
9130: 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c & SQLITE_OK==sql
9140: 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 ite3VdbeMemGrow(
9150: 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 pSub, nByte, 1)
9160: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 ){. apS
9170: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d ub = (SubProgram
9180: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 **)pSub->z;.
9190: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 apSub[nSu
91a0: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 b++] = pOp->p4.p
91b0: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 Program;.
91c0: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c pSub->flags |
91d0: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 = MEM_Blob;.
91e0: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 pSub->n =
91f0: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 nSub*sizeof(SubP
9200: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 rogram*);.
9210: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 }. }.
9220: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 }.. pMem->fla
9230: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
9240: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f pMem->u.i = pO
9250: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 p->p1;
9260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9270: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 /* P1 */. pMe
9280: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 m->type = SQLITE
9290: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d _INTEGER;. pM
92a0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d em++;.. pMem-
92b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 >flags = MEM_Int
92c0: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 ;. pMem->u.i
92d0: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 = pOp->p2;
92e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
92f0: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 /* P2 */.
9300: 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 pMem->type = SQ
9310: 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 LITE_INTEGER;.
9320: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 pMem++;.. p
9330: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
9340: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e _Int;. pMem->
9350: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 u.i = pOp->p3;
9360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9370: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f /* P3 */
9380: 0a 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 . pMem->type
9390: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 = SQLITE_INTEGER
93a0: 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 ;. pMem++;..
93b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 if( sqlite3Vd
93c0: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 beMemGrow(pMem,
93d0: 33 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 32, 0) ){
93e0: 20 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 /* P4 */.
93f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 assert( p->d
9400: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
9410: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
9420: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 SQLITE_ERROR;.
9430: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c }. pMem->fl
9440: 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 ags = MEM_Dyn|ME
9450: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a M_Str|MEM_Term;.
9460: 20 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 z = displayP
9470: 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 4(pOp, pMem->z,
9480: 33 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 32);. if( z!=
9490: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 pMem->z ){.
94a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
94b0: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d etStr(pMem, z, -
94c0: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 1, SQLITE_UTF8,
94d0: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 0);. }else{.
94e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 assert( pMe
94f0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 m->z!=0 );.
9500: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 pMem->n = sqlit
9510: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d e3Strlen30(pMem-
9520: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d >z);. pMem-
9530: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 >enc = SQLITE_UT
9540: 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d F8;. }. pM
9550: 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 em->type = SQLIT
9560: 45 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d E_TEXT;. pMem
9570: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e ++;.. if( p->
9580: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 explain==1 ){.
9590: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 if( sqlite3V
95a0: 64 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c dbeMemGrow(pMem,
95b0: 20 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 4, 0) ){.
95c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d assert( p->db-
95d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b >mallocFailed );
95e0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
95f0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 SQLITE_ERROR;.
9600: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d }. pMem
9610: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 ->flags = MEM_Dy
9620: 6e 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 n|MEM_Str|MEM_Te
9630: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e rm;. pMem->
9640: 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c n = 2;. sql
9650: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c ite3_snprintf(3,
9660: 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 pMem->z, "%.2x"
9670: 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a , pOp->p5); /*
9680: 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 P5 */. pMe
9690: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 m->type = SQLITE
96a0: 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 _TEXT;. pMe
96b0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f m->enc = SQLITE_
96c0: 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d UTF8;. pMem
96d0: 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 ++;. .#ifdef SQ
96e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 LITE_DEBUG.
96f0: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 if( pOp->zComme
9700: 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d nt ){. pM
9710: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
9720: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 Str|MEM_Term;.
9730: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 pMem->z =
9740: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 pOp->zComment;.
9750: 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d pMem->n =
9760: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
9770: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 (pMem->z);.
9780: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 pMem->enc = S
9790: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 QLITE_UTF8;.
97a0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d pMem->type =
97b0: 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 SQLITE_TEXT;.
97c0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 }else.#endif
97d0: 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 . {.
97e0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
97f0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 EM_Null;
9800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
9810: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 * Comment */.
9820: 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 pMem->type
9830: 3d 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 = SQLITE_NULL;.
9840: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 }. }..
9850: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 p->nResColumn
9860: 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c = 8 - 4*(p->expl
9870: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 ain-1);. p->r
9880: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 c = SQLITE_OK;.
9890: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 rc = SQLITE_R
98a0: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e OW;. }. return
98b0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a rc;.}.#endif /*
98c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 SQLITE_OMIT_EXP
98d0: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 LAIN */..#ifdef
98e0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a SQLITE_DEBUG./*.
98f0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c ** Print the SQL
9900: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 that was used t
9910: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 o generate a VDB
9920: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f E program..*/.vo
9930: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 id sqlite3VdbePr
9940: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b intSql(Vdbe *p){
9950: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e . int nOp = p->
9960: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 nOp;. VdbeOp *p
9970: 4f 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 Op;. if( nOp<1
9980: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 ) return;. pOp
9990: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 = &p->aOp[0];.
99a0: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d if( pOp->opcode=
99b0: 3d 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 =OP_Trace && pOp
99c0: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 ->p4.z!=0 ){.
99d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d const char *z =
99e0: 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 pOp->p4.z;.
99f0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 while( sqlite3Is
9a00: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b space(*z) ) z++;
9a10: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c . printf("SQL
9a20: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 : [%s]\n", z);.
9a30: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 }.}.#endif..#if
9a40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
9a50: 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 _OMIT_TRACE) &&
9a60: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 defined(SQLITE_E
9a70: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f NABLE_IOTRACE)./
9a80: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f *.** Print an IO
9a90: 54 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 TRACE message sh
9aa0: 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e owing SQL conten
9ab0: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 t..*/.void sqlit
9ac0: 65 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c e3VdbeIOTraceSql
9ad0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 (Vdbe *p){. int
9ae0: 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 nOp = p->nOp;.
9af0: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 VdbeOp *pOp;.
9b00: 69 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 if( sqlite3IoTra
9b10: 63 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a ce==0 ) return;.
9b20: 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 if( nOp<1 ) re
9b30: 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 turn;. pOp = &p
9b40: 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 ->aOp[0];. if(
9b50: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f pOp->opcode==OP_
9b60: 54 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 Trace && pOp->p4
9b70: 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 .z!=0 ){. int
9b80: 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 i, j;. char
9b90: 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c z[1000];. sql
9ba0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 ite3_snprintf(si
9bb0: 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 zeof(z), z, "%s"
9bc0: 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 , pOp->p4.z);.
9bd0: 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 for(i=0; sqlit
9be0: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b e3Isspace(z[i]);
9bf0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 i++){}. for(
9c00: 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b j=0; z[i]; i++){
9c10: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 . if( sqlit
9c20: 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 e3Isspace(z[i])
9c30: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a ){. if( z
9c40: 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 [i-1]!=' ' ){.
9c50: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d z[j++] =
9c60: 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a ' ';. }.
9c70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
9c80: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b z[j++] = z[
9c90: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 i];. }.
9ca0: 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a }. z[j] = 0;.
9cb0: 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 sqlite3IoTra
9cc0: 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a ce("SQL %s\n", z
9cd0: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 );. }.}.#endif
9ce0: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f /* !SQLITE_OMIT_
9cf0: 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f TRACE && SQLITE_
9d00: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a ENABLE_IOTRACE *
9d10: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 /../*.** Allocat
9d20: 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 e space from a f
9d30: 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 ixed size buffer
9d40: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f and return a po
9d50: 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 inter to.** that
9d60: 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 space. If insu
9d70: 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 fficient space i
9d80: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 s available, ret
9d90: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 urn NULL..**.**
9da0: 54 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 The pBuf paramet
9db0: 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 er is the initia
9dc0: 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 l value of a poi
9dd0: 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a nter which will.
9de0: 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e ** receive the n
9df0: 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 ew memory. pBuf
9e00: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c is normally NUL
9e10: 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e L. If pBuf is n
9e20: 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d ot.** NULL, it m
9e30: 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 eans that memory
9e40: 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 space has alrea
9e50: 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 dy been allocate
9e60: 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 d and that.** th
9e70: 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c is routine shoul
9e80: 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 d not allocate a
9e90: 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 ny new memory.
9ea0: 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 When pBuf is not
9eb0: 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 .** NULL simply
9ec0: 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e return pBuf. On
9ed0: 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 ly allocate new
9ee0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 memory space whe
9ef0: 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c n pBuf.** is NUL
9f00: 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 L..**.** nByte i
9f10: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 s the number of
9f20: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e bytes of space n
9f30: 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 eeded..**.** *pp
9f40: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 From points to a
9f50: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 vailable space a
9f60: 6e 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 nd pEnd points t
9f70: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 o the end of the
9f80: 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 .** available sp
9f90: 61 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 ace. When space
9fa0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a is allocated, *
9fb0: 70 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 ppFrom is advanc
9fc0: 65 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 ed past.** the e
9fd0: 6e 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 nd of the alloca
9fe0: 74 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a ted space..**.**
9ff0: 20 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f *pnByte is a co
a000: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d unter of the num
a010: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 ber of bytes of
a020: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 space that have
a030: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c failed.** to all
a040: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 ocate. If there
a050: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 is insufficient
a060: 20 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f space in *ppFro
a070: 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 m to satisfy the
a080: 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 .** request, the
a090: 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 n increment *pnB
a0a0: 79 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e yte by the amoun
a0b0: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 t of the request
a0c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
a0d0: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 *allocSpace(.
a0e0: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 void *pBuf,
a0f0: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 /* Where re
a100: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c turn pointer wil
a110: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 l be stored */.
a120: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 int nByte,
a130: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
a140: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f of bytes to allo
a150: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 cate */. u8 **p
a160: 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f pFrom, /
a170: 2a 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 * IN/OUT: Alloca
a180: 74 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 te from *ppFrom
a190: 2a 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 */. u8 *pEnd,
a1a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 /* Poi
a1b0: 6e 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 nter to 1 byte p
a1c0: 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a ast the end of *
a1d0: 70 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f ppFrom buffer */
a1e0: 0a 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 . int *pnByte
a1f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c /* If al
a200: 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 location cannot
a210: 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 be made, increme
a220: 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b nt *pnByte */.){
a230: 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 . assert( EIGHT
a240: 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 _BYTE_ALIGNMENT(
a250: 2a 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 *ppFrom) );. if
a260: 28 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 ( pBuf ) return
a270: 70 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 pBuf;. nByte =
a280: 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 ROUND8(nByte);.
a290: 20 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b if( &(*ppFrom)[
a2a0: 6e 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 nByte] <= pEnd )
a2b0: 7b 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f {. pBuf = (vo
a2c0: 69 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 id*)*ppFrom;.
a2d0: 20 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 *ppFrom += nByt
a2e0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 e;. }else{.
a2f0: 2a 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 *pnByte += nByte
a300: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 ;. }. return p
a310: 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 Buf;.}../*.** Re
a320: 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 wind the VDBE ba
a330: 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e ck to the beginn
a340: 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 ing in preparati
a350: 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e on for.** runnin
a360: 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 g it..*/.void sq
a370: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 lite3VdbeRewind(
a380: 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 Vdbe *p){.#if de
a390: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 fined(SQLITE_DEB
a3a0: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 UG) || defined(V
a3b0: 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 DBE_PROFILE). i
a3c0: 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 nt i;.#endif. a
a3d0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 ssert( p!=0 );.
a3e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 assert( p->magi
a3f0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e c==VDBE_MAGIC_IN
a400: 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 IT );.. /* Ther
a410: 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c e should be at l
a420: 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e east one opcode.
a430: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 . */. assert(
a440: 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f p->nOp>0 );.. /
a450: 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 * Set the magic
a460: 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 to VDBE_MAGIC_RU
a470: 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 N sooner rather
a480: 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 than later. */.
a490: 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 p->magic = VDBE
a4a0: 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 _MAGIC_RUN;..#if
a4b0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
a4c0: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d . for(i=1; i<p-
a4d0: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 >nMem; i++){.
a4e0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d assert( p->aMem
a4f0: 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b [i].db==p->db );
a500: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d . }.#endif. p-
a510: 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 >pc = -1;. p->r
a520: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 c = SQLITE_OK;.
a530: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 p->errorAction
a540: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d = OE_Abort;. p-
a550: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 >magic = VDBE_MA
a560: 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 GIC_RUN;. p->nC
a570: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e hange = 0;. p->
a580: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 cacheCtr = 1;.
a590: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 p->minWriteFileF
a5a0: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 ormat = 255;. p
a5b0: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 ->iStatement = 0
a5c0: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 ;. p->nFkConstr
a5d0: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 aint = 0;.#ifdef
a5e0: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 VDBE_PROFILE.
a5f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f for(i=0; i<p->nO
a600: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e p; i++){. p->
a610: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a aOp[i].cnt = 0;.
a620: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 p->aOp[i].cy
a630: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 cles = 0;. }.#e
a640: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 ndif.}../*.** Pr
a650: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 epare a virtual
a660: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 machine for exec
a670: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 ution for the fi
a680: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a rst time after.*
a690: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 * creating the v
a6a0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 irtual machine.
a6b0: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 This involves t
a6c0: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 hings such.** as
a6d0: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 73 74 61 63 allocating stac
a6e0: 6b 20 73 70 61 63 65 20 61 6e 64 20 69 6e 69 74 k space and init
a6f0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f ializing the pro
a700: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a gram counter..**
a710: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 After the VDBE
a720: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 has be prepped,
a730: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 it can be execut
a740: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 ed by one or mor
a750: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 e.** calls to sq
a760: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e lite3VdbeExec().
a770: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 .**.** This fu
a780: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 nction may be ca
a790: 6c 6c 65 64 20 65 78 61 63 74 20 6f 6e 63 65 20 lled exact once
a7a0: 6f 6e 20 61 20 65 61 63 68 20 76 69 72 74 75 61 on a each virtua
a7b0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 l machine..** Af
a7c0: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 ter this routine
a7d0: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 is called the V
a7e0: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b M has been "pack
a7f0: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 aged" and is rea
a800: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 dy.** to run. A
a810: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e fter this routin
a820: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 74 e is called, fut
a830: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a her calls to .**
a840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
a850: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 p() functions ar
a860: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 e prohibited. T
a870: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 his routine disc
a880: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 onnects.** the V
a890: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 dbe from the Par
a8a0: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 se object that h
a8b0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 elped generate i
a8c0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a t so that the.**
a8d0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 the Vdbe become
a8e0: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 s an independent
a8f0: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 entity and the
a900: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e Parse object can
a910: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 be.** destroyed
a920: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 ..**.** Use the
a930: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e sqlite3VdbeRewin
a940: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f d() procedure to
a950: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 restore a virtu
a960: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a al machine back.
a970: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 ** to its initia
a980: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 l state after it
a990: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a has been run..*
a9a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
a9b0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 beMakeReady(. V
a9c0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 dbe *p,
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
a9e0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 The VDBE */. P
a9f0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 arse *pParse
aa00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
aa10: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 Parsing context
aa20: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 */.){. sqlite3
aa30: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 *db;
aa40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 /* The d
aa50: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
aa60: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 on */. int nVar
aa70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
aa80: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
aa90: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a of parameters *
aaa0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 /. int nMem;
aab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
aac0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
aad0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 VM memory regist
aae0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 ers */. int nCu
aaf0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 rsor;
ab00: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
ab10: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 r of cursors req
ab20: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e uired */. int n
ab30: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 Arg;
ab40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d /* Num
ab50: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 ber of arguments
ab60: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 in subprograms
ab70: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 */. int n;
ab80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ab90: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e /* Loop coun
aba0: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 ter */. u8 *zCs
abb0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
abc0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 /* Memor
abd0: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 y available for
abe0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 allocation */.
abf0: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20 u8 *zEnd;
ac00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
ac10: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 * First byte pas
ac20: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f t allocated memo
ac30: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 ry */. int nByt
ac40: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e;
ac50: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75 /* How mu
ac60: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 ch extra memory
ac70: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 is needed */..
ac80: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a assert( p!=0 );.
ac90: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 assert( p->nOp
aca0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 >0 );. assert(
acb0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 pParse!=0 );. a
acc0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d ssert( p->magic=
acd0: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 =VDBE_MAGIC_INIT
ace0: 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 );. db = p->db
acf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e ;. assert( db->
ad00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 mallocFailed==0
ad10: 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 );. nVar = pPar
ad20: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d se->nVar;. nMem
ad30: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b = pParse->nMem;
ad40: 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 . nCursor = pPa
ad50: 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 rse->nTab;. nAr
ad60: 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 g = pParse->nMax
ad70: 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 Arg;. . /* For
ad80: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 each cursor req
ad90: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f uired, also allo
ada0: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 cate a memory ce
adb0: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 ll. Memory. **
adc0: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 cells (nMem+1-nC
add0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e ursor)..nMem, in
ade0: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 clusive, will ne
adf0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 ver be used by.
ae00: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f ** the vdbe pro
ae10: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 gram. Instead th
ae20: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 ey are used to a
ae30: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f llocate space fo
ae40: 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f r. ** VdbeCurso
ae50: 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 r/BtCursor struc
ae60: 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 tures. The blob
ae70: 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 of memory associ
ae80: 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 ated with . **
ae90: 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 cursor 0 is stor
aea0: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c ed in memory cel
aeb0: 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 l nMem. Memory c
aec0: 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a ell (nMem-1). *
aed0: 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f * stores the blo
aee0: 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f b of memory asso
aef0: 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 ciated with curs
af00: 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a or 1, etc.. **.
af10: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 ** See also: a
af20: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e llocateCursor().
af30: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 . */. nMem +=
af40: 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 41 nCursor;.. /* A
af50: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f llocate space fo
af60: 72 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 r memory registe
af70: 72 73 2c 20 53 51 4c 20 76 61 72 69 61 62 6c 65 rs, SQL variable
af80: 73 2c 20 56 44 42 45 20 63 75 72 73 6f 72 73 20 s, VDBE cursors
af90: 61 6e 64 20 0a 20 20 2a 2a 20 61 6e 20 61 72 72 and . ** an arr
afa0: 61 79 20 74 6f 20 6d 61 72 73 68 61 6c 20 53 51 ay to marshal SQ
afb0: 4c 20 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d L function argum
afc0: 65 6e 74 73 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 ents in.. */.
afd0: 7a 43 73 72 20 3d 20 28 75 38 2a 29 26 70 2d 3e zCsr = (u8*)&p->
afe0: 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 20 20 20 20 aOp[p->nOp];
aff0: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 /* Memory ava
b000: 6c 69 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 liable for alloc
b010: 61 74 69 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 ation */. zEnd
b020: 3d 20 28 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 = (u8*)&p->aOp[p
b030: 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a ->nOpAlloc]; /*
b040: 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 First byte past
b050: 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a end of zCsr[] *
b060: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 /.. resolveP2Va
b070: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a lues(p, &nArg);.
b080: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 p->usesStmtJou
b090: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 rnal = (u8)(pPar
b0a0: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 se->isMultiWrite
b0b0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 && pParse->mayA
b0c0: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 bort);. if( pPa
b0d0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 rse->explain &&
b0e0: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e nMem<10 ){. n
b0f0: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 Mem = 10;. }.
b100: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 memset(zCsr, 0,
b110: 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 zEnd-zCsr);. zC
b120: 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 sr += (zCsr - (u
b130: 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 8*)0)&7;. asser
b140: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c t( EIGHT_BYTE_AL
b150: 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b IGNMENT(zCsr) );
b160: 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f .. /* Memory fo
b170: 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 r registers, par
b180: 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c ameters, cursor,
b190: 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 etc, is allocat
b1a0: 65 64 20 69 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 ed in two. ** p
b1b0: 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 asses. On the f
b1c0: 69 72 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 irst pass, we tr
b1d0: 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 y to reuse unuse
b1e0: 64 20 73 70 61 63 65 20 61 74 20 74 68 65 20 0a d space at the .
b1f0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 ** end of the
b200: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 opcode array. I
b210: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 f we are unable
b220: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d to satisfy all m
b230: 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 emory. ** requi
b240: 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 rements by reusi
b250: 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 ng the opcode ar
b260: 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 ray tail, then t
b270: 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 he second. ** p
b280: 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e ass will fill in
b290: 20 74 68 65 20 72 65 73 74 20 75 73 69 6e 67 20 the rest using
b2a0: 61 20 66 72 65 73 68 20 61 6c 6c 6f 63 61 74 69 a fresh allocati
b2b0: 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 on. . **. **
b2c0: 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 This two-pass ap
b2d0: 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 proach that reus
b2e0: 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 es as much memor
b2f0: 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 y as possible fr
b300: 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 om. ** the left
b310: 6f 76 65 72 20 73 70 61 63 65 20 61 74 20 74 68 over space at th
b320: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 e end of the opc
b330: 6f 64 65 20 61 72 72 61 79 20 63 61 6e 20 73 69 ode array can si
b340: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a gnificantly. **
b350: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 reduce the amou
b360: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c nt of memory hel
b370: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 d by a prepared
b380: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a statement.. */.
b390: 20 20 64 6f 20 7b 0a 20 20 20 20 6e 42 79 74 65 do {. nByte
b3a0: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 = 0;. p->aMe
b3b0: 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 m = allocSpace(p
b3c0: 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a ->aMem, nMem*siz
b3d0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c eof(Mem), &zCsr,
b3e0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a zEnd, &nByte);.
b3f0: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c p->aVar = al
b400: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 56 61 72 locSpace(p->aVar
b410: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 , nVar*sizeof(Me
b420: 6d 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c m), &zCsr, zEnd,
b430: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d &nByte);. p-
b440: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 >apArg = allocSp
b450: 61 63 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 ace(p->apArg, nA
b460: 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c rg*sizeof(Mem*),
b470: 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e &zCsr, zEnd, &n
b480: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a Byte);. p->az
b490: 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 Var = allocSpace
b4a0: 28 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a (p->azVar, nVar*
b4b0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 26 sizeof(char*), &
b4c0: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 zCsr, zEnd, &nBy
b4d0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 te);. p->apCs
b4e0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 r = allocSpace(p
b4f0: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 ->apCsr, nCursor
b500: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 *sizeof(VdbeCurs
b510: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 or*),.
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b530: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 &zCsr, zEnd, &nB
b540: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 yte);. if( nB
b550: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e yte ){. p->
b560: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 pFree = sqlite3D
b570: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 bMallocZero(db,
b580: 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 nByte);. }.
b590: 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 zCsr = p->pFre
b5a0: 65 3b 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a e;. zEnd = &z
b5b0: 43 73 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 Csr[nByte];. }w
b5c0: 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 hile( nByte && !
b5d0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
b5e0: 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f );.. p->nCurso
b5f0: 72 20 3d 20 28 75 31 36 29 6e 43 75 72 73 6f 72 r = (u16)nCursor
b600: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 ;. if( p->aVar
b610: 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d ){. p->nVar =
b620: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 (ynVar)nVar;.
b630: 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 for(n=0; n<nVa
b640: 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 r; n++){. p
b650: 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 ->aVar[n].flags
b660: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 = MEM_Null;.
b670: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 p->aVar[n].db
b680: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a = db;. }. }.
b690: 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 if( p->azVar )
b6a0: 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d {. p->nzVar =
b6b0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a pParse->nzVar;.
b6c0: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a memcpy(p->az
b6d0: 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 Var, pParse->azV
b6e0: 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a ar, p->nzVar*siz
b6f0: 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 eof(p->azVar[0])
b700: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 );. memset(pP
b710: 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 arse->azVar, 0,
b720: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 pParse->nzVar*si
b730: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 zeof(pParse->azV
b740: 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 ar[0]));. }. i
b750: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 f( p->aMem ){.
b760: 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 p->aMem--;
b770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b780: 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 /* aMem[] goes
b790: 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f from 1..nMem */
b7a0: 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e . p->nMem = n
b7b0: 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 Mem;
b7c0: 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f /* no
b7d0: 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 t from 0..nMem-1
b7e0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b */. for(n=1;
b7f0: 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a n<=nMem; n++){.
b800: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d p->aMem[n]
b810: 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c .flags = MEM_Nul
b820: 6c 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d l;. p->aMem
b830: 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 [n].db = db;.
b840: 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c }. }. p->expl
b850: 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 ain = pParse->ex
b860: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 plain;. sqlite3
b870: 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d VdbeRewind(p);.}
b880: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 ../*.** Close a
b890: 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64 20 VDBE cursor and
b8a0: 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20 release all the
b8b0: 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20 63 resources that c
b8c0: 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e ursor .** happen
b8d0: 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f s to hold..*/.vo
b8e0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 id sqlite3VdbeFr
b8f0: 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a 70 eeCursor(Vdbe *p
b900: 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 , VdbeCursor *pC
b910: 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 x){. if( pCx==0
b920: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a ){. return;.
b930: 20 20 7d 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 }. if( pCx->p
b940: 42 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 Bt ){. sqlite
b950: 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3BtreeClose(pCx-
b960: 3e 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 >pBt);. /* Th
b970: 65 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 e pCx->pCursor w
b980: 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 ill be close aut
b990: 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 omatically, if i
b9a0: 74 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 t exists, by.
b9b0: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f ** the call abo
b9c0: 76 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 ve. */. }else i
b9d0: 66 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 f( pCx->pCursor
b9e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 ){. sqlite3Bt
b9f0: 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 reeCloseCursor(p
ba00: 43 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 Cx->pCursor);.
ba10: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 }.#ifndef SQLITE
ba20: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
ba30: 4c 45 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 56 LE. if( pCx->pV
ba40: 74 61 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 tabCursor ){.
ba50: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 sqlite3_vtab_cu
ba60: 72 73 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f rsor *pVtabCurso
ba70: 72 20 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 r = pCx->pVtabCu
ba80: 72 73 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 rsor;. const
ba90: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a sqlite3_module *
baa0: 70 4d 6f 64 75 6c 65 20 3d 20 70 43 78 2d 3e 70 pModule = pCx->p
bab0: 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 Module;. p->i
bac0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b nVtabMethod = 1;
bad0: 0a 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 . pModule->xC
bae0: 6c 6f 73 65 28 70 56 74 61 62 43 75 72 73 6f 72 lose(pVtabCursor
baf0: 29 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 );. p->inVtab
bb00: 4d 65 74 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a Method = 0;. }.
bb10: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 #endif.}../*.**
bb20: 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 Copy the values
bb30: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 stored in the Vd
bb40: 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 beFrame structur
bb50: 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 e to its Vdbe. T
bb60: 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 his.** is used,
bb70: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 for example, whe
bb80: 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d n a trigger sub-
bb90: 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 program is halte
bba0: 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 d to restore.**
bbb0: 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d control to the m
bbc0: 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a ain program..*/.
bbd0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 int sqlite3VdbeF
bbe0: 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 rameRestore(Vdbe
bbf0: 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a Frame *pFrame){.
bc00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 Vdbe *v = pFra
bc10: 6d 65 2d 3e 76 3b 0a 20 20 76 2d 3e 61 4f 70 20 me->v;. v->aOp
bc20: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 = pFrame->aOp;.
bc30: 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 v->nOp = pFrame
bc40: 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d ->nOp;. v->aMem
bc50: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b = pFrame->aMem;
bc60: 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 . v->nMem = pFr
bc70: 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e ame->nMem;. v->
bc80: 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e apCsr = pFrame->
bc90: 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 apCsr;. v->nCur
bca0: 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 sor = pFrame->nC
bcb0: 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e ursor;. v->db->
bcc0: 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 lastRowid = pFra
bcd0: 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 me->lastRowid;.
bce0: 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 v->nChange = pF
bcf0: 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 rame->nChange;.
bd00: 20 72 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e return pFrame->
bd10: 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f pc;.}../*.** Clo
bd20: 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a se all cursors..
bd30: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 **.** Also relea
bd40: 73 65 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d se any dynamic m
bd50: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 emory held by th
bd60: 65 20 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 e VM in the Vdbe
bd70: 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a .aMem memory .**
bd80: 20 63 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 cell array. Thi
bd90: 73 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 s is necessary a
bda0: 73 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c s the memory cel
bdb0: 6c 20 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 l array may cont
bdc0: 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 ain.** pointers
bdd0: 74 6f 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a to VdbeFrame obj
bde0: 65 63 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 ects, which may
bdf0: 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 in turn contain
be00: 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f pointers to.** o
be10: 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a pen cursors..*/.
be20: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 static void clos
be30: 65 41 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 eAllCursors(Vdbe
be40: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 *p){. if( p->p
be50: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 Frame ){. Vdb
be60: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a eFrame *pFrame;.
be70: 20 20 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 for(pFrame=p
be80: 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 ->pFrame; pFrame
be90: 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d ->pParent; pFram
bea0: 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e e=pFrame->pParen
beb0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 t);. sqlite3V
bec0: 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 dbeFrameRestore(
bed0: 70 46 72 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 70 pFrame);. }. p
bee0: 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 ->pFrame = 0;.
bef0: 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 0a p->nFrame = 0;..
bf00: 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 if( p->apCsr )
bf10: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 {. int i;.
bf20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e for(i=0; i<p->n
bf30: 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 Cursor; i++){.
bf40: 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a VdbeCursor *
bf50: 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d pC = p->apCsr[i]
bf60: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 ;. if( pC )
bf70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
bf80: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 3VdbeFreeCursor(
bf90: 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 p, pC);.
bfa0: 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b p->apCsr[i] = 0;
bfb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
bfc0: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d }. if( p->aMem
bfd0: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d ){. releaseM
bfe0: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d emArray(&p->aMem
bff0: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 [1], p->nMem);.
c000: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 }. while( p->p
c010: 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 DelFrame ){.
c020: 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 VdbeFrame *pDel
c030: 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a = p->pDelFrame;.
c040: 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 p->pDelFrame
c050: 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 = pDel->pParent
c060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 ;. sqlite3Vdb
c070: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 eFrameDelete(pDe
c080: 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a l);. }.}../*.**
c090: 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d Clean up the VM
c0a0: 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e after execution
c0b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ..**.** This rou
c0c0: 74 69 6e 65 20 77 69 6c 6c 20 61 75 74 6f 6d 61 tine will automa
c0d0: 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 20 61 6e tically close an
c0e0: 79 20 63 75 72 73 6f 72 73 2c 20 6c 69 73 74 73 y cursors, lists
c0f0: 2c 20 61 6e 64 2f 6f 72 0a 2a 2a 20 73 6f 72 74 , and/or.** sort
c100: 65 72 73 20 74 68 61 74 20 77 65 72 65 20 6c 65 ers that were le
c110: 66 74 20 6f 70 65 6e 2e 20 20 49 74 20 61 6c 73 ft open. It als
c120: 6f 20 64 65 6c 65 74 65 73 20 74 68 65 20 76 61 o deletes the va
c130: 6c 75 65 73 20 6f 66 0a 2a 2a 20 76 61 72 69 61 lues of.** varia
c140: 62 6c 65 73 20 69 6e 20 74 68 65 20 61 56 61 72 bles in the aVar
c150: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 [] array..*/.sta
c160: 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 tic void Cleanup
c170: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c (Vdbe *p){. sql
c180: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 ite3 *db = p->db
c190: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ;..#ifdef SQLITE
c1a0: 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 _DEBUG. /* Exec
c1b0: 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 ute assert() sta
c1c0: 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 tements to ensur
c1d0: 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e e that the Vdbe.
c1e0: 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a apCsr[] and . *
c1f0: 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 * Vdbe.aMem[] ar
c200: 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 rays have alread
c210: 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 y been cleaned u
c220: 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a p. */. int i;.
c230: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
c240: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 nCursor; i++) as
c250: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 3d 3d sert( p->apCsr==
c260: 30 20 7c 7c 20 70 2d 3e 61 70 43 73 72 5b 69 5d 0 || p->apCsr[i]
c270: 3d 3d 30 20 29 3b 0a 20 20 66 6f 72 28 69 3d 31 ==0 );. for(i=1
c280: 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b ; i<=p->nMem; i+
c290: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d +) assert( p->aM
c2a0: 65 6d 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4d 65 6d em==0 || p->aMem
c2b0: 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 4e [i].flags==MEM_N
c2c0: 75 6c 6c 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 ull );.#endif..
c2d0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
c2e0: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a b, p->zErrMsg);.
c2f0: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 p->zErrMsg = 0
c300: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 ;. p->pResultSe
c310: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 t = 0;.}../*.**
c320: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f Set the number o
c330: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 f result columns
c340: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 that will be re
c350: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 turned by this S
c360: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e QL.** statement.
c370: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 This is now set
c380: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 at compile time
c390: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 , rather than du
c3a0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f ring.** executio
c3b0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 n of the vdbe pr
c3c0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 ogram so that sq
c3d0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 lite3_column_cou
c3e0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 nt() can.** be c
c3f0: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 alled on an SQL
c400: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 statement before
c410: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e sqlite3_step().
c420: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
c430: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 VdbeSetNumCols(V
c440: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 dbe *p, int nRes
c450: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a Column){. Mem *
c460: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 pColName;. int
c470: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 n;. sqlite3 *db
c480: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c = p->db;.. rel
c490: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e easeMemArray(p->
c4a0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 aColName, p->nRe
c4b0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f sColumn*COLNAME_
c4c0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 N);. sqlite3DbF
c4d0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e ree(db, p->aColN
c4e0: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 ame);. n = nRes
c4f0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e Column*COLNAME_N
c500: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d ;. p->nResColum
c510: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c n = (u16)nResCol
c520: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 umn;. p->aColNa
c530: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 me = pColName =
c540: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d (Mem*)sqlite3DbM
c550: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 allocZero(db, si
c560: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 zeof(Mem)*n );.
c570: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 if( p->aColName
c580: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
c590: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 while( n-- > 0 )
c5a0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e {. pColName->
c5b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c flags = MEM_Null
c5c0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e ;. pColName->
c5d0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 db = p->db;.
c5e0: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a pColName++;. }.
c5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 }../*.** Set the
c600: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 name of the idx
c610: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 'th column to be
c620: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 returned by the
c630: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a SQL statement..
c640: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 ** zName must be
c650: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 a pointer to a
c660: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 nul terminated s
c670: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 tring..**.** Thi
c680: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d s call must be m
c690: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c ade after a call
c6a0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 to sqlite3VdbeS
c6b0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a etNumCols()..**.
c6c0: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 ** The final par
c6d0: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 ameter, xDel, mu
c6e0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c st be one of SQL
c6f0: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c ITE_DYNAMIC, SQL
c700: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 ITE_STATIC.** or
c710: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e SQLITE_TRANSIEN
c720: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 T. If it is SQLI
c730: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e TE_DYNAMIC, then
c740: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e the buffer poin
c750: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 ted.** to by zNa
c760: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 me will be freed
c770: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 by sqlite3DbFre
c780: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 e() when the vdb
c790: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a e is destroyed..
c7a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
c7b0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 beSetColName(.
c7c0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 Vdbe *p,
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c7e0: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 /* Vdbe being c
c7f0: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 onfigured */. i
c800: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 nt idx,
c810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c820: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 /* Index of colu
c830: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 mn zName applies
c840: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 to */. int var
c850: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
c860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 /* One
c870: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f of the COLNAME_
c880: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 * constants */.
c890: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
c8a0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 me,
c8b0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 /* Pointer to
c8c0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e buffer containin
c8d0: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 g name */. void
c8e0: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 (*xDel)(void*)
c8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
c900: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e Memory managemen
c910: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a t strategy for z
c920: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 Name */.){. int
c930: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c rc;. Mem *pCol
c940: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 Name;. assert(
c950: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d idx<p->nResColum
c960: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 n );. assert( v
c970: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a ar<COLNAME_N );.
c980: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c if( p->db->mal
c990: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 locFailed ){.
c9a0: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 assert( !zName
c9b0: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f || xDel!=SQLITE_
c9c0: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 DYNAMIC );. r
c9d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
c9e0: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 EM;. }. assert
c9f0: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 ( p->aColName!=0
ca00: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d );. pColName =
ca10: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 &(p->aColName[i
ca20: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f dx+var*p->nResCo
ca30: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 lumn]);. rc = s
ca40: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 qlite3VdbeMemSet
ca50: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e Str(pColName, zN
ca60: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f ame, -1, SQLITE_
ca70: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 UTF8, xDel);. a
ca80: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 ssert( rc!=0 ||
ca90: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e !zName || (pColN
caa0: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 ame->flags&MEM_T
cab0: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 erm)!=0 );. ret
cac0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
cad0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 A read or write
cae0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 transaction may
caf0: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 or may not be a
cb00: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 ctive on databas
cb10: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 e handle.** db.
cb20: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e If a transaction
cb30: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d is active, comm
cb40: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 it it. If there
cb50: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 is a.** write-tr
cb60: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 ansaction spanni
cb70: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 ng more than one
cb80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 database file,
cb90: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 this routine.**
cba0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 takes care of th
cbb0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
cbc0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 trickery..*/.st
cbd0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d atic int vdbeCom
cbe0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c mit(sqlite3 *db,
cbf0: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 Vdbe *p){. int
cc00: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 i;. int nTrans
cc10: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 = 0; /* Number
cc20: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 of databases wi
cc30: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 th an active wri
cc40: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a te-transaction *
cc50: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c /. int rc = SQL
cc60: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 ITE_OK;. int ne
cc70: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a edXcommit = 0;..
cc80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d #ifdef SQLITE_OM
cc90: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
cca0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f /* With this o
ccb0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 ption, sqlite3Vt
ccc0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 abSync() is defi
ccd0: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 ned to be simply
cce0: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b . ** SQLITE_OK
ccf0: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 so p is not use
cd00: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 d. . */. UNUSE
cd10: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a D_PARAMETER(p);.
cd20: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 #endif.. /* Bef
cd30: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 ore doing anythi
cd40: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 ng else, call th
cd50: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 e xSync() callba
cd60: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 ck for any. **
cd70: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 virtual module t
cd80: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e ables written in
cd90: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f this transactio
cda0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 n. This has to.
cdb0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f ** be done befo
cdc0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 re determining w
cdd0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 hether a master
cde0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 journal file is
cdf0: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 . ** required,
ce00: 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 as an xSync() ca
ce10: 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 llback may add a
ce20: 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 n attached datab
ce30: 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 ase. ** to the
ce40: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a transaction.. *
ce50: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 /. rc = sqlite3
ce60: 56 74 61 62 53 79 6e 63 28 64 62 2c 20 26 70 2d VtabSync(db, &p-
ce70: 3e 7a 45 72 72 4d 73 67 29 3b 0a 0a 20 20 2f 2a >zErrMsg);.. /*
ce80: 20 54 68 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 This loop deter
ce90: 6d 69 6e 65 73 20 28 61 29 20 69 66 20 74 68 65 mines (a) if the
cea0: 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f commit hook sho
ceb0: 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 uld be invoked a
cec0: 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 nd. ** (b) how
ced0: 6d 61 6e 79 20 64 61 74 61 62 61 73 65 20 66 69 many database fi
cee0: 6c 65 73 20 68 61 76 65 20 6f 70 65 6e 20 77 72 les have open wr
cef0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 ite transactions
cf00: 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c , not . ** incl
cf10: 75 64 69 6e 67 20 74 68 65 20 74 65 6d 70 20 64 uding the temp d
cf20: 61 74 61 62 61 73 65 2e 20 28 62 29 20 69 73 20 atabase. (b) is
cf30: 69 6d 70 6f 72 74 61 6e 74 20 62 65 63 61 75 73 important becaus
cf40: 65 20 69 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a e if more than .
cf50: 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 ** one databas
cf60: 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 e file has an op
cf70: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 en write transac
cf80: 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a tion, a master j
cf90: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 ournal. ** file
cfa0: 20 69 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 is required for
cfb0: 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 an atomic commi
cfc0: 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 t.. */ . for(i
cfd0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f =0; rc==SQLITE_O
cfe0: 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 K && i<db->nDb;
cff0: 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74 72 65 65 i++){ . Btree
d000: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
d010: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 i].pBt;. if(
d020: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e sqlite3BtreeIsIn
d030: 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 Trans(pBt) ){.
d040: 20 20 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 needXcommit
d050: 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 69 = 1;. if( i
d060: 21 3d 31 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a !=1 ) nTrans++;.
d070: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
d080: 65 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 e3PagerExclusive
d090: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 Lock(sqlite3Btre
d0a0: 65 50 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 ePager(pBt));.
d0b0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 }. }. if( rc
d0c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
d0d0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
d0e0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 }.. /* If there
d0f0: 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 are any write-t
d100: 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 ransactions at a
d110: 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 ll, invoke the c
d120: 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 ommit hook */.
d130: 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 if( needXcommit
d140: 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 && db->xCommitCa
d150: 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 llback ){. rc
d160: 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 = db->xCommitCa
d170: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d llback(db->pComm
d180: 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 itArg);. if(
d190: 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 rc ){. retu
d1a0: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 rn SQLITE_CONSTR
d1b0: 41 49 4e 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a AINT;. }. }.
d1c0: 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 . /* The simple
d1d0: 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 case - no more
d1e0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 than one databas
d1f0: 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e e file (not coun
d200: 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 ting the. ** TE
d210: 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 MP database) has
d220: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 a transaction a
d230: 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 ctive. There i
d240: 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 s no need for th
d250: 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f e. ** master-jo
d260: 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a urnal.. **. **
d270: 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 If the return v
d280: 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 alue of sqlite3B
d290: 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 treeGetFilename(
d2a0: 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 ) is a zero leng
d2b0: 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 th. ** string,
d2c0: 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 it means the mai
d2d0: 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d n database is :m
d2e0: 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 emory: or a temp
d2f0: 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a file. In . **
d300: 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f that case we do
d310: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f not support ato
d320: 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 mic multi-file c
d330: 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 ommits, so use t
d340: 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 he . ** simple
d350: 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 case then too..
d360: 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c */. if( 0==sql
d370: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c ite3Strlen30(sql
d380: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 ite3BtreeGetFile
d390: 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e name(db->aDb[0].
d3a0: 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 pBt)). || nTra
d3b0: 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 ns<=1. ){. f
d3c0: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 or(i=0; rc==SQLI
d3d0: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e TE_OK && i<db->n
d3e0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 Db; i++){.
d3f0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d Btree *pBt = db-
d400: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 >aDb[i].pBt;.
d410: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 if( pBt ){.
d420: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
d430: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 e3BtreeCommitPha
d440: 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 seOne(pBt, 0);.
d450: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 }. }..
d460: 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d /* Do the comm
d470: 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 it only if all d
d480: 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 atabases success
d490: 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 fully complete p
d4a0: 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 hase 1. . **
d4b0: 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 If one of the Bt
d4c0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e reeCommitPhaseOn
d4d0: 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c e() calls fails,
d4e0: 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 this indicates
d4f0: 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 an. ** IO err
d500: 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e or while deletin
d510: 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 g or truncating
d520: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 a journal file.
d530: 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a It is unlikely,.
d540: 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 ** but could
d550: 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 happen. In this
d560: 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 case abandon pr
d570: 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 ocessing and ret
d580: 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 urn the error..
d590: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d */. for(i=
d5a0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0; rc==SQLITE_OK
d5b0: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 && i<db->nDb; i
d5c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 ++){. Btree
d5d0: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
d5e0: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 i].pBt;. if
d5f0: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 ( pBt ){.
d600: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc = sqlite3Btr
d610: 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f eeCommitPhaseTwo
d620: 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 (pBt, 0);.
d630: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 }. }. if(
d640: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
d650: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 . sqlite3Vt
d660: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 abCommit(db);.
d670: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 }. }.. /* Th
d680: 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d e complex case -
d690: 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 There is a mult
d6a0: 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 i-file write-tra
d6b0: 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e nsaction active.
d6c0: 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 . ** This requi
d6d0: 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 res a master jou
d6e0: 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 rnal file to ens
d6f0: 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 ure the transact
d700: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d ion is. ** comm
d710: 69 74 74 65 64 20 61 74 6f 6d 69 63 6c 79 2e 0a itted atomicly..
d720: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c */.#ifndef SQL
d730: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a ITE_OMIT_DISKIO.
d740: 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 else{. sqli
d750: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 te3_vfs *pVfs =
d760: 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e db->pVfs;. in
d770: 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a t needSync = 0;.
d780: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 char *zMaste
d790: 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 r = 0; /* File
d7a0: 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 -name for the ma
d7b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a ster journal */.
d7c0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a char const *
d7d0: 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 zMainFile = sqli
d7e0: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e te3BtreeGetFilen
d7f0: 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 ame(db->aDb[0].p
d800: 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 Bt);. sqlite3
d810: 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d _file *pMaster =
d820: 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 0;. i64 offs
d830: 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 et = 0;. int
d840: 72 65 73 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c res;.. /* Sel
d850: 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 ect a master jou
d860: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a rnal file name *
d870: 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 /. do {.
d880: 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 u32 iRandom;.
d890: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
d8a0: 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a e(db, zMaster);.
d8b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 sqlite3_ra
d8c0: 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 ndomness(sizeof(
d8d0: 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 iRandom), &iRand
d8e0: 6f 6d 29 3b 0a 20 20 20 20 20 20 7a 4d 61 73 74 om);. zMast
d8f0: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 er = sqlite3MPri
d900: 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 25 30 ntf(db, "%s-mj%0
d910: 38 58 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 2c 20 8X", zMainFile,
d920: 69 52 61 6e 64 6f 6d 26 30 78 37 66 66 66 66 66 iRandom&0x7fffff
d930: 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 ff);. if( !
d940: 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 zMaster ){.
d950: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
d960: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a _NOMEM;. }.
d970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c sqlite3Fil
d980: 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 eSuffix3(zMainFi
d990: 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 le, zMaster);.
d9a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
d9b0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a OsAccess(pVfs, z
d9c0: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 Master, SQLITE_A
d9d0: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 CCESS_EXISTS, &r
d9e0: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 es);. }while(
d9f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 rc==SQLITE_OK &
da00: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 & res );. if(
da10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc==SQLITE_OK )
da20: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 {. /* Open
da30: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
da40: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 al. */. rc
da50: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d = sqlite3OsOpenM
da60: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 alloc(pVfs, zMas
da70: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a ter, &pMaster, .
da80: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 SQLITE
da90: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c _OPEN_READWRITE|
daa0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 SQLITE_OPEN_CREA
dab0: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 TE|. SQ
dac0: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 LITE_OPEN_EXCLUS
dad0: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f IVE|SQLITE_OPEN_
dae0: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 MASTER_JOURNAL,
daf0: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0. );. }
db00: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
db10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
db20: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
db30: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 , zMaster);.
db40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 return rc;.
db50: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 }. . /* Writ
db60: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 e the name of ea
db70: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 ch database file
db80: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 in the transact
db90: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 ion into the new
dba0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a . ** master j
dbb0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 ournal file. If
dbc0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 an error occurs
dbd0: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c at this point cl
dbe0: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 ose. ** and d
dbf0: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 elete the master
dc00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 journal file. A
dc10: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 ll the individua
dc20: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a l journal files.
dc30: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 ** still hav
dc40: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 e 'null' as the
dc50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 master journal p
dc60: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 ointer, so they
dc70: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a will roll. **
dc80: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e back independen
dc90: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 tly if a failure
dca0: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a occurs.. */.
dcb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 for(i=0; i<d
dcc0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 b->nDb; i++){.
dcd0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d Btree *pBt =
dce0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b db->aDb[i].pBt;
dcf0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 . if( sqlit
dd00: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 e3BtreeIsInTrans
dd10: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 (pBt) ){.
dd20: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 char const *zFi
dd30: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 le = sqlite3Btre
dd40: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 eGetJournalname(
dd50: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 pBt);. if
dd60: 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 ( zFile==0 ){.
dd70: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 continue
dd80: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d ; /* Ignore TEM
dd90: 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 P and :memory: d
dda0: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 atabases */.
ddb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 }. as
ddc0: 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d sert( zFile[0]!=
ddd0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 0 );. if(
dde0: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 !needSync && !s
ddf0: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 qlite3BtreeSyncD
de00: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a isabled(pBt) ){.
de10: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 needSy
de20: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 nc = 1;.
de30: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 }. rc = s
de40: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d qlite3OsWrite(pM
de50: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 aster, zFile, sq
de60: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 lite3Strlen30(zF
de70: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b ile)+1, offset);
de80: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 . offset
de90: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e += sqlite3Strlen
dea0: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 30(zFile)+1;.
deb0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c if( rc!=SQL
dec0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
ded0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f sqlite3OsClo
dee0: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b seFree(pMaster);
def0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
df00: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c e3OsDelete(pVfs,
df10: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 zMaster, 0);.
df20: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 sqlite3D
df30: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 bFree(db, zMaste
df40: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 r);. re
df50: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 turn rc;.
df60: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
df70: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 .. /* Sync th
df80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
df90: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f file. If the IO
dfa0: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 CAP_SEQUENTIAL d
dfb0: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 evice. ** fla
dfc0: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 g is set this is
dfd0: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 not required..
dfe0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 */. if( ne
dff0: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 edSync . &&
e000: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 0==(sqlite3OsDev
e010: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 iceCharacteristi
e020: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 cs(pMaster)&SQLI
e030: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 TE_IOCAP_SEQUENT
e040: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c IAL). && SQL
e050: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 ITE_OK!=(rc = sq
e060: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 lite3OsSync(pMas
e070: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 ter, SQLITE_SYNC
e080: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b _NORMAL)). ){
e090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 . sqlite3Os
e0a0: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 CloseFree(pMaste
e0b0: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 r);. sqlite
e0c0: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 3OsDelete(pVfs,
e0d0: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 zMaster, 0);.
e0e0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
e0f0: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 (db, zMaster);.
e100: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
e110: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 }.. /* Sy
e120: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 nc all the db fi
e130: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 les involved in
e140: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e the transaction.
e150: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 The same call.
e160: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d ** sets the m
e170: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f aster journal po
e180: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e inter in each in
e190: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c dividual journal
e1a0: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 . If. ** an e
e1b0: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 rror occurs here
e1c0: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 , do not delete
e1d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
e1e0: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a al file.. **.
e1f0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 ** If the er
e200: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e ror occurs durin
e210: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c g the first call
e220: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 to. ** sqlit
e230: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 e3BtreeCommitPha
e240: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 seOne(), then th
e250: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 ere is a chance
e260: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 that the. **
e270: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
e280: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 ile will be orph
e290: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e aned. But we can
e2a0: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 not delete it,.
e2b0: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 ** in case th
e2c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
e2d0: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 file name was w
e2e0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 ritten into the
e2f0: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 journal. ** f
e300: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 ile before the f
e310: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e ailure occurred.
e320: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 . */. for(
e330: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f i=0; rc==SQLITE_
e340: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b OK && i<db->nDb;
e350: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 i++){ . Bt
e360: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 ree *pBt = db->a
e370: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 Db[i].pBt;.
e380: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 if( pBt ){.
e390: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
e3a0: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
e3b0: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 One(pBt, zMaster
e3c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
e3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c . sqlite3OsCl
e3e0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 oseFree(pMaster)
e3f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 ;. assert( rc
e400: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b !=SQLITE_BUSY );
e410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
e420: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
e430: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
e440: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 , zMaster);.
e450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 return rc;.
e460: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 }.. /* Delet
e470: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 e the master jou
e480: 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 rnal file. This
e490: 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e commits the tran
e4a0: 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 saction. After.
e4b0: 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 ** doing this
e4c0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 the directory i
e4d0: 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 s synced again b
e4e0: 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 efore any indivi
e4f0: 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e dual. ** tran
e500: 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 saction files ar
e510: 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a e deleted.. *
e520: 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 /. rc = sqlit
e530: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c e3OsDelete(pVfs,
e540: 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20 zMaster, 1);.
e550: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
e560: 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 db, zMaster);.
e570: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 zMaster = 0;.
e580: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 if( rc ){.
e590: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
e5a0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 }.. /* All
e5b0: 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 files and direct
e5c0: 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 ories have alrea
e5d0: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 dy been synced,
e5e0: 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 so the following
e5f0: 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f . ** calls to
e600: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d sqlite3BtreeCom
e610: 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 mitPhaseTwo() ar
e620: 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 e only closing f
e630: 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 iles and. **
e640: 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e deleting or trun
e650: 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e cating journals.
e660: 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f If something go
e670: 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 es wrong while.
e680: 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 ** this is ha
e690: 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 ppening we don't
e6a0: 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 really care. Th
e6b0: 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 e integrity of t
e6c0: 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 he. ** transa
e6d0: 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 ction is already
e6e0: 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 guaranteed, but
e6f0: 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c some stray 'col
e700: 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 d' journals.
e710: 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 ** may be lying
e720: 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e around. Returnin
e730: 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 g an error code
e740: 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 won't help matte
e750: 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 rs.. */. d
e760: 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 isable_simulated
e770: 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 _io_errors();.
e780: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 sqlite3BeginBe
e790: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 nignMalloc();.
e7a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
e7b0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 >nDb; i++){ .
e7c0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
e7d0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
e7e0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b if( pBt ){
e7f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
e800: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
e810: 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 Two(pBt, 1);.
e820: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 }. }. s
e830: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d qlite3EndBenignM
e840: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 alloc();. ena
e850: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f ble_simulated_io
e860: 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 _errors();..
e870: 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 sqlite3VtabCommi
e880: 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 t(db);. }.#endi
e890: 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a f.. return rc;.
e8a0: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 }../* .** This r
e8b0: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 outine checks th
e8c0: 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 61 at the sqlite3.a
e8d0: 63 74 69 76 65 56 64 62 65 43 6e 74 20 63 6f 75 ctiveVdbeCnt cou
e8e0: 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d nt variable.** m
e8f0: 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 atches the numbe
e900: 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 r of vdbe's in t
e910: 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e he list sqlite3.
e920: 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a pVdbe that are.*
e930: 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 * currently acti
e940: 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e ve. An assertion
e950: 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 fails if the tw
e960: 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 o counts do not
e970: 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 match..** This i
e980: 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 s an internal se
e990: 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 lf-check only -
e9a0: 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 it is not an ess
e9b0: 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e ential processin
e9c0: 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a g.** step..**.**
e9d0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 This is a no-op
e9e0: 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 if NDEBUG is de
e9f0: 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 fined..*/.#ifnde
ea00: 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 f NDEBUG.static
ea10: 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 void checkActive
ea20: 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 VdbeCnt(sqlite3
ea30: 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b *db){. Vdbe *p;
ea40: 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a . int cnt = 0;.
ea50: 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 int nWrite = 0
ea60: 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 ;. p = db->pVdb
ea70: 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b e;. while( p ){
ea80: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 . if( p->magi
ea90: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 c==VDBE_MAGIC_RU
eaa0: 4e 20 26 26 20 70 2d 3e 70 63 3e 3d 30 20 29 7b N && p->pc>=0 ){
eab0: 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 . cnt++;.
eac0: 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f if( p->readO
ead0: 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b nly==0 ) nWrite+
eae0: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d +;. }. p =
eaf0: 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 p->pNext;. }.
eb00: 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 assert( cnt==db
eb10: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20 ->activeVdbeCnt
eb20: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 );. assert( nWr
eb30: 69 74 65 3d 3d 64 62 2d 3e 77 72 69 74 65 56 64 ite==db->writeVd
eb40: 62 65 43 6e 74 20 29 3b 0a 7d 0a 23 65 6c 73 65 beCnt );.}.#else
eb50: 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 .#define checkAc
eb60: 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 tiveVdbeCnt(x).#
eb70: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 endif../*.** For
eb80: 20 65 76 65 72 79 20 42 74 72 65 65 20 74 68 61 every Btree tha
eb90: 74 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f t in database co
eba0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 77 68 69 63 nnection db whic
ebb0: 68 20 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d h .** has been m
ebc0: 6f 64 69 66 69 65 64 2c 20 22 74 72 69 70 22 20 odified, "trip"
ebd0: 6f 72 20 69 6e 76 61 6c 69 64 61 74 65 20 65 61 or invalidate ea
ebe0: 63 68 20 63 75 72 73 6f 72 20 69 6e 0a 2a 2a 20 ch cursor in.**
ebf0: 74 68 61 74 20 42 74 72 65 65 20 6d 69 67 68 74 that Btree might
ec00: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66 have been modif
ec10: 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 ied so that the
ec20: 63 75 72 73 6f 72 0a 2a 2a 20 63 61 6e 20 6e 65 cursor.** can ne
ec30: 76 65 72 20 62 65 20 75 73 65 64 20 61 67 61 69 ver be used agai
ec40: 6e 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 n. This happens
ec50: 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b when a rollback
ec60: 0a 2a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 57 65 .*** occurs. We
ec70: 20 68 61 76 65 20 74 6f 20 74 72 69 70 20 61 6c have to trip al
ec80: 6c 20 74 68 65 20 6f 74 68 65 72 20 63 75 72 73 l the other curs
ec90: 6f 72 73 2c 20 65 76 65 6e 0a 2a 2a 20 63 75 72 ors, even.** cur
eca0: 73 6f 72 20 66 72 6f 6d 20 6f 74 68 65 72 20 56 sor from other V
ecb0: 4d 73 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 Ms in different
ecc0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 database connect
ecd0: 69 6f 6e 73 2c 0a 2a 2a 20 73 6f 20 74 68 61 74 ions,.** so that
ece0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 6d 20 74 72 none of them tr
ecf0: 79 20 74 6f 20 75 73 65 20 74 68 65 20 64 61 74 y to use the dat
ed00: 61 20 61 74 20 77 68 69 63 68 20 74 68 65 79 0a a at which they.
ed10: 2a 2a 20 77 65 72 65 20 70 6f 69 6e 74 69 6e 67 ** were pointing
ed20: 20 61 6e 64 20 77 68 69 63 68 20 6e 6f 77 20 6d and which now m
ed30: 61 79 20 68 61 76 65 20 62 65 65 6e 20 63 68 61 ay have been cha
ed40: 6e 67 65 64 20 64 75 65 0a 2a 2a 20 74 6f 20 74 nged due.** to t
ed50: 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a he rollback..**.
ed60: 2a 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 61 74 ** Remember that
ed70: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 63 61 6e 20 a rollback can
ed80: 64 65 6c 65 74 65 20 74 61 62 6c 65 73 20 63 6f delete tables co
ed90: 6d 70 6c 65 74 65 20 61 6e 64 0a 2a 2a 20 72 65 mplete and.** re
eda0: 6f 72 64 65 72 20 72 6f 6f 74 70 61 67 65 73 2e order rootpages.
edb0: 20 20 53 6f 20 69 74 20 69 73 20 6e 6f 74 20 73 So it is not s
edc0: 75 66 66 69 63 69 65 6e 74 20 6a 75 73 74 20 74 ufficient just t
edd0: 6f 20 73 61 76 65 0a 2a 2a 20 74 68 65 20 73 74 o save.** the st
ede0: 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f ate of the curso
edf0: 72 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 69 r. We have to i
ee00: 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 63 75 nvalidate the cu
ee10: 72 73 6f 72 0a 2a 2a 20 73 6f 20 74 68 61 74 20 rsor.** so that
ee20: 69 74 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 it is never used
ee30: 20 61 67 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 again..*/.stati
ee40: 63 20 76 6f 69 64 20 69 6e 76 61 6c 69 64 61 74 c void invalidat
ee50: 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 eCursorsOnModifi
ee60: 65 64 42 74 72 65 65 73 28 73 71 6c 69 74 65 33 edBtrees(sqlite3
ee70: 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a *db){. int i;.
ee80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
ee90: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 >nDb; i++){.
eea0: 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e 61 Btree *p = db->a
eeb0: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 Db[i].pBt;. i
eec0: 66 28 20 70 20 26 26 20 73 71 6c 69 74 65 33 42 f( p && sqlite3B
eed0: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 treeIsInTrans(p)
eee0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ){. sqlite
eef0: 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 3BtreeTripAllCur
ef00: 73 6f 72 73 28 70 2c 20 53 51 4c 49 54 45 5f 41 sors(p, SQLITE_A
ef10: 42 4f 52 54 29 3b 0a 20 20 20 20 7d 0a 20 20 7d BORT);. }. }
ef20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 .}../*.** If the
ef30: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 Vdbe passed as
ef40: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 the first argume
ef50: 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 74 nt opened a stat
ef60: 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f ement-transactio
ef70: 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e n,.** close it n
ef80: 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 ow. Argument eOp
ef90: 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 must be either
efa0: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
efb0: 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 CK or.** SAVEPOI
efc0: 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 69 NT_RELEASE. If i
efd0: 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 t is SAVEPOINT_R
efe0: 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 OLLBACK, then th
eff0: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 e statement.** t
f000: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f ransaction is ro
f010: 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 4f lled back. If eO
f020: 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 p is SAVEPOINT_R
f030: 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 65 ELEASE, then the
f040: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 .** statement t
f050: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f ransaction is co
f060: 6d 6d 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 mmtted..**.** If
f070: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 an IO error occ
f080: 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 urs, an SQLITE_I
f090: 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 OERR_XXX error c
f0a0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e ode is returned.
f0b0: 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 .** Otherwise S
f0c0: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 QLITE_OK..*/.int
f0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 sqlite3VdbeClos
f0e0: 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 eStatement(Vdbe
f0f0: 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 *p, int eOp){.
f100: 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 sqlite3 *const d
f110: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 b = p->db;. int
f120: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b rc = SQLITE_OK;
f130: 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 .. /* If p->iSt
f140: 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 atement is great
f150: 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 er than zero, th
f160: 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 en this Vdbe ope
f170: 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 ned a . ** stat
f180: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
f190: 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 n that should be
f1a0: 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 closed here. Th
f1b0: 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e e only exception
f1c0: 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e . ** is that an
f1d0: 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 IO error may ha
f1e0: 76 65 20 6f 63 63 75 72 65 64 2c 20 63 61 75 73 ve occured, caus
f1f0: 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 ing an emergency
f200: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 rollback.. **
f210: 49 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 In this case (db
f220: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 ->nStatement==0)
f230: 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e , and there is n
f240: 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 othing to do..
f250: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 */. if( db->nSt
f260: 61 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 atement && p->iS
f270: 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 tatement ){.
f280: 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 int i;. const
f290: 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 int iSavepoint
f2a0: 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d = p->iStatement-
f2b0: 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 1;.. assert(
f2c0: 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 eOp==SAVEPOINT_R
f2d0: 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d OLLBACK || eOp==
f2e0: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
f2f0: 45 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 E);. assert(
f300: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 db->nStatement>0
f310: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
f320: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 p->iStatement==(
f330: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 db->nStatement+d
f340: 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 b->nSavepoint) )
f350: 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 ;.. for(i=0;
f360: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b i<db->nDb; i++){
f370: 20 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 . int rc2
f380: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 = SQLITE_OK;.
f390: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
f3a0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
f3b0: 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b if( pBt ){
f3c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 . if( eOp
f3d0: 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c ==SAVEPOINT_ROLL
f3e0: 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 BACK ){.
f3f0: 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 rc2 = sqlite3B
f400: 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 treeSavepoint(pB
f410: 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c t, SAVEPOINT_ROL
f420: 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e LBACK, iSavepoin
f430: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 t);. }.
f440: 20 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 if( rc2==S
f450: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 QLITE_OK ){.
f460: 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 rc2 = sqli
f470: 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e te3BtreeSavepoin
f480: 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 t(pBt, SAVEPOINT
f490: 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 _RELEASE, iSavep
f4a0: 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d oint);. }
f4b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d . if( rc=
f4c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
f4d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 rc = rc2
f4e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
f4f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 }. }. db
f500: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a ->nStatement--;.
f510: 20 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e p->iStatemen
f520: 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 t = 0;.. if(
f530: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
f540: 0a 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d . if( eOp==
f550: 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
f560: 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 CK ){. rc
f570: 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 = sqlite3VtabSa
f580: 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 vepoint(db, SAVE
f590: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 POINT_ROLLBACK,
f5a0: 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 iSavepoint);.
f5b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 }. if( r
f5c0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
f5d0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c rc = sql
f5e0: 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e ite3VtabSavepoin
f5f0: 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f t(db, SAVEPOINT_
f600: 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f RELEASE, iSavepo
f610: 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 int);. }.
f620: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 }.. /* If t
f630: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 he statement tra
f640: 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e nsaction is bein
f650: 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 g rolled back, a
f660: 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 lso restore the
f670: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 . ** database
f680: 20 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 handles deferre
f690: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 d constraint cou
f6a0: 6e 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 nter to the valu
f6b0: 65 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 e it had when .
f6c0: 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d ** the statem
f6d0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ent transaction
f6e0: 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a was opened. */.
f6f0: 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 if( eOp==SAV
f700: 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 EPOINT_ROLLBACK
f710: 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 ){. db->nDe
f720: 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e ferredCons = p->
f730: 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 nStmtDefCons;.
f740: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e }. }. return
f750: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 rc;.}../*.** Th
f760: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
f770: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 alled when a tra
f780: 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 nsaction opened
f790: 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 by the database
f7a0: 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 .** handle assoc
f7b0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 iated with the V
f7c0: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 M passed as an a
f7d0: 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 rgument is about
f7e0: 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 to be .** commi
f7f0: 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 tted. If there a
f800: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 re outstanding d
f810: 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 eferred foreign
f820: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a key constraint.*
f830: 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 * violations, re
f840: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
f850: 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 R. Otherwise, SQ
f860: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 LITE_OK..**.** I
f870: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 f there are outs
f880: 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 tanding FK viola
f890: 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 tions and this f
f8a0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 unction returns
f8b0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 .** SQLITE_ERROR
f8c0: 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 , set the result
f8d0: 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 of the VM to SQ
f8e0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 LITE_CONSTRAINT
f8f0: 61 6e 64 20 77 72 69 74 65 0a 2a 2a 20 61 6e 20 and write.** an
f900: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f error message to
f910: 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e it. Then return
f920: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a SQLITE_ERROR..*
f930: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 /.#ifndef SQLITE
f940: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 _OMIT_FOREIGN_KE
f950: 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 Y.int sqlite3Vdb
f960: 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 eCheckFk(Vdbe *p
f970: 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b , int deferred){
f980: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
f990: 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 p->db;. if( (d
f9a0: 65 66 65 72 72 65 64 20 26 26 20 64 62 2d 3e 6e eferred && db->n
f9b0: 44 65 66 65 72 72 65 64 43 6f 6e 73 3e 30 29 20 DeferredCons>0)
f9c0: 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 || (!deferred &&
f9d0: 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e p->nFkConstrain
f9e0: 74 3e 30 29 20 29 7b 0a 20 20 20 20 70 2d 3e 72 t>0) ){. p->r
f9f0: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 c = SQLITE_CONST
fa00: 52 41 49 4e 54 3b 0a 20 20 20 20 70 2d 3e 65 72 RAINT;. p->er
fa10: 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 rorAction = OE_A
fa20: 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 bort;. sqlite
fa30: 33 53 65 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 3SetString(&p->z
fa40: 45 72 72 4d 73 67 2c 20 64 62 2c 20 22 66 6f 72 ErrMsg, db, "for
fa50: 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 eign key constra
fa60: 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 int failed");.
fa70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
fa80: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 ERROR;. }. ret
fa90: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d urn SQLITE_OK;.}
faa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 .#endif../*.** T
fab0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 his routine is c
fac0: 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 alled the when a
fad0: 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 VDBE tries to h
fae0: 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 alt. If the VDB
faf0: 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 E.** has made ch
fb00: 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 anges and is in
fb10: 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c autocommit mode,
fb20: 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f then commit tho
fb30: 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 se.** changes.
fb40: 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 If a rollback is
fb50: 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f needed, then do
fb60: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a the rollback..*
fb70: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
fb80: 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 e is the only wa
fb90: 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 y to move the st
fba0: 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d ate of a VM from
fbb0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 .** SQLITE_MAGIC
fbc0: 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d _RUN to SQLITE_M
fbd0: 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 AGIC_HALT. It i
fbe0: 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a s harmless to.**
fbf0: 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 call this on a
fc00: 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 VM that is in th
fc10: 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 e SQLITE_MAGIC_H
fc20: 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a ALT state..**.**
fc30: 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 Return an error
fc40: 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 code. If the c
fc50: 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 ommit could not
fc60: 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 complete because
fc70: 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 of.** lock cont
fc80: 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 ention, return S
fc90: 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 QLITE_BUSY. If
fca0: 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 SQLITE_BUSY is r
fcb0: 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d eturned, it.** m
fcc0: 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 eans the close d
fcd0: 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e id not happen an
fce0: 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 d needs to be re
fcf0: 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 peated..*/.int s
fd00: 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 qlite3VdbeHalt(V
fd10: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 dbe *p){. int r
fd20: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 c;
fd30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 /* Us
fd40: 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e ed to store tran
fd50: 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 sient return cod
fd60: 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 es */. sqlite3
fd70: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 *db = p->db;..
fd80: 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e /* This function
fd90: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f contains the lo
fda0: 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 gic that determi
fdb0: 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 nes if a stateme
fdc0: 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 nt or. ** trans
fdd0: 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 action will be c
fde0: 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c ommitted or roll
fdf0: 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 ed back as a res
fe00: 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 ult of the. **
fe10: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 execution of thi
fe20: 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e s virtual machin
fe30: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 e. . **. ** If
fe40: 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c any of the foll
fe50: 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 owing errors occ
fe60: 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 ur:. **. **
fe70: 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 SQLITE_NOMEM.
fe80: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 ** SQLITE_I
fe90: 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 OERR. ** SQ
fea0: 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 LITE_FULL. **
feb0: 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 SQLITE_INTERR
fec0: 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 UPT. **. ** Th
fed0: 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 en the internal
fee0: 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 cache might have
fef0: 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e been left in an
ff00: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 inconsistent.
ff10: 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 ** state. We ne
ff20: 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 ed to rollback t
ff30: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 he statement tra
ff40: 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 nsaction, if the
ff50: 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 re is. ** one,
ff60: 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 or the complete
ff70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 transaction if t
ff80: 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 here is no state
ff90: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
ffa0: 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d .. */.. if( p-
ffb0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
ffc0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d d ){. p->rc =
ffd0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 SQLITE_NOMEM;.
ffe0: 20 7d 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 }. closeAllCur
fff0: 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 sors(p);. if( p
10000 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 ->magic!=VDBE_MA
10010 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 GIC_RUN ){. r
10020 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b eturn SQLITE_OK;
10030 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 . }. checkActi
10040 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a veVdbeCnt(db);..
10050 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f /* No commit o
10060 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 r rollback neede
10070 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d d if the program
10080 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 2a never started *
10090 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 /. if( p->pc>=0
100a0 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b ){. int mrc;
100b0 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 /* Primary er
100c0 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d ror code from p-
100d0 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 >rc */. int e
100e0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b StatementOp = 0;
100f0 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 . int isSpeci
10100 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 alError;
10110 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 /* Set to tr
10120 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c ue if a 'special
10130 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 ' error */..
10140 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 /* Lock all btre
10150 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 es used by the s
10160 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 tatement */.
10170 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 sqlite3VdbeEnter
10180 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 (p);.. /* Che
10190 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 ck for one of th
101a0 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 e special errors
101b0 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d */. mrc = p-
101c0 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 >rc & 0xff;.
101d0 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 assert( p->rc!=S
101e0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 QLITE_IOERR_BLOC
101f0 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 KED ); /* This
10200 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 error no longer
10210 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 exists */. is
10220 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d SpecialError = m
10230 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d rc==SQLITE_NOMEM
10240 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f || mrc==SQLITE_
10250 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 IOERR.
10260 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 || mr
10270 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 c==SQLITE_INTERR
10280 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 UPT || mrc==SQLI
10290 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 TE_FULL;. if(
102a0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 isSpecialError
102b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 ){. /* If t
102c0 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 he query was rea
102d0 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 d-only and the e
102e0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c rror code is SQL
102f0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a ITE_INTERRUPT, .
10300 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c ** no roll
10310 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 back is necessar
10320 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 y. Otherwise, at
10330 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 least a savepoi
10340 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 nt . ** tra
10350 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 nsaction must be
10360 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 rolled back to
10370 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 restore the data
10380 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 base to a .
10390 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 ** consistent s
103a0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 tate.. **.
103b0 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 ** Even if
103c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 the statement is
103d0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 read-only, it i
103e0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 s important to p
103f0 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 erform. **
10400 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 a statement or t
10410 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 ransaction rollb
10420 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 ack operation. I
10430 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 f the error .
10440 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 ** occured wh
10450 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 ile writing to t
10460 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d he journal, sub-
10470 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 journal or datab
10480 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c ase. ** fil
10490 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 e as part of an
104a0 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 effort to free u
104b0 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73 p cache space (s
104c0 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 ee function.
104d0 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 ** pagerStress
104e0 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 () in pager.c),
104f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 the rollback is
10500 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 required to rest
10510 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 ore . ** th
10520 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e e pager to a con
10530 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 sistent state..
10540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
10550 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c ( !p->readOnly |
10560 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e | mrc!=SQLITE_IN
10570 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 TERRUPT ){.
10580 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c if( (mrc==SQL
10590 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 ITE_NOMEM || mrc
105a0 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 ==SQLITE_FULL) &
105b0 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 & p->usesStmtJou
105c0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 rnal ){.
105d0 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d eStatementOp =
105e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 SAVEPOINT_ROLLB
105f0 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c ACK;. }el
10600 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a se{. /*
10610 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 We are forced t
10620 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 o roll back the
10630 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 active transacti
10640 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 on. Before doing
10650 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f . ** so
10660 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 , abort any othe
10670 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 r statements thi
10680 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 s handle current
10690 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 ly has active..
106a0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 */.
106b0 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 invalidate
106c0 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 CursorsOnModifie
106d0 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 dBtrees(db);.
106e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f sqlite3Ro
106f0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 llbackAll(db);.
10700 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
10710 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 CloseSavepoints(
10720 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 db);. d
10730 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 b->autoCommit =
10740 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 1;. }.
10750 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
10760 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d /* Check for imm
10770 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b ediate foreign k
10780 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a ey violations. *
10790 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d /. if( p->rc=
107a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
107b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 sqlite3VdbeC
107c0 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 heckFk(p, 0);.
107d0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 }. . /* If
107e0 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 the auto-commit
107f0 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 flag is set and
10800 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c this is the onl
10810 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 y active writer
10820 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e . ** VM, then
10830 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 we do either a
10840 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 commit or rollba
10850 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ck of the curren
10860 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a t transaction. .
10870 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f **. ** No
10880 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 te: This block a
10890 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 lso runs if one
108a0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 of the special e
108b0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 rrors handled .
108c0 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 ** above has
108d0 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a occurred. . *
108e0 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 /. if( !sqlit
108f0 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 e3VtabInSync(db)
10900 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 . && db->au
10910 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 toCommit . &
10920 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 & db->writeVdbeC
10930 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 nt==(p->readOnly
10940 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 ==0) . ){.
10950 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 if( p->rc==SQ
10960 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 LITE_OK || (p->e
10970 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 rrorAction==OE_F
10980 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 ail && !isSpecia
10990 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 lError) ){.
109a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 rc = sqlite3V
109b0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 dbeCheckFk(p, 1)
109c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 ;. if( rc
109d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
109e0 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 if( NEV
109f0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 ER(p->readOnly)
10a00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 ){. s
10a10 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 qlite3VdbeLeave(
10a20 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 p);.
10a30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
10a40 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d ROR;. }
10a50 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
10a60 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e SQLITE_CONSTRAIN
10a70 54 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 T;. }else
10a80 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 { . /*
10a90 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 The auto-commit
10aa0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 flag is true, th
10ab0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 e vdbe program w
10ac0 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 as successful .
10ad0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 ** or h
10ae0 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 it an 'OR FAIL'
10af0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 constraint and t
10b00 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 here are no defe
10b10 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 rred foreign.
10b20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f ** key co
10b30 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c nstraints to hol
10b40 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 d up the transac
10b50 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 tion. This means
10b60 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 a commit .
10b70 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 ** is requi
10b80 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 red. */.
10b90 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 rc = vdbeCommi
10ba0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 t(db, p);.
10bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }. if(
10bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 rc==SQLITE_BUSY
10bd0 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 && p->readOnly )
10be0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 {. sqli
10bf0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b te3VdbeLeave(p);
10c00 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 . retur
10c10 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 n SQLITE_BUSY;.
10c20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
10c30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 rc!=SQLITE_OK )
10c40 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 {. p->r
10c50 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 c = rc;.
10c60 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 sqlite3Rollbac
10c70 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20 kAll(db);.
10c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
10c90 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 db->nDeferred
10ca0 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 Cons = 0;.
10cb0 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 sqlite3Commi
10cc0 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 tInternalChanges
10cd0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a (db);. }.
10ce0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
10cf0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c sqlite3Roll
10d00 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 20 backAll(db);.
10d10 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e }. db->n
10d20 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 Statement = 0;.
10d30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 }else if( eSt
10d40 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a atementOp==0 ){.
10d50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d if( p->rc=
10d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d =SQLITE_OK || p-
10d70 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 >errorAction==OE
10d80 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 _Fail ){.
10d90 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 eStatementOp =
10da0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
10db0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 E;. }else i
10dc0 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f f( p->errorActio
10dd0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 n==OE_Abort ){.
10de0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e eStatemen
10df0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f tOp = SAVEPOINT_
10e00 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 ROLLBACK;.
10e10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 }else{. i
10e20 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 nvalidateCursors
10e30 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 OnModifiedBtrees
10e40 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 (db);. sq
10e50 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c lite3RollbackAll
10e60 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 (db);. sq
10e70 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f lite3CloseSavepo
10e80 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 ints(db);.
10e90 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 db->autoCommit
10ea0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 1;. }.
10eb0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 }. . /* If
10ec0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 eStatementOp is
10ed0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 non-zero, then
10ee0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e a statement tran
10ef0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f saction needs to
10f00 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 . ** be commi
10f10 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 tted or rolled b
10f20 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 ack. Call sqlite
10f30 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 3VdbeCloseStatem
10f40 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 ent() to. **
10f50 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f do so. If this o
10f60 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 peration returns
10f70 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 an error, and t
10f80 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 he current state
10f90 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f ment. ** erro
10fa0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 r code is SQLITE
10fb0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f _OK or SQLITE_CO
10fc0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 NSTRAINT, then p
10fd0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a romote the. *
10fe0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d * current statem
10ff0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a ent error code..
11000 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 */. if( e
11010 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 StatementOp ){.
11020 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 rc = sqlite
11030 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 3VdbeCloseStatem
11040 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e ent(p, eStatemen
11050 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 tOp);. if(
11060 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 rc ){. if
11070 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
11080 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c OK || p->rc==SQL
11090 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 ITE_CONSTRAINT )
110a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 {. p->r
110b0 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 c = rc;.
110c0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
110d0 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b db, p->zErrMsg);
110e0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 . p->zE
110f0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 rrMsg = 0;.
11100 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 6e 76 }. inv
11110 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f 6e alidateCursorsOn
11120 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 64 ModifiedBtrees(d
11130 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 b);. sqli
11140 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 te3RollbackAll(d
11150 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 b);. sqli
11160 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e te3CloseSavepoin
11170 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 ts(db);.
11180 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d db->autoCommit =
11190 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 1;. }.
111a0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 }. . /* If t
111b0 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 his was an INSER
111c0 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c T, UPDATE or DEL
111d0 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 ETE and no state
111e0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e ment transaction
111f0 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e . ** has been
11200 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 rolled back, up
11210 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 date the databas
11220 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 e connection cha
11230 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 nge-counter. .
11240 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e */. if( p->
11250 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 changeCntOn ){.
11260 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d if( eStatem
11270 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 entOp!=SAVEPOINT
11280 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 _ROLLBACK ){.
11290 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 sqlite3Vdbe
112a0 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 SetChanges(db, p
112b0 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 ->nChange);.
112c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
112d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 sqlite3VdbeSetC
112e0 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 hanges(db, 0);.
112f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e }. p->
11300 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 nChange = 0;.
11310 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 6f 6c }. . /* Rol
11320 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 74 20 lback or commit
11330 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 6e 67 any schema chang
11340 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 65 64 es that occurred
11350 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e . */. if( p->
11360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc!=SQLITE_OK &&
11370 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 db->flags&SQLIT
11380 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20 E_InternChanges
11390 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
113a0 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 ResetInternalSch
113b0 65 6d 61 28 64 62 2c 20 2d 31 29 3b 0a 20 20 20 ema(db, -1);.
113c0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 28 db->flags = (
113d0 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c 49 db->flags | SQLI
113e0 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 TE_InternChanges
113f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a );. }.. /*
11400 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 Release the loc
11410 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 ks */. sqlite
11420 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 3VdbeLeave(p);.
11430 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 }.. /* We have
11440 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61 successfully ha
11450 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 lted and closed
11460 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 the VM. Record
11470 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 this fact. */.
11480 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a if( p->pc>=0 ){.
11490 20 20 20 20 64 62 2d 3e 61 63 74 69 76 65 56 64 db->activeVd
114a0 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 69 66 28 beCnt--;. if(
114b0 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b !p->readOnly ){
114c0 0a 20 20 20 20 20 20 64 62 2d 3e 77 72 69 74 65 . db->write
114d0 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 20 20 7d VdbeCnt--;. }
114e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d . assert( db-
114f0 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 3e 3d >activeVdbeCnt>=
11500 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 6e 74 db->writeVdbeCnt
11510 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 );. }. p->mag
11520 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f ic = VDBE_MAGIC_
11530 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 HALT;. checkAct
11540 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a iveVdbeCnt(db);.
11550 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c if( p->db->mal
11560 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 locFailed ){.
11570 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f p->rc = SQLITE_
11580 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a NOMEM;. }.. /*
11590 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d If the auto-com
115a0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 mit flag is set
115b0 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e to true, then an
115c0 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 y locks that wer
115d0 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 e held. ** by c
115e0 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 onnection db hav
115f0 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 e now been relea
11600 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 sed. Call sqlite
11610 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 3ConnectionUnloc
11620 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 ked() . ** to i
11630 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 nvoke any requir
11640 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 ed unlock-notify
11650 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f callbacks.. */
11660 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 . if( db->autoC
11670 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c ommit ){. sql
11680 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e ite3ConnectionUn
11690 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a locked(db);. }.
116a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 61 . assert( db->a
116b0 63 74 69 76 65 56 64 62 65 43 6e 74 3e 30 20 7c ctiveVdbeCnt>0 |
116c0 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 | db->autoCommit
116d0 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 ==0 || db->nStat
116e0 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 ement==0 );. re
116f0 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c turn (p->rc==SQL
11700 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 ITE_BUSY ? SQLIT
11710 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f E_BUSY : SQLITE_
11720 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 OK);.}.../*.** E
11730 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 ach VDBE holds t
11740 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 he result of the
11750 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c most recent sql
11760 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c ite3_step() call
11770 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 .** in p->rc. T
11780 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 his routine sets
11790 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 that result bac
117a0 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a k to SQLITE_OK..
117b0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
117c0 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 dbeResetStepResu
117d0 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 lt(Vdbe *p){. p
117e0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b ->rc = SQLITE_OK
117f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e ;.}../*.** Clean
11800 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 up a VDBE after
11810 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 execution but d
11820 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 o not delete the
11830 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a VDBE just yet..
11840 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 ** Write any err
11850 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f or messages into
11860 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 *pzErrMsg. Ret
11870 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 urn the result c
11880 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 ode..**.** After
11890 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 this routine is
118a0 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 run, the VDBE s
118b0 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 hould be ready t
118c0 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a o be executed.**
118d0 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f again..**.** To
118e0 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 look at it anot
118f0 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f her way, this ro
11900 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 utine resets the
11910 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a state of the.**
11920 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 virtual machine
11930 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 from VDBE_MAGIC
11940 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 _RUN or VDBE_MAG
11950 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a IC_HALT back to.
11960 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e ** VDBE_MAGIC_IN
11970 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 IT..*/.int sqlit
11980 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 e3VdbeReset(Vdbe
11990 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 *p){. sqlite3
119a0 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 *db;. db = p->d
119b0 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 b;.. /* If the
119c0 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 VM did not run t
119d0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 o completion or
119e0 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 if it encountere
119f0 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c d an. ** error,
11a00 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e then it might n
11a10 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c ot have been hal
11a20 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 ted properly. S
11a30 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e o halt. ** it n
11a40 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 ow.. */. sqlit
11a50 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a e3VdbeHalt(p);..
11a60 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 /* If the VDBE
11a70 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e has be run even
11a80 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e partially, then
11a90 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 transfer the er
11aa0 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e ror code. ** an
11ab0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 d error message
11ac0 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e from the VDBE in
11ad0 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 to the main data
11ae0 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 base structure.
11af0 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 But. ** if the
11b00 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 VDBE has just b
11b10 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 een set to run b
11b20 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 ut has not actua
11b30 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 lly executed any
11b40 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f . ** instructio
11b50 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 ns yet, leave th
11b60 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 e main database
11b70 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f error informatio
11b80 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a n unchanged.. *
11b90 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 /. if( p->pc>=0
11ba0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a ){. if( p->z
11bb0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 ErrMsg ){.
11bc0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 sqlite3BeginBeni
11bd0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 gnMalloc();.
11be0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 sqlite3ValueSe
11bf0 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 2d 31 tStr(db->pErr,-1
11c00 2c 70 2d 3e 7a 45 72 72 4d 73 67 2c 53 51 4c 49 ,p->zErrMsg,SQLI
11c10 54 45 5f 55 54 46 38 2c 53 51 4c 49 54 45 5f 54 TE_UTF8,SQLITE_T
11c20 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 RANSIENT);.
11c30 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 sqlite3EndBenig
11c40 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 nMalloc();.
11c50 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70 db->errCode = p
11c60 2d 3e 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 ->rc;. sqli
11c70 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
11c80 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 >zErrMsg);.
11c90 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b p->zErrMsg = 0;
11ca0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 . }else if( p
11cb0 2d 3e 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 ->rc ){. sq
11cc0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 70 lite3Error(db, p
11cd0 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 7d 65 ->rc, 0);. }e
11ce0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 lse{. sqlit
11cf0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 e3Error(db, SQLI
11d00 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 20 20 7d TE_OK, 0);. }
11d10 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f . if( p->runO
11d20 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 nlyOnce ) p->exp
11d30 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 ired = 1;. }els
11d40 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 e if( p->rc && p
11d50 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 ->expired ){.
11d60 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 /* The expired
11d70 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 flag was set on
11d80 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 the VDBE before
11d90 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 the first call.
11da0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 ** to sqlite3
11db0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e _step(). For con
11dc0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 sistency (since
11dd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 sqlite3_step() w
11de0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 as. ** called
11df0 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 ), set the datab
11e00 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 ase error in thi
11e10 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a s case as well..
11e20 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 */. sqlit
11e30 65 33 45 72 72 6f 72 28 64 62 2c 20 70 2d 3e 72 e3Error(db, p->r
11e40 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 c, 0);. sqlit
11e50 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62 e3ValueSetStr(db
11e60 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a ->pErr, -1, p->z
11e70 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 ErrMsg, SQLITE_U
11e80 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e TF8, SQLITE_TRAN
11e90 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 SIENT);. sqli
11ea0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
11eb0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 >zErrMsg);. p
11ec0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 ->zErrMsg = 0;.
11ed0 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61 69 6d }.. /* Reclaim
11ee0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73 65 64 all memory used
11ef0 20 62 79 20 74 68 65 20 56 44 42 45 0a 20 20 2a by the VDBE. *
11f00 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29 3b 0a /. Cleanup(p);.
11f10 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f 66 69 . /* Save profi
11f20 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ling information
11f30 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42 45 20 from this VDBE
11f40 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 run.. */.#ifdef
11f50 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 VDBE_PROFILE.
11f60 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 {. FILE *out
11f70 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f 70 72 = fopen("vdbe_pr
11f80 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61 22 29 ofile.out", "a")
11f90 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20 29 7b ;. if( out ){
11fa0 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 . int i;.
11fb0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c fprintf(out,
11fc0 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20 20 20 "---- ");.
11fd0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e for(i=0; i<p->n
11fe0 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 Op; i++){.
11ff0 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 fprintf(out, "
12000 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d %02x", p->aOp[i]
12010 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20 20 20 .opcode);.
12020 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 }. fprintf(
12030 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 out, "\n");.
12040 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
12050 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 nOp; i++){.
12060 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 fprintf(out,
12070 22 25 36 64 20 25 31 30 6c 6c 64 20 25 38 6c 6c "%6d %10lld %8ll
12080 64 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 d ",.
12090 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 p->aOp[i].cnt,.
120a0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 p->aOp
120b0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 [i].cycles,.
120c0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d p->aOp[i]
120d0 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b .cnt>0 ? p->aOp[
120e0 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 i].cycles/p->aOp
120f0 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 [i].cnt : 0.
12100 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 73 );. s
12110 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f qlite3VdbePrintO
12120 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f p(out, i, &p->aO
12130 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 p[i]);. }.
12140 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 fclose(out)
12150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 ;. }. }.#end
12160 69 66 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 if. p->magic =
12170 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b VDBE_MAGIC_INIT;
12180 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 . return p->rc
12190 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d & db->errMask;.}
121a0 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 . ./*.** Clean u
121b0 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 p and delete a V
121c0 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 DBE after execut
121d0 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 ion. Return an
121e0 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 integer which is
121f0 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 .** the result c
12200 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 ode. Write any
12210 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 error message te
12220 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 xt into *pzErrMs
12230 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 g..*/.int sqlite
12240 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 3VdbeFinalize(Vd
12250 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 be *p){. int rc
12260 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
12270 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 if( p->magic==VD
12280 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 BE_MAGIC_RUN ||
12290 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
122a0 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 AGIC_HALT ){.
122b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 rc = sqlite3Vdb
122c0 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 eReset(p);. a
122d0 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e ssert( (rc & p->
122e0 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 db->errMask)==rc
122f0 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 );. }. sqlite
12300 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 3VdbeDelete(p);.
12310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
12320 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 64 /*.** Call the d
12330 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 65 61 estructor for ea
12340 63 68 20 61 75 78 64 61 74 61 20 65 6e 74 72 79 ch auxdata entry
12350 20 69 6e 20 70 56 64 62 65 46 75 6e 63 20 66 6f in pVdbeFunc fo
12360 72 20 77 68 69 63 68 0a 2a 2a 20 74 68 65 20 63 r which.** the c
12370 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 orresponding bit
12380 20 69 6e 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 in mask is clea
12390 72 2e 20 20 41 75 78 64 61 74 61 20 65 6e 74 72 r. Auxdata entr
123a0 69 65 73 20 62 65 79 6f 6e 64 20 33 31 0a 2a 2a ies beyond 31.**
123b0 20 61 72 65 20 61 6c 77 61 79 73 20 64 65 73 74 are always dest
123c0 72 6f 79 65 64 2e 20 20 54 6f 20 64 65 73 74 72 royed. To destr
123d0 6f 79 20 61 6c 6c 20 61 75 78 64 61 74 61 20 65 oy all auxdata e
123e0 6e 74 72 69 65 73 2c 20 63 61 6c 6c 20 74 68 69 ntries, call thi
123f0 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 74 s.** routine wit
12400 68 20 6d 61 73 6b 3d 3d 30 2e 0a 2a 2f 0a 76 6f h mask==0..*/.vo
12410 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 id sqlite3VdbeDe
12420 6c 65 74 65 41 75 78 44 61 74 61 28 56 64 62 65 leteAuxData(Vdbe
12430 46 75 6e 63 20 2a 70 56 64 62 65 46 75 6e 63 2c Func *pVdbeFunc,
12440 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20 69 6e int mask){. in
12450 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 t i;. for(i=0;
12460 69 3c 70 56 64 62 65 46 75 6e 63 2d 3e 6e 41 75 i<pVdbeFunc->nAu
12470 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 x; i++){. str
12480 75 63 74 20 41 75 78 44 61 74 61 20 2a 70 41 75 uct AuxData *pAu
12490 78 20 3d 20 26 70 56 64 62 65 46 75 6e 63 2d 3e x = &pVdbeFunc->
124a0 61 70 41 75 78 5b 69 5d 3b 0a 20 20 20 20 69 66 apAux[i];. if
124b0 28 20 28 69 3e 33 31 20 7c 7c 20 21 28 6d 61 73 ( (i>31 || !(mas
124c0 6b 26 28 28 28 75 33 32 29 31 29 3c 3c 69 29 29 k&(((u32)1)<<i))
124d0 29 20 26 26 20 70 41 75 78 2d 3e 70 41 75 78 20 ) && pAux->pAux
124e0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 ){. if( pAu
124f0 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 x->xDelete ){.
12500 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c pAux->xDel
12510 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b ete(pAux->pAux);
12520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 . }. p
12530 41 75 78 2d 3e 70 41 75 78 20 3d 20 30 3b 0a 20 Aux->pAux = 0;.
12540 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a }. }.}../*.*
12550 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 * Free all memor
12560 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
12570 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 h the Vdbe passe
12580 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 d as the second
12590 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54 68 65 argument..** The
125a0 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 difference betw
125b0 65 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f een this functio
125c0 6e 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 n and sqlite3Vdb
125d0 65 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 eDelete() is tha
125e0 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 t.** VdbeDelete(
125f0 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 ) also unlinks t
12600 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 he Vdbe from the
12610 20 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 list of VMs ass
12620 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 ociated with.**
12630 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e the database con
12640 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 nection..*/.void
12650 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 sqlite3VdbeDele
12660 74 65 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 teObject(sqlite3
12670 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a *db, Vdbe *p){.
12680 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 SubProgram *pS
12690 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e ub, *pNext;. in
126a0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 t i;. assert( p
126b0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 ->db==0 || p->db
126c0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 ==db );. releas
126d0 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 eMemArray(p->aVa
126e0 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 r, p->nVar);. r
126f0 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 eleaseMemArray(p
12700 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e ->aColName, p->n
12710 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d ResColumn*COLNAM
12720 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 E_N);. for(pSub
12730 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 =p->pProgram; pS
12740 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b ub; pSub=pNext){
12750 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 . pNext = pSu
12760 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 b->pNext;. vd
12770 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 beFreeOpArray(db
12780 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 , pSub->aOp, pSu
12790 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c b->nOp);. sql
127a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
127b0 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 Sub);. }. for(
127c0 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e i=p->nzVar-1; i>
127d0 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 =0; i--) sqlite3
127e0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a DbFree(db, p->az
127f0 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 Var[i]);. vdbeF
12800 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 reeOpArray(db, p
12810 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a ->aOp, p->nOp);.
12820 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
12830 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a db, p->aLabel);.
12840 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
12850 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 db, p->aColName)
12860 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 ;. sqlite3DbFre
12870 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a e(db, p->zSql);.
12880 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
12890 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 db, p->pFree);.
128a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
128b0 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 b, p);.}../*.**
128c0 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 Delete an entire
128d0 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 VDBE..*/.void s
128e0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
128f0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c (Vdbe *p){. sql
12900 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 ite3 *db;.. if(
12910 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 NEVER(p==0) ) r
12920 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d eturn;. db = p-
12930 3e 64 62 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 >db;. if( p->pP
12940 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 rev ){. p->pP
12950 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e rev->pNext = p->
12960 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a pNext;. }else{.
12970 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e assert( db->
12980 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 pVdbe==p );.
12990 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 db->pVdbe = p->p
129a0 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 Next;. }. if(
129b0 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 p->pNext ){.
129c0 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 p->pNext->pPrev
129d0 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a = p->pPrev;. }.
129e0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 p->magic = VDB
129f0 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 E_MAGIC_DEAD;.
12a00 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c p->db = 0;. sql
12a10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 4f 62 ite3VdbeDeleteOb
12a20 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a ject(db, p);.}..
12a30 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 /*.** Make sure
12a40 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 the cursor p is
12a50 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 ready to read or
12a60 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 write the row t
12a70 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 o which it.** wa
12a80 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 s last positione
12a90 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 d. Return an er
12aa0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f ror code if an O
12ab0 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 OM fault or I/O
12ac0 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 error.** prevent
12ad0 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 s us from positi
12ae0 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 oning the cursor
12af0 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 to its correct
12b00 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 position..**.**
12b10 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 If a MoveTo oper
12b20 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 ation is pending
12b30 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 on the given cu
12b40 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 rsor, then do th
12b50 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 at.** MoveTo now
12b60 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 . If no move is
12b70 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 pending, check
12b80 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f to see if the ro
12b90 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 w has been.** de
12ba0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 leted out from u
12bb0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 nder the cursor
12bc0 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d and if it has, m
12bd0 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a ark the row as.*
12be0 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a * a NULL row..**
12bf0 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f .** If the curso
12c00 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 r is already poi
12c10 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 nting to the cor
12c20 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 rect row and tha
12c30 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 t row has.** not
12c40 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 been deleted ou
12c50 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 t from under the
12c60 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 cursor, then th
12c70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 is routine is a
12c80 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 no-op..*/.int sq
12c90 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d lite3VdbeCursorM
12ca0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 oveto(VdbeCursor
12cb0 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 *p){. if( p->d
12cc0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b eferredMoveto ){
12cd0 0a 20 20 20 20 69 6e 74 20 72 65 73 2c 20 72 63 . int res, rc
12ce0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
12cf0 54 45 53 54 0a 20 20 20 20 65 78 74 65 72 6e 20 TEST. extern
12d00 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 int sqlite3_sear
12d10 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 ch_count;.#endif
12d20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e . assert( p->
12d30 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 isTable );. r
12d40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 c = sqlite3Btree
12d50 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 MovetoUnpacked(p
12d60 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d ->pCursor, 0, p-
12d70 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 >movetoTarget, 0
12d80 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 69 66 28 , &res);. if(
12d90 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b rc ) return rc;
12da0 0a 20 20 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 . p->lastRowi
12db0 64 20 3d 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 d = p->movetoTar
12dc0 67 65 74 3b 0a 20 20 20 20 69 66 28 20 72 65 73 get;. if( res
12dd0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c !=0 ) return SQL
12de0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 ITE_CORRUPT_BKPT
12df0 3b 0a 20 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 ;. p->rowidIs
12e00 56 61 6c 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 Valid = 1;.#ifde
12e10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 f SQLITE_TEST.
12e20 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 sqlite3_search
12e30 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 _count++;.#endif
12e40 0a 20 20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 . p->deferred
12e50 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 Moveto = 0;.
12e60 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d p->cacheStatus =
12e70 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 CACHE_STALE;.
12e80 7d 65 6c 73 65 20 69 66 28 20 41 4c 57 41 59 53 }else if( ALWAYS
12e90 28 70 2d 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a (p->pCursor) ){.
12ea0 20 20 20 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 int hasMoved
12eb0 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 ;. int rc = s
12ec0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f qlite3BtreeCurso
12ed0 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 rHasMoved(p->pCu
12ee0 72 73 6f 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 rsor, &hasMoved)
12ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 ;. if( rc ) r
12f00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 eturn rc;. if
12f10 28 20 68 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 ( hasMoved ){.
12f20 20 20 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 p->cacheStat
12f30 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 us = CACHE_STALE
12f40 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 ;. p->nullR
12f50 6f 77 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 ow = 1;. }.
12f60 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 }. return SQLIT
12f70 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 E_OK;.}../*.** T
12f80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e he following fun
12f90 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 ctions:.**.** sq
12fa0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
12fb0 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 ype().** sqlite3
12fc0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 VdbeSerialTypeLe
12fd0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 n().** sqlite3Vd
12fe0 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a beSerialLen().**
12ff0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
13000 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 alPut().** sqlit
13010 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 e3VdbeSerialGet(
13020 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c ).**.** encapsul
13030 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 ate the code tha
13040 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c t serializes val
13050 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 ues for storage
13060 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 in SQLite.** dat
13070 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f a and index reco
13080 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c rds. Each serial
13090 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 ized value consi
130a0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 sts of a.** 'ser
130b0 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 ial-type' and a
130c0 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 blob of data. Th
130d0 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 e serial type is
130e0 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 an 8-byte unsig
130f0 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 ned.** integer,
13100 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 stored as a vari
13110 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 nt..**.** In an
13120 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 SQLite index rec
13130 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 ord, the serial
13140 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 type is stored d
13150 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a irectly before.*
13160 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 * the blob of da
13170 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 ta that it corre
13180 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 sponds to. In a
13190 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c table record, al
131a0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 l serial.** type
131b0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 s are stored at
131c0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 the start of the
131d0 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 record, and the
131e0 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 blobs of data a
131f0 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 t.** the end. He
13200 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 nce these functi
13210 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 ons allow the ca
13220 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 ller to handle t
13230 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 he.** serial-typ
13240 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 e and data blob
13250 73 65 70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a seperately..**.*
13260 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
13270 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 table describes
13280 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 the various stor
13290 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 age classes for
132a0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 data:.**.** se
132b0 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 rial type
132c0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 bytes of data
132d0 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d type.** --
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 ------------
132f0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
13300 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
13310 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 ---.** 0
13320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13330 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 0 N
13340 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 ULL.** 1
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13360 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 1 s
13370 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a igned integer.**
13380 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 2
13390 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 2
133a0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 signed
133b0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 integer.**
133c0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3
133d0 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 3
133e0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 signed intege
133f0 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 r.** 4
13400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13410 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 4 sig
13420 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 ned integer.**
13430 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 5
13440 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 6
13450 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e signed in
13460 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 teger.** 6
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13480 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 8
13490 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a signed integer.
134a0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 ** 7
134b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 8
134c0 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 IEEE
134d0 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 float.** 8
134e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
134f0 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 0
13500 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e Integer constan
13510 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 t 0.** 9
13520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13530 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 0 I
13540 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 nteger constant
13550 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 1.** 10,11
13560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13570 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 res
13580 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 erved for expans
13590 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 ion.** N>=12
135a0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 and even (
135b0 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 N-12)/2 B
135c0 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 LOB.** N>=13
135d0 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 and odd (
135e0 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 N-13)/2 t
135f0 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 ext.**.** The 8
13600 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 and 9 types were
13610 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c added in 3.3.0,
13620 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 file format 4.
13630 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a Prior versions.
13640 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c ** of SQLite wil
13650 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 l not understand
13660 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 those serial ty
13670 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 pes..*/../*.** R
13680 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c eturn the serial
13690 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 -type for the va
136a0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d lue stored in pM
136b0 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 em..*/.u32 sqlit
136c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
136d0 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 (Mem *pMem, int
136e0 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 file_format){.
136f0 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d int flags = pMem
13700 2d 3e 66 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e ->flags;. int n
13710 3b 0a 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d ;.. if( flags&M
13720 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 EM_Null ){. r
13730 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 eturn 0;. }. i
13740 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 f( flags&MEM_Int
13750 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 ){. /* Figur
13760 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f e out whether to
13770 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 use 1, 2, 4, 6
13780 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 or 8 bytes. */.#
13790 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 define MAX_6B
137a0 59 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 YTE ((((i64)0x00
137b0 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 008000)<<32)-1).
137c0 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d i64 i = pMem
137d0 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 ->u.i;. u64 u
137e0 3b 0a 20 20 20 20 69 66 28 20 66 69 6c 65 5f 66 ;. if( file_f
137f0 6f 72 6d 61 74 3e 3d 34 20 26 26 20 28 69 26 31 ormat>=4 && (i&1
13800 29 3d 3d 69 20 29 7b 0a 20 20 20 20 20 20 72 65 )==i ){. re
13810 74 75 72 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 turn 8+(u32)i;.
13820 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 }. if( i<0
13830 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3c ){. if( i<
13840 28 2d 4d 41 58 5f 36 42 59 54 45 29 20 29 20 72 (-MAX_6BYTE) ) r
13850 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f eturn 6;. /
13860 2a 20 50 72 65 76 69 6f 75 73 20 74 65 73 74 20 * Previous test
13870 70 72 65 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d prevents: u = -
13880 28 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 (-92233720368547
13890 37 35 38 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75808) */.
138a0 75 20 3d 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 u = -i;. }els
138b0 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a e{. u = i;.
138c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c }. if( u<
138d0 3d 31 32 37 20 29 20 72 65 74 75 72 6e 20 31 3b =127 ) return 1;
138e0 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 . if( u<=3276
138f0 37 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 7 ) return 2;.
13900 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 if( u<=8388607
13910 20 29 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 ) return 3;.
13920 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 if( u<=21474836
13930 34 37 20 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 47 ) return 4;.
13940 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 if( u<=MAX_6B
13950 59 54 45 20 29 20 72 65 74 75 72 6e 20 35 3b 0a YTE ) return 5;.
13960 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 return 6;.
13970 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 }. if( flags&ME
13980 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 M_Real ){. re
13990 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 turn 7;. }. as
139a0 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e sert( pMem->db->
139b0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 mallocFailed ||
139c0 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d flags&(MEM_Str|M
139d0 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 EM_Blob) );. n
139e0 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 = pMem->n;. if(
139f0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 flags & MEM_Zer
13a00 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d o ){. n += pM
13a10 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d em->u.nZero;. }
13a20 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 . assert( n>=0
13a30 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a );. return ((n*
13a40 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 2) + 12 + ((flag
13a50 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b s&MEM_Str)!=0));
13a60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
13a70 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 the length of t
13a80 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f he data correspo
13a90 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 nding to the sup
13aa0 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 plied serial-typ
13ab0 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 e..*/.u32 sqlite
13ac0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 3VdbeSerialTypeL
13ad0 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 en(u32 serial_ty
13ae0 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 pe){. if( seria
13af0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 l_type>=12 ){.
13b00 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c return (serial
13b10 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d _type-12)/2;. }
13b20 65 6c 73 65 7b 0a 20 20 20 20 73 74 61 74 69 63 else{. static
13b30 20 63 6f 6e 73 74 20 75 38 20 61 53 69 7a 65 5b const u8 aSize[
13b40 5d 20 3d 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 ] = { 0, 1, 2, 3
13b50 2c 20 34 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c , 4, 6, 8, 8, 0,
13b60 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 0, 0, 0 };.
13b70 72 65 74 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 return aSize[ser
13b80 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d ial_type];. }.}
13b90 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 ../*.** If we ar
13ba0 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 e on an architec
13bb0 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d ture with mixed-
13bc0 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 endian floating
13bd0 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 .** points (ex:
13be0 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 ARM7) then swap
13bf0 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 the lower 4 byte
13c00 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 s with the .** u
13c10 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 pper 4 bytes. R
13c20 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 eturn the result
13c30 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 ..**.** For most
13c40 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 architectures,
13c50 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e this is a no-op.
13c60 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 .**.** (later):
13c70 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 It is reported
13c80 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d to me that the m
13c90 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 ixed-endian prob
13ca0 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 lem.** on ARM7 i
13cb0 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 s an issue with
13cc0 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 GCC, not with th
13cd0 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 e ARM7 chip. It
13ce0 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 seems.** that e
13cf0 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 arly versions of
13d00 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 GCC stored the
13d10 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 two words of a 6
13d20 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 4-bit.** float i
13d30 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 n the wrong orde
13d40 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 r. And that err
13d50 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 or has been prop
13d60 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 agated.** ever s
13d70 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 ince. The blame
13d80 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 is not necessar
13d90 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 ily with GCC, th
13da0 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 ough..** GCC mig
13db0 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 ht have just cop
13dc0 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d ying the problem
13dd0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f from a prior co
13de0 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 mpiler..** I am
13df0 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e also told that n
13e00 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 ewer versions of
13e10 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 GCC that follow
13e20 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 a different.**
13e30 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 ABI get the byte
13e40 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a order right..**
13e50 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 .** Developers u
13e60 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 sing SQLite on a
13e70 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f n ARM7 should co
13e80 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 mpile and run th
13e90 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 eir.** applicati
13ea0 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 on using -DSQLIT
13eb0 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 E_DEBUG=1 at lea
13ec0 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 st once. With D
13ed0 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c EBUG.** enabled,
13ee0 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 some asserts be
13ef0 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 low will ensure
13f00 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 that the byte or
13f10 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 der of.** floati
13f20 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 ng point values
13f30 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a is correct..**.*
13f40 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 * (2007-08-30)
13f50 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 Frank van Vugt h
13f60 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 as studied this
13f70 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a problem closely.
13f80 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 ** and has send
13f90 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 his findings to
13fa0 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c the SQLite devel
13fb0 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a opers. Frank.**
13fc0 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d writes that som
13fd0 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 e Linux kernels
13fe0 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 offer floating p
13ff0 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a oint hardware.**
14000 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 emulation that
14010 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 uses only 32-bit
14020 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 mantissas inste
14030 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a ad of a full .**
14040 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 48-bits as requ
14050 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 ired by the IEEE
14060 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 standard. (Thi
14070 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 s is the.** CONF
14080 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f IG_FPE_FASTFPE o
14090 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 ption.) On such
140a0 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 systems, floati
140b0 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 ng point.** byte
140c0 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 swapping become
140d0 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 s very complicat
140e0 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 ed. To avoid pr
140f0 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e oblems,.** the n
14100 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 ecessary byte sw
14110 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 apping is carrie
14120 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 d out using a 64
14130 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 -bit integer.**
14140 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 rather than a 64
14150 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 -bit float. Fra
14160 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 nk assures us th
14170 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 at the code here
14180 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 .** works for hi
14190 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 m. We, the deve
141a0 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 lopers, have no
141b0 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 way to independe
141c0 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 ntly.** verify t
141d0 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 his, but Frank s
141e0 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 eems to know wha
141f0 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 t he is talking
14200 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 about.** so we t
14210 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 rust him..*/.#if
14220 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 def SQLITE_MIXED
14230 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c _ENDIAN_64BIT_FL
14240 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 OAT.static u64 f
14250 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 loatSwap(u64 in)
14260 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 {. union {.
14270 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 u64 r;. u32 i
14280 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 [2];. } u;. u3
14290 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 2 t;.. u.r = in
142a0 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a ;. t = u.i[0];.
142b0 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 u.i[0] = u.i[1
142c0 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b ];. u.i[1] = t;
142d0 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d . return u.r;.}
142e0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 .# define swapMi
142f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 xedEndianFloat(X
14300 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 ) X = floatSwap
14310 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 (X).#else.# defi
14320 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 ne swapMixedEndi
14330 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 anFloat(X).#endi
14340 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 f../*.** Write t
14350 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 he serialized da
14360 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 ta blob for the
14370 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 value stored in
14380 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 pMem into .** bu
14390 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 f. It is assumed
143a0 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 that the caller
143b0 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 has allocated s
143c0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e ufficient space.
143d0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
143e0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 umber of bytes w
143f0 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 ritten..**.** nB
14400 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 uf is the amount
14410 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 of space left i
14420 6e 20 62 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d n buf[]. nBuf m
14430 75 73 74 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a ust always be.**
14440 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f large enough to
14450 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 hold the entire
14460 20 66 69 65 6c 64 2e 20 20 45 78 63 65 70 74 2c field. Except,
14470 20 69 66 20 74 68 65 20 66 69 65 6c 64 20 69 73 if the field is
14480 0a 2a 2a 20 61 20 62 6c 6f 62 20 77 69 74 68 20 .** a blob with
14490 61 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 a zero-filled ta
144a0 69 6c 2c 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d il, then buf[] m
144b0 69 67 68 74 20 62 65 20 6a 75 73 74 20 74 68 65 ight be just the
144c0 20 72 69 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 right.** size t
144d0 6f 20 68 6f 6c 64 20 65 76 65 72 79 74 68 69 6e o hold everythin
144e0 67 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 g except for the
144f0 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 zero-filled tai
14500 6c 2e 20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 l. If buf[].**
14510 69 73 20 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 is only big enou
14520 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e gh to hold the n
14530 6f 6e 2d 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 on-zero prefix,
14540 74 68 65 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 then only write
14550 74 68 61 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 that.** prefix i
14560 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 nto buf[]. But
14570 69 66 20 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 if buf[] is larg
14580 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 e enough to hold
14590 20 62 6f 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 both the.** pre
145a0 66 69 78 20 61 6e 64 20 74 68 65 20 74 61 69 6c fix and the tail
145b0 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 then write the
145c0 70 72 65 66 69 78 20 61 6e 64 20 73 65 74 20 74 prefix and set t
145d0 68 65 20 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a he tail to all.*
145e0 2a 20 7a 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 * zeros..**.** R
145f0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 eturn the number
14600 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c of bytes actual
14610 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 ly written into
14620 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 buf[]. The numb
14630 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 er.** of bytes i
14640 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 n the zero-fille
14650 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 d tail is includ
14660 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e ed in the return
14670 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 value only.** i
14680 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 f those bytes we
14690 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 re zeroed in buf
146a0 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 []..*/ .u32 sqli
146b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 te3VdbeSerialPut
146c0 28 75 38 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 (u8 *buf, int nB
146d0 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 uf, Mem *pMem, i
146e0 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b nt file_format){
146f0 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 . u32 serial_ty
14700 70 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 pe = sqlite3Vdbe
14710 53 65 72 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c SerialType(pMem,
14720 20 66 69 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 file_format);.
14730 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 u32 len;.. /*
14740 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c Integer and Real
14750 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c */. if( serial
14760 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 _type<=7 && seri
14770 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 al_type>0 ){.
14780 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 u64 v;. u32
14790 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 i;. if( seria
147a0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 l_type==7 ){.
147b0 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f assert( sizeo
147c0 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 f(v)==sizeof(pMe
147d0 6d 2d 3e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d m->r) );. m
147e0 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d emcpy(&v, &pMem-
147f0 3e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a >r, sizeof(v));.
14800 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 swapMixedE
14810 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 ndianFloat(v);.
14820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
14830 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 v = pMem->u.i;.
14840 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 }. len = i
14850 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 = sqlite3VdbeSe
14860 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 rialTypeLen(seri
14870 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 al_type);. as
14880 73 65 72 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 sert( len<=(u32)
14890 6e 42 75 66 20 29 3b 0a 20 20 20 20 77 68 69 6c nBuf );. whil
148a0 65 28 20 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 e( i-- ){.
148b0 62 75 66 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 buf[i] = (u8)(v&
148c0 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 0xFF);. v >
148d0 3e 3d 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 >= 8;. }.
148e0 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a return len;. }.
148f0 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 . /* String or
14900 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 blob */. if( se
14910 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b rial_type>=12 ){
14920 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 . assert( pMe
14930 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 m->n + ((pMem->f
14940 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 lags & MEM_Zero)
14950 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 ?pMem->u.nZero:0
14960 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d ). =
14970 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 = (int)sqlite3Vd
14980 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
14990 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a serial_type) );.
149a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d assert( pMem
149b0 2d 3e 6e 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 ->n<=nBuf );.
149c0 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a len = pMem->n;.
149d0 20 20 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 memcpy(buf,
149e0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 pMem->z, len);.
149f0 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 if( pMem->fla
14a00 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b gs & MEM_Zero ){
14a10 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d . len += pM
14a20 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 em->u.nZero;.
14a30 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e assert( nBuf>
14a40 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 =0 );. if(
14a50 6c 65 6e 20 3e 20 28 75 33 32 29 6e 42 75 66 20 len > (u32)nBuf
14a60 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d ){. len =
14a70 20 28 75 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 (u32)nBuf;.
14a80 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 }. memset
14a90 28 26 62 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 (&buf[pMem->n],
14aa0 30 2c 20 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0, len-pMem->n);
14ab0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
14ac0 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a n len;. }.. /*
14ad0 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e NULL or constan
14ae0 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 ts 0 or 1 */. r
14af0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a eturn 0;.}../*.*
14b00 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 * Deserialize th
14b10 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e e data blob poin
14b20 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 ted to by buf as
14b30 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 serial type ser
14b40 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 ial_type.** and
14b50 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 store the result
14b60 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 in pMem. Retur
14b70 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
14b80 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a bytes read..*/ .
14b90 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 u32 sqlite3VdbeS
14ba0 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 erialGet(. cons
14bb0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
14bc0 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 *buf, /* Buf
14bd0 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 fer to deseriali
14be0 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 ze from */. u32
14bf0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 serial_type,
14c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 /* Se
14c10 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 rial type to des
14c20 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 erialize */. Me
14c30 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 m *pMem
14c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d /* M
14c50 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 emory cell to wr
14c60 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a ite value into *
14c70 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 /.){. switch( s
14c80 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 erial_type ){.
14c90 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 case 10: /*
14ca0 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 Reserved for fut
14cb0 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 ure use */. c
14cc0 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 ase 11: /* Res
14cd0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 erved for future
14ce0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 use */. case
14cf0 20 30 3a 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 0: { /* NULL *
14d00 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c /. pMem->fl
14d10 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a ags = MEM_Null;.
14d20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
14d30 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b }. case 1: {
14d40 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 /* 1-byte signe
14d50 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 d integer */.
14d60 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 pMem->u.i = (
14d70 73 69 67 6e 65 64 20 63 68 61 72 29 62 75 66 5b signed char)buf[
14d80 30 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 0];. pMem->
14d90 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
14da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b . return 1;
14db0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
14dc0 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 2: { /* 2-byte s
14dd0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
14de0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 . pMem->u.i
14df0 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 61 = (((signed cha
14e00 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 r)buf[0])<<8) |
14e10 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d buf[1];. pM
14e20 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
14e30 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 Int;. retur
14e40 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 n 2;. }. c
14e50 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 ase 3: { /* 3-by
14e60 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 te signed intege
14e70 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d r */. pMem-
14e80 3e 75 2e 69 20 3d 20 28 28 28 73 69 67 6e 65 64 >u.i = (((signed
14e90 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 char)buf[0])<<1
14ea0 36 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 6) | (buf[1]<<8)
14eb0 20 7c 20 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 | buf[2];.
14ec0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
14ed0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 EM_Int;. re
14ee0 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 turn 3;. }.
14ef0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 case 4: { /* 4
14f00 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 -byte signed int
14f10 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d eger */. pM
14f20 65 6d 2d 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 em->u.i = (buf[0
14f30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 31 5d ]<<24) | (buf[1]
14f40 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c <<16) | (buf[2]<
14f50 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 <8) | buf[3];.
14f60 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
14f70 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 = MEM_Int;.
14f80 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d return 4;. }
14f90 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f . case 5: { /
14fa0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 * 6-byte signed
14fb0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 integer */.
14fc0 20 75 36 34 20 78 20 3d 20 28 28 28 73 69 67 6e u64 x = (((sign
14fd0 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 29 3c ed char)buf[0])<
14fe0 3c 38 29 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 <8) | buf[1];.
14ff0 20 20 20 20 75 33 32 20 79 20 3d 20 28 62 75 66 u32 y = (buf
15000 5b 32 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b [2]<<24) | (buf[
15010 33 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 3]<<16) | (buf[4
15020 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a ]<<8) | buf[5];.
15030 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 x = (x<<32
15040 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 ) | y;. pMe
15050 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 m->u.i = *(i64*)
15060 26 78 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e &x;. pMem->
15070 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
15080 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b . return 6;
15090 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
150a0 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 6: /* 8-byte s
150b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
150c0 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f . case 7: { /
150d0 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 * IEEE floating
150e0 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 point */. u
150f0 36 34 20 78 3b 0a 20 20 20 20 20 20 75 33 32 20 64 x;. u32
15100 79 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 y;.#if !defined(
15110 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 NDEBUG) && !defi
15120 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f ned(SQLITE_OMIT_
15130 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a FLOATING_POINT).
15140 20 20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 /* Verify
15150 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e that integers an
15160 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 d floating point
15170 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 values use the
15180 73 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 same. ** by
15190 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 te order. Or, t
151a0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 hat if SQLITE_MI
151b0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 XED_ENDIAN_64BIT
151c0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 20 20 _FLOAT is.
151d0 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 ** defined that
151e0 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 64-bit floating
151f0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 point values rea
15200 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 lly are mixed.
15210 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 ** endian..
15220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 */. st
15230 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 atic const u64 t
15240 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 1 = ((u64)0x3ff0
15250 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 0000)<<32;.
15260 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f static const do
15270 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 uble r1 = 1.0;.
15280 20 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 u64 t2 = t1
15290 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 ;. swapMixe
152a0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 dEndianFloat(t2)
152b0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 ;. assert(
152c0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 sizeof(r1)==size
152d0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 of(t2) && memcmp
152e0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f (&r1, &t2, sizeo
152f0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e f(r1))==0 );.#en
15300 64 69 66 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 dif.. x = (
15310 62 75 66 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 buf[0]<<24) | (b
15320 75 66 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 uf[1]<<16) | (bu
15330 66 5b 32 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 f[2]<<8) | buf[3
15340 5d 3b 0a 20 20 20 20 20 20 79 20 3d 20 28 62 75 ];. y = (bu
15350 66 5b 34 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 f[4]<<24) | (buf
15360 5b 35 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b [5]<<16) | (buf[
15370 36 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 6]<<8) | buf[7];
15380 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 . x = (x<<3
15390 32 29 20 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 2) | y;. if
153a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 ( serial_type==6
153b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d ){. pMem
153c0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 ->u.i = *(i64*)&
153d0 78 3b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d x;. pMem-
153e0 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 >flags = MEM_Int
153f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
15400 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 assert( s
15410 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 izeof(x)==8 && s
15420 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d izeof(pMem->r)==
15430 38 20 29 3b 0a 20 20 20 20 20 20 20 20 73 77 61 8 );. swa
15440 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 pMixedEndianFloa
15450 74 28 78 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 t(x);. me
15460 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 mcpy(&pMem->r, &
15470 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 x, sizeof(x));.
15480 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 pMem->fla
15490 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 gs = sqlite3IsNa
154a0 4e 28 70 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d N(pMem->r) ? MEM
154b0 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c _Null : MEM_Real
154c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
154d0 72 65 74 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a return 8;. }.
154e0 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f case 8: /
154f0 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 * Integer 0 */.
15500 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a case 9: { /*
15510 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 Integer 1 */.
15520 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 pMem->u.i =
15530 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 serial_type-8;.
15540 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
15550 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
15560 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 return 0;.
15570 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b }. default: {
15580 0a 20 20 20 20 20 20 75 33 32 20 6c 65 6e 20 3d . u32 len =
15590 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 (serial_type-12
155a0 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d )/2;. pMem-
155b0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 >z = (char *)buf
155c0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 ;. pMem->n
155d0 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 = len;. pMe
155e0 6d 2d 3e 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 m->xDel = 0;.
155f0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 if( serial_ty
15600 70 65 26 30 78 30 31 20 29 7b 0a 20 20 20 20 20 pe&0x01 ){.
15610 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
15620 20 4d 45 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 MEM_Str | MEM_E
15630 70 68 65 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 phem;. }els
15640 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d e{. pMem-
15650 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f >flags = MEM_Blo
15660 62 20 7c 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 b | MEM_Ephem;.
15670 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 }. ret
15680 75 72 6e 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 urn len;. }.
15690 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d }. return 0;.}
156a0 0a 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 .../*.** Given t
156b0 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 he nKey-byte enc
156c0 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 oding of a recor
156d0 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 d in pKey[], par
156e0 73 65 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 se the.** record
156f0 20 69 6e 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 into a Unpacked
15700 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 Record structure
15710 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e . Return a poin
15720 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 ter to.** that s
15730 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 tructure..**.**
15740 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 The calling func
15750 74 69 6f 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 tion might provi
15760 64 65 20 73 7a 53 70 61 63 65 20 62 79 74 65 73 de szSpace bytes
15770 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 of memory.** sp
15780 61 63 65 20 61 74 20 70 53 70 61 63 65 2e 20 20 ace at pSpace.
15790 54 68 69 73 20 73 70 61 63 65 20 63 61 6e 20 62 This space can b
157a0 65 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 e used to hold t
157b0 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 he returned.** V
157c0 44 62 65 50 61 72 73 65 64 52 65 63 6f 72 64 20 DbeParsedRecord
157d0 73 74 72 75 63 74 75 72 65 20 69 66 20 69 74 20 structure if it
157e0 69 73 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e is large enough.
157f0 20 20 49 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f If it is.** no
15800 74 20 62 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 t big enough, sp
15810 61 63 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 ace is obtained
15820 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c from sqlite3_mal
15830 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 loc()..**.** The
15840 20 72 65 74 75 72 6e 65 64 20 73 74 72 75 63 74 returned struct
15850 75 72 65 20 73 68 6f 75 6c 64 20 62 65 20 63 6c ure should be cl
15860 6f 73 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 osed by a call t
15870 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 o.** sqlite3Vdbe
15880 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 DeleteUnpackedRe
15890 63 6f 72 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 cord()..*/ .Unpa
158a0 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 ckedRecord *sqli
158b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 te3VdbeRecordUnp
158c0 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a ack(. KeyInfo *
158d0 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a pKeyInfo, /*
158e0 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f Information abo
158f0 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f ut the record fo
15900 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b rmat */. int nK
15910 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 ey,
15920 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 /* Size of the
15930 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f binary record */
15940 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 . const void *p
15950 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 Key, /* The
15960 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a binary record *
15970 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 /. char *pSpace
15980 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e , /* Un
15990 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 aligned space av
159a0 61 69 6c 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 ailable to hold
159b0 74 68 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 the object */.
159c0 69 6e 74 20 73 7a 53 70 61 63 65 20 20 20 20 20 int szSpace
159d0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f /* Size o
159e0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 f pSpace[] in by
159f0 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 tes */.){. cons
15a00 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
15a10 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 *aKey = (const u
15a20 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 nsigned char *)p
15a30 4b 65 79 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 Key;. UnpackedR
15a40 65 63 6f 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 ecord *p; /* Th
15a50 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 e unpacked recor
15a60 64 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 72 d that we will r
15a70 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e eturn */. int n
15a80 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f Byte; /
15a90 2a 20 4d 65 6d 6f 72 79 20 73 70 61 63 65 20 6e * Memory space n
15aa0 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c eeded to hold p,
15ab0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 in bytes */. i
15ac0 6e 74 20 64 3b 0a 20 20 75 33 32 20 69 64 78 3b nt d;. u32 idx;
15ad0 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 . u16 u;
15ae0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e /* Unsign
15af0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 ed loop counter
15b00 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a */. u32 szHdr;.
15b10 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 Mem *pMem;. i
15b20 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 nt nOff;
15b30 20 20 20 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 /* Increase p
15b40 53 70 61 63 65 20 62 79 20 74 68 69 73 20 6d 75 Space by this mu
15b50 63 68 20 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 ch to 8-byte ali
15b60 67 6e 20 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a gn it */. . /*
15b70 0a 20 20 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f . ** We want to
15b80 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 shift the point
15b90 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63 er pSpace up suc
15ba0 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 h that it is 8-b
15bb0 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a yte aligned.. *
15bc0 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 * Thus, we need
15bd0 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 to calculate a v
15be0 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 alue, nOff, betw
15bf0 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 een 0 and 7, to
15c00 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 shift . ** it b
15c10 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73 y. If pSpace is
15c20 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 already 8-byte
15c30 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 aligned, nOff sh
15c40 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 ould be zero..
15c50 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d */. nOff = (8 -
15c60 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f (SQLITE_PTR_TO_
15c70 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29 INT(pSpace) & 7)
15c80 29 20 26 20 37 3b 0a 20 20 70 53 70 61 63 65 20 ) & 7;. pSpace
15c90 2b 3d 20 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 += nOff;. szSpa
15ca0 63 65 20 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 ce -= nOff;. nB
15cb0 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a yte = ROUND8(siz
15cc0 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f eof(UnpackedReco
15cd0 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 rd)) + sizeof(Me
15ce0 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 m)*(pKeyInfo->nF
15cf0 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e ield+1);. if( n
15d00 42 79 74 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a Byte>szSpace ){.
15d10 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 44 p = sqlite3D
15d20 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 bMallocRaw(pKeyI
15d30 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b nfo->db, nByte);
15d40 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 . if( p==0 )
15d50 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d return 0;. p-
15d60 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 >flags = UNPACKE
15d70 44 5f 4e 45 45 44 5f 46 52 45 45 20 7c 20 55 4e D_NEED_FREE | UN
15d80 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 PACKED_NEED_DEST
15d90 52 4f 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 ROY;. }else{.
15da0 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 p = (UnpackedR
15db0 65 63 6f 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 ecord*)pSpace;.
15dc0 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e p->flags = UN
15dd0 50 41 43 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 PACKED_NEED_DEST
15de0 52 4f 59 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b ROY;. }. p->pK
15df0 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 eyInfo = pKeyInf
15e00 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d o;. p->nField =
15e10 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c pKeyInfo->nFiel
15e20 64 20 2b 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d d + 1;. p->aMem
15e30 20 3d 20 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 = pMem = (Mem*)
15e40 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e &((char*)p)[ROUN
15e50 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b D8(sizeof(Unpack
15e60 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 edRecord))];. a
15e70 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 ssert( EIGHT_BYT
15e80 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d E_ALIGNMENT(pMem
15e90 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 ) );. idx = get
15ea0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 Varint32(aKey, s
15eb0 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 zHdr);. d = szH
15ec0 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 dr;. u = 0;. w
15ed0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20 hile( idx<szHdr
15ee0 26 26 20 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 && u<p->nField &
15ef0 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 & d<=nKey ){.
15f00 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 u32 serial_type
15f10 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 ;.. idx += ge
15f20 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b tVarint32(&aKey[
15f30 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 idx], serial_typ
15f40 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e e);. pMem->en
15f50 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e c = pKeyInfo->en
15f60 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 c;. pMem->db
15f70 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a = pKeyInfo->db;.
15f80 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 /* pMem->fla
15f90 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 gs = 0; // sqlit
15fa0 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 e3VdbeSerialGet(
15fb0 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 ) will set this
15fc0 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d for us */. pM
15fd0 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b em->zMalloc = 0;
15fe0 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 . pMem->z = 0
15ff0 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 ;. d += sqlit
16000 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 e3VdbeSerialGet(
16010 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c &aKey[d], serial
16020 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 _type, pMem);.
16030 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 75 2b pMem++;. u+
16040 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 +;. }. assert(
16050 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 u<=pKeyInfo->nF
16060 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d ield + 1 );. p-
16070 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 20 20 72 >nField = u;. r
16080 65 74 75 72 6e 20 28 76 6f 69 64 2a 29 70 3b 0a eturn (void*)p;.
16090 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f }../*.** This ro
160a0 75 74 69 6e 65 20 64 65 73 74 72 6f 79 73 20 61 utine destroys a
160b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
160c0 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 76 6f 69 64 20 object..*/.void
160d0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 sqlite3VdbeDelet
160e0 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 eUnpackedRecord(
160f0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a UnpackedRecord *
16100 70 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 p){.#ifdef SQLIT
16110 45 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 69 3b E_DEBUG. int i;
16120 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b 0a 0a 20 . Mem *pMem;..
16130 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b assert( p!=0 );
16140 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 66 6c . assert( p->fl
16150 61 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e ags & UNPACKED_N
16160 45 45 44 5f 44 45 53 54 52 4f 59 20 29 3b 0a 20 EED_DESTROY );.
16170 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 6d 3d 70 for(i=0, pMem=p
16180 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e 6e 46 69 ->aMem; i<p->nFi
16190 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 6d 2b 2b eld; i++, pMem++
161a0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 75 6e ){. /* The un
161b0 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 69 73 packed record is
161c0 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 72 75 63 always construc
161d0 74 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a ted by the. *
161e0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 55 6e 70 * sqlite3VdbeUnp
161f0 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 ackRecord() func
16200 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 68 69 63 tion above, whic
16210 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 20 20 20 h makes all.
16220 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 ** strings and b
16230 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 20 41 6e lobs static. An
16240 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 65 6c d none of the el
16250 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 20 20 2a ements are. *
16260 2a 20 65 76 65 72 20 74 72 61 6e 73 66 6f 72 6d * ever transform
16270 65 64 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 ed, so there is
16280 6e 65 76 65 72 20 61 6e 79 74 68 69 6e 67 20 74 never anything t
16290 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 20 2a 2f o delete.. */
162a0 0a 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a . if( pMem->z
162b0 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 Malloc ) sqlite3
162c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 VdbeMemRelease(p
162d0 4d 65 6d 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 Mem);. }.#endif
162e0 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 . if( p->flags
162f0 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 45 44 5f & UNPACKED_NEED_
16300 46 52 45 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 FREE ){. sqli
16310 74 65 33 44 62 46 72 65 65 28 70 2d 3e 70 4b 65 te3DbFree(p->pKe
16320 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 3b 0a 20 yInfo->db, p);.
16330 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 }.}../*.** This
16340 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 function compar
16350 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 es the two table
16360 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 rows or index r
16370 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 ecords.** specif
16380 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 ied by {nKey1, p
16390 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 Key1} and pPKey2
163a0 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 . It returns a
163b0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a negative, zero.*
163c0 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e * or positive in
163d0 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 teger if key1 is
163e0 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 less than, equa
163f0 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 l to or .** grea
16400 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 ter than key2.
16410 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 The {nKey1, pKey
16420 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 1} key must be a
16430 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 blob.** created
16440 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b 65 52 65 by th OP_MakeRe
16450 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 cord opcode of t
16460 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 he VDBE. The pP
16470 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 Key2.** key must
16480 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 be a parsed key
16490 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 such as obtaine
164a0 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 d from.** sqlite
164b0 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 3VdbeParseRecord
164c0 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 ..**.** Key1 and
164d0 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 Key2 do not hav
164e0 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 e to contain the
164f0 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 same number of
16500 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 65 20 6b fields..** The k
16510 65 79 20 77 69 74 68 20 66 65 77 65 72 20 66 69 ey with fewer fi
16520 65 6c 64 73 20 69 73 20 75 73 75 61 6c 6c 79 20 elds is usually
16530 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 20 74 68 compares less th
16540 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f 6e 67 65 an the .** longe
16550 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 65 72 20 r key. However
16560 69 66 20 74 68 65 20 55 4e 50 41 43 4b 45 44 5f if the UNPACKED_
16570 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 20 69 6e INCRKEY flags in
16580 20 70 50 4b 65 79 32 20 69 73 20 73 65 74 0a 2a pPKey2 is set.*
16590 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e * and the common
165a0 20 70 72 65 66 69 78 65 73 20 61 72 65 20 65 71 prefixes are eq
165b0 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 31 20 69 ual, then key1 i
165c0 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 65 79 32 s less than key2
165d0 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 65 20 55 ..** Or if the U
165e0 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 5f 50 52 NPACKED_MATCH_PR
165f0 45 46 49 58 20 66 6c 61 67 20 69 73 20 73 65 74 EFIX flag is set
16600 20 61 6e 64 20 74 68 65 20 70 72 65 66 69 78 65 and the prefixe
16610 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 6c 2c 20 s are.** equal,
16620 74 68 65 6e 20 74 68 65 20 6b 65 79 73 20 61 72 then the keys ar
16630 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 e considered to
16640 62 65 20 65 71 75 61 6c 20 61 6e 64 0a 2a 2a 20 be equal and.**
16650 74 68 65 20 70 61 72 74 73 20 62 65 79 6f 6e 64 the parts beyond
16660 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 72 65 66 the common pref
16670 69 78 20 61 72 65 20 69 67 6e 6f 72 65 64 2e 0a ix are ignored..
16680 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 55 4e 50 **.** If the UNP
16690 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 ACKED_IGNORE_ROW
166a0 49 44 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 ID flag is set,
166b0 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 62 79 then the last by
166c0 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 68 65 61 te of.** the hea
166d0 64 65 72 20 6f 66 20 70 4b 65 79 31 20 69 73 20 der of pKey1 is
166e0 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 69 73 20 ignored. It is
166f0 61 73 73 75 6d 65 64 20 74 68 61 74 20 70 4b 65 assumed that pKe
16700 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 64 65 y1 is.** an inde
16710 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 75 73 20 x key, and thus
16720 65 6e 64 73 20 77 69 74 68 20 61 20 72 6f 77 69 ends with a rowi
16730 64 20 76 61 6c 75 65 2e 20 20 54 68 65 20 6c 61 d value. The la
16740 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74 68 st byte.** of th
16750 65 20 68 65 61 64 65 72 20 77 69 6c 6c 20 74 68 e header will th
16760 65 72 65 66 6f 72 65 20 62 65 20 74 68 65 20 73 erefore be the s
16770 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 erial type of th
16780 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f 6e 65 20 e rowid:.** one
16790 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 35 of 1, 2, 3, 4, 5
167a0 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 2d 20 74 , 6, 8, or 9 - t
167b0 68 65 20 69 6e 74 65 67 65 72 20 73 65 72 69 61 he integer seria
167c0 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 68 65 20 l types..** The
167d0 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 serial type of t
167e0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 20 77 he final rowid w
167f0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 61 20 ill always be a
16800 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2a 20 single byte..**
16810 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 69 73 By ignoring this
16820 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 74 68 last byte of th
16830 65 20 68 65 61 64 65 72 2c 20 77 65 20 66 6f 72 e header, we for
16840 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f ce the compariso
16850 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 n.** to ignore t
16860 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 he rowid at the
16870 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a 2a 2f 0a end of key1..*/.
16880 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 int sqlite3VdbeR
16890 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 ecordCompare(.
168a0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 int nKey1, const
168b0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a void *pKey1, /*
168c0 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 Left key */. U
168d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 npackedRecord *p
168e0 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 PKey2 /*
168f0 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a Right key */.){.
16900 20 20 69 6e 74 20 64 31 3b 20 20 20 20 20 20 20 int d1;
16910 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 /* Offset i
16920 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 nto aKey[] of ne
16930 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 xt data element
16940 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 */. u32 idx1;
16950 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 /* Offse
16960 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 t into aKey[] of
16970 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 next header ele
16980 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a ment */. u32 sz
16990 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 Hdr1; /*
169a0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 Number of bytes
169b0 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 in header */. i
169c0 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 nt i = 0;. int
169d0 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 20 72 63 nField;. int rc
169e0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e = 0;. const un
169f0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 signed char *aKe
16a00 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 y1 = (const unsi
16a10 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 gned char *)pKey
16a20 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 1;. KeyInfo *pK
16a30 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 eyInfo;. Mem me
16a40 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 m1;.. pKeyInfo
16a50 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e = pPKey2->pKeyIn
16a60 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d fo;. mem1.enc =
16a70 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a pKeyInfo->enc;.
16a80 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 mem1.db = pKey
16a90 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d Info->db;. /* m
16aa0 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 em1.flags = 0;
16ab0 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 // Will be initi
16ac0 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 alized by sqlite
16ad0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 3VdbeSerialGet()
16ae0 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 */. VVA_ONLY(
16af0 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 3d 20 30 mem1.zMalloc = 0
16b00 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 ; ) /* Only need
16b10 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 ed by assert() s
16b20 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 tatements */..
16b30 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 /* Compilers may
16b40 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d complain that m
16b50 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e em1.u.i is poten
16b60 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c tially uninitial
16b70 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f ized.. ** We co
16b80 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 uld initialize i
16b90 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 t, as shown here
16ba0 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f , to silence tho
16bb0 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 se complaints..
16bc0 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c ** But in fact,
16bd0 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e mem1.u.i will n
16be0 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 ever actually be
16bf0 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 used uninitiali
16c00 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a zed, and doing .
16c10 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 ** the unneces
16c20 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 sary initializat
16c30 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 ion has a measur
16c40 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 able negative pe
16c50 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 rformance. ** i
16c60 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 mpact, since thi
16c70 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 s routine is a v
16c80 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e ery high runner.
16c90 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f And so, we cho
16ca0 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f ose. ** to igno
16cb0 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 re the compiler
16cc0 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 warnings and lea
16cd0 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 ve this variable
16ce0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a uninitialized..
16cf0 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e */. /* mem1.
16d00 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 u.i = 0; // not
16d10 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f needed, here to
16d20 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 silence compile
16d30 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a r warning */. .
16d40 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 idx1 = getVari
16d50 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 nt32(aKey1, szHd
16d60 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 r1);. d1 = szHd
16d70 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 32 r1;. if( pPKey2
16d80 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b ->flags & UNPACK
16d90 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 ED_IGNORE_ROWID
16da0 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d 3b ){. szHdr1--;
16db0 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d 20 . }. nField =
16dc0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 pKeyInfo->nField
16dd0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 3c ;. while( idx1<
16de0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 szHdr1 && i<pPKe
16df0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 20 y2->nField ){.
16e00 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 u32 serial_typ
16e10 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 e1;.. /* Read
16e20 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 the serial type
16e30 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 s for the next e
16e40 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b lement in each k
16e50 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 ey. */. idx1
16e60 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 += getVarint32(
16e70 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 aKey1+idx1, seri
16e80 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 20 al_type1 );.
16e90 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 26 if( d1>=nKey1 &&
16ea0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
16eb0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c alTypeLen(serial
16ec0 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 61 _type1)>0 ) brea
16ed0 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 k;.. /* Extra
16ee0 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f ct the values to
16ef0 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 be compared..
16f00 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 */. d1 += s
16f10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
16f20 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 Get(&aKey1[d1],
16f30 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d serial_type1, &m
16f40 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f em1);.. /* Do
16f50 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a the comparison.
16f60 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 */. rc =
16f70 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 sqlite3MemCompar
16f80 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 e(&mem1, &pPKey2
16f90 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 20 ->aMem[i],.
16fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16fb0 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 3f i<nField ?
16fc0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c pKeyInfo->aColl
16fd0 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 66 [i] : 0);. if
16fe0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 ( rc!=0 ){.
16ff0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a 4d assert( mem1.zM
17000 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 alloc==0 ); /*
17010 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f See comment belo
17020 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 49 w */.. /* I
17030 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 nvert the result
17040 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e 67 if we are using
17050 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 DESC sort order
17060 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 . */. if( p
17070 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 KeyInfo->aSortOr
17080 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 20 der && i<nField
17090 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f && pKeyInfo->aSo
170a0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 rtOrder[i] ){.
170b0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a rc = -rc;.
170c0 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 }. .
170d0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 45 /* If the PRE
170e0 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 20 FIX_SEARCH flag
170f0 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 66 is set and all f
17100 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 65 ields except the
17110 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 final. **
17120 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 65 rowid field were
17130 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c 65 equal, then cle
17140 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 45 ar the PREFIX_SE
17150 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 65 ARCH flag and se
17160 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b 65 t . ** pPKe
17170 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 65 y2->rowid to the
17180 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 6f value of the ro
17190 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 4b wid field in (pK
171a0 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 20 ey1, nKey1)..
171b0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 73 ** This is us
171c0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 55 ed by the OP_IsU
171d0 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 20 nique opcode..
171e0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 */. if(
171f0 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 (pPKey2->flags
17200 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 & UNPACKED_PREFI
17210 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d 3d X_SEARCH) && i==
17220 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 2d (pPKey2->nField-
17230 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 1) ){. as
17240 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 64 sert( idx1==szHd
17250 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 20 r1 && rc );.
17260 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 assert( mem1
17270 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 .flags & MEM_Int
17280 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b 65 );. pPKe
17290 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 4e y2->flags &= ~UN
172a0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 45 PACKED_PREFIX_SE
172b0 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 50 ARCH;. pP
172c0 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d 65 Key2->rowid = me
172d0 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d 0a m1.u.i;. }.
172e0 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 72 . retur
172f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 n rc;. }.
17300 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e i++;. }.. /* N
17310 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 o memory allocat
17320 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 ion is ever used
17330 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 on mem1. Prove
17340 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a this using. **
17350 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 the following a
17360 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 ssert(). If the
17370 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c assert() fails,
17380 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a it indicates a.
17390 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b ** memory leak
173a0 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 and a need to c
173b0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d all sqlite3VdbeM
173c0 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 emRelease(&mem1)
173d0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 .. */. assert(
173e0 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d 30 mem1.zMalloc==0
173f0 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 );.. /* rc==0
17400 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 here means that
17410 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 one of the keys
17420 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 ran out of field
17430 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 s and. ** all t
17440 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 he fields up to
17450 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 that point were
17460 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 4e equal. If the UN
17470 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a 20 PACKED_INCRKEY.
17480 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c ** flag is set,
17490 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 20 then break the
174a0 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 20 tie by treating
174b0 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e 0a key2 as larger..
174c0 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 43 ** If the UPAC
174d0 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 48 KED_PREFIX_MATCH
174e0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68 flag is set, th
174f0 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f 6d en keys with com
17500 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 2a mon prefixes. *
17510 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 * are considered
17520 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 4f to be equal. O
17530 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c 6f therwise, the lo
17540 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 20 nger key is the
17550 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 41 . ** larger. A
17560 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 68 s it happens, th
17570 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 6c e pPKey2 will al
17580 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e 67 ways be the long
17590 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 65 er. ** if there
175a0 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 65 is a difference
175b0 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 .. */. assert(
175c0 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 rc==0 );. if(
175d0 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 pPKey2->flags &
175e0 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 UNPACKED_INCRKEY
175f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 3b ){. rc = -1;
17600 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b . }else if( pPK
17610 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 ey2->flags & UNP
17620 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 ACKED_PREFIX_MAT
17630 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 61 CH ){. /* Lea
17640 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d 65 ve rc==0 */. }e
17650 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a 48 lse if( idx1<szH
17660 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 dr1 ){. rc =
17670 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 1;. }. return
17680 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 70 rc;.}. ../*.** p
17690 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e Cur points at an
176a0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 index entry cre
176b0 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f ated using the O
176c0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 P_MakeRecord opc
176d0 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 ode..** Read the
176e0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 rowid (the last
176f0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 field in the re
17700 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 cord) and store
17710 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a it in *rowid..**
17720 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f Return SQLITE_O
17730 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 K if everything
17740 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 works, or an err
17750 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 or code otherwis
17760 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 e..**.** pCur mi
17770 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 ght be pointing
17780 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 to text obtained
17790 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 from a corrupt
177a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a database file..*
177b0 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 * So the content
177c0 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 cannot be trust
177d0 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 ed. Do appropri
177e0 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 ate checks on th
177f0 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e e content..*/.in
17800 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 t sqlite3VdbeIdx
17810 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 Rowid(sqlite3 *d
17820 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 b, BtCursor *pCu
17830 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a r, i64 *rowid){.
17840 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d i64 nCellKey =
17850 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0;. int rc;.
17860 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 u32 szHdr;
17870 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 /* Size of the
17880 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 header */. u32
17890 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f typeRowid; /
178a0 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 * Serial type of
178b0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 the rowid */.
178c0 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 u32 lenRowid;
178d0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 /* Size of the
178e0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 rowid */. Mem
178f0 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 5f m, v;.. UNUSED_
17900 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 0a PARAMETER(db);..
17910 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a /* Get the siz
17920 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 e of the index e
17930 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 ntry. Only indi
17940 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c ces entries of l
17950 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 ess. ** than 2G
17960 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d iB are support -
17970 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 anything large
17980 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 must be database
17990 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a corruption.. *
179a0 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e * Any corruption
179b0 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 is detected in
179c0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 sqlite3BtreePars
179d0 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 eCellPtr(), thou
179e0 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 gh, so. ** this
179f0 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 code can safely
17a00 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 assume that nCe
17a10 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 llKey is 32-bits
17a20 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 . */. assert
17a30 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 ( sqlite3BtreeCu
17a40 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 rsorIsValid(pCur
17a50 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 ) );. rc = sqli
17a60 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 te3BtreeKeySize(
17a70 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 pCur, &nCellKey)
17a80 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d ;. assert( rc==
17a90 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 SQLITE_OK );
17aa0 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 /* pCur is alwa
17ab0 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 ys valid so KeyS
17ac0 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 ize cannot fail
17ad0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 */. assert( (nC
17ae0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f ellKey & SQLITE_
17af0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e MAX_U32)==(u64)n
17b00 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a CellKey );.. /*
17b10 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d Read in the com
17b20 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 plete content of
17b30 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 the index entry
17b40 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 2c */. memset(&m,
17b50 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b 0a 0, sizeof(m));.
17b60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 rc = sqlite3Vd
17b70 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 beMemFromBtree(p
17b80 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 Cur, 0, (int)nCe
17b90 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 llKey, 1, &m);.
17ba0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 if( rc ){. r
17bb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 eturn rc;. }..
17bc0 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e /* The index en
17bd0 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 try must begin w
17be0 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a ith a header siz
17bf0 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 e */. (void)get
17c00 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e Varint32((u8*)m.
17c10 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 z, szHdr);. tes
17c20 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 tcase( szHdr==3
17c30 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 );. testcase( s
17c40 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 zHdr==m.n );. i
17c50 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 f( unlikely(szHd
17c60 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 r<3 || (int)szHd
17c70 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f r>m.n) ){. go
17c80 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 to idx_rowid_cor
17c90 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 ruption;. }..
17ca0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c /* The last fiel
17cb0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 d of the index s
17cc0 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 hould be an inte
17cd0 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e ger - the ROWID.
17ce0 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 . ** Verify tha
17cf0 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 t the last entry
17d00 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e really is an in
17d10 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 teger. */. (voi
17d20 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 d)getVarint32((u
17d30 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 8*)&m.z[szHdr-1]
17d40 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 , typeRowid);.
17d50 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f testcase( typeRo
17d60 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 wid==1 );. test
17d70 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d case( typeRowid=
17d80 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 =2 );. testcase
17d90 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 ( typeRowid==3 )
17da0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 ;. testcase( ty
17db0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 peRowid==4 );.
17dc0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f testcase( typeRo
17dd0 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 wid==5 );. test
17de0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d case( typeRowid=
17df0 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 =6 );. testcase
17e00 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 ( typeRowid==8 )
17e10 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 ;. testcase( ty
17e20 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 peRowid==9 );.
17e30 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 if( unlikely(typ
17e40 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 eRowid<1 || type
17e50 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 Rowid>9 || typeR
17e60 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 owid==7) ){.
17e70 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 goto idx_rowid_c
17e80 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 orruption;. }.
17e90 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 lenRowid = sqli
17ea0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 te3VdbeSerialTyp
17eb0 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 3b eLen(typeRowid);
17ec0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 . testcase( (u3
17ed0 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 2)m.n==szHdr+len
17ee0 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 Rowid );. if( u
17ef0 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e nlikely((u32)m.n
17f00 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 <szHdr+lenRowid)
17f10 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 ){. goto idx
17f20 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f _rowid_corruptio
17f30 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 n;. }.. /* Fet
17f40 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f ch the integer o
17f50 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 ff the end of th
17f60 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a e index record *
17f70 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 /. sqlite3VdbeS
17f80 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d erialGet((u8*)&m
17f90 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d .z[m.n-lenRowid]
17fa0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 , typeRowid, &v)
17fb0 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 ;. *rowid = v.u
17fc0 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 .i;. sqlite3Vdb
17fd0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b eMemRelease(&m);
17fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
17ff0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 _OK;.. /* Jump
18000 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 here if database
18010 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 corruption is d
18020 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 etected after m
18030 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c has been. ** al
18040 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 located. Free t
18050 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 he m object and
18060 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
18070 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f RRUPT. */.idx_ro
18080 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a wid_corruption:.
18090 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a 4d testcase( m.zM
180a0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 alloc!=0 );. sq
180b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
180c0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 ase(&m);. retur
180d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 n SQLITE_CORRUPT
180e0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 _BKPT;.}../*.**
180f0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 Compare the key
18100 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 of the index ent
18110 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 ry that cursor p
18120 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f C is pointing to
18130 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 against.** the
18140 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 key string in pU
18150 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 npacked. Write
18160 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d into *pRes a num
18170 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e ber.** that is n
18180 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f egative, zero, o
18190 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 r positive if pC
181a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
181b0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 qual to,.** or g
181c0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 reater than pUnp
181d0 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 acked. Return S
181e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 QLITE_OK on succ
181f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 ess..**.** pUnpa
18200 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 cked is either c
18210 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 reated without a
18220 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 rowid or is tru
18230 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 ncated so that i
18240 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 t.** omits the r
18250 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e owid at the end.
18260 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 The rowid at t
18270 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e he end of the in
18280 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 dex entry.** is
18290 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e ignored as well.
182a0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f Hence, this ro
182b0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 utine only compa
182c0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 res the prefixes
182d0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 .** of the keys
182e0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 prior to the fi
182f0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 nal rowid, not t
18300 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a he entire key..*
18310 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
18320 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a eIdxKeyCompare(.
18330 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 VdbeCursor *pC
18340 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a , /*
18350 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 The cursor to c
18360 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a ompare against *
18370 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f /. UnpackedReco
18380 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 rd *pUnpacked,
18390 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 /* Unpacked vers
183a0 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 6f ion of key to co
183b0 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f mpare against */
183c0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 . int *res
183d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
183e0 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 * Write the comp
183f0 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 arison result he
18400 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e re */.){. i64 n
18410 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 CellKey = 0;. i
18420 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f nt rc;. BtCurso
18430 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 r *pCur = pC->pC
18440 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a ursor;. Mem m;.
18450 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
18460 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 e3BtreeCursorIsV
18470 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 alid(pCur) );.
18480 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 rc = sqlite3Btre
18490 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 eKeySize(pCur, &
184a0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 nCellKey);. ass
184b0 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f ert( rc==SQLITE_
184c0 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 OK ); /* pCur
184d0 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 is always valid
184e0 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e so KeySize cann
184f0 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 ot fail */. /*
18500 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c nCellKey will al
18510 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 ways be between
18520 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 0 and 0xffffffff
18530 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 because of the
18540 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 say. ** that bt
18550 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 reeParseCellPtr(
18560 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 ) and sqlite3Get
18570 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 Varint32() are i
18580 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 mplemented */.
18590 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 if( nCellKey<=0
185a0 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 || nCellKey>0x7f
185b0 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 ffffff ){. *r
185c0 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 es = 0;. retu
185d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
185e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d 65 T_BKPT;. }. me
185f0 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a 65 mset(&m, 0, size
18600 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 73 of(m));. rc = s
18610 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f qlite3VdbeMemFro
18620 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 mBtree(pC->pCurs
18630 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 6c or, 0, (int)nCel
18640 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 lKey, 1, &m);.
18650 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 if( rc ){. re
18660 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 turn rc;. }. a
18670 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 64 ssert( pUnpacked
18680 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b ->flags & UNPACK
18690 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 20 ED_IGNORE_ROWID
186a0 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 );. *res = sqli
186b0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d te3VdbeRecordCom
186c0 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 pare(m.n, m.z, p
186d0 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c Unpacked);. sql
186e0 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 ite3VdbeMemRelea
186f0 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e se(&m);. return
18700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f SQLITE_OK;.}../
18710 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
18720 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 e sets the value
18730 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 to be returned
18740 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 by subsequent ca
18750 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 lls to.** sqlite
18760 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 3_changes() on t
18770 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 he database hand
18780 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 le 'db'. .*/.voi
18790 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 d sqlite3VdbeSet
187a0 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 Changes(sqlite3
187b0 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 *db, int nChange
187c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c ){. assert( sql
187d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 ite3_mutex_held(
187e0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 db->mutex) );.
187f0 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 db->nChange = nC
18800 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f hange;. db->nTo
18810 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 talChange += nCh
18820 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 ange;.}../*.** S
18830 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 et a flag in the
18840 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 vdbe to update
18850 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 the change count
18860 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 er when it is fi
18870 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 nalised.** or re
18880 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c set..*/.void sql
18890 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 ite3VdbeCountCha
188a0 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 nges(Vdbe *v){.
188b0 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 v->changeCntOn
188c0 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 = 1;.}../*.** Ma
188d0 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 rk every prepare
188e0 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f d statement asso
188f0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 ciated with a da
18900 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
18910 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e n.** as expired.
18920 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 .**.** An expire
18930 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e d statement mean
18940 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 s that recompila
18950 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 tion of the stat
18960 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f ement is.** reco
18970 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e mmend. Statemen
18980 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 ts expire when t
18990 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 hings happen tha
189a0 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 t make their.**
189b0 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 programs obsolet
189c0 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 e. Removing use
189d0 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 r-defined functi
189e0 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 ons or collating
189f0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f .** sequences, o
18a00 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 r changing an au
18a10 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 thorization func
18a20 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 tion are the typ
18a30 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 es of.** things
18a40 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 that make prepar
18a50 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 ed statements ob
18a60 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 solete..*/.void
18a70 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 sqlite3ExpirePre
18a80 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 paredStatements(
18a90 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 sqlite3 *db){.
18aa0 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 Vdbe *p;. for(p
18ab0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b = db->pVdbe; p;
18ac0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 p=p->pNext){.
18ad0 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 p->expired = 1
18ae0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 ;. }.}../*.** R
18af0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 eturn the databa
18b00 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 se associated wi
18b10 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a th the Vdbe..*/.
18b20 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 sqlite3 *sqlite3
18b30 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b VdbeDb(Vdbe *v){
18b40 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b . return v->db;
18b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
18b60 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e a pointer to an
18b70 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 sqlite3_value s
18b80 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e tructure contain
18b90 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f ing the value bo
18ba0 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 und.** parameter
18bb0 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 iVar of VM v. E
18bc0 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 xcept, if the va
18bd0 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 lue is an SQL NU
18be0 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 LL, return .** 0
18bf0 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 instead. Unless
18c00 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 it is NULL, app
18c10 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 ly affinity aff
18c20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 (one of the SQLI
18c30 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 TE_AFF_*.** cons
18c40 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 tants) to the va
18c50 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 lue before retur
18c60 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 ning it..**.** T
18c70 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 he returned valu
18c80 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 e must be freed
18c90 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 by the caller us
18ca0 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 ing sqlite3Value
18cb0 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 Free()..*/.sqlit
18cc0 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 e3_value *sqlite
18cd0 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 64 3VdbeGetValue(Vd
18ce0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c be *v, int iVar,
18cf0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 u8 aff){. asse
18d00 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 rt( iVar>0 );.
18d10 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d if( v ){. Mem
18d20 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 *pMem = &v->aVa
18d30 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 r[iVar-1];. i
18d40 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 f( 0==(pMem->fla
18d50 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 gs & MEM_Null) )
18d60 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
18d70 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 value *pRet = sq
18d80 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d lite3ValueNew(v-
18d90 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 >db);. if(
18da0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 pRet ){.
18db0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f sqlite3VdbeMemCo
18dc0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 py((Mem *)pRet,
18dd0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 pMem);. s
18de0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 qlite3ValueApply
18df0 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 Affinity(pRet, a
18e00 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 ff, SQLITE_UTF8)
18e10 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 ;. sqlite
18e20 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 70 3VdbeMemStoreTyp
18e30 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b 0a e((Mem *)pRet);.
18e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 }. re
18e50 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d turn pRet;. }
18e60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b . }. return 0;
18e70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 .}../*.** Config
18e80 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 ure SQL variable
18e90 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 iVar so that bi
18ea0 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 nding a new valu
18eb0 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a e to it signals.
18ec0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 ** to sqlite3_re
18ed0 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 optimize() that
18ee0 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 re-preparing the
18ef0 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 statement may r
18f00 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 esult.** in a be
18f10 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e tter query plan.
18f20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
18f30 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 VdbeSetVarmask(V
18f40 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 dbe *v, int iVar
18f50 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 ){. assert( iVa
18f60 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 r>0 );. if( iVa
18f70 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 r>32 ){. v->e
18f80 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 xpmask = 0xfffff
18f90 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 fff;. }else{.
18fa0 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 v->expmask |=
18fb0 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 ((u32)1 << (iVar
18fc0 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 -1));. }.}..#if
18fd0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
18fe0 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b E_PREUPDATE_HOOK
18ff0 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 ./*.** Invoke th
19000 65 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f e pre-update hoo
19010 6b 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e k. If this is an
19020 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 UPDATE or DELET
19030 45 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c E pre-update cal
19040 6c 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f l,.** then curso
19050 72 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 r passed as the
19060 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 second argument
19070 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 should point to
19080 74 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a the row about.**
19090 20 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 to be update or
190a0 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 deleted. If the
190b0 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c application cal
190c0 6c 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 ls sqlite3_preup
190d0 64 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 date_old(),.** t
190e0 68 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 he required valu
190f0 65 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 e will be read f
19100 72 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 rom the row the
19110 63 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f cursor points to
19120 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
19130 33 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 3VdbePreUpdateHo
19140 6f 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 ok(. Vdbe *v,
19150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19160 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 /* Vdbe pr
19170 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 e-update hook is
19180 20 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 invoked by */.
19190 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 VdbeCursor *pCs
191a0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r,
191b0 20 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 /* Cursor to gr
191c0 61 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 ab old.* values
191d0 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 from */. int op
191e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
191f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c /* SQL
19200 49 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 ITE_INSERT, UPDA
19210 54 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a TE or DELETE */.
19220 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 const char *zD
19230 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b,
19240 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 /* Database na
19250 6d 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 me */. Table *p
19260 54 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 Tab,
19270 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 /* Modif
19280 69 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 ied table */. i
19290 36 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 64 iKey1,
192a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
192b0 2a 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 * Initial key va
192c0 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 lue */. int iRe
192d0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 g
192e0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 /* Regi
192f0 73 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 ster for new.* r
19300 65 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 ecord */.){. sq
19310 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 lite3 *db = v->d
19320 62 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a b;. i64 iKey2;.
19330 20 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75 PreUpdate preu
19340 70 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 pdate;. const c
19350 68 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 har *zTbl = pTab
19360 2d 3e 7a 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65 ->zName;.. asse
19370 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 rt( db->pPreUpda
19380 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 te==0 );. memse
19390 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c t(&preupdate, 0,
193a0 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 sizeof(PreUpdat
193b0 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 e));. if( op==S
193c0 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a QLITE_UPDATE ){.
193d0 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 iKey2 = v->a
193e0 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 Mem[iReg].u.i;.
193f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 }else{. iKey
19400 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 2 = iKey1;. }..
19410 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 preupdate.v =
19420 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 v;. preupdate.p
19430 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 Csr = pCsr;. pr
19440 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b eupdate.op = op;
19450 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 . preupdate.iNe
19460 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 wReg = iReg;. p
19470 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f reupdate.keyinfo
19480 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 .db = db;. preu
19490 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e pdate.keyinfo.en
194a0 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 c = ENC(db);. p
194b0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f reupdate.keyinfo
194c0 2e 6e 46 69 65 6c 64 20 3d 20 70 43 73 72 2d 3e .nField = pCsr->
194d0 6e 46 69 65 6c 64 3b 0a 20 20 70 72 65 75 70 64 nField;. preupd
194e0 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b 65 79 ate.iKey1 = iKey
194f0 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 1;. preupdate.i
19500 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a 20 20 Key2 = iKey2;.
19510 70 72 65 75 70 64 61 74 65 2e 69 50 4b 65 79 20 preupdate.iPKey
19520 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 0a = pTab->iPKey;..
19530 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 db->pPreUpdate
19540 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b 0a 20 = &preupdate;.
19550 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74 65 43 db->xPreUpdateC
19560 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50 72 65 allback(db->pPre
19570 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c 20 6f UpdateArg, db, o
19580 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 69 4b p, zDb, zTbl, iK
19590 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20 20 64 ey1, iKey2);. d
195a0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20 3d 20 b->pPreUpdate =
195b0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 0;. sqlite3DbFr
195c0 65 65 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 ee(db, preupdate
195d0 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 69 66 28 .aRecord);. if(
195e0 20 70 72 65 75 70 64 61 74 65 2e 70 55 6e 70 61 preupdate.pUnpa
195f0 63 6b 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 cked ){. sqli
19600 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 te3VdbeDeleteUnp
19610 61 63 6b 65 64 52 65 63 6f 72 64 28 70 72 65 75 ackedRecord(preu
19620 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 pdate.pUnpacked)
19630 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 75 ;. }. if( preu
19640 70 64 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b pdate.pNewUnpack
19650 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 ed ){. sqlite
19660 33 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 3VdbeDeleteUnpac
19670 6b 65 64 52 65 63 6f 72 64 28 70 72 65 75 70 64 kedRecord(preupd
19680 61 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 ate.pNewUnpacked
19690 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 );. }. if( pre
196a0 75 70 64 61 74 65 2e 61 4e 65 77 20 29 7b 0a 20 update.aNew ){.
196b0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f int i;. fo
196c0 72 28 69 3d 30 3b 20 69 3c 70 43 73 72 2d 3e 6e r(i=0; i<pCsr->n
196d0 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 Field; i++){.
196e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 sqlite3VdbeMe
196f0 6d 52 65 6c 65 61 73 65 28 26 70 72 65 75 70 64 mRelease(&preupd
19700 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b 0a 20 20 ate.aNew[i]);.
19710 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 }. sqlite3D
19720 62 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 bFree(db, preupd
19730 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20 7d 0a 7d ate.aNew);. }.}
19740 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
19750 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 E_ENABLE_PREUPDA
19760 54 45 5f 48 4f 4f 4b 20 2a 2f 0a TE_HOOK */.