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 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 . tmp = *pA;.
07d0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 *pA = *pB;. *pB
07e0: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d = tmp;. pTmp =
07f0: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 pA->pNext;. pA
0800: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e ->pNext = pB->pN
0810: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 ext;. pB->pNext
0820: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 = pTmp;. pTmp
0830: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 = pA->pPrev;. p
0840: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 A->pPrev = pB->p
0850: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 Prev;. pB->pPre
0860: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 v = pTmp;. zTmp
0870: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 = pA->zSql;. p
0880: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 A->zSql = pB->zS
0890: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d ql;. pB->zSql =
08a0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 zTmp;. pB->isP
08b0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 repareV2 = pA->i
08c0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 23 sPrepareV2;.}..#
08d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
08e0: 55 47 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 72 UG./*.** Turn tr
08f0: 61 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 0a acing on or off.
0900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
0910: 64 62 65 54 72 61 63 65 28 56 64 62 65 20 2a 70 dbeTrace(Vdbe *p
0920: 2c 20 46 49 4c 45 20 2a 74 72 61 63 65 29 7b 0a , FILE *trace){.
0930: 20 20 70 2d 3e 74 72 61 63 65 20 3d 20 74 72 61 p->trace = tra
0940: 63 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a ce;.}.#endif../*
0950: 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 56 .** Resize the V
0960: 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 6f dbe.aOp array so
0970: 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 6c that it is at l
0980: 65 61 73 74 20 6f 6e 65 20 6f 70 20 6c 61 72 67 east one op larg
0990: 65 72 20 74 68 61 6e 20 0a 2a 2a 20 69 74 20 77 er than .** it w
09a0: 61 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 as..**.** If an
09b0: 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 out-of-memory er
09c0: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 ror occurs while
09d0: 20 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 resizing the ar
09e0: 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 ray, return.** S
09f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 QLITE_NOMEM. In
0a00: 74 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 this case Vdbe.a
0a10: 4f 70 20 61 6e 64 20 56 64 62 65 2e 6e 4f 70 41 Op and Vdbe.nOpA
0a20: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 lloc remain .**
0a30: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 unchanged (this
0a40: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f is so that any o
0a50: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 pcodes already a
0a60: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 llocated can be
0a70: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 .** correctly de
0a80: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 allocated along
0a90: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 with the rest of
0aa0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 the Vdbe)..*/.s
0ab0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 tatic int growOp
0ac0: 41 72 72 61 79 28 56 64 62 65 20 2a 70 29 7b 0a Array(Vdbe *p){.
0ad0: 20 20 56 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a VdbeOp *pNew;.
0ae0: 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d int nNew = (p-
0af0: 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e >nOpAlloc ? p->n
0b00: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 OpAlloc*2 : (int
0b10: 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 )(1024/sizeof(Op
0b20: 29 29 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 )));. pNew = sq
0b30: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 lite3DbRealloc(p
0b40: 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 6e 4e ->db, p->aOp, nN
0b50: 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a ew*sizeof(Op));.
0b60: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 if( pNew ){.
0b70: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 p->nOpAlloc =
0b80: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 sqlite3DbMallocS
0b90: 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 ize(p->db, pNew)
0ba0: 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 /sizeof(Op);.
0bb0: 20 70 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a p->aOp = pNew;.
0bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e }. return (pN
0bd0: 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a ew ? SQLITE_OK :
0be0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a SQLITE_NOMEM);.
0bf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e }../*.** Add a n
0c00: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 ew instruction t
0c10: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e o the list of in
0c20: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65 structions curre
0c30: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42 nt in the.** VDB
0c40: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61 E. Return the a
0c50: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 ddress of the ne
0c60: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a w instruction..*
0c70: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a *.** Parameters:
0c80: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20 .**.** p
0c90: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65 Pointe
0ca0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a r to the VDBE.**
0cb0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20 .** op
0cc0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64 The opcod
0cd0: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72 e for this instr
0ce0: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 uction.**.**
0cf0: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20 p1, p2, p3
0d00: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 Operands.**.** U
0d10: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 se the sqlite3Vd
0d20: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29 beResolveLabel()
0d30: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78 function to fix
0d40: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a an address and.
0d50: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 ** the sqlite3Vd
0d60: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e beChangeP4() fun
0d70: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20 ction to change
0d80: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 the value of the
0d90: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a P4.** operand..
0da0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
0db0: 62 65 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 beAddOp3(Vdbe *p
0dc0: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 , int op, int p1
0dd0: 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 , int p2, int p3
0de0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 ){. int i;. Vd
0df0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 beOp *pOp;.. i
0e00: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 = p->nOp;. asse
0e10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 rt( p->magic==VD
0e20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b BE_MAGIC_INIT );
0e30: 0a 20 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 . assert( op>0
0e40: 26 26 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 && op<0xff );.
0e50: 69 66 28 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c if( p->nOpAlloc<
0e60: 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20 67 72 =i ){. if( gr
0e70: 6f 77 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a owOpArray(p) ){.
0e80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a return 1;.
0e90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e }. }. p->n
0ea0: 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 Op++;. pOp = &p
0eb0: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d ->aOp[i];. pOp-
0ec0: 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 >opcode = (u8)op
0ed0: 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b ;. pOp->p5 = 0;
0ee0: 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b . pOp->p1 = p1;
0ef0: 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b . pOp->p2 = p2;
0f00: 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b . pOp->p3 = p3;
0f10: 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 . pOp->p4.p = 0
0f20: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 ;. pOp->p4type
0f30: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 = P4_NOTUSED;.
0f40: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a p->expired = 0;.
0f50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
0f60: 42 55 47 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d BUG. pOp->zComm
0f70: 65 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 ent = 0;. if( s
0f80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 6f 70 54 qlite3VdbeAddopT
0f90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 56 64 race ) sqlite3Vd
0fa0: 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2c 20 bePrintOp(0, i,
0fb0: 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 23 65 6e &p->aOp[i]);.#en
0fc0: 64 69 66 0a 23 69 66 64 65 66 20 56 44 42 45 5f dif.#ifdef VDBE_
0fd0: 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 PROFILE. pOp->c
0fe0: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 ycles = 0;. pOp
0ff0: 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 ->cnt = 0;.#endi
1000: 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a f. return i;.}.
1010: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 int sqlite3VdbeA
1020: 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20 69 ddOp0(Vdbe *p, i
1030: 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e nt op){. return
1040: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
1050: 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 p3(p, op, 0, 0,
1060: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 0);.}.int sqlite
1070: 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62 65 3VdbeAddOp1(Vdbe
1080: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 *p, int op, int
1090: 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 p1){. return s
10a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 qlite3VdbeAddOp3
10b0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 (p, op, p1, 0, 0
10c0: 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 );.}.int sqlite3
10d0: 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65 20 VdbeAddOp2(Vdbe
10e0: 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 *p, int op, int
10f0: 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 p1, int p2){. r
1100: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 eturn sqlite3Vdb
1110: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 eAddOp3(p, op, p
1120: 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 1, p2, 0);.}.../
1130: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f *.** Add an opco
1140: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 de that includes
1150: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 the p4 value as
1160: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 a pointer..*/.i
1170: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
1180: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c dOp4(. Vdbe *p,
1190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
11a0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f dd the opcode to
11b0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e this VM */. in
11c0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 t op,
11d0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 /* The new opc
11e0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c ode */. int p1,
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1200: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a The P1 operand *
1210: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 /. int p2,
1220: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 /* The P
1230: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 2 operand */. i
1240: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 nt p3,
1250: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 /* The P3 ope
1260: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 rand */. const
1270: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a char *zP4, /*
1280: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 The P4 operand
1290: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 */. int p4type
12a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f /* P4 o
12b0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 perand type */.)
12c0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 {. int addr = s
12d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 qlite3VdbeAddOp3
12e0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 (p, op, p1, p2,
12f0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 p3);. sqlite3Vd
1300: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 beChangeP4(p, ad
1310: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 dr, zP4, p4type)
1320: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b ;. return addr;
1330: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
1340: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 opcode that inc
1350: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c ludes the p4 val
1360: 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 ue as an integer
1370: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
1380: 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 VdbeAddOp4Int(.
1390: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 Vdbe *p,
13a0: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 /* Add the
13b0: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 opcode to this V
13c0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 M */. int op,
13d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
13e0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a e new opcode */.
13f0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 int p1,
1400: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 /* The P1
1410: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
1420: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 p2,
1430: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 /* The P2 opera
1440: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 nd */. int p3,
1450: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1460: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f he P3 operand */
1470: 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 . int p4
1480: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 /* The P4
1490: 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 operand as an i
14a0: 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 nteger */.){. i
14b0: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 nt addr = sqlite
14c0: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 3VdbeAddOp3(p, o
14d0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a p, p1, p2, p3);.
14e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 sqlite3VdbeCha
14f0: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 ngeP4(p, addr, S
1500: 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 QLITE_INT_TO_PTR
1510: 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b (p4), P4_INT32);
1520: 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a . return addr;.
1530: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 }../*.** Create
1540: 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c a new symbolic l
1550: 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 abel for an inst
1560: 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68 61 73 ruction that has
1570: 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f yet to be.** co
1580: 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c ded. The symbol
1590: 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65 61 6c ic label is real
15a0: 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61 74 69 ly just a negati
15b0: 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a ve number. The.
15c0: 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 ** label can be
15d0: 75 73 65 64 20 61 73 20 74 68 65 20 50 32 20 76 used as the P2 v
15e0: 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 alue of an opera
15f0: 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 tion. Later, wh
1600: 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 en.** the label
1610: 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 is resolved to a
1620: 20 73 70 65 63 69 66 69 63 20 61 64 64 72 65 73 specific addres
1630: 73 2c 20 74 68 65 20 56 44 42 45 20 77 69 6c 6c s, the VDBE will
1640: 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 scan.** through
1650: 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c its operation l
1660: 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65 20 61 ist and change a
1670: 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50 32 20 ll values of P2
1680: 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 which match.** t
1690: 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 he label into th
16a0: 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64 72 65 e resolved addre
16b0: 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 ss..**.** The VD
16c0: 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 BE knows that a
16d0: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 P2 value is a la
16e0: 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61 62 65 bel because labe
16f0: 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 ls are.** always
1700: 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20 50 32 negative and P2
1710: 20 76 61 6c 75 65 73 20 61 72 65 20 73 75 70 70 values are supp
1720: 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 ose to be non-ne
1730: 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 gative..** Hence
1740: 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 , a negative P2
1750: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c value is a label
1760: 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74 6f that has yet to
1770: 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a be resolved..**
1780: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75 .** Zero is retu
1790: 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 rned if a malloc
17a0: 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 () fails..*/.int
17b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 sqlite3VdbeMake
17c0: 4c 61 62 65 6c 28 56 64 62 65 20 2a 70 29 7b 0a Label(Vdbe *p){.
17d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 20 3d 20 70 int i;. i = p
17e0: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 ->nLabel++;. as
17f0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
1800: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
1810: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 70 2d 3e 6e );. if( i>=p->n
1820: 4c 61 62 65 6c 41 6c 6c 6f 63 20 29 7b 0a 20 20 LabelAlloc ){.
1830: 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 6e 4c 61 int n = p->nLa
1840: 62 65 6c 41 6c 6c 6f 63 2a 32 20 2b 20 35 3b 0a belAlloc*2 + 5;.
1850: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 p->aLabel =
1860: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 sqlite3DbRealloc
1870: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d OrFree(p->db, p-
1880: 3e 61 4c 61 62 65 6c 2c 0a 20 20 20 20 20 20 20 >aLabel,.
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18b0: 6e 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 n*sizeof(p->aLab
18c0: 65 6c 5b 30 5d 29 29 3b 0a 20 20 20 20 70 2d 3e el[0]));. p->
18d0: 6e 4c 61 62 65 6c 41 6c 6c 6f 63 20 3d 20 73 71 nLabelAlloc = sq
18e0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a lite3DbMallocSiz
18f0: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 e(p->db, p->aLab
1900: 65 6c 29 2f 73 69 7a 65 6f 66 28 70 2d 3e 61 4c el)/sizeof(p->aL
1910: 61 62 65 6c 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 abel[0]);. }.
1920: 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b if( p->aLabel ){
1930: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 . p->aLabel[i
1940: 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 ] = -1;. }. re
1950: 74 75 72 6e 20 2d 31 2d 69 3b 0a 7d 0a 0a 2f 2a turn -1-i;.}../*
1960: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 .** Resolve labe
1970: 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65 20 l "x" to be the
1980: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e address of the n
1990: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 ext instruction
19a0: 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 to.** be inserte
19b0: 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74 65 d. The paramete
19c0: 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65 20 r "x" must have
19d0: 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 been obtained fr
19e0: 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 om.** a prior ca
19f0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 ll to sqlite3Vdb
1a00: 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f eMakeLabel()..*/
1a10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
1a20: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 eResolveLabel(Vd
1a30: 62 65 20 2a 70 2c 20 69 6e 74 20 78 29 7b 0a 20 be *p, int x){.
1a40: 20 69 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 int j = -1-x;.
1a50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 assert( p->magi
1a60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e c==VDBE_MAGIC_IN
1a70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 IT );. assert(
1a80: 6a 3e 3d 30 20 26 26 20 6a 3c 70 2d 3e 6e 4c 61 j>=0 && j<p->nLa
1a90: 62 65 6c 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e bel );. if( p->
1aa0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d aLabel ){. p-
1ab0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 70 2d 3e >aLabel[j] = p->
1ac0: 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a nOp;. }.}../*.*
1ad0: 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 * Mark the VDBE
1ae0: 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 as one that can
1af0: 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 only be run one
1b00: 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 time..*/.void sq
1b10: 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 lite3VdbeRunOnly
1b20: 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 Once(Vdbe *p){.
1b30: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 p->runOnlyOnce
1b40: 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 = 1;.}..#ifdef S
1b50: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 QLITE_DEBUG /* s
1b60: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 qlite3AssertMayA
1b70: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a bort() logic */.
1b80: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f ./*.** The follo
1b90: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 wing type and fu
1ba0: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 nction are used
1bb0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 to iterate throu
1bc0: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a gh all opcodes.*
1bd0: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e * in a Vdbe main
1be0: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 program and eac
1bf0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f h of the sub-pro
1c00: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 grams (triggers)
1c10: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f it may .** invo
1c20: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 ke directly or i
1c30: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 ndirectly. It sh
1c40: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 ould be used as
1c50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 follows:.**.**
1c60: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 Op *pOp;.** V
1c70: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b dbeOpIter sIter;
1c80: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 .**.** memset(
1c90: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f &sIter, 0, sizeo
1ca0: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 f(sIter));.**
1cb0: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 sIter.v = v;
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cd0: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 // v is
1ce0: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a of type Vdbe* .*
1cf0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 * while( (pOp
1d00: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 = opIterNext(&sI
1d10: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 ter)) ){.**
1d20: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 // Do something
1d30: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a with pOp.** }.
1d40: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 ** sqlite3DbFr
1d50: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e ee(v->db, sIter.
1d60: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 apSub);.** .*/.t
1d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64 ypedef struct Vd
1d80: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 beOpIter VdbeOpI
1d90: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 ter;.struct Vdbe
1da0: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 OpIter {. Vdbe
1db0: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *v;
1dc0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f /* Vdbe to
1dd0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 iterate through
1de0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 the opcodes of
1df0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 */. SubProgram
1e00: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 **apSub;
1e10: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 /* Array of subp
1e20: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 rograms */. int
1e30: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 nSub;
1e40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
1e50: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 r of entries in
1e60: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 apSub */. int i
1e70: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 Addr;
1e80: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 /* Address
1e90: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 of next instruc
1ea0: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a tion to return *
1eb0: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 /. int iSub;
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1ed0: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 * 0 = main progr
1ee0: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 am, 1 = first su
1ef0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a b-program etc. *
1f00: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a /.};.static Op *
1f10: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f opIterNext(VdbeO
1f20: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 pIter *p){. Vdb
1f30: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f e *v = p->v;. O
1f40: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f p *pRet = 0;. O
1f50: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f p *aOp;. int nO
1f60: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 p;.. if( p->iSu
1f70: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 b<=p->nSub ){..
1f80: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d if( p->iSub==
1f90: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 0 ){. aOp =
1fa0: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e v->aOp;. n
1fb0: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 Op = v->nOp;.
1fc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f }else{. aO
1fd0: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e p = p->apSub[p->
1fe0: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 iSub-1]->aOp;.
1ff0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 nOp = p->apS
2000: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e ub[p->iSub-1]->n
2010: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 Op;. }. as
2020: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e sert( p->iAddr<n
2030: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 Op );.. pRet
2040: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d = &aOp[p->iAddr]
2050: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b ;. p->iAddr++
2060: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 ;. if( p->iAd
2070: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 dr==nOp ){.
2080: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 p->iSub++;.
2090: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a p->iAddr = 0;.
20a0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 }. . if(
20b0: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 pRet->p4type==P
20c0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 4_SUBPROGRAM ){.
20d0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 int nByte
20e0: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 = (p->nSub+1)*si
20f0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a zeof(SubProgram*
2100: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a );. int j;.
2110: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a for(j=0; j
2120: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a <p->nSub; j++){.
2130: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 if( p->a
2140: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 pSub[j]==pRet->p
2150: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 4.pProgram ) bre
2160: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
2170: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 if( j==p->nSub
2180: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 ){. p->a
2190: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 pSub = sqlite3Db
21a0: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d ReallocOrFree(v-
21b0: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e >db, p->apSub, n
21c0: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 Byte);. i
21d0: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a f( !p->apSub ){.
21e0: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d pRet =
21f0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 0;. }els
2200: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e e{. p->
2210: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d apSub[p->nSub++]
2220: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f = pRet->p4.pPro
2230: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a gram;. }.
2240: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
2250: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 }.. return pRet
2260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b ;.}../*.** Check
2270: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 if the program
2280: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d stored in the VM
2290: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
22a0: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 pParse may.** t
22b0: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 hrow an ABORT ex
22c0: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 ception (causing
22d0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 the statement,
22e0: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 but not entire t
22f0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f ransaction.** to
2300: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 be rolled back)
2310: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e . This condition
2320: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 is true if the
2330: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 main program or
2340: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 any.** sub-progr
2350: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 ams contains any
2360: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e of the followin
2370: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 g:.**.** * OP
2380: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 _Halt with P1=SQ
2390: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 LITE_CONSTRAINT
23a0: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e and P2=OE_Abort.
23b0: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 .** * OP_Halt
23c0: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 IfNull with P1=S
23d0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
23e0: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 and P2=OE_Abort
23f0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 ..** * OP_Des
2400: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f troy.** * OP_
2410: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 VUpdate.** *
2420: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 OP_VRename.**
2430: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 * OP_FkCounter
2440: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 with P2==0 (imme
2450: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 diate foreign ke
2460: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a y constraint).**
2470: 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 .** Then check t
2480: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 hat the value of
2490: 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 Parse.mayAbort
24a0: 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a is true if an.**
24b0: 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 ABORT may be th
24c0: 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f rown, or false o
24d0: 74 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e therwise. Return
24e0: 20 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 true if it does
24f0: 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 .** match, or fa
2500: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 lse otherwise. T
2510: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
2520: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 intended to be u
2530: 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f sed as.** part o
2540: 66 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 f an assert stat
2550: 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d ement in the com
2560: 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 piler. Similar t
2570: 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 o:.**.** asser
2580: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 t( sqlite3VdbeAs
2590: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 sertMayAbort(pPa
25a0: 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 rse->pVdbe, pPar
25b0: 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b se->mayAbort) );
25c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
25d0: 64 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 dbeAssertMayAbor
25e0: 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d t(Vdbe *v, int m
25f0: 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 ayAbort){. int
2600: 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 hasAbort = 0;.
2610: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f Op *pOp;. VdbeO
2620: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d pIter sIter;. m
2630: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c emset(&sIter, 0,
2640: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b sizeof(sIter));
2650: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a . sIter.v = v;.
2660: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d . while( (pOp =
2670: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 opIterNext(&sIt
2680: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 er))!=0 ){. i
2690: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d nt opcode = pOp-
26a0: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 >opcode;. if(
26b0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 opcode==OP_Dest
26c0: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f roy || opcode==O
26d0: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 P_VUpdate || opc
26e0: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 ode==OP_VRename
26f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
2700: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 OMIT_FOREIGN_KEY
2710: 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f 64 65 . || (opcode
2720: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 ==OP_FkCounter &
2730: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 & pOp->p1==0 &&
2740: 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23 65 6e pOp->p2==1) .#en
2750: 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 dif. || ((op
2760: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c code==OP_Halt ||
2770: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 opcode==OP_Halt
2780: 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 IfNull) . &
2790: 26 20 28 70 4f 70 2d 3e 70 31 3d 3d 53 51 4c 49 & (pOp->p1==SQLI
27a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 TE_CONSTRAINT &&
27b0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f pOp->p2==OE_Abo
27c0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 rt)). ){.
27d0: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a hasAbort = 1;.
27e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
27f0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 }. }. sqlite3
2800: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 DbFree(v->db, sI
2810: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f ter.apSub);.. /
2820: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 * Return true if
2830: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 hasAbort==mayAb
2840: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c ort. Or if a mal
2850: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 loc failure occu
2860: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c red.. ** If mal
2870: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e loc failed, then
2880: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f the while() loo
2890: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 p above may not
28a0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 have iterated.
28b0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f ** through all o
28c0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 pcodes and hasAb
28d0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 ort may be set i
28e0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 ncorrectly. Retu
28f0: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 rn. ** true for
2900: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 this case to pr
2910: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 event the assert
2920: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 () in the caller
2930: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f s frame. ** fro
2940: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 m failing. */.
2950: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d return ( v->db-
2960: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c >mallocFailed ||
2970: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 hasAbort==mayAb
2980: 6f 72 74 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 ort );.}.#endif
2990: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 /* SQLITE_DEBUG
29a0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 - the sqlite3Ass
29b0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 ertMayAbort() fu
29c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a nction */../*.**
29d0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68 Loop through th
29e0: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e e program lookin
29f0: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20 g for P2 values
2a00: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76 that are negativ
2a10: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73 e.** on jump ins
2a20: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68 tructions. Each
2a30: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61 such value is a
2a40: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65 label. Resolve
2a50: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79 the.** label by
2a60: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20 setting the P2
2a70: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72 value to its cor
2a80: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 rect non-zero va
2a90: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 lue..**.** This
2aa0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 routine is calle
2ab0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c d once after all
2ac0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65 opcodes have be
2ad0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a en inserted..**.
2ae0: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61 ** Variable *pMa
2af0: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74 xFuncArgs is set
2b00: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 to the maximum
2b10: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20 value of any P2
2b20: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 argument .** to
2b30: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 an OP_Function,
2b40: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50 OP_AggStep or OP
2b50: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e _VFilter opcode.
2b60: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 This is used by
2b70: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 .** sqlite3Vdbe
2b80: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73 MakeReady() to s
2b90: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41 ize the Vdbe.apA
2ba0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a rg[] array..**.*
2bb0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73 * The Op.opflags
2bc0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e field is set on
2bd0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f all opcodes..*/
2be0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 .static void res
2bf0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 olveP2Values(Vdb
2c00: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 e *p, int *pMaxF
2c10: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 uncArgs){. int
2c20: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 i;. int nMaxArg
2c30: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 s = *pMaxFuncArg
2c40: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 s;. Op *pOp;.
2c50: 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 2d int *aLabel = p-
2c60: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 >aLabel;. p->re
2c70: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 66 6f adOnly = 1;. fo
2c80: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d r(pOp=p->aOp, i=
2c90: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 p->nOp-1; i>=0;
2ca0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 i--, pOp++){.
2cb0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 u8 opcode = pOp
2cc0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 70 ->opcode;.. p
2cd0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 Op->opflags = sq
2ce0: 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 lite3OpcodePrope
2cf0: 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 rty[opcode];.
2d00: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f if( opcode==OP_
2d10: 46 75 6e 63 74 69 6f 6e 20 7c 7c 20 6f 70 63 6f Function || opco
2d20: 64 65 3d 3d 4f 50 5f 41 67 67 53 74 65 70 20 29 de==OP_AggStep )
2d30: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d {. if( pOp-
2d40: 3e 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e >p5>nMaxArgs ) n
2d50: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 MaxArgs = pOp->p
2d60: 35 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 5;. }else if(
2d70: 20 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 72 61 (opcode==OP_Tra
2d80: 6e 73 61 63 74 69 6f 6e 20 26 26 20 70 4f 70 2d nsaction && pOp-
2d90: 3e 70 32 21 3d 30 29 20 7c 7c 20 6f 70 63 6f 64 >p2!=0) || opcod
2da0: 65 3d 3d 4f 50 5f 56 61 63 75 75 6d 20 29 7b 0a e==OP_Vacuum ){.
2db0: 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c p->readOnl
2dc0: 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 y = 0;.#ifndef S
2dd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 QLITE_OMIT_VIRTU
2de0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 7d 65 6c 73 ALTABLE. }els
2df0: 65 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 e if( opcode==OP
2e00: 5f 56 55 70 64 61 74 65 20 29 7b 0a 20 20 20 20 _VUpdate ){.
2e10: 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d if( pOp->p2>nM
2e20: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 axArgs ) nMaxArg
2e30: 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 s = pOp->p2;.
2e40: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 63 6f 64 }else if( opcod
2e50: 65 3d 3d 4f 50 5f 56 46 69 6c 74 65 72 20 29 7b e==OP_VFilter ){
2e60: 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 . int n;.
2e70: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e assert( p->n
2e80: 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 Op - i >= 3 );.
2e90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 assert( pOp
2ea0: 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f [-1].opcode==OP_
2eb0: 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 Integer );.
2ec0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b n = pOp[-1].p1;
2ed0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 . if( n>nMa
2ee0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 xArgs ) nMaxArgs
2ef0: 20 3d 20 6e 3b 0a 23 65 6e 64 69 66 0a 20 20 20 = n;.#endif.
2f00: 20 7d 0a 0a 20 20 20 20 69 66 28 20 28 70 4f 70 }.. if( (pOp
2f10: 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c ->opflags & OPFL
2f20: 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f G_JUMP)!=0 && pO
2f30: 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 p->p2<0 ){.
2f40: 20 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d assert( -1-pOp-
2f50: 3e 70 32 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b >p2<p->nLabel );
2f60: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d . pOp->p2 =
2f70: 20 61 4c 61 62 65 6c 5b 2d 31 2d 70 4f 70 2d 3e aLabel[-1-pOp->
2f80: 70 32 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 p2];. }. }.
2f90: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 sqlite3DbFree(p
2fa0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 29 ->db, p->aLabel)
2fb0: 3b 0a 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20 ;. p->aLabel =
2fc0: 30 3b 0a 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 0;.. *pMaxFuncA
2fd0: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a rgs = nMaxArgs;.
2fe0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
2ff0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 the address of t
3000: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 he next instruct
3010: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 ion to be insert
3020: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 ed..*/.int sqlit
3030: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 e3VdbeCurrentAdd
3040: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 r(Vdbe *p){. as
3050: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
3060: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
3070: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e );. return p->n
3080: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 Op;.}../*.** Thi
3090: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
30a0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ns a pointer to
30b0: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 the array of opc
30c0: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 odes associated
30d0: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 with.** the Vdbe
30e0: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 passed as the f
30f0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 irst argument. I
3100: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 t is the callers
3110: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a responsibility.
3120: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f ** to arrange fo
3130: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 r the returned a
3140: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 rray to be event
3150: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e ually freed usin
3160: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 g the .** vdbeFr
3170: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 eeOpArray() func
3180: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f tion..**.** Befo
3190: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 re returning, *p
31a0: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 nOp is set to th
31b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 e number of entr
31c0: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 ies in the retur
31d0: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c ned.** array. Al
31e0: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 so, *pnMaxArg is
31f0: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 set to the larg
3200: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e er of its curren
3210: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 t value and .**
3220: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e the number of en
3230: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 tries in the Vdb
3240: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 e.apArg[] array
3250: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 required to exec
3260: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 ute the .** retu
3270: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f rned program..*/
3280: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 .VdbeOp *sqlite3
3290: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 VdbeTakeOpArray(
32a0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e Vdbe *p, int *pn
32b0: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 Op, int *pnMaxAr
32c0: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f g){. VdbeOp *aO
32d0: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 p = p->aOp;. as
32e0: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d sert( aOp && !p-
32f0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
3300: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b d );.. /* Check
3310: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 that sqlite3Vdb
3320: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 eUsesBtree() was
3330: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 not called on t
3340: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 his VM */. asse
3350: 72 74 28 20 70 2d 3e 61 4d 75 74 65 78 2e 6e 4d rt( p->aMutex.nM
3360: 75 74 65 78 3d 3d 30 20 29 3b 0a 0a 20 20 72 65 utex==0 );.. re
3370: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c solveP2Values(p,
3380: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 pnMaxArg);. *p
3390: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 nOp = p->nOp;.
33a0: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 p->aOp = 0;. re
33b0: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a turn aOp;.}../*.
33c0: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c ** Add a whole l
33d0: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e ist of operation
33e0: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69 s to the operati
33f0: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72 on stack. Retur
3400: 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 n the.** address
3410: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f 70 of the first op
3420: 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a eration added..*
3430: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
3440: 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 20 eAddOpList(Vdbe
3450: 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 *p, int nOp, Vdb
3460: 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 eOpList const *a
3470: 4f 70 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 3b Op){. int addr;
3480: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 . assert( p->ma
3490: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
34a0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d INIT );. if( p-
34b0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e >nOp + nOp > p->
34c0: 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 nOpAlloc && grow
34d0: 4f 70 41 72 72 61 79 28 70 29 20 29 7b 0a 20 20 OpArray(p) ){.
34e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
34f0: 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 3b addr = p->nOp;
3500: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e 4f . if( ALWAYS(nO
3510: 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 p>0) ){. int
3520: 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69 73 i;. VdbeOpLis
3530: 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20 61 t const *pIn = a
3540: 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b Op;. for(i=0;
3550: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49 6e i<nOp; i++, pIn
3560: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 ++){. int p
3570: 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20 20 2 = pIn->p2;.
3580: 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 20 VdbeOp *pOut
3590: 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 = &p->aOp[i+addr
35a0: 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 6f ];. pOut->o
35b0: 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70 63 pcode = pIn->opc
35c0: 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d ode;. pOut-
35d0: 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a 20 >p1 = pIn->p1;.
35e0: 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 26 26 if( p2<0 &&
35f0: 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 (sqlite3OpcodeP
3600: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70 roperty[pOut->op
3610: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 code] & OPFLG_JU
3620: 4d 50 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 MP)!=0 ){.
3630: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 64 64 pOut->p2 = add
3640: 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a 20 20 r + ADDR(p2);.
3650: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
3660: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 70 32 pOut->p2 = p2
3670: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
3680: 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e pOut->p3 = pIn->
3690: 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e p3;. pOut->
36a0: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 p4type = P4_NOTU
36b0: 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d SED;. pOut-
36c0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 20 >p4.p = 0;.
36d0: 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 pOut->p5 = 0;.#
36e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 ifdef SQLITE_DEB
36f0: 55 47 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a UG. pOut->z
3700: 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 Comment = 0;.
3710: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 if( sqlite3Vd
3720: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a beAddopTrace ){.
3730: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
3740: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b dbePrintOp(0, i+
3750: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b addr, &p->aOp[i+
3760: 61 64 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a addr]);. }.
3770: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 #endif. }.
3780: 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a p->nOp += nOp;.
3790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 }. return add
37a0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e r;.}../*.** Chan
37b0: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 ge the value of
37c0: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66 the P1 operand f
37d0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e or a specific in
37e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 struction..** Th
37f0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 is routine is us
3800: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 eful when a larg
3810: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 e program is loa
3820: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 ded from a.** st
3830: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 atic array using
3840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
3850: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e pList but we wan
3860: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 t to make a.** f
3870: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 ew minor changes
3880: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e to the program.
3890: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
38a0: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 VdbeChangeP1(Vdb
38b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20 e *p, int addr,
38c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65 int val){. asse
38d0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 rt( p!=0 );. as
38e0: 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 29 3b sert( addr>=0 );
38f0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 61 64 . if( p->nOp>ad
3900: 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 dr ){. p->aOp
3910: 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61 6c 3b [addr].p1 = val;
3920: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 . }.}../*.** Ch
3930: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f ange the value o
3940: 66 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 f the P2 operand
3950: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 for a specific
3960: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 instruction..**
3970: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 This routine is
3980: 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74 74 69 useful for setti
3990: 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e ng a jump destin
39a0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 ation..*/.void s
39b0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
39c0: 50 32 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 P2(Vdbe *p, int
39d0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a addr, int val){.
39e0: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 assert( p!=0 )
39f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 ;. assert( addr
3a00: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e >=0 );. if( p->
3a10: 6e 4f 70 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 nOp>addr ){.
3a20: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 p->aOp[addr].p2
3a30: 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a = val;. }.}../*
3a40: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 .** Change the v
3a50: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f alue of the P3 o
3a60: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 perand for a spe
3a70: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f cific instructio
3a80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 n..*/.void sqlit
3a90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 e3VdbeChangeP3(V
3aa0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 dbe *p, int addr
3ab0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 , int val){. as
3ac0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 sert( p!=0 );.
3ad0: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 assert( addr>=0
3ae0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 3e );. if( p->nOp>
3af0: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61 addr ){. p->a
3b00: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61 Op[addr].p3 = va
3b10: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 l;. }.}../*.**
3b20: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 Change the value
3b30: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61 of the P5 opera
3b40: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20 nd for the most
3b50: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65 recently.** adde
3b60: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a d operation..*/.
3b70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
3b80: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70 ChangeP5(Vdbe *p
3b90: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73 , u8 val){. ass
3ba0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 ert( p!=0 );. i
3bb0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 f( p->aOp ){.
3bc0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e assert( p->nOp>
3bd0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 0 );. p->aOp[
3be0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76 p->nOp-1].p5 = v
3bf0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a al;. }.}../*.**
3c00: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f Change the P2 o
3c10: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 perand of instru
3c20: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 ction addr so th
3c30: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a at it points to.
3c40: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f ** the address o
3c50: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 f the next instr
3c60: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 uction to be cod
3c70: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ed..*/.void sqli
3c80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 te3VdbeJumpHere(
3c90: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 Vdbe *p, int add
3ca0: 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 61 64 r){. assert( ad
3cb0: 64 72 3e 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 dr>=0 );. sqlit
3cc0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 e3VdbeChangeP2(p
3cd0: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b , addr, p->nOp);
3ce0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 .}.../*.** If th
3cf0: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 e input FuncDef
3d00: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 structure is eph
3d10: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 emeral, then fre
3d20: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 e it. If.** the
3d30: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 FuncDef is not
3d40: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 ephermal, then d
3d50: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 o nothing..*/.st
3d60: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 atic void freeEp
3d70: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 hemeralFunction(
3d80: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e sqlite3 *db, Fun
3d90: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 cDef *pDef){. i
3da0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 f( ALWAYS(pDef)
3db0: 26 26 20 28 70 44 65 66 2d 3e 66 6c 61 67 73 20 && (pDef->flags
3dc0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50 & SQLITE_FUNC_EP
3dd0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 HEM)!=0 ){. s
3de0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
3df0: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 pDef);. }.}..s
3e00: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 tatic void vdbeF
3e10: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 reeOpArray(sqlit
3e20: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 e3 *, Op *, int)
3e30: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 ;../*.** Delete
3e40: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65 a P4 value if ne
3e50: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 cessary..*/.stat
3e60: 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28 73 ic void freeP4(s
3e70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 qlite3 *db, int
3e80: 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70 34 p4type, void *p4
3e90: 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a 20 ){. if( p4 ){.
3ea0: 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29 3b assert( db );
3eb0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34 74 . switch( p4t
3ec0: 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 ype ){. cas
3ed0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 e P4_REAL:.
3ee0: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a case P4_INT64:.
3ef0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 44 59 case P4_DY
3f00: 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63 61 73 NAMIC:. cas
3f10: 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 0a 20 20 e P4_KEYINFO:.
3f20: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 case P4_INTA
3f30: 52 52 41 59 3a 0a 20 20 20 20 20 20 63 61 73 65 RRAY:. case
3f40: 20 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 P4_KEYINFO_HAND
3f50: 4f 46 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 OFF: {. s
3f60: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
3f70: 20 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 p4);. br
3f80: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
3f90: 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e case P4_MPRIN
3fa0: 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 TF: {. if
3fb0: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 ( db->pnBytesFre
3fc0: 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f ed==0 ) sqlite3_
3fd0: 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 free(p4);.
3fe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
3ff0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 56 . case P4_V
4000: 44 42 45 46 55 4e 43 3a 20 7b 0a 20 20 20 20 20 DBEFUNC: {.
4010: 20 20 20 56 64 62 65 46 75 6e 63 20 2a 70 56 64 VdbeFunc *pVd
4020: 62 65 46 75 6e 63 20 3d 20 28 56 64 62 65 46 75 beFunc = (VdbeFu
4030: 6e 63 20 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 nc *)p4;.
4040: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 freeEphemeralFu
4050: 6e 63 74 69 6f 6e 28 64 62 2c 20 70 56 64 62 65 nction(db, pVdbe
4060: 46 75 6e 63 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 Func->pFunc);.
4070: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e if( db->pn
4080: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 BytesFreed==0 )
4090: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 sqlite3VdbeDelet
40a0: 65 41 75 78 44 61 74 61 28 70 56 64 62 65 46 75 eAuxData(pVdbeFu
40b0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 nc, 0);.
40c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
40d0: 2c 20 70 56 64 62 65 46 75 6e 63 29 3b 0a 20 20 , pVdbeFunc);.
40e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
40f0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 }. case
4100: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 P4_FUNCDEF: {.
4110: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 freeEpheme
4120: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 ralFunction(db,
4130: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 (FuncDef*)p4);.
4140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
4150: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
4160: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 P4_MEM: {.
4170: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 if( db->pnByt
4180: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 esFreed==0 ){.
4190: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
41a0: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 alueFree((sqlite
41b0: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 3_value*)p4);.
41c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
41d0: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 Mem *p =
41e0: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 (Mem*)p4;.
41f0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
4200: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 e(db, p->zMalloc
4210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c );. sql
4220: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
4230: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
4240: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
4250: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 }. case P
4260: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 4_VTAB : {.
4270: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 if( db->pnByt
4280: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c esFreed==0 ) sql
4290: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 ite3VtabUnlock((
42a0: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 VTable *)p4);.
42b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
42c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d }. }. }.}
42d0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 ../*.** Free the
42e0: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 space allocated
42f0: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 for aOp and any
4300: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 p4 values alloc
4310: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 ated for the.**
4320: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 opcodes containe
4330: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 d within. If aOp
4340: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 is not NULL it
4350: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f is assumed to co
4360: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e ntain .** nOp en
4370: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 tries. .*/.stati
4380: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f c void vdbeFreeO
4390: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a pArray(sqlite3 *
43a0: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 db, Op *aOp, int
43b0: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 nOp){. if( aOp
43c0: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b ){. Op *pOp;
43d0: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 . for(pOp=aOp
43e0: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b ; pOp<&aOp[nOp];
43f0: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66 pOp++){. f
4400: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 reeP4(db, pOp->p
4410: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 4type, pOp->p4.p
4420: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 );.#ifdef SQLITE
4430: 5f 44 45 42 55 47 0a 20 20 20 20 20 20 73 71 6c _DEBUG. sql
4440: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
4450: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 Op->zComment);.#
4460: 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d endif . }
4470: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 . }. sqlite3Db
4480: 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d Free(db, aOp);.}
4490: 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 ../*.** Link the
44a0: 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 SubProgram obje
44b0: 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 ct passed as the
44c0: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 second argument
44d0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 into the linked
44e0: 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 .** list at Vdbe
44f0: 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 .pSubProgram. Th
4500: 69 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 is list is used
4510: 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 to delete all su
4520: 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a b-program.** obj
4530: 65 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d ects when the VM
4540: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 is no longer re
4550: 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 quired..*/.void
4560: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 sqlite3VdbeLinkS
4570: 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a ubProgram(Vdbe *
4580: 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 pVdbe, SubProgra
4590: 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 m *p){. p->pNex
45a0: 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 t = pVdbe->pProg
45b0: 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 ram;. pVdbe->pP
45c0: 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f rogram = p;.}../
45d0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 4e 20 6f 70 *.** Change N op
45e0: 63 6f 64 65 73 20 73 74 61 72 74 69 6e 67 20 61 codes starting a
45f0: 74 20 61 64 64 72 20 74 6f 20 4e 6f 2d 6f 70 73 t addr to No-ops
4600: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
4610: 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 3VdbeChangeToNoo
4620: 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 p(Vdbe *p, int a
4630: 64 64 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 ddr, int N){. i
4640: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20 f( p->aOp ){.
4650: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 VdbeOp *pOp = &
4660: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 p->aOp[addr];.
4670: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
4680: 70 2d 3e 64 62 3b 0a 20 20 20 20 77 68 69 6c 65 p->db;. while
4690: 28 20 4e 2d 2d 20 29 7b 0a 20 20 20 20 20 20 66 ( N-- ){. f
46a0: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 reeP4(db, pOp->p
46b0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 4type, pOp->p4.p
46c0: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 );. memset(
46d0: 70 4f 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 pOp, 0, sizeof(p
46e0: 4f 70 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 70 Op[0]));. p
46f0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f 50 5f Op->opcode = OP_
4700: 4e 6f 6f 70 3b 0a 20 20 20 20 20 20 70 4f 70 2b Noop;. pOp+
4710: 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a +;. }. }.}..
4720: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 /*.** Change the
4730: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 value of the P4
4740: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 operand for a s
4750: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 pecific instruct
4760: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 ion..** This rou
4770: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 tine is useful w
4780: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 hen a large prog
4790: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 ram is loaded fr
47a0: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 om a.** static a
47b0: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 rray using sqlit
47c0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 e3VdbeAddOpList
47d0: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d but we want to m
47e0: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e ake a.** few min
47f0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 or changes to th
4800: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a e program..**.**
4810: 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 If n>=0 then th
4820: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 e P4 operand is
4830: 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 dynamic, meaning
4840: 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a that a copy of.
4850: 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 ** the string is
4860: 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 made into memor
4870: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 y obtained from
4880: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 sqlite3_malloc()
4890: 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 ..** A value of
48a0: 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 n==0 means copy
48b0: 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 bytes of zP4 up
48c0: 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 to and including
48d0: 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 the.** first nu
48e0: 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 ll byte. If n>0
48f0: 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 then copy n+1 b
4900: 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 0a ytes of zP4..**.
4910: 2a 2a 20 49 66 20 6e 3d 3d 50 34 5f 4b 45 59 49 ** If n==P4_KEYI
4920: 4e 46 4f 20 69 74 20 6d 65 61 6e 73 20 74 68 61 NFO it means tha
4930: 74 20 7a 50 34 20 69 73 20 61 20 70 6f 69 6e 74 t zP4 is a point
4940: 65 72 20 74 6f 20 61 20 4b 65 79 49 6e 66 6f 20 er to a KeyInfo
4950: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 41 20 structure..** A
4960: 63 6f 70 79 20 69 73 20 6d 61 64 65 20 6f 66 20 copy is made of
4970: 74 68 65 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 the KeyInfo stru
4980: 63 74 75 72 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 cture into memor
4990: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a y obtained from.
49a0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f ** sqlite3_mallo
49b0: 63 2c 20 74 6f 20 62 65 20 66 72 65 65 64 20 77 c, to be freed w
49c0: 68 65 6e 20 74 68 65 20 56 64 62 65 20 69 73 20 hen the Vdbe is
49d0: 66 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 6e 3d finalized..** n=
49e0: 3d 50 34 5f 4b 45 59 49 4e 46 4f 5f 48 41 4e 44 =P4_KEYINFO_HAND
49f0: 4f 46 46 20 69 6e 64 69 63 61 74 65 73 20 74 68 OFF indicates th
4a00: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 20 74 6f at zP4 points to
4a10: 20 61 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 a KeyInfo struc
4a20: 74 75 72 65 0a 2a 2a 20 73 74 6f 72 65 64 20 69 ture.** stored i
4a30: 6e 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 74 68 n memory that th
4a40: 65 20 63 61 6c 6c 65 72 20 68 61 73 20 6f 62 74 e caller has obt
4a50: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 ained from sqlit
4a60: 65 33 5f 6d 61 6c 6c 6f 63 2e 20 54 68 65 20 0a e3_malloc. The .
4a70: 2a 2a 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 ** caller should
4a80: 20 6e 6f 74 20 66 72 65 65 20 74 68 65 20 61 6c not free the al
4a90: 6c 6f 63 61 74 69 6f 6e 2c 20 69 74 20 77 69 6c location, it wil
4aa0: 6c 20 62 65 20 66 72 65 65 64 20 77 68 65 6e 20 l be freed when
4ab0: 74 68 65 20 56 64 62 65 20 69 73 0a 2a 2a 20 66 the Vdbe is.** f
4ac0: 69 6e 61 6c 69 7a 65 64 2e 0a 2a 2a 20 0a 2a 2a inalized..** .**
4ad0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 Other values of
4ae0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 n (P4_STATIC, P
4af0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 4_COLLSEQ etc.)
4b00: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 indicate that zP
4b10: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 4 points.** to a
4b20: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 string or struc
4b30: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 ture that is gua
4b40: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 ranteed to exist
4b50: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d for the lifetim
4b60: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 e of.** the Vdbe
4b70: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 . In these cases
4b80: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 we can just cop
4b90: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a y the pointer..*
4ba0: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 *.** If addr<0 t
4bb0: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e hen change P4 on
4bc0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 the most recent
4bd0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 ly inserted inst
4be0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 ruction..*/.void
4bf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
4c00: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e geP4(Vdbe *p, in
4c10: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 t addr, const ch
4c20: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b ar *zP4, int n){
4c30: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 . Op *pOp;. sq
4c40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 lite3 *db;. ass
4c50: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 ert( p!=0 );. d
4c60: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 b = p->db;. ass
4c70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
4c80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 DBE_MAGIC_INIT )
4c90: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d 3d ;. if( p->aOp==
4ca0: 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 0 || db->mallocF
4cb0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 20 ailed ){. if
4cc0: 28 20 6e 21 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 ( n!=P4_KEYINFO
4cd0: 26 26 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 && n!=P4_VTAB )
4ce0: 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 {. freeP4(d
4cf0: 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 b, n, (void*)*(c
4d00: 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 har**)&zP4);.
4d10: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 }. return;.
4d20: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e }. assert( p->
4d30: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 nOp>0 );. asser
4d40: 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 t( addr<p->nOp )
4d50: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 ;. if( addr<0 )
4d60: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e {. addr = p->
4d70: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 nOp - 1;. }. p
4d80: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 Op = &p->aOp[add
4d90: 72 5d 3b 0a 20 20 66 72 65 65 50 34 28 64 62 2c r];. freeP4(db,
4da0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f pOp->p4type, pO
4db0: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d p->p4.p);. pOp-
4dc0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 69 66 28 >p4.p = 0;. if(
4dd0: 20 6e 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a n==P4_INT32 ){.
4de0: 20 20 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 /* Note: thi
4df0: 73 20 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 s cast is safe,
4e00: 62 65 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 because the orig
4e10: 69 6e 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 in data point wa
4e20: 73 20 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 s an int. **
4e30: 74 68 61 74 20 77 61 73 20 63 61 73 74 20 74 6f that was cast to
4e40: 20 61 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a a (const char *
4e50: 29 2e 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 ). */. pOp->p
4e60: 34 2e 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 4.i = SQLITE_PTR
4e70: 5f 54 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 _TO_INT(zP4);.
4e80: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 pOp->p4type =
4e90: 50 34 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 P4_INT32;. }els
4ea0: 65 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a e if( zP4==0 ){.
4eb0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 pOp->p4.p =
4ec0: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 0;. pOp->p4ty
4ed0: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b pe = P4_NOTUSED;
4ee0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d . }else if( n==
4ef0: 50 34 5f 4b 45 59 49 4e 46 4f 20 29 7b 0a 20 20 P4_KEYINFO ){.
4f00: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 KeyInfo *pKeyI
4f10: 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 nfo;. int nFi
4f20: 65 6c 64 2c 20 6e 42 79 74 65 3b 0a 0a 20 20 20 eld, nByte;..
4f30: 20 6e 46 69 65 6c 64 20 3d 20 28 28 4b 65 79 49 nField = ((KeyI
4f40: 6e 66 6f 2a 29 7a 50 34 29 2d 3e 6e 46 69 65 6c nfo*)zP4)->nFiel
4f50: 64 3b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 73 d;. nByte = s
4f60: 69 7a 65 6f 66 28 2a 70 4b 65 79 49 6e 66 6f 29 izeof(*pKeyInfo)
4f70: 20 2b 20 28 6e 46 69 65 6c 64 2d 31 29 2a 73 69 + (nField-1)*si
4f80: 7a 65 6f 66 28 70 4b 65 79 49 6e 66 6f 2d 3e 61 zeof(pKeyInfo->a
4f90: 43 6f 6c 6c 5b 30 5d 29 20 2b 20 6e 46 69 65 6c Coll[0]) + nFiel
4fa0: 64 3b 0a 20 20 20 20 70 4b 65 79 49 6e 66 6f 20 d;. pKeyInfo
4fb0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f = sqlite3DbMallo
4fc0: 63 52 61 77 28 30 2c 20 6e 42 79 74 65 29 3b 0a cRaw(0, nByte);.
4fd0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 pOp->p4.pKey
4fe0: 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b Info = pKeyInfo;
4ff0: 0a 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 . if( pKeyInf
5000: 6f 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 61 o ){. u8 *a
5010: 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 SortOrder;.
5020: 20 6d 65 6d 63 70 79 28 28 63 68 61 72 2a 29 70 memcpy((char*)p
5030: 4b 65 79 49 6e 66 6f 2c 20 7a 50 34 2c 20 6e 42 KeyInfo, zP4, nB
5040: 79 74 65 20 2d 20 6e 46 69 65 6c 64 29 3b 0a 20 yte - nField);.
5050: 20 20 20 20 20 61 53 6f 72 74 4f 72 64 65 72 20 aSortOrder
5060: 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 = pKeyInfo->aSor
5070: 74 4f 72 64 65 72 3b 0a 20 20 20 20 20 20 69 66 tOrder;. if
5080: 28 20 61 53 6f 72 74 4f 72 64 65 72 20 29 7b 0a ( aSortOrder ){.
5090: 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e 66 6f pKeyInfo
50a0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 ->aSortOrder = (
50b0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 26 unsigned char*)&
50c0: 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b pKeyInfo->aColl[
50d0: 6e 46 69 65 6c 64 5d 3b 0a 20 20 20 20 20 20 20 nField];.
50e0: 20 6d 65 6d 63 70 79 28 70 4b 65 79 49 6e 66 6f memcpy(pKeyInfo
50f0: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 2c 20 61 53 ->aSortOrder, aS
5100: 6f 72 74 4f 72 64 65 72 2c 20 6e 46 69 65 6c 64 ortOrder, nField
5110: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 );. }.
5120: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 pOp->p4type = P
5130: 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 20 20 7d 4_KEYINFO;. }
5140: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 64 else{. p->d
5150: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
5160: 3d 20 31 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e = 1;. pOp->
5170: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 p4type = P4_NOTU
5180: 53 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c SED;. }. }el
5190: 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 se if( n==P4_KEY
51a0: 49 4e 46 4f 5f 48 41 4e 44 4f 46 46 20 29 7b 0a INFO_HANDOFF ){.
51b0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 pOp->p4.p =
51c0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 (void*)zP4;.
51d0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 pOp->p4type = P4
51e0: 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20 7d 65 6c 73 _KEYINFO;. }els
51f0: 65 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 e if( n==P4_VTAB
5200: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e ){. pOp->p4.
5210: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a p = (void*)zP4;.
5220: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 pOp->p4type
5230: 3d 20 50 34 5f 56 54 41 42 3b 0a 20 20 20 20 73 = P4_VTAB;. s
5240: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28 qlite3VtabLock((
5250: 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 3b 0a 20 VTable *)zP4);.
5260: 20 20 20 61 73 73 65 72 74 28 20 28 28 56 54 61 assert( ((VTa
5270: 62 6c 65 20 2a 29 7a 50 34 29 2d 3e 64 62 3d 3d ble *)zP4)->db==
5280: 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 65 6c 73 65 p->db );. }else
5290: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 if( n<0 ){.
52a0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 pOp->p4.p = (voi
52b0: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d d*)zP4;. pOp-
52c0: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65 >p4type = (signe
52d0: 64 20 63 68 61 72 29 6e 3b 0a 20 20 7d 65 6c 73 d char)n;. }els
52e0: 65 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 e{. if( n==0
52f0: 29 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 ) n = sqlite3Str
5300: 6c 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 len30(zP4);.
5310: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 pOp->p4.z = sqli
5320: 74 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e te3DbStrNDup(p->
5330: 64 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 db, zP4, n);.
5340: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 pOp->p4type = P
5350: 34 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 4_DYNAMIC;. }.}
5360: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 ..#ifndef NDEBUG
5370: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 ./*.** Change th
5380: 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 e comment on the
5390: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 the most recent
53a0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 ly coded instruc
53b0: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 tion. Or.** ins
53c0: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 ert a No-op and
53d0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 add the comment
53e0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 to that new inst
53f0: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a ruction. This.*
5400: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 * makes the code
5410: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 easier to read
5420: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 during debugging
5430: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 . None of this
5440: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 happens.** in a
5450: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 production build
5460: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
5470: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 3VdbeComment(Vdb
5480: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 e *p, const char
5490: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
54a0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
54b0: 20 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e if( !p ) return
54c0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e ;. assert( p->n
54d0: 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d Op>0 || p->aOp==
54e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
54f0: 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 ->aOp==0 || p->a
5500: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f Op[p->nOp-1].zCo
5510: 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 mment==0 || p->d
5520: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 b->mallocFailed
5530: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 );. if( p->nOp
5540: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a ){. char **pz
5550: 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f = &p->aOp[p->nO
5560: 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 p-1].zComment;.
5570: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 va_start(ap,
5580: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 zFormat);. sq
5590: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 lite3DbFree(p->d
55a0: 62 2c 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a b, *pz);. *pz
55b0: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e = sqlite3VMPrin
55c0: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 tf(p->db, zForma
55d0: 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 t, ap);. va_e
55e0: 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f nd(ap);. }.}.vo
55f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f id sqlite3VdbeNo
5600: 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a opComment(Vdbe *
5610: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a p, const char *z
5620: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 Format, ...){.
5630: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 va_list ap;. if
5640: 28 20 21 70 20 29 20 72 65 74 75 72 6e 3b 0a 20 ( !p ) return;.
5650: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
5660: 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a p0(p, OP_Noop);.
5670: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 assert( p->nOp
5680: 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 >0 || p->aOp==0
5690: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
56a0: 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 aOp==0 || p->aOp
56b0: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d [p->nOp-1].zComm
56c0: 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d ent==0 || p->db-
56d0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b >mallocFailed );
56e0: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b . if( p->nOp ){
56f0: 0a 20 20 20 20 63 68 61 72 20 2a 2a 70 7a 20 3d . char **pz =
5700: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d &p->aOp[p->nOp-
5710: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 20 1].zComment;.
5720: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 va_start(ap, zF
5730: 6f 72 6d 61 74 29 3b 0a 20 20 20 20 73 71 6c 69 ormat);. sqli
5740: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c te3DbFree(p->db,
5750: 20 2a 70 7a 29 3b 0a 20 20 20 20 2a 70 7a 20 3d *pz);. *pz =
5760: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 sqlite3VMPrintf
5770: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c (p->db, zFormat,
5780: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 ap);. va_end
5790: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 (ap);. }.}.#end
57a0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f if /* NDEBUG */
57b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ../*.** Return t
57c0: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 he opcode for a
57d0: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 given address.
57e0: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69 If the address i
57f0: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 s -1, then.** re
5800: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 turn the most re
5810: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 cently inserted
5820: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 opcode..**.** If
5830: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 a memory alloca
5840: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f tion error has o
5850: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f ccurred prior to
5860: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 the calling of
5870: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c this.** routine,
5880: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 then a pointer
5890: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f to a dummy VdbeO
58a0: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e p will be return
58b0: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 ed. That opcode
58c0: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 .** is readable
58d0: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 but not writable
58e0: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 , though it is c
58f0: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c ast to a writabl
5900: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 e value..** The
5910: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d return of a dumm
5920: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 y opcode allows
5930: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 the call to cont
5940: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 inue functioning
5950: 0a 2a 2a 20 61 66 74 65 72 20 61 20 4f 4f 4d 20 .** after a OOM
5960: 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 fault without ha
5970: 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f ving to check to
5980: 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 see if the retu
5990: 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 rn from .** this
59a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 routine is a va
59b0: 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 lid pointer. Bu
59c0: 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 t because the du
59d0: 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c mmy.opcode is 0,
59e0: 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e .** dummy will n
59f0: 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 ever be written
5a00: 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 to. This is ver
5a10: 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e ified by code in
5a20: 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 spection and.**
5a30: 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 by running with
5a40: 56 61 6c 67 72 69 6e 64 2e 0a 2a 2a 0a 2a 2a 20 Valgrind..**.**
5a50: 41 62 6f 75 74 20 74 68 65 20 23 69 66 64 65 66 About the #ifdef
5a60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 SQLITE_OMIT_TRA
5a70: 43 45 3a 20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 CE: Normally, t
5a80: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e his routine is n
5a90: 65 76 65 72 20 63 61 6c 6c 65 64 0a 2a 2a 20 75 ever called.** u
5aa0: 6e 6c 65 73 73 20 70 2d 3e 6e 4f 70 3e 30 2e 20 nless p->nOp>0.
5ab0: 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 This is because
5ac0: 20 69 6e 20 74 68 65 20 61 62 73 65 6e 73 65 20 in the absense
5ad0: 6f 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 of SQLITE_OMIT_T
5ae0: 52 41 43 45 2c 0a 2a 2a 20 61 6e 20 4f 50 5f 54 RACE,.** an OP_T
5af0: 72 61 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e race instruction
5b00: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 73 65 72 is always inser
5b10: 74 65 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 ted by sqlite3Vd
5b20: 62 65 47 65 74 28 29 20 61 73 20 73 6f 6f 6e 20 beGet() as soon
5b30: 61 73 0a 2a 2a 20 61 20 6e 65 77 20 56 44 42 45 as.** a new VDBE
5b40: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 53 6f is created. So
5b50: 20 77 65 20 61 72 65 20 66 72 65 65 20 74 6f 20 we are free to
5b60: 73 65 74 20 61 64 64 72 20 74 6f 20 70 2d 3e 6e set addr to p->n
5b70: 4f 70 2d 31 20 77 69 74 68 6f 75 74 0a 2a 2a 20 Op-1 without.**
5b80: 68 61 76 69 6e 67 20 74 6f 20 64 6f 75 62 6c 65 having to double
5b90: 2d 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 -check to make s
5ba0: 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65 73 ure that the res
5bb0: 75 6c 74 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 ult is non-negat
5bc0: 69 76 65 2e 20 42 75 74 0a 2a 2a 20 69 66 20 53 ive. But.** if S
5bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 QLITE_OMIT_TRACE
5be0: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 74 68 65 is defined, the
5bf0: 20 4f 50 5f 54 72 61 63 65 20 69 73 20 6f 6d 69 OP_Trace is omi
5c00: 74 74 65 64 20 61 6e 64 20 77 65 20 64 6f 20 6e tted and we do n
5c10: 65 65 64 20 74 6f 0a 2a 2a 20 63 68 65 63 6b 20 eed to.** check
5c20: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 70 2d 3e the value of p->
5c30: 6e 4f 70 2d 31 20 62 65 66 6f 72 65 20 63 6f 6e nOp-1 before con
5c40: 74 69 6e 75 69 6e 67 2e 0a 2a 2f 0a 56 64 62 65 tinuing..*/.Vdbe
5c50: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 Op *sqlite3VdbeG
5c60: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e etOp(Vdbe *p, in
5c70: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 t addr){. /* C8
5c80: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 9 specifies that
5c90: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 the constant "d
5ca0: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e ummy" will be in
5cb0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c itialized to all
5cc0: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 . ** zeros, whi
5cd0: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 ch is correct.
5ce0: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 MSVC generates a
5cf0: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 warning, nevert
5d00: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 heless. */. sta
5d10: 74 69 63 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 tic const VdbeOp
5d20: 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f dummy; /* Igno
5d30: 72 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e re the MSVC warn
5d40: 69 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 ing about no ini
5d50: 74 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 tializer */. as
5d60: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
5d70: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
5d80: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 );. if( addr<0
5d90: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 ){.#ifdef SQLITE
5da0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 20 20 20 20 _OMIT_TRACE.
5db0: 69 66 28 20 70 2d 3e 6e 4f 70 3d 3d 30 20 29 20 if( p->nOp==0 )
5dc0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 return (VdbeOp*)
5dd0: 26 64 75 6d 6d 79 3b 0a 23 65 6e 64 69 66 0a 20 &dummy;.#endif.
5de0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 addr = p->nOp
5df0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 - 1;. }. asse
5e00: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 rt( (addr>=0 &&
5e10: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 addr<p->nOp) ||
5e20: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
5e30: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e led );. if( p->
5e40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
5e50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 ){. return (
5e60: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a VdbeOp*)&dummy;.
5e70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 }else{. ret
5e80: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 urn &p->aOp[addr
5e90: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 ];. }.}..#if !d
5ea0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d efined(SQLITE_OM
5eb0: 49 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 IT_EXPLAIN) || !
5ec0: 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 defined(NDEBUG)
5ed0: 5c 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 \. || define
5ee0: 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 d(VDBE_PROFILE)
5ef0: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 || defined(SQLIT
5f00: 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 E_DEBUG)./*.** C
5f10: 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 ompute a string
5f20: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 that describes t
5f30: 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 he P4 parameter
5f40: 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a for an opcode..*
5f50: 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 * Use zTemp for
5f60: 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d any required tem
5f70: 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 porary buffer sp
5f80: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 ace..*/.static c
5f90: 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f har *displayP4(O
5fa0: 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 p *pOp, char *zT
5fb0: 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b emp, int nTemp){
5fc0: 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a . char *zP4 = z
5fd0: 54 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 Temp;. assert(
5fe0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 nTemp>=20 );. s
5ff0: 77 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 witch( pOp->p4ty
6000: 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 pe ){. case P
6010: 34 5f 4b 45 59 49 4e 46 4f 5f 53 54 41 54 49 43 4_KEYINFO_STATIC
6020: 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 :. case P4_KE
6030: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 YINFO: {. i
6040: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b nt i, j;. K
6050: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
6060: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 = pOp->p4.pKeyI
6070: 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 nfo;. sqlit
6080: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
6090: 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 65 79 69 6e p, zTemp, "keyin
60a0: 66 6f 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f fo(%d", pKeyInfo
60b0: 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 ->nField);.
60c0: 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c i = sqlite3Strl
60d0: 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 en30(zTemp);.
60e0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b for(j=0; j<pK
60f0: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 eyInfo->nField;
6100: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f j++){. Co
6110: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 llSeq *pColl = p
6120: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a KeyInfo->aColl[j
6130: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 ];. if( p
6140: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 Coll ){.
6150: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 int n = sqlite
6160: 33 53 74 72 6c 65 6e 33 30 28 70 43 6f 6c 6c 2d 3Strlen30(pColl-
6170: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 >zName);.
6180: 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 if( i+n>nTemp
6190: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 -6 ){.
61a0: 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b memcpy(&zTemp[
61b0: 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 i],",...",4);.
61c0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b break;
61d0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 . }.
61e0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b zTemp[i++
61f0: 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 ] = ',';.
6200: 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d if( pKeyInfo-
6210: 3e 61 53 6f 72 74 4f 72 64 65 72 20 26 26 20 70 >aSortOrder && p
6220: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 KeyInfo->aSortOr
6230: 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 der[j] ){.
6240: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d zTemp[i++]
6250: 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 = '-';.
6260: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 }. me
6270: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 mcpy(&zTemp[i],
6280: 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 2c 6e 2b 31 pColl->zName,n+1
6290: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 20 2b );. i +
62a0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c = n;. }el
62b0: 73 65 20 69 66 28 20 69 2b 34 3c 6e 54 65 6d 70 se if( i+4<nTemp
62c0: 2d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 -6 ){.
62d0: 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d memcpy(&zTemp[i]
62e0: 2c 22 2c 6e 69 6c 22 2c 34 29 3b 0a 20 20 20 20 ,",nil",4);.
62f0: 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 i += 4;.
6300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
6310: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d zTemp[i++]
6320: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 = ')';. zT
6330: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 emp[i] = 0;.
6340: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d assert( i<nTem
6350: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b p );. break
6360: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
6370: 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 P4_COLLSEQ: {.
6380: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 CollSeq *pC
6390: 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 oll = pOp->p4.pC
63a0: 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 oll;. sqlit
63b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
63c0: 70 2c 20 7a 54 65 6d 70 2c 20 22 63 6f 6c 6c 73 p, zTemp, "colls
63d0: 65 71 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c eq(%.20s)", pCol
63e0: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 l->zName);.
63f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
6400: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 case P4_FUNCDE
6410: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 F: {. FuncD
6420: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e ef *pDef = pOp->
6430: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 p4.pFunc;.
6440: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
6450: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 (nTemp, zTemp, "
6460: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a %s(%d)", pDef->z
6470: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 Name, pDef->nArg
6480: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
6490: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 }. case P
64a0: 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 4_INT64: {.
64b0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
64c0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 f(nTemp, zTemp,
64d0: 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 "%lld", *pOp->p4
64e0: 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 .pI64);. br
64f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
6500: 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a ase P4_INT32: {.
6510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
6520: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 printf(nTemp, zT
6530: 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e emp, "%d", pOp->
6540: 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 p4.i);. bre
6550: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
6560: 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 se P4_REAL: {.
6570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 sqlite3_snpr
6580: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d intf(nTemp, zTem
6590: 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 p, "%.16g", *pOp
65a0: 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 ->p4.pReal);.
65b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
65c0: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a case P4_MEM:
65d0: 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d {. Mem *pM
65e0: 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 em = pOp->p4.pMe
65f0: 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 m;. assert(
6600: 20 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 (pMem->flags &
6610: 4d 45 4d 5f 4e 75 6c 6c 29 3d 3d 30 20 29 3b 0a MEM_Null)==0 );.
6620: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e if( pMem->
6630: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 flags & MEM_Str
6640: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d ){. zP4 =
6650: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 pMem->z;.
6660: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e }else if( pMem->
6670: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 flags & MEM_Int
6680: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
6690: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
66a0: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 p, zTemp, "%lld"
66b0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 , pMem->u.i);.
66c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d }else if( pM
66d0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f em->flags & MEM_
66e0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 Real ){.
66f0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
6700: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 (nTemp, zTemp, "
6710: 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 72 29 %.16g", pMem->r)
6720: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
6730: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 assert( p
6740: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Mem->flags & MEM
6750: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 _Blob );.
6760: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b zP4 = "(blob)";
6770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 . }. b
6780: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e reak;. }.#ifn
6790: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
67a0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 VIRTUALTABLE.
67b0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b case P4_VTAB: {
67c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 . sqlite3_v
67d0: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 tab *pVtab = pOp
67e0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 ->p4.pVtab->pVta
67f0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 b;. sqlite3
6800: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c _snprintf(nTemp,
6810: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 zTemp, "vtab:%p
6820: 3a 25 70 22 2c 20 70 56 74 61 62 2c 20 70 56 74 :%p", pVtab, pVt
6830: 61 62 2d 3e 70 4d 6f 64 75 6c 65 29 3b 0a 20 20 ab->pModule);.
6840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
6850: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 .#endif. case
6860: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a P4_INTARRAY: {.
6870: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
6880: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 printf(nTemp, zT
6890: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 emp, "intarray")
68a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
68b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 }. case P4
68c0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 _SUBPROGRAM: {.
68d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
68e0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 rintf(nTemp, zTe
68f0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a mp, "program");.
6900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
6910: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 }. default:
6920: 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f {. zP4 = pO
6930: 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 p->p4.z;. i
6940: 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 f( zP4==0 ){.
6950: 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 zP4 = zTemp
6960: 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b ;. zTemp[
6970: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0] = 0;. }.
6980: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 }. }. asse
6990: 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 rt( zP4!=0 );.
69a0: 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 return zP4;.}.#e
69b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c ndif../*.** Decl
69c0: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 are to the Vdbe
69d0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f that the BTree o
69e0: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 bject at db->aDb
69f0: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a [i] is used..**.
6a00: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 ** The prepared
6a10: 73 74 61 74 65 6d 65 6e 74 20 68 61 73 20 74 6f statement has to
6a20: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 know in advance
6a30: 20 77 68 69 63 68 20 42 74 72 65 65 20 6f 62 6a which Btree obj
6a40: 65 63 74 73 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 ects.** will be
6a50: 75 73 65 64 20 73 6f 20 74 68 61 74 20 69 74 20 used so that it
6a60: 63 61 6e 20 61 63 71 75 69 72 65 20 6d 75 74 65 can acquire mute
6a70: 78 65 73 20 6f 6e 20 74 68 65 6d 20 61 6c 6c 20 xes on them all
6a80: 69 6e 20 73 6f 72 74 65 64 0a 2a 2a 20 6f 72 64 in sorted.** ord
6a90: 65 72 20 28 76 69 61 20 73 71 6c 69 74 65 33 56 er (via sqlite3V
6aa0: 64 62 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 dbeMutexArrayEnt
6ab0: 65 72 28 29 2e 20 20 4d 75 74 65 78 65 73 20 61 er(). Mutexes a
6ac0: 72 65 20 61 63 71 75 69 72 65 64 0a 2a 2a 20 69 re acquired.** i
6ad0: 6e 20 6f 72 64 65 72 20 28 61 6e 64 20 72 65 6c n order (and rel
6ae0: 65 61 73 65 64 20 69 6e 20 72 65 76 65 72 73 65 eased in reverse
6af0: 20 6f 72 64 65 72 29 20 74 6f 20 61 76 6f 69 64 order) to avoid
6b00: 20 64 65 61 64 6c 6f 63 6b 73 2e 0a 2a 2f 0a 76 deadlocks..*/.v
6b10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 oid sqlite3VdbeU
6b20: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 sesBtree(Vdbe *p
6b30: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 79 44 62 4d , int i){. yDbM
6b40: 61 73 6b 20 6d 61 73 6b 3b 0a 20 20 61 73 73 65 ask mask;. asse
6b50: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d rt( i>=0 && i<p-
6b60: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 73 69 >db->nDb && i<si
6b70: 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 zeof(yDbMask)*8
6b80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 );. assert( i<(
6b90: 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 int)sizeof(p->bt
6ba0: 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 reeMask)*8 );.
6bb0: 6d 61 73 6b 20 3d 20 28 28 75 33 32 29 31 29 3c mask = ((u32)1)<
6bc0: 3c 69 3b 0a 20 20 69 66 28 20 28 70 2d 3e 62 74 <i;. if( (p->bt
6bd0: 72 65 65 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d reeMask & mask)=
6be0: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 62 74 72 =0 ){. p->btr
6bf0: 65 65 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a eeMask |= mask;.
6c00: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 sqlite3Btree
6c10: 4d 75 74 65 78 41 72 72 61 79 49 6e 73 65 72 74 MutexArrayInsert
6c20: 28 26 70 2d 3e 61 4d 75 74 65 78 2c 20 70 2d 3e (&p->aMutex, p->
6c30: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b db->aDb[i].pBt);
6c40: 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 20 64 65 66 . }.}...#if def
6c50: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c ined(VDBE_PROFIL
6c60: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 E) || defined(SQ
6c70: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a LITE_DEBUG)./*.*
6c80: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 * Print a single
6c90: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 opcode. This r
6ca0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 outine is used f
6cb0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c or debugging onl
6cc0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 y..*/.void sqlit
6cd0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 e3VdbePrintOp(FI
6ce0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 LE *pOut, int pc
6cf0: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 , Op *pOp){. ch
6d00: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 ar *zP4;. char
6d10: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 73 74 61 74 zPtr[50];. stat
6d20: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a ic const char *z
6d30: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 Format1 = "%4d %
6d40: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 -13s %4d %4d %4d
6d50: 20 25 2d 34 73 20 25 2e 32 58 20 25 73 5c 6e 22 %-4s %.2X %s\n"
6d60: 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 ;. if( pOut==0
6d70: 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b ) pOut = stdout;
6d80: 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 . zP4 = display
6d90: 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 P4(pOp, zPtr, si
6da0: 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 20 20 66 zeof(zPtr));. f
6db0: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f printf(pOut, zFo
6dc0: 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 rmat1, pc, .
6dd0: 20 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e sqlite3OpcodeN
6de0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 ame(pOp->opcode)
6df0: 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e , pOp->p1, pOp->
6e00: 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 p2, pOp->p3, zP4
6e10: 2c 20 70 4f 70 2d 3e 70 35 2c 0a 23 69 66 64 65 , pOp->p5,.#ifde
6e20: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 f SQLITE_DEBUG.
6e30: 20 20 20 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 pOp->zComme
6e40: 6e 74 20 3f 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 nt ? pOp->zComme
6e50: 6e 74 20 3a 20 22 22 0a 23 65 6c 73 65 0a 20 20 nt : "".#else.
6e60: 20 20 20 20 22 22 0a 23 65 6e 64 69 66 0a 20 20 "".#endif.
6e70: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 );. fflush(pOut
6e80: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a );.}.#endif../*.
6e90: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 ** Release an ar
6ea0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 ray of N Mem ele
6eb0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 ments.*/.static
6ec0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 void releaseMemA
6ed0: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 rray(Mem *p, int
6ee0: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 N){. if( p &&
6ef0: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 N ){. Mem *pE
6f00: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 nd;. sqlite3
6f10: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 *db = p->db;.
6f20: 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 u8 malloc_faile
6f30: 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 d = db->mallocFa
6f40: 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 20 64 62 iled;. if( db
6f50: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 ->pnBytesFreed )
6f60: 7b 0a 20 20 20 20 20 20 66 6f 72 28 70 45 6e 64 {. for(pEnd
6f70: 3d 26 70 5b 4e 5d 3b 20 70 3c 70 45 6e 64 3b 20 =&p[N]; p<pEnd;
6f80: 70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 p++){. sq
6f90: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
6fa0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 p->zMalloc);.
6fb0: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 }. retur
6fc0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 n;. }. for
6fd0: 28 70 45 6e 64 3d 26 70 5b 4e 5d 3b 20 70 3c 70 (pEnd=&p[N]; p<p
6fe0: 45 6e 64 3b 20 70 2b 2b 29 7b 0a 20 20 20 20 20 End; p++){.
6ff0: 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 assert( (&p[1])
7000: 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 ==pEnd || p[0].d
7010: 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 0a 20 b==p[1].db );..
7020: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f /* This blo
7030: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 ck is really an
7040: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 inlined version
7050: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 of sqlite3VdbeMe
7060: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20 mRelease().
7070: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61 ** that takes a
7080: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20 dvantage of the
7090: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65 fact that the me
70a0: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 mory cell value
70b0: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 is . ** bei
70c0: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 ng set to NULL a
70d0: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61 fter releasing a
70e0: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 ny dynamic resou
70f0: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 rces.. **.
7100: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 ** The just
7110: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 ification for du
7120: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69 plicating code i
7130: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67 s that according
7140: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 to . ** ca
7150: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61 llgrind, this ca
7160: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74 uses a certain t
7170: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20 est case to hit
7180: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20 the CPU 4.7 .
7190: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 ** percent le
71a0: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 ss (x86 linux, g
71b0: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 cc version 4.1.2
71c0: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a , -O6) than if .
71d0: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 ** sqlite3
71e0: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72 MemRelease() wer
71f0: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 e called from he
7200: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 re. With -O2, th
7210: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a is jumps. *
7220: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 * to 6.6 percent
7230: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20 . The test case
7240: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30 is inserting 100
7250: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 0 rows into a ta
7260: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 ble . ** wi
7270: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 th no indexes us
7280: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65 ing a single pre
7290: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61 pared INSERT sta
72a0: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a tement, bind() .
72b0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 ** and res
72c0: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72 et(). Inserts ar
72d0: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 e grouped into a
72e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 transaction..
72f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 */. if(
7300: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 p->flags&(MEM_A
7310: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 gg|MEM_Dyn|MEM_F
7320: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 rame|MEM_RowSet)
7330: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
7340: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
7350: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 e(p);. }els
7360: 65 20 69 66 28 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 e if( p->zMalloc
7370: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 ){. sqli
7380: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d te3DbFree(db, p-
7390: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 >zMalloc);.
73a0: 20 20 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 20 3d 20 p->zMalloc =
73b0: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 0;. }..
73c0: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d p->flags = MEM
73d0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 _Null;. }.
73e0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
73f0: 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 d = malloc_faile
7400: 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 d;. }.}../*.**
7410: 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 Delete a VdbeFra
7420: 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 me object and it
7430: 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 s contents. Vdbe
7440: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 Frame objects ar
7450: 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 e.** allocated b
7460: 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d y the OP_Program
7470: 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 opcode in sqlit
7480: 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f e3VdbeExec()..*/
7490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
74a0: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 eFrameDelete(Vdb
74b0: 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e eFrame *p){. in
74c0: 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d t i;. Mem *aMem
74d0: 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 = VdbeFrameMem(
74e0: 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 p);. VdbeCursor
74f0: 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 **apCsr = (Vdbe
7500: 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b Cursor **)&aMem[
7510: 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 p->nChildMem];.
7520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e for(i=0; i<p->n
7530: 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a ChildCsr; i++){.
7540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 sqlite3VdbeF
7550: 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 reeCursor(p->v,
7560: 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 apCsr[i]);. }.
7570: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 releaseMemArray
7580: 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 (aMem, p->nChild
7590: 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 Mem);. sqlite3D
75a0: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 bFree(p->v->db,
75b0: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 p);.}..#ifndef S
75c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 QLITE_OMIT_EXPLA
75d0: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 IN./*.** Give a
75e0: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 listing of the p
75f0: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 rogram in the vi
7600: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a rtual machine..*
7610: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 *.** The interfa
7620: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 ce is the same a
7630: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 s sqlite3VdbeExe
7640: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 c(). But instea
7650: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 d of.** running
7660: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 the code, it inv
7670: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 okes the callbac
7680: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 k once for each
7690: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 instruction..**
76a0: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 This feature is
76b0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e used to implemen
76c0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a t "EXPLAIN"..**.
76d0: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 ** When p->expla
76e0: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 in==1, each inst
76f0: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 ruction is liste
7700: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 d. When.** p->e
7710: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 xplain==2, only
7720: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 OP_Explain instr
7730: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 uctions are list
7740: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 ed and these.**
7750: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 are shown in a d
7760: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e ifferent format.
7770: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 p->explain==2
7780: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 is used to imple
7790: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 ment.** EXPLAIN
77a0: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a QUERY PLAN..**.*
77b0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 * When p->explai
77c0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 n==1, first the
77d0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 main program is
77e0: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 listed, then eac
77f0: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 h of.** the trig
7800: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 ger subprograms
7810: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 are listed one b
7820: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 y one..*/.int sq
7830: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 lite3VdbeList(.
7840: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 Vdbe *p
7850: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
7860: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 e VDBE */.){. i
7870: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 nt nRow;
7880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7890: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e /* Stop when
78a0: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 row count reach
78b0: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 es this */. int
78c0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 nSub = 0;
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
78e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 /* Number of s
78f0: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f ub-vdbes seen so
7900: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f far */. SubPro
7910: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 gram **apSub = 0
7920: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f ; /
7930: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 * Array of sub-v
7940: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 dbes */. Mem *p
7950: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 Sub = 0;
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
7970: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f * Memory cell ho
7980: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 ld array of subp
7990: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 rogs */. sqlite
79a0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 3 *db = p->db;
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
79c0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 * The database c
79d0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 onnection */. i
79e0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 nt i;
79f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7a00: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e /* Loop coun
7a10: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 ter */. int rc
7a20: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 = SQLITE_OK;
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
7a40: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a Return code */.
7a50: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d Mem *pMem = p-
7a60: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 >pResultSet = &p
7a70: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 2f 2a 20 46 ->aMem[1]; /* F
7a80: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 irst Mem of resu
7a90: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 lt set */.. ass
7aa0: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 ert( p->explain
7ab0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
7ac0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
7ad0: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 C_RUN );. asser
7ae0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 t( p->rc==SQLITE
7af0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 _OK || p->rc==SQ
7b00: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e LITE_BUSY || p->
7b10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d rc==SQLITE_NOMEM
7b20: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 );.. /* Even t
7b30: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 hough this opcod
7b40: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 e does not use d
7b50: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 ynamic strings f
7b60: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 or. ** the resu
7b70: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d lt, result colum
7b80: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 ns may become dy
7b90: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 namic if the use
7ba0: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c r calls. ** sql
7bb0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 ite3_column_text
7bc0: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 16(), causing a
7bd0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 translation to U
7be0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a TF-16 encoding..
7bf0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 */. releaseMe
7c00: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b mArray(pMem, 8);
7c10: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 .. if( p->rc==S
7c20: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 QLITE_NOMEM ){.
7c30: 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 /* This happe
7c40: 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 ns if a malloc()
7c50: 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 inside a call t
7c60: 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e o sqlite3_column
7c70: 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a _text() or. *
7c80: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e * sqlite3_column
7c90: 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 _text16() failed
7ca0: 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 . */. db->ma
7cb0: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a llocFailed = 1;.
7cc0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
7cd0: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 E_ERROR;. }..
7ce0: 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 /* When the numb
7cf0: 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 er of output row
7d00: 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 s reaches nRow,
7d10: 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 that means the.
7d20: 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 ** listing has
7d30: 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c finished and sql
7d40: 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 ite3_step() shou
7d50: 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ld return SQLITE
7d60: 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 _DONE.. ** nRow
7d70: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 is the sum of t
7d80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 he number of row
7d90: 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 s in the main pr
7da0: 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a ogram, plus. **
7db0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 the sum of the
7dc0: 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 number of rows i
7dd0: 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 n all trigger su
7de0: 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e bprograms encoun
7df0: 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 tered. ** so fa
7e00: 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c r. The nRow val
7e10: 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 ue will increase
7e20: 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 as new trigger
7e30: 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a subprograms are.
7e40: 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 ** encountered
7e50: 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c , but p->pc will
7e60: 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 eventually catc
7e70: 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 h up to nRow..
7e80: 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e */. nRow = p->n
7e90: 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 Op;. if( p->exp
7ea0: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f lain==1 ){. /
7eb0: 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 * The first 8 me
7ec0: 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 mory cells are u
7ed0: 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 sed for the resu
7ee0: 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 lt set. So we w
7ef0: 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 ill. ** comma
7f00: 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 ndeer the 9th ce
7f10: 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f ll to use as sto
7f20: 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 rage for an arra
7f30: 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 y of pointers.
7f40: 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 ** to trigger
7f50: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 subprograms. Th
7f60: 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e e VDBE is guaran
7f70: 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 teed to have at
7f80: 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 least 9. ** c
7f90: 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 ells. */. as
7fa0: 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 sert( p->nMem>9
7fb0: 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 );. pSub = &p
7fc0: 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 ->aMem[9];. i
7fd0: 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d f( pSub->flags&M
7fe0: 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 EM_Blob ){.
7ff0: 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 /* On the first
8000: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 call to sqlite3
8010: 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 _step(), pSub wi
8020: 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 ll hold a NULL.
8030: 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 It is. **
8040: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 initialized to a
8050: 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f BLOB by the P4_
8060: 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 SUBPROGRAM proce
8070: 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f ssing logic belo
8080: 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 w */. nSub
8090: 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 = pSub->n/sizeof
80a0: 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 (Vdbe*);. a
80b0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 pSub = (SubProgr
80c0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 am **)pSub->z;.
80d0: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 }. for(i=0
80e0: 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a ; i<nSub; i++){.
80f0: 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 nRow += ap
8100: 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 Sub[i]->nOp;.
8110: 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 }. }.. do{.
8120: 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 i = p->pc++;.
8130: 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 }while( i<nRow
8140: 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 && p->explain==2
8150: 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 && p->aOp[i].op
8160: 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e code!=OP_Explain
8170: 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f );. if( i>=nRo
8180: 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d w ){. p->rc =
8190: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
81a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 rc = SQLITE_DONE
81b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 ;. }else if( db
81c0: 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 ->u1.isInterrupt
81d0: 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 ed ){. p->rc
81e0: 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 = SQLITE_INTERRU
81f0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c PT;. rc = SQL
8200: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 ITE_ERROR;. s
8210: 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 qlite3SetString(
8220: 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 2c &p->zErrMsg, db,
8230: 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45 72 "%s", sqlite3Er
8240: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 rStr(p->rc));.
8250: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 }else{. char
8260: 2a 7a 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b *z;. Op *pOp;
8270: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f . if( i<p->nO
8280: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 p ){. /* Th
8290: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 e output line nu
82a0: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e mber is small en
82b0: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 ough that we are
82c0: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 still in the.
82d0: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 ** main prog
82e0: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f ram. */. pO
82f0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a p = &p->aOp[i];.
8300: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
8310: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 /* We are curre
8320: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 ntly listing sub
8330: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 programs. Figur
8340: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 e out which one
8350: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 and. ** pic
8360: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 k up the appropr
8370: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a iate opcode. */.
8380: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 int j;.
8390: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a i -= p->nOp;.
83a0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 for(j=0; i
83b0: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b >=apSub[j]->nOp;
83c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 j++){. i
83d0: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f -= apSub[j]->nO
83e0: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 p;. }.
83f0: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d pOp = &apSub[j]
8400: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a ->aOp[i];. }.
8410: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 if( p->expla
8420: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 in==1 ){. p
8430: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
8440: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d _Int;. pMem
8450: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f ->type = SQLITE_
8460: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 70 INTEGER;. p
8470: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 Mem->u.i = i;
8480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
84a0: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 Program counter
84b0: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b */. pMem++;
84c0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e . . pMem->
84d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 flags = MEM_Stat
84e0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 ic|MEM_Str|MEM_T
84f0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d erm;. pMem-
8500: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 >z = (char*)sqli
8510: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f te3OpcodeName(pO
8520: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 20 2f 2a 20 p->opcode); /*
8530: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 Opcode */.
8540: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 assert( pMem->z!
8550: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d =0 );. pMem
8560: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 ->n = sqlite3Str
8570: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a len30(pMem->z);.
8580: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 pMem->type
8590: 20 3d 20 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a = SQLITE_TEXT;.
85a0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 pMem->enc
85b0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 = SQLITE_UTF8;.
85c0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 pMem++;..
85d0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f /* When an O
85e0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 P_Program opcode
85f0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 is encounter (t
8600: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 he only opcode t
8610: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a hat has. **
8620: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d a P4_SUBPROGRAM
8630: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 argument), expa
8640: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 nd the size of t
8650: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 he array of subp
8660: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a rograms. **
8670: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d kept in p->aMem
8680: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 [9].z to hold th
8690: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 e new program -
86a0: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 assuming this su
86b0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a bprogram. *
86c0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 * has not alread
86d0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 y been seen..
86e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 */. if(
86f0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f pOp->p4type==P4_
8700: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 SUBPROGRAM ){.
8710: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 int nByte
8720: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f = (nSub+1)*sizeo
8730: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a f(SubProgram*);.
8740: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 int j;.
8750: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 for(j=0;
8760: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 j<nSub; j++){.
8770: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 if( apSu
8780: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 b[j]==pOp->p4.pP
8790: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a rogram ) break;.
87a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
87b0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 if( j==nSub &&
87c0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 SQLITE_OK==sqli
87d0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 te3VdbeMemGrow(p
87e0: 53 75 62 2c 20 6e 42 79 74 65 2c 20 31 29 20 29 Sub, nByte, 1) )
87f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 {. apSu
8800: 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 b = (SubProgram
8810: 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 **)pSub->z;.
8820: 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 apSub[nSub
8830: 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 ++] = pOp->p4.pP
8840: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 rogram;.
8850: 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d pSub->flags |=
8860: 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 MEM_Blob;.
8870: 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e pSub->n = n
8880: 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 Sub*sizeof(SubPr
8890: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 ogram*);.
88a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
88b0: 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 .. pMem->flag
88c0: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 s = MEM_Int;.
88d0: 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 pMem->u.i = pOp
88e0: 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 ->p1;
88f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
8900: 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d * P1 */. pMem
8910: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f ->type = SQLITE_
8920: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 70 4d 65 INTEGER;. pMe
8930: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e m++;.. pMem->
8940: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b flags = MEM_Int;
8950: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d . pMem->u.i =
8960: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 pOp->p2;
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8980: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 /* P2 */.
8990: 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c pMem->type = SQL
89a0: 49 54 45 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 ITE_INTEGER;.
89b0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d pMem++;.. pM
89c0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
89d0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 Int;. pMem->u
89e0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 .i = pOp->p3;
89f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8a00: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a /* P3 */.
8a10: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d pMem->type =
8a20: 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3b SQLITE_INTEGER;
8a30: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 . pMem++;..
8a40: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 if( sqlite3Vdb
8a50: 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 33 eMemGrow(pMem, 3
8a60: 32 2c 20 30 29 20 29 7b 20 20 20 20 20 20 20 20 2, 0) ){
8a70: 20 20 20 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 /* P4 */.
8a80: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 assert( p->db
8a90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
8aa0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 ;. return S
8ab0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 QLITE_ERROR;.
8ac0: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 }. pMem->fla
8ad0: 67 73 20 3d 20 4d 45 4d 5f 44 79 6e 7c 4d 45 4d gs = MEM_Dyn|MEM
8ae0: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 _Str|MEM_Term;.
8af0: 20 20 20 7a 20 3d 20 64 69 73 70 6c 61 79 50 34 z = displayP4
8b00: 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 33 (pOp, pMem->z, 3
8b10: 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 21 3d 70 2);. if( z!=p
8b20: 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 Mem->z ){.
8b30: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 sqlite3VdbeMemSe
8b40: 74 53 74 72 28 70 4d 65 6d 2c 20 7a 2c 20 2d 31 tStr(pMem, z, -1
8b50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 , SQLITE_UTF8, 0
8b60: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 );. }else{.
8b70: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d assert( pMem
8b80: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 ->z!=0 );.
8b90: 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 pMem->n = sqlite
8ba0: 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 3Strlen30(pMem->
8bb0: 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e z);. pMem->
8bc0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 enc = SQLITE_UTF
8bd0: 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 8;. }. pMe
8be0: 6d 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 m->type = SQLITE
8bf0: 5f 54 45 58 54 3b 0a 20 20 20 20 70 4d 65 6d 2b _TEXT;. pMem+
8c00: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 +;.. if( p->e
8c10: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 xplain==1 ){.
8c20: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 if( sqlite3Vd
8c30: 62 65 4d 65 6d 47 72 6f 77 28 70 4d 65 6d 2c 20 beMemGrow(pMem,
8c40: 34 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 4, 0) ){.
8c50: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e assert( p->db->
8c60: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a mallocFailed );.
8c70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
8c80: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 QLITE_ERROR;.
8c90: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d }. pMem-
8ca0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 44 79 6e >flags = MEM_Dyn
8cb0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 |MEM_Str|MEM_Ter
8cc0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e m;. pMem->n
8cd0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 = 2;. sqli
8ce0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 te3_snprintf(3,
8cf0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c pMem->z, "%.2x",
8d00: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 pOp->p5); /*
8d10: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d P5 */. pMem
8d20: 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f ->type = SQLITE_
8d30: 54 45 58 54 3b 0a 20 20 20 20 20 20 70 4d 65 6d TEXT;. pMem
8d40: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 ->enc = SQLITE_U
8d50: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b TF8;. pMem+
8d60: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c +;. .#ifdef SQL
8d70: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 20 20 ITE_DEBUG.
8d80: 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e if( pOp->zCommen
8d90: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 t ){. pMe
8da0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 m->flags = MEM_S
8db0: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 tr|MEM_Term;.
8dc0: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 70 pMem->z = p
8dd0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 3b 0a 20 20 Op->zComment;.
8de0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 pMem->n =
8df0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
8e00: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 pMem->z);.
8e10: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 pMem->enc = SQ
8e20: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 LITE_UTF8;.
8e30: 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d 20 pMem->type =
8e40: 53 51 4c 49 54 45 5f 54 45 58 54 3b 0a 20 20 20 SQLITE_TEXT;.
8e50: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a }else.#endif.
8e60: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 {.
8e70: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
8e80: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 M_Null;
8e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
8ea0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 Comment */.
8eb0: 20 20 20 20 70 4d 65 6d 2d 3e 74 79 70 65 20 3d pMem->type =
8ec0: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3b 0a 20 20 SQLITE_NULL;.
8ed0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
8ee0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d p->nResColumn =
8ef0: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 8 - 4*(p->expla
8f00: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 72 63 in-1);. p->rc
8f10: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
8f20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f rc = SQLITE_RO
8f30: 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 W;. }. return
8f40: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 rc;.}.#endif /*
8f50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c SQLITE_OMIT_EXPL
8f60: 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 AIN */..#ifdef S
8f70: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a QLITE_DEBUG./*.*
8f80: 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 * Print the SQL
8f90: 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f that was used to
8fa0: 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 generate a VDBE
8fb0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 program..*/.voi
8fc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 d sqlite3VdbePri
8fd0: 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a ntSql(Vdbe *p){.
8fe0: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e int nOp = p->n
8ff0: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f Op;. VdbeOp *pO
9000: 70 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 p;. if( nOp<1 )
9010: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d return;. pOp =
9020: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 &p->aOp[0];. i
9030: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d f( pOp->opcode==
9040: 4f 50 5f 54 72 61 63 65 20 26 26 20 70 4f 70 2d OP_Trace && pOp-
9050: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 >p4.z!=0 ){.
9060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 const char *z =
9070: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 77 pOp->p4.z;. w
9080: 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 hile( sqlite3Iss
9090: 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a pace(*z) ) z++;.
90a0: 20 20 20 20 70 72 69 6e 74 66 28 22 53 51 4c 3a printf("SQL:
90b0: 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 20 20 [%s]\n", z);.
90c0: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 }.}.#endif..#if
90d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f !defined(SQLITE_
90e0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 OMIT_TRACE) && d
90f0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e efined(SQLITE_EN
9100: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a ABLE_IOTRACE)./*
9110: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 .** Print an IOT
9120: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f RACE message sho
9130: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 wing SQL content
9140: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
9150: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 3VdbeIOTraceSql(
9160: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 Vdbe *p){. int
9170: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 nOp = p->nOp;.
9180: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 VdbeOp *pOp;. i
9190: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 f( sqlite3IoTrac
91a0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 e==0 ) return;.
91b0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 if( nOp<1 ) ret
91c0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d urn;. pOp = &p-
91d0: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 >aOp[0];. if( p
91e0: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 54 Op->opcode==OP_T
91f0: 72 61 63 65 20 26 26 20 70 4f 70 2d 3e 70 34 2e race && pOp->p4.
9200: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 z!=0 ){. int
9210: 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a i, j;. char z
9220: 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 [1000];. sqli
9230: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a te3_snprintf(siz
9240: 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c eof(z), z, "%s",
9250: 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 pOp->p4.z);.
9260: 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 for(i=0; sqlite
9270: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 3Isspace(z[i]);
9280: 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a i++){}. for(j
9290: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a =0; z[i]; i++){.
92a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 if( sqlite
92b0: 33 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 3Isspace(z[i]) )
92c0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b {. if( z[
92d0: 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 i-1]!=' ' ){.
92e0: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 z[j++] =
92f0: 27 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 ' ';. }.
9300: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
9310: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 z[j++] = z[i
9320: 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d ];. }. }
9330: 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 . z[j] = 0;.
9340: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 sqlite3IoTrac
9350: 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 e("SQL %s\n", z)
9360: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f ;. }.}.#endif /
9370: 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 * !SQLITE_OMIT_T
9380: 52 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 RACE && SQLITE_E
9390: 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f NABLE_IOTRACE */
93a0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 ../*.** Allocate
93b0: 20 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 space from a fi
93c0: 78 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 xed size buffer
93d0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 and return a poi
93e0: 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 nter to.** that
93f0: 73 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 space. If insuf
9400: 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 ficient space is
9410: 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 available, retu
9420: 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 rn NULL..**.** T
9430: 68 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 he pBuf paramete
9440: 72 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c r is the initial
9450: 20 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e value of a poin
9460: 74 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a ter which will.*
9470: 2a 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 * receive the ne
9480: 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 w memory. pBuf
9490: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c is normally NULL
94a0: 2e 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f . If pBuf is no
94b0: 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 t.** NULL, it me
94c0: 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 ans that memory
94d0: 73 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 space has alread
94e0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 y been allocated
94f0: 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 and that.** thi
9500: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 s routine should
9510: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e not allocate an
9520: 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 y new memory. W
9530: 68 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a hen pBuf is not.
9540: 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 ** NULL simply r
9550: 65 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c eturn pBuf. Onl
9560: 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d y allocate new m
9570: 65 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e emory space when
9580: 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c pBuf.** is NULL
9590: 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 ..**.** nByte is
95a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 the number of b
95b0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 ytes of space ne
95c0: 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 eded..**.** *ppF
95d0: 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 rom points to av
95e0: 61 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e ailable space an
95f0: 64 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f d pEnd points to
9600: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a the end of the.
9610: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 ** available spa
9620: 63 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 ce. When space
9630: 69 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 is allocated, *p
9640: 70 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 pFrom is advance
9650: 64 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e d past.** the en
9660: 64 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 d of the allocat
9670: 65 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 ed space..**.**
9680: 2a 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 *pnByte is a cou
9690: 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 nter of the numb
96a0: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 er of bytes of s
96b0: 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 pace that have f
96c0: 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f ailed.** to allo
96d0: 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 cate. If there
96e0: 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 is insufficient
96f0: 73 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d space in *ppFrom
9700: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a to satisfy the.
9710: 2a 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e ** request, then
9720: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 increment *pnBy
9730: 74 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 te by the amount
9740: 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e of the request.
9750: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
9760: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 *allocSpace(. v
9770: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 oid *pBuf,
9780: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 /* Where ret
9790: 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c urn pointer will
97a0: 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 be stored */.
97b0: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 int nByte,
97c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
97d0: 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 f bytes to alloc
97e0: 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 ate */. u8 **pp
97f0: 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a From, /*
9800: 20 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 IN/OUT: Allocat
9810: 65 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a e from *ppFrom *
9820: 2f 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 /. u8 *pEnd,
9830: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e /* Poin
9840: 74 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 ter to 1 byte pa
9850: 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 st the end of *p
9860: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a pFrom buffer */.
9870: 20 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 int *pnByte
9880: 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c /* If all
9890: 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 ocation cannot b
98a0: 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e e made, incremen
98b0: 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a t *pnByte */.){.
98c0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f assert( EIGHT_
98d0: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a BYTE_ALIGNMENT(*
98e0: 70 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 ppFrom) );. if(
98f0: 20 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 pBuf ) return p
9900: 42 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 Buf;. nByte = R
9910: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 OUND8(nByte);.
9920: 69 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e if( &(*ppFrom)[n
9930: 42 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b Byte] <= pEnd ){
9940: 0a 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 . pBuf = (voi
9950: 64 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 d*)*ppFrom;.
9960: 2a 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 *ppFrom += nByte
9970: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a ;. }else{. *
9980: 70 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b pnByte += nByte;
9990: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 . }. return pB
99a0: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 uf;.}../*.** Pre
99b0: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d pare a virtual m
99c0: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 achine for execu
99d0: 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 6e 76 6f tion. This invo
99e0: 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 lves things such
99f0: 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e .** as allocatin
9a00: 67 20 73 74 61 63 6b 20 73 70 61 63 65 20 61 6e g stack space an
9a10: 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 d initializing t
9a20: 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 he program count
9a30: 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 er..** After the
9a40: 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 VDBE has be pre
9a50: 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 pped, it can be
9a60: 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 executed by one
9a70: 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 or more.** calls
9a80: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 to sqlite3VdbeE
9a90: 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 xec(). .**.** T
9aa0: 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 his is the only
9ab0: 77 61 79 20 74 6f 20 6d 6f 76 65 20 61 20 56 44 way to move a VD
9ac0: 42 45 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 BE from VDBE_MAG
9ad0: 49 43 5f 49 4e 49 54 20 74 6f 0a 2a 2a 20 56 44 IC_INIT to.** VD
9ae0: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 2e 0a 2a 2a BE_MAGIC_RUN..**
9af0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
9b00: 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 n may be called
9b10: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 20 6f more than once o
9b20: 6e 20 61 20 73 69 6e 67 6c 65 20 76 69 72 74 75 n a single virtu
9b30: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 54 al machine..** T
9b40: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 69 73 he first call is
9b50: 20 6d 61 64 65 20 77 68 69 6c 65 20 63 6f 6d 70 made while comp
9b60: 69 6c 69 6e 67 20 74 68 65 20 53 51 4c 20 73 74 iling the SQL st
9b70: 61 74 65 6d 65 6e 74 2e 20 53 75 62 73 65 71 75 atement. Subsequ
9b80: 65 6e 74 0a 2a 2a 20 63 61 6c 6c 73 20 61 72 65 ent.** calls are
9b90: 20 6d 61 64 65 20 61 73 20 70 61 72 74 20 6f 66 made as part of
9ba0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 6f 66 20 the process of
9bb0: 72 65 73 65 74 74 69 6e 67 20 61 20 73 74 61 74 resetting a stat
9bc0: 65 6d 65 6e 74 20 74 6f 20 62 65 0a 2a 2a 20 72 ement to be.** r
9bd0: 65 2d 65 78 65 63 75 74 65 64 20 28 66 72 6f 6d e-executed (from
9be0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 a call to sqlit
9bf0: 65 33 5f 72 65 73 65 74 28 29 29 2e 20 54 68 65 e3_reset()). The
9c00: 20 6e 56 61 72 2c 20 6e 4d 65 6d 2c 20 6e 43 75 nVar, nMem, nCu
9c10: 72 73 6f 72 20 0a 2a 2a 20 61 6e 64 20 69 73 45 rsor .** and isE
9c20: 78 70 6c 61 69 6e 20 70 61 72 61 6d 65 74 65 72 xplain parameter
9c30: 73 20 61 72 65 20 6f 6e 6c 79 20 70 61 73 73 65 s are only passe
9c40: 64 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 73 d correct values
9c50: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a the first time.
9c60: 2a 2a 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 ** the function
9c70: 69 73 20 63 61 6c 6c 65 64 2e 20 4f 6e 20 73 75 is called. On su
9c80: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 2c 20 bsequent calls,
9c90: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 72 65 73 from sqlite3_res
9ca0: 65 74 28 29 2c 20 6e 56 61 72 0a 2a 2a 20 69 73 et(), nVar.** is
9cb0: 20 70 61 73 73 65 64 20 2d 31 20 61 6e 64 20 6e passed -1 and n
9cc0: 4d 65 6d 2c 20 6e 43 75 72 73 6f 72 20 61 6e 64 Mem, nCursor and
9cd0: 20 69 73 45 78 70 6c 61 69 6e 20 61 72 65 20 61 isExplain are a
9ce0: 6c 6c 20 70 61 73 73 65 64 20 7a 65 72 6f 2e 0a ll passed zero..
9cf0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
9d00: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 dbeMakeReady(.
9d10: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 Vdbe *p,
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
9d30: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 * The VDBE */.
9d40: 69 6e 74 20 6e 56 61 72 2c 20 20 20 20 20 20 20 int nVar,
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
9d60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 27 3f 27 20 * Number of '?'
9d70: 73 65 65 20 69 6e 20 74 68 65 20 53 51 4c 20 73 see in the SQL s
9d80: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e tatement */. in
9d90: 74 20 6e 4d 65 6d 2c 20 20 20 20 20 20 20 20 20 t nMem,
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
9db0: 4e 75 6d 62 65 72 20 6f 66 20 6d 65 6d 6f 72 79 Number of memory
9dc0: 20 63 65 6c 6c 73 20 74 6f 20 61 6c 6c 6f 63 61 cells to alloca
9dd0: 74 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 te */. int nCur
9de0: 73 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 sor,
9df0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
9e00: 20 6f 66 20 63 75 72 73 6f 72 73 20 74 6f 20 61 of cursors to a
9e10: 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 69 6e 74 llocate */. int
9e20: 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 nArg,
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d /* M
9e40: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 aximum number of
9e50: 20 61 72 67 73 20 69 6e 20 53 75 62 50 72 6f 67 args in SubProg
9e60: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 69 73 rams */. int is
9e70: 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 Explain,
9e80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 /* True
9e90: 20 69 66 20 74 68 65 20 45 58 50 4c 41 49 4e 20 if the EXPLAIN
9ea0: 6b 65 79 77 6f 72 64 73 20 69 73 20 70 72 65 73 keywords is pres
9eb0: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 ent */. int use
9ec0: 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 20 20 20 sStmtJournal
9ed0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 /* True
9ee0: 74 6f 20 73 65 74 20 56 64 62 65 2e 75 73 65 73 to set Vdbe.uses
9ef0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 29 StmtJournal */.)
9f00: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c {. int n;. sql
9f10: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 ite3 *db = p->db
9f20: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d ;.. assert( p!=
9f30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
9f40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
9f50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f GIC_INIT );.. /
9f60: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 * There should b
9f70: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f e at least one o
9f80: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 pcode.. */. as
9f90: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 sert( p->nOp>0 )
9fa0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 ;.. /* Set the
9fb0: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 magic to VDBE_MA
9fc0: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 GIC_RUN sooner r
9fd0: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 ather than later
9fe0: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 . */. p->magic
9ff0: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e = VDBE_MAGIC_RUN
a000: 3b 0a 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 ;.. /* For each
a010: 20 63 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 cursor required
a020: 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 , also allocate
a030: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d a memory cell. M
a040: 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 emory. ** cells
a050: 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 (nMem+1-nCursor
a060: 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 )..nMem, inclusi
a070: 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 ve, will never b
a080: 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 e used by. ** t
a090: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e he vdbe program.
a0a0: 20 49 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 Instead they ar
a0b0: 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 e used to alloca
a0c0: 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a te space for. *
a0d0: 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 * VdbeCursor/BtC
a0e0: 75 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 ursor structures
a0f0: 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 . The blob of me
a100: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 mory associated
a110: 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f with . ** curso
a120: 72 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e r 0 is stored in
a130: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 memory cell nMe
a140: 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 m. Memory cell (
a150: 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f nMem-1). ** sto
a160: 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 res the blob of
a170: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 memory associate
a180: 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c d with cursor 1,
a190: 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 etc.. **. **
a1a0: 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 See also: alloca
a1b0: 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f teCursor().. */
a1c0: 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 . nMem += nCurs
a1d0: 6f 72 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 or;.. /* Alloca
a1e0: 74 65 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d te space for mem
a1f0: 6f 72 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 ory registers, S
a200: 51 4c 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 QL variables, VD
a210: 42 45 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a BE cursors and .
a220: 20 20 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f ** an array to
a230: 20 6d 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e marshal SQL fun
a240: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 ction arguments
a250: 69 6e 2e 20 54 68 69 73 20 69 73 20 6f 6e 6c 79 in. This is only
a260: 20 64 6f 6e 65 20 74 68 65 0a 20 20 2a 2a 20 66 done the. ** f
a270: 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 66 irst time this f
a280: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 unction is calle
a290: 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 56 44 d for a given VD
a2a0: 42 45 2c 20 6e 6f 74 20 77 68 65 6e 20 69 74 20 BE, not when it
a2b0: 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 63 61 is. ** being ca
a2c0: 6c 6c 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 lled from sqlite
a2d0: 33 5f 72 65 73 65 74 28 29 20 74 6f 20 72 65 73 3_reset() to res
a2e0: 65 74 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d et the virtual m
a2f0: 61 63 68 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 achine.. */. i
a300: 66 28 20 6e 56 61 72 3e 3d 30 20 26 26 20 41 4c f( nVar>=0 && AL
a310: 57 41 59 53 28 64 62 2d 3e 6d 61 6c 6c 6f 63 46 WAYS(db->mallocF
a320: 61 69 6c 65 64 3d 3d 30 29 20 29 7b 0a 20 20 20 ailed==0) ){.
a330: 20 75 38 20 2a 7a 43 73 72 20 3d 20 28 75 38 20 u8 *zCsr = (u8
a340: 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 *)&p->aOp[p->nOp
a350: 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f ]; /* Memo
a360: 72 79 20 61 76 61 6c 69 61 62 6c 65 20 66 6f 72 ry avaliable for
a370: 20 61 6c 6c 6f 61 74 69 6f 6e 20 2a 2f 0a 20 20 alloation */.
a380: 20 20 75 38 20 2a 7a 45 6e 64 20 3d 20 28 75 38 u8 *zEnd = (u8
a390: 20 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f *)&p->aOp[p->nO
a3a0: 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20 46 69 72 pAlloc]; /* Fir
a3b0: 73 74 20 62 79 74 65 20 70 61 73 74 20 61 76 61 st byte past ava
a3c0: 69 6c 61 62 6c 65 20 6d 65 6d 20 2a 2f 0a 20 20 ilable mem */.
a3d0: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 int nByte;
a3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
a3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 /* How
a400: 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f much extra memo
a410: 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20 ry needed */..
a420: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 resolveP2Value
a430: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 20 s(p, &nArg);.
a440: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 p->usesStmtJour
a450: 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 73 53 74 nal = (u8)usesSt
a460: 6d 74 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 69 mtJournal;. i
a470: 66 28 20 69 73 45 78 70 6c 61 69 6e 20 26 26 20 f( isExplain &&
a480: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 20 nMem<10 ){.
a490: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 20 20 nMem = 10;.
a4a0: 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 7a 43 73 }. memset(zCs
a4b0: 72 2c 20 30 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 r, 0, zEnd-zCsr)
a4c0: 3b 0a 20 20 20 20 7a 43 73 72 20 2b 3d 20 28 7a ;. zCsr += (z
a4d0: 43 73 72 20 2d 20 28 75 38 2a 29 30 29 26 37 3b Csr - (u8*)0)&7;
a4e0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49 47 . assert( EIG
a4f0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e HT_BYTE_ALIGNMEN
a500: 54 28 7a 43 73 72 29 20 29 3b 0a 0a 20 20 20 20 T(zCsr) );..
a510: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 /* Memory for re
a520: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 gisters, paramet
a530: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 ers, cursor, etc
a540: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 , is allocated i
a550: 6e 20 74 77 6f 0a 20 20 20 20 2a 2a 20 70 61 73 n two. ** pas
a560: 73 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 ses. On the fir
a570: 73 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 st pass, we try
a580: 74 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 to reuse unused
a590: 73 70 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 space at the .
a5a0: 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 ** end of the
a5b0: 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 opcode array. I
a5c0: 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 f we are unable
a5d0: 74 6f 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d to satisfy all m
a5e0: 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 72 65 71 emory. ** req
a5f0: 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65 75 uirements by reu
a600: 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65 20 sing the opcode
a610: 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65 6e array tail, then
a620: 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 the second.
a630: 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c ** pass will fil
a640: 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 75 73 l in the rest us
a650: 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c 6c 6f ing a fresh allo
a660: 63 61 74 69 6f 6e 2e 20 20 0a 20 20 20 20 2a 2a cation. . **
a670: 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 77 6f . ** This two
a680: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 -pass approach t
a690: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 hat reuses as mu
a6a0: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 ch memory as pos
a6b0: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 20 20 2a sible from. *
a6c0: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 * the leftover s
a6d0: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 pace at the end
a6e0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 of the opcode ar
a6f0: 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 ray can signific
a700: 61 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 72 65 64 antly. ** red
a710: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f uce the amount o
a720: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 f memory held by
a730: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 a prepared stat
a740: 65 6d 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 ement.. */.
a750: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 6e 42 79 do {. nBy
a760: 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d te = 0;. p-
a770: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 >aMem = allocSpa
a780: 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d ce(p->aMem, nMem
a790: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a *sizeof(Mem), &z
a7a0: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 Csr, zEnd, &nByt
a7b0: 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 e);. p->aVa
a7c0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 r = allocSpace(p
a7d0: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a ->aVar, nVar*siz
a7e0: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c eof(Mem), &zCsr,
a7f0: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a zEnd, &nByte);.
a800: 20 20 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d p->apArg =
a810: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 allocSpace(p->a
a820: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f pArg, nArg*sizeo
a830: 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 f(Mem*), &zCsr,
a840: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 zEnd, &nByte);.
a850: 20 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 p->azVar =
a860: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a allocSpace(p->az
a870: 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 Var, nVar*sizeof
a880: 28 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 (char*), &zCsr,
a890: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 zEnd, &nByte);.
a8a0: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 p->apCsr =
a8b0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 allocSpace(p->ap
a8c0: 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a Csr, nCursor*siz
a8d0: 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 eof(VdbeCursor*)
a8e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a &z
a900: 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 Csr, zEnd, &nByt
a910: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 42 e);. if( nB
a920: 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 yte ){. p
a930: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 ->pFree = sqlite
a940: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 3DbMallocZero(db
a950: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 , nByte);.
a960: 7d 0a 20 20 20 20 20 20 7a 43 73 72 20 3d 20 70 }. zCsr = p
a970: 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 20 20 7a ->pFree;. z
a980: 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e 42 79 74 End = &zCsr[nByt
a990: 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 e];. }while(
a9a0: 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d 61 nByte && !db->ma
a9b0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 llocFailed );..
a9c0: 20 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 p->nCursor =
a9d0: 28 75 31 36 29 6e 43 75 72 73 6f 72 3b 0a 20 20 (u16)nCursor;.
a9e0: 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b if( p->aVar ){
a9f0: 0a 20 20 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d . p->nVar =
aa00: 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 (ynVar)nVar;.
aa10: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e for(n=0; n<n
aa20: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 Var; n++){.
aa30: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c p->aVar[n].fl
aa40: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a ags = MEM_Null;.
aa50: 20 20 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b p->aVar[
aa60: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 n].db = db;.
aa70: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 }. }. if
aa80: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 ( p->aMem ){.
aa90: 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 p->aMem--;
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
aab0: 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 /* aMem[] goe
aac0: 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a s from 1..nMem *
aad0: 2f 0a 20 20 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 /. p->nMem
aae0: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 = nMem;
aaf0: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 /*
ab00: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 not from 0..nMe
ab10: 6d 2d 31 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 m-1 */. for
ab20: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e (n=1; n<=nMem; n
ab30: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e ++){. p->
ab40: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 aMem[n].flags =
ab50: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 MEM_Null;.
ab60: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 p->aMem[n].db
ab70: 3d 20 64 62 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = db;. }.
ab80: 20 20 7d 0a 20 20 7d 0a 23 69 66 64 65 66 20 53 }. }.#ifdef S
ab90: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f QLITE_DEBUG. fo
aba0: 72 28 6e 3d 31 3b 20 6e 3c 70 2d 3e 6e 4d 65 6d r(n=1; n<p->nMem
abb0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 ; n++){. asse
abc0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 rt( p->aMem[n].d
abd0: 62 3d 3d 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e b==db );. }.#en
abe0: 64 69 66 0a 0a 20 20 70 2d 3e 70 63 20 3d 20 2d dif.. p->pc = -
abf0: 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 1;. p->rc = SQL
ac00: 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 ITE_OK;. p->err
ac10: 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 orAction = OE_Ab
ac20: 6f 72 74 3b 0a 20 20 70 2d 3e 65 78 70 6c 61 69 ort;. p->explai
ac30: 6e 20 7c 3d 20 69 73 45 78 70 6c 61 69 6e 3b 0a n |= isExplain;.
ac40: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 p->magic = VDB
ac50: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 E_MAGIC_RUN;. p
ac60: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 ->nChange = 0;.
ac70: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 p->cacheCtr = 1
ac80: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 ;. p->minWriteF
ac90: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b ileFormat = 255;
aca0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 . p->iStatement
acb0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f = 0;. p->nFkCo
acc0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 nstraint = 0;.#i
acd0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c fdef VDBE_PROFIL
ace0: 45 0a 20 20 7b 0a 20 20 20 20 69 6e 74 20 69 3b E. {. int i;
acf0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
ad00: 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 p->nOp; i++){.
ad10: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e p->aOp[i].cn
ad20: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e t = 0;. p->
ad30: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 aOp[i].cycles =
ad40: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 0;. }. }.#en
ad50: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f dif.}../*.** Clo
ad60: 73 65 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 se a VDBE cursor
ad70: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c and release all
ad80: 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 the resources t
ad90: 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 hat cursor .** h
ada0: 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a appens to hold..
adb0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
adc0: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 dbeFreeCursor(Vd
add0: 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f be *p, VdbeCurso
ade0: 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 r *pCx){. if( p
adf0: 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 Cx==0 ){. ret
ae00: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 urn;. }. if( p
ae10: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 73 Cx->pBt ){. s
ae20: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 qlite3BtreeClose
ae30: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 (pCx->pBt);.
ae40: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 /* The pCx->pCur
ae50: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 sor will be clos
ae60: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c e automatically,
ae70: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 if it exists, b
ae80: 79 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c y. ** the cal
ae90: 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 7d 65 l above. */. }e
aea0: 6c 73 65 20 69 66 28 20 70 43 78 2d 3e 70 43 75 lse if( pCx->pCu
aeb0: 72 73 6f 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 rsor ){. sqli
aec0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 te3BtreeCloseCur
aed0: 73 6f 72 28 70 43 78 2d 3e 70 43 75 72 73 6f 72 sor(pCx->pCursor
aee0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 );. }.#ifndef S
aef0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 QLITE_OMIT_VIRTU
af00: 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 43 ALTABLE. if( pC
af10: 78 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 x->pVtabCursor )
af20: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 {. sqlite3_vt
af30: 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 ab_cursor *pVtab
af40: 43 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 Cursor = pCx->pV
af50: 74 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 tabCursor;. c
af60: 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 onst sqlite3_mod
af70: 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 ule *pModule = p
af80: 43 78 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 Cx->pModule;.
af90: 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74 68 6f 64 p->inVtabMethod
afa0: 20 3d 20 31 3b 0a 20 20 20 20 70 4d 6f 64 75 6c = 1;. pModul
afb0: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 e->xClose(pVtabC
afc0: 75 72 73 6f 72 29 3b 0a 20 20 20 20 70 2d 3e 69 ursor);. p->i
afd0: 6e 56 74 61 62 4d 65 74 68 6f 64 20 3d 20 30 3b nVtabMethod = 0;
afe0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f . }.#endif.}../
aff0: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 *.** Copy the va
b000: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 lues stored in t
b010: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 he VdbeFrame str
b020: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 ucture to its Vd
b030: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 be. This.** is u
b040: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 sed, for example
b050: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 , when a trigger
b060: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 sub-program is
b070: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 halted to restor
b080: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 e.** control to
b090: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d the main program
b0a0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
b0b0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 VdbeFrameRestore
b0c0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 (VdbeFrame *pFra
b0d0: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d me){. Vdbe *v =
b0e0: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 76 2d pFrame->v;. v-
b0f0: 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 >aOp = pFrame->a
b100: 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 Op;. v->nOp = p
b110: 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d Frame->nOp;. v-
b120: 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e >aMem = pFrame->
b130: 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 aMem;. v->nMem
b140: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a = pFrame->nMem;.
b150: 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 v->apCsr = pFr
b160: 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d ame->apCsr;. v-
b170: 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d >nCursor = pFram
b180: 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d e->nCursor;. v-
b190: 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d >db->lastRowid =
b1a0: 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 pFrame->lastRow
b1b0: 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 id;. v->nChange
b1c0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e = pFrame->nChan
b1d0: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 ge;. return pFr
b1e0: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a ame->pc;.}../*.*
b1f0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 * Close all curs
b200: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 ors..**.** Also
b210: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 release any dyna
b220: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 mic memory held
b230: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 by the VM in the
b240: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 Vdbe.aMem memor
b250: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 y .** cell array
b260: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 . This is necess
b270: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 ary as the memor
b280: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 y cell array may
b290: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e contain.** poin
b2a0: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d ters to VdbeFram
b2b0: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 e objects, which
b2c0: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e may in turn con
b2d0: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f tain pointers to
b2e0: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 .** open cursors
b2f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
b300: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 closeAllCursors
b310: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 (Vdbe *p){. if(
b320: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 p->pFrame ){.
b330: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 VdbeFrame *pFr
b340: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 ame;. for(pFr
b350: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 ame=p->pFrame; p
b360: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 Frame->pParent;
b370: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 pFrame=pFrame->p
b380: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c Parent);. sql
b390: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 ite3VdbeFrameRes
b3a0: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 tore(pFrame);.
b3b0: 7d 0a 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 }. p->pFrame =
b3c0: 30 3b 0a 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 0;. p->nFrame =
b3d0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 0;.. if( p->ap
b3e0: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 Csr ){. int i
b3f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 ;. for(i=0; i
b400: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b <p->nCursor; i++
b410: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 ){. VdbeCur
b420: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 sor *pC = p->apC
b430: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 sr[i];. if(
b440: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 pC ){. s
b450: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 qlite3VdbeFreeCu
b460: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 rsor(p, pC);.
b470: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d p->apCsr[i]
b480: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 0;. }.
b490: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d }. }. if( p-
b4a0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c >aMem ){. rel
b4b0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d easeMemArray(&p-
b4c0: 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 >aMem[1], p->nMe
b4d0: 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 m);. }. while(
b4e0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b p->pDelFrame ){
b4f0: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a . VdbeFrame *
b500: 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 pDel = p->pDelFr
b510: 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c ame;. p->pDel
b520: 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 Frame = pDel->pP
b530: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 arent;. sqlit
b540: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 e3VdbeFrameDelet
b550: 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 7d 0a 0a e(pDel);. }.}..
b560: 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 /*.** Clean up t
b570: 68 65 20 56 4d 20 61 66 74 65 72 20 65 78 65 63 he VM after exec
b580: 75 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 ution..**.** Thi
b590: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 61 s routine will a
b5a0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f utomatically clo
b5b0: 73 65 20 61 6e 79 20 63 75 72 73 6f 72 73 2c 20 se any cursors,
b5c0: 6c 69 73 74 73 2c 20 61 6e 64 2f 6f 72 0a 2a 2a lists, and/or.**
b5d0: 20 73 6f 72 74 65 72 73 20 74 68 61 74 20 77 65 sorters that we
b5e0: 72 65 20 6c 65 66 74 20 6f 70 65 6e 2e 20 20 49 re left open. I
b5f0: 74 20 61 6c 73 6f 20 64 65 6c 65 74 65 73 20 74 t also deletes t
b600: 68 65 20 76 61 6c 75 65 73 20 6f 66 0a 2a 2a 20 he values of.**
b610: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 65 variables in the
b620: 20 61 56 61 72 5b 5d 20 61 72 72 61 79 2e 0a 2a aVar[] array..*
b630: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c /.static void Cl
b640: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a eanup(Vdbe *p){.
b650: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
b660: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 p->db;..#ifdef S
b670: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a QLITE_DEBUG. /*
b680: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 Execute assert(
b690: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 ) statements to
b6a0: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 ensure that the
b6b0: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 Vdbe.apCsr[] and
b6c0: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d . ** Vdbe.aMem
b6d0: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 [] arrays have a
b6e0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 lready been clea
b6f0: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e ned up. */. in
b700: 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 t i;. for(i=0;
b710: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b i<p->nCursor; i+
b720: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 +) assert( p->ap
b730: 43 73 72 3d 3d 30 20 7c 7c 20 70 2d 3e 61 70 43 Csr==0 || p->apC
b740: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 66 6f sr[i]==0 );. fo
b750: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 r(i=1; i<=p->nMe
b760: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 m; i++) assert(
b770: 70 2d 3e 61 4d 65 6d 3d 3d 30 20 7c 7c 20 70 2d p->aMem==0 || p-
b780: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d >aMem[i].flags==
b790: 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 23 65 6e 64 MEM_Null );.#end
b7a0: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 if.. sqlite3DbF
b7b0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d ree(db, p->zErrM
b7c0: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 sg);. p->zErrMs
b7d0: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 g = 0;. p->pRes
b7e0: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f ultSet = 0;.}../
b7f0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d *.** Set the num
b800: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f ber of result co
b810: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 lumns that will
b820: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 be returned by t
b830: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 his SQL.** state
b840: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f ment. This is no
b850: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 w set at compile
b860: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 time, rather th
b870: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 an during.** exe
b880: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 cution of the vd
b890: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 be program so th
b8a0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d at sqlite3_colum
b8b0: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a n_count() can.**
b8c0: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e be called on an
b8d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 SQL statement b
b8e0: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 efore sqlite3_st
b8f0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 ep()..*/.void sq
b900: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 lite3VdbeSetNumC
b910: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 ols(Vdbe *p, int
b920: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 nResColumn){.
b930: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 Mem *pColName;.
b940: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 int n;. sqlite
b950: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 3 *db = p->db;..
b960: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 releaseMemArra
b970: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 y(p->aColName, p
b980: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c ->nResColumn*COL
b990: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 NAME_N);. sqlit
b9a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e e3DbFree(db, p->
b9b0: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d aColName);. n =
b9c0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e nResColumn*COLN
b9d0: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 AME_N;. p->nRes
b9e0: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 Column = (u16)nR
b9f0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 esColumn;. p->a
ba00: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 ColName = pColNa
ba10: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 me = (Mem*)sqlit
ba20: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 e3DbMallocZero(d
ba30: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e b, sizeof(Mem)*n
ba40: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f );. if( p->aCo
ba50: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 lName==0 ) retur
ba60: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 n;. while( n--
ba70: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e > 0 ){. pColN
ba80: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d ame->flags = MEM
ba90: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e _Null;. pColN
baa0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b ame->db = p->db;
bab0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b . pColName++;
bac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 . }.}../*.** Se
bad0: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 t the name of th
bae0: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 e idx'th column
baf0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 to be returned b
bb00: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d y the SQL statem
bb10: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 ent..** zName mu
bb20: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 st be a pointer
bb30: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 to a nul termina
bb40: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a ted string..**.*
bb50: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 * This call must
bb60: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 be made after a
bb70: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 call to sqlite3
bb80: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 VdbeSetNumCols()
bb90: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 ..**.** The fina
bba0: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 l parameter, xDe
bbb0: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f l, must be one o
bbc0: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 f SQLITE_DYNAMIC
bbd0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a , SQLITE_STATIC.
bbe0: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 ** or SQLITE_TRA
bbf0: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 NSIENT. If it is
bc00: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c SQLITE_DYNAMIC,
bc10: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 then the buffer
bc20: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 pointed.** to b
bc30: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 y zName will be
bc40: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 freed by sqlite3
bc50: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 DbFree() when th
bc60: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f e vdbe is destro
bc70: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 yed..*/.int sqli
bc80: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d te3VdbeSetColNam
bc90: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 e(. Vdbe *p,
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bcb0: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 /* Vdbe be
bcc0: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a ing configured *
bcd0: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 /. int idx,
bce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bcf0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 /* Index of
bd00: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 column zName ap
bd10: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e plies to */. in
bd20: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 t var,
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
bd40: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c * One of the COL
bd50: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 NAME_* constants
bd60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 */. const char
bd70: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 *zName,
bd80: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 /* Pointe
bd90: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 r to buffer cont
bda0: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 aining name */.
bdb0: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f void (*xDel)(vo
bdc0: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 id*)
bdd0: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 /* Memory mana
bde0: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 gement strategy
bdf0: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a for zName */.){.
be00: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 int rc;. Mem
be10: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 *pColName;. ass
be20: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 ert( idx<p->nRes
be30: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 Column );. asse
be40: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f rt( var<COLNAME_
be50: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 N );. if( p->db
be60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
be70: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a {. assert( !z
be80: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 Name || xDel!=SQ
be90: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a LITE_DYNAMIC );.
bea0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
beb0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 E_NOMEM;. }. a
bec0: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 ssert( p->aColNa
bed0: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e me!=0 );. pColN
bee0: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e ame = &(p->aColN
bef0: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e ame[idx+var*p->n
bf00: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 ResColumn]);. r
bf10: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d c = sqlite3VdbeM
bf20: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d emSetStr(pColNam
bf30: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 e, zName, -1, SQ
bf40: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 LITE_UTF8, xDel)
bf50: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d ;. assert( rc!=
bf60: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 0 || !zName || (
bf70: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 pColName->flags&
bf80: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a MEM_Term)!=0 );.
bf90: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a return rc;.}..
bfa0: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 /*.** A read or
bfb0: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f write transactio
bfc0: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 n may or may not
bfd0: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 be active on da
bfe0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a tabase handle.**
bff0: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 db. If a transa
c000: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c ction is active,
c010: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 commit it. If t
c020: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 here is a.** wri
c030: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 te-transaction s
c040: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 panning more tha
c050: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 n one database f
c060: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e ile, this routin
c070: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 e.** takes care
c080: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f of the master jo
c090: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a urnal trickery..
c0a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 */.static int vd
c0b0: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 beCommit(sqlite3
c0c0: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a *db, Vdbe *p){.
c0d0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e int i;. int n
c0e0: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e Trans = 0; /* N
c0f0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 umber of databas
c100: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 es with an activ
c110: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 e write-transact
c120: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 ion */. int rc
c130: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 = SQLITE_OK;. i
c140: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d nt needXcommit =
c150: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 0;..#ifdef SQLI
c160: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
c170: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 ABLE. /* With t
c180: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 his option, sqli
c190: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 te3VtabSync() is
c1a0: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 defined to be s
c1b0: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 imply . ** SQLI
c1c0: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f TE_OK so p is no
c1d0: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 t used. . */.
c1e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 UNUSED_PARAMETER
c1f0: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f (p);.#endif.. /
c200: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 * Before doing a
c210: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 nything else, ca
c220: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 ll the xSync() c
c230: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a allback for any.
c240: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 ** virtual mod
c250: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 ule tables writt
c260: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 en in this trans
c270: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 action. This has
c280: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 to. ** be done
c290: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e before determin
c2a0: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 ing whether a ma
c2b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c ster journal fil
c2c0: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 e is . ** requi
c2d0: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 red, as an xSync
c2e0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 () callback may
c2f0: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 add an attached
c300: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f database. ** to
c310: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
c320: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 .. */. rc = sq
c330: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 lite3VtabSync(db
c340: 2c 20 26 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a , &p->zErrMsg);.
c350: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 . /* This loop
c360: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 determines (a) i
c370: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f f the commit hoo
c380: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f k should be invo
c390: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 ked and. ** (b)
c3a0: 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 how many databa
c3b0: 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 se files have op
c3c0: 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 en write transac
c3d0: 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a tions, not . **
c3e0: 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 including the t
c3f0: 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 emp database. (b
c400: 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 ) is important b
c410: 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 ecause if more t
c420: 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 han . ** one da
c430: 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 tabase file has
c440: 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 an open write tr
c450: 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 ansaction, a mas
c460: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a ter journal. **
c470: 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 file is require
c480: 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 d for an atomic
c490: 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 commit.. */ .
c4a0: 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c for(i=0; rc==SQL
c4b0: 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e ITE_OK && i<db->
c4c0: 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 nDb; i++){ .
c4d0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d Btree *pBt = db-
c4e0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 >aDb[i].pBt;.
c4f0: 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 if( sqlite3Btre
c500: 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 eIsInTrans(pBt)
c510: 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f ){. needXco
c520: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 mmit = 1;.
c530: 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e if( i!=1 ) nTran
c540: 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 s++;. rc =
c550: 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c sqlite3PagerExcl
c560: 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 usiveLock(sqlite
c570: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3BtreePager(pBt)
c580: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 );. }. }. i
c590: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b f( rc!=SQLITE_OK
c5a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 ){. return r
c5b0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 c;. }.. /* If
c5c0: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 there are any wr
c5d0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 ite-transactions
c5e0: 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 at all, invoke
c5f0: 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 the commit hook
c600: 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f */. if( needXco
c610: 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d mmit && db->xCom
c620: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 mitCallback ){.
c630: 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d rc = db->xCom
c640: 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e mitCallback(db->
c650: 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 pCommitArg);.
c660: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 if( rc ){.
c670: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
c680: 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 20 7d ONSTRAINT;. }
c690: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 . }.. /* The s
c6a0: 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 imple case - no
c6b0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 more than one da
c6c0: 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 tabase file (not
c6d0: 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 counting the.
c6e0: 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 ** TEMP database
c6f0: 29 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 ) has a transact
c700: 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 ion active. Th
c710: 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 ere is no need f
c720: 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 or the. ** mast
c730: 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a er-journal.. **
c740: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 . ** If the ret
c750: 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c urn value of sql
c760: 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 ite3BtreeGetFile
c770: 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f name() is a zero
c780: 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 length. ** str
c790: 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 ing, it means th
c7a0: 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 e main database
c7b0: 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 is :memory: or a
c7c0: 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 temp file. In
c7d0: 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 . ** that case
c7e0: 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 we do not suppor
c7f0: 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 t atomic multi-f
c800: 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 ile commits, so
c810: 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 use the . ** si
c820: 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 mple case then t
c830: 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 oo.. */. if( 0
c840: 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 ==sqlite3Strlen3
c850: 30 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 0(sqlite3BtreeGe
c860: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 tFilename(db->aD
c870: 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c b[0].pBt)). ||
c880: 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a nTrans<=1. ){.
c890: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d for(i=0; rc=
c8a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c =SQLITE_OK && i<
c8b0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 db->nDb; i++){.
c8c0: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 Btree *pBt
c8d0: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 = db->aDb[i].pBt
c8e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 ;. if( pBt
c8f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
c900: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d sqlite3BtreeComm
c910: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 itPhaseOne(pBt,
c920: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0);. }.
c930: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 }.. /* Do the
c940: 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 commit only if
c950: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 all databases su
c960: 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c ccessfully compl
c970: 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 ete phase 1. .
c980: 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 ** If one of t
c990: 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 he BtreeCommitPh
c9a0: 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 aseOne() calls f
c9b0: 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 ails, this indic
c9c0: 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 ates an. ** I
c9d0: 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 O error while de
c9e0: 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 leting or trunca
c9f0: 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 ting a journal f
ca00: 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b ile. It is unlik
ca10: 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 ely,. ** but
ca20: 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e could happen. In
ca30: 20 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 this case aband
ca40: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e on processing an
ca50: 64 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 d return the err
ca60: 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 or.. */. f
ca70: 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 or(i=0; rc==SQLI
ca80: 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e TE_OK && i<db->n
ca90: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 Db; i++){.
caa0: 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d Btree *pBt = db-
cab0: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 >aDb[i].pBt;.
cac0: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 if( pBt ){.
cad0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
cae0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 e3BtreeCommitPha
caf0: 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 seTwo(pBt, 0);.
cb00: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
cb10: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
cb20: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 OK ){. sqli
cb30: 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 te3VtabCommit(db
cb40: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 );. }. }..
cb50: 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 /* The complex c
cb60: 61 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 ase - There is a
cb70: 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 multi-file writ
cb80: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 e-transaction ac
cb90: 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 tive.. ** This
cba0: 72 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 requires a maste
cbb0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 r journal file t
cbc0: 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 o ensure the tra
cbd0: 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a nsaction is. **
cbe0: 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 committed atomi
cbf0: 63 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 cly.. */.#ifnde
cc00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 f SQLITE_OMIT_DI
cc10: 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 SKIO. else{.
cc20: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 sqlite3_vfs *pV
cc30: 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 fs = db->pVfs;.
cc40: 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 int needSync
cc50: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a = 0;. char *z
cc60: 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a Master = 0; /*
cc70: 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 File-name for t
cc80: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
cc90: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f l */. char co
cca0: 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d nst *zMainFile =
ccb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 sqlite3BtreeGet
ccc0: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 Filename(db->aDb
ccd0: 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 [0].pBt);. sq
cce0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 lite3_file *pMas
ccf0: 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 ter = 0;. i64
cd00: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 offset = 0;.
cd10: 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 20 2f int res;.. /
cd20: 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 * Select a maste
cd30: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e r journal file n
cd40: 61 6d 65 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a ame */. do {.
cd50: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f u32 iRando
cd60: 6d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 m;. sqlite3
cd70: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 DbFree(db, zMast
cd80: 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 er);. sqlit
cd90: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 e3_randomness(si
cda0: 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 zeof(iRandom), &
cdb0: 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 iRandom);.
cdc0: 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 zMaster = sqlite
cdd0: 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 3MPrintf(db, "%s
cde0: 2d 6d 6a 25 30 38 58 22 2c 20 7a 4d 61 69 6e 46 -mj%08X", zMainF
cdf0: 69 6c 65 2c 20 69 52 61 6e 64 6f 6d 26 30 78 37 ile, iRandom&0x7
ce00: 66 66 66 66 66 66 66 29 3b 0a 20 20 20 20 20 20 fffffff);.
ce10: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 29 7b 0a if( !zMaster ){.
ce20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
ce30: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 QLITE_NOMEM;.
ce40: 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 }. rc =
ce50: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 sqlite3OsAccess(
ce60: 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 pVfs, zMaster, S
ce70: 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 QLITE_ACCESS_EXI
ce80: 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 STS, &res);.
ce90: 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 }while( rc==SQLI
cea0: 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a TE_OK && res );.
ceb0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
cec0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f TE_OK ){. /
ced0: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 * Open the maste
cee0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 r journal. */.
cef0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 rc = sqlite3
cf00: 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 OsOpenMalloc(pVf
cf10: 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 s, zMaster, &pMa
cf20: 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 ster, .
cf30: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 SQLITE_OPEN_REA
cf40: 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 DWRITE|SQLITE_OP
cf50: 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 EN_CREATE|.
cf60: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e SQLITE_OPEN
cf70: 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 _EXCLUSIVE|SQLIT
cf80: 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f E_OPEN_MASTER_JO
cf90: 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 URNAL, 0. )
cfa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 ;. }. if(
cfb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
cfc0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 . sqlite3Db
cfd0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 Free(db, zMaster
cfe0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
cff0: 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 rc;. }. .
d000: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d /* Write the nam
d010: 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 e of each databa
d020: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 se file in the t
d030: 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 ransaction into
d040: 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d the new. ** m
d050: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
d060: 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 le. If an error
d070: 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 occurs at this p
d080: 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a oint close. *
d090: 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 * and delete the
d0a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
d0b0: 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e file. All the in
d0c0: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c dividual journal
d0d0: 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 files. ** st
d0e0: 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 ill have 'null'
d0f0: 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f as the master jo
d100: 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 urnal pointer, s
d110: 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c o they will roll
d120: 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 . ** back ind
d130: 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 ependently if a
d140: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a failure occurs..
d150: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 */. for(i
d160: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 =0; i<db->nDb; i
d170: 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 ++){. Btree
d180: 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b *pBt = db->aDb[
d190: 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 i].pBt;. if
d1a0: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 ( sqlite3BtreeIs
d1b0: 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a InTrans(pBt) ){.
d1c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e char con
d1d0: 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 st *zFile = sqli
d1e0: 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e te3BtreeGetJourn
d1f0: 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 alname(pBt);.
d200: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d if( zFile==
d210: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 0 ){. c
d220: 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e ontinue; /* Ign
d230: 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 ore TEMP and :me
d240: 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 mory: databases
d250: 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 */. }.
d260: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 assert( zFi
d270: 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 le[0]!=0 );.
d280: 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e if( !needSyn
d290: 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 c && !sqlite3Btr
d2a0: 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 eeSyncDisabled(p
d2b0: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 Bt) ){.
d2c0: 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 needSync = 1;.
d2d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
d2e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 rc = sqlite3OsW
d2f0: 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 rite(pMaster, zF
d300: 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c ile, sqlite3Strl
d310: 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f en30(zFile)+1, o
d320: 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 ffset);.
d330: 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 offset += sqlite
d340: 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 3Strlen30(zFile)
d350: 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 +1;. if(
d360: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
d370: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
d380: 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d e3OsCloseFree(pM
d390: 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 aster);.
d3a0: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 sqlite3OsDelet
d3b0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c e(pVfs, zMaster,
d3c0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 0);. s
d3d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
d3e0: 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 zMaster);.
d3f0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a return rc;.
d400: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
d410: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
d420: 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 Sync the master
d430: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 journal file. If
d440: 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 the IOCAP_SEQUE
d450: 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 NTIAL device.
d460: 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 ** flag is set
d470: 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 this is not requ
d480: 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 ired.. */.
d490: 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 if( needSync .
d4a0: 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 && 0==(sqlit
d4b0: 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 e3OsDeviceCharac
d4c0: 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 teristics(pMaste
d4d0: 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f r)&SQLITE_IOCAP_
d4e0: 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 SEQUENTIAL).
d4f0: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 && SQLITE_OK!=(
d500: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 rc = sqlite3OsSy
d510: 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 nc(pMaster, SQLI
d520: 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 TE_SYNC_NORMAL))
d530: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 . ){. sq
d540: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 lite3OsCloseFree
d550: 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 (pMaster);.
d560: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 sqlite3OsDelete
d570: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 (pVfs, zMaster,
d580: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 0);. sqlite
d590: 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 3DbFree(db, zMas
d5a0: 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 ter);. retu
d5b0: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 rn rc;. }..
d5c0: 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 /* Sync all th
d5d0: 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c e db files invol
d5e0: 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 ved in the trans
d5f0: 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 action. The same
d600: 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 call. ** set
d610: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 s the master jou
d620: 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 rnal pointer in
d630: 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 each individual
d640: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 journal. If.
d650: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 ** an error occu
d660: 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 rs here, do not
d670: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 delete the maste
d680: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a r journal file..
d690: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 **. ** If
d6a0: 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 the error occur
d6b0: 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 s during the fir
d6c0: 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a st call to. *
d6d0: 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f * sqlite3BtreeCo
d6e0: 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 mmitPhaseOne(),
d6f0: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 then there is a
d700: 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a chance that the.
d710: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f ** master jo
d720: 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 urnal file will
d730: 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 be orphaned. But
d740: 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 we cannot delet
d750: 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 e it,. ** in
d760: 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 case the master
d770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d journal file nam
d780: 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e e was written in
d790: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 to the journal.
d7a0: 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 ** file befor
d7b0: 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 e the failure oc
d7c0: 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 curred.. */.
d7d0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d for(i=0; rc==
d7e0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 SQLITE_OK && i<d
d7f0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 b->nDb; i++){ .
d800: 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 Btree *pBt
d810: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 = db->aDb[i].pBt
d820: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 ;. if( pBt
d830: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
d840: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d sqlite3BtreeComm
d850: 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 itPhaseOne(pBt,
d860: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 zMaster);.
d870: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 }. }. sqli
d880: 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 te3OsCloseFree(p
d890: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 Master);. ass
d8a0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f ert( rc!=SQLITE_
d8b0: 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 BUSY );. if(
d8c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
d8d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 . sqlite3Db
d8e0: 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 Free(db, zMaster
d8f0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
d900: 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f rc;. }.. /
d910: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 * Delete the mas
d920: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
d930: 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 . This commits t
d940: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 he transaction.
d950: 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 After. ** doi
d960: 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65 ng this the dire
d970: 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 ctory is synced
d980: 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 again before any
d990: 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 individual.
d9a0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 ** transaction f
d9b0: 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 iles are deleted
d9c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 .. */. rc
d9d0: 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 = sqlite3OsDelet
d9e0: 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c e(pVfs, zMaster,
d9f0: 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 1);. sqlite3
da00: 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 DbFree(db, zMast
da10: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 er);. zMaster
da20: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 = 0;. if( rc
da30: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){. return
da40: 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 rc;. }..
da50: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 /* All files and
da60: 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 directories hav
da70: 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 e already been s
da80: 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f ynced, so the fo
da90: 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 llowing. ** c
daa0: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 alls to sqlite3B
dab0: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 treeCommitPhaseT
dac0: 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c wo() are only cl
dad0: 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a osing files and.
dae0: 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 ** deleting
daf0: 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f or truncating jo
db00: 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 urnals. If somet
db10: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 hing goes wrong
db20: 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 while. ** thi
db30: 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 s is happening w
db40: 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 e don't really c
db50: 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 are. The integri
db60: 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a ty of the. **
db70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 transaction is
db80: 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 already guarante
db90: 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 ed, but some str
dba0: 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 ay 'cold' journa
dbb0: 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 ls. ** may be
dbc0: 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 lying around. R
dbd0: 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f eturning an erro
dbe0: 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c r code won't hel
dbf0: 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a p matters.. *
dc00: 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 /. disable_si
dc10: 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 mulated_io_error
dc20: 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 s();. sqlite3
dc30: 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f BeginBenignMallo
dc40: 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 c();. for(i=0
dc50: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b ; i<db->nDb; i++
dc60: 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 ){ . Btree
dc70: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 *pBt = db->aDb[i
dc80: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 ].pBt;. if(
dc90: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 pBt ){.
dca0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d sqlite3BtreeComm
dcb0: 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 itPhaseTwo(pBt,
dcc0: 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 1);. }.
dcd0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 }. sqlite3End
dce0: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a BenignMalloc();.
dcf0: 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c enable_simul
dd00: 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 ated_io_errors()
dd10: 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 ;.. sqlite3Vt
dd20: 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 abCommit(db);.
dd30: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 }.#endif.. retu
dd40: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a rn rc;.}../* .**
dd50: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 This routine ch
dd60: 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 ecks that the sq
dd70: 6c 69 74 65 33 2e 61 63 74 69 76 65 56 64 62 65 lite3.activeVdbe
dd80: 43 6e 74 20 63 6f 75 6e 74 20 76 61 72 69 61 62 Cnt count variab
dd90: 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 le.** matches th
dda0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 e number of vdbe
ddb0: 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 's in the list s
ddc0: 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 qlite3.pVdbe tha
ddd0: 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 t are.** current
dde0: 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 ly active. An as
ddf0: 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 sertion fails if
de00: 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 the two counts
de10: 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a do not match..**
de20: 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 This is an inte
de30: 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 rnal self-check
de40: 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 only - it is not
de50: 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 an essential pr
de60: 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 ocessing.** step
de70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 ..**.** This is
de80: 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 a no-op if NDEBU
de90: 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f G is defined..*/
dea0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a .#ifndef NDEBUG.
deb0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 static void chec
dec0: 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 kActiveVdbeCnt(s
ded0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 qlite3 *db){. V
dee0: 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e dbe *p;. int cn
def0: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 t = 0;. int nWr
df00: 69 74 65 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 ite = 0;. p = d
df10: 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c b->pVdbe;. whil
df20: 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 e( p ){. if(
df30: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
df40: 41 47 49 43 5f 52 55 4e 20 26 26 20 70 2d 3e 70 AGIC_RUN && p->p
df50: 63 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6e c>=0 ){. cn
df60: 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 t++;. if( p
df70: 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 ->readOnly==0 )
df80: 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a nWrite++;. }.
df90: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 p = p->pNext
dfa0: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
dfb0: 63 6e 74 3d 3d 64 62 2d 3e 61 63 74 69 76 65 56 cnt==db->activeV
dfc0: 64 62 65 43 6e 74 20 29 3b 0a 20 20 61 73 73 65 dbeCnt );. asse
dfd0: 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e rt( nWrite==db->
dfe0: 77 72 69 74 65 56 64 62 65 43 6e 74 20 29 3b 0a writeVdbeCnt );.
dff0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 }.#else.#define
e000: 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 checkActiveVdbeC
e010: 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a nt(x).#endif../*
e020: 0a 2a 2a 20 46 6f 72 20 65 76 65 72 79 20 42 74 .** For every Bt
e030: 72 65 65 20 74 68 61 74 20 69 6e 20 64 61 74 61 ree that in data
e040: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 base connection
e050: 64 62 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 db which .** has
e060: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2c 20 been modified,
e070: 22 74 72 69 70 22 20 6f 72 20 69 6e 76 61 6c 69 "trip" or invali
e080: 64 61 74 65 20 65 61 63 68 20 63 75 72 73 6f 72 date each cursor
e090: 20 69 6e 0a 2a 2a 20 74 68 61 74 20 42 74 72 65 in.** that Btre
e0a0: 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 e might have bee
e0b0: 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20 74 68 n modified so th
e0c0: 61 74 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a at the cursor.**
e0d0: 20 63 61 6e 20 6e 65 76 65 72 20 62 65 20 75 73 can never be us
e0e0: 65 64 20 61 67 61 69 6e 2e 20 20 54 68 69 73 20 ed again. This
e0f0: 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 20 72 happens when a r
e100: 6f 6c 6c 62 61 63 6b 0a 2a 2a 2a 20 6f 63 63 75 ollback.*** occu
e110: 72 73 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 rs. We have to
e120: 74 72 69 70 20 61 6c 6c 20 74 68 65 20 6f 74 68 trip all the oth
e130: 65 72 20 63 75 72 73 6f 72 73 2c 20 65 76 65 6e er cursors, even
e140: 0a 2a 2a 20 63 75 72 73 6f 72 20 66 72 6f 6d 20 .** cursor from
e150: 6f 74 68 65 72 20 56 4d 73 20 69 6e 20 64 69 66 other VMs in dif
e160: 66 65 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 ferent database
e170: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2c 0a 2a 2a 20 connections,.**
e180: 73 6f 20 74 68 61 74 20 6e 6f 6e 65 20 6f 66 20 so that none of
e190: 74 68 65 6d 20 74 72 79 20 74 6f 20 75 73 65 20 them try to use
e1a0: 74 68 65 20 64 61 74 61 20 61 74 20 77 68 69 63 the data at whic
e1b0: 68 20 74 68 65 79 0a 2a 2a 20 77 65 72 65 20 70 h they.** were p
e1c0: 6f 69 6e 74 69 6e 67 20 61 6e 64 20 77 68 69 63 ointing and whic
e1d0: 68 20 6e 6f 77 20 6d 61 79 20 68 61 76 65 20 62 h now may have b
e1e0: 65 65 6e 20 63 68 61 6e 67 65 64 20 64 75 65 0a een changed due.
e1f0: 2a 2a 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 ** to the rollba
e200: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 6d 65 6d 62 ck..**.** Rememb
e210: 65 72 20 74 68 61 74 20 61 20 72 6f 6c 6c 62 61 er that a rollba
e220: 63 6b 20 63 61 6e 20 64 65 6c 65 74 65 20 74 61 ck can delete ta
e230: 62 6c 65 73 20 63 6f 6d 70 6c 65 74 65 20 61 6e bles complete an
e240: 64 0a 2a 2a 20 72 65 6f 72 64 65 72 20 72 6f 6f d.** reorder roo
e250: 74 70 61 67 65 73 2e 20 20 53 6f 20 69 74 20 69 tpages. So it i
e260: 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 s not sufficient
e270: 20 6a 75 73 74 20 74 6f 20 73 61 76 65 0a 2a 2a just to save.**
e280: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 the state of th
e290: 65 20 63 75 72 73 6f 72 2e 20 20 57 65 20 68 61 e cursor. We ha
e2a0: 76 65 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 ve to invalidate
e2b0: 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 73 the cursor.** s
e2c0: 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 o that it is nev
e2d0: 65 72 20 75 73 65 64 20 61 67 61 69 6e 2e 0a 2a er used again..*
e2e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e /.static void in
e2f0: 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 4f validateCursorsO
e300: 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 28 nModifiedBtrees(
e310: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 sqlite3 *db){.
e320: 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 int i;. for(i=0
e330: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b ; i<db->nDb; i++
e340: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 ){. Btree *p
e350: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 = db->aDb[i].pBt
e360: 3b 0a 20 20 20 20 69 66 28 20 70 20 26 26 20 73 ;. if( p && s
e370: 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 qlite3BtreeIsInT
e380: 72 61 6e 73 28 70 29 20 29 7b 0a 20 20 20 20 20 rans(p) ){.
e390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 sqlite3BtreeTri
e3a0: 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 53 pAllCursors(p, S
e3b0: 51 4c 49 54 45 5f 41 42 4f 52 54 29 3b 0a 20 20 QLITE_ABORT);.
e3c0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a }. }.}../*.**
e3d0: 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 If the Vdbe pas
e3e0: 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 sed as the first
e3f0: 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 argument opened
e400: 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 a statement-tra
e410: 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f nsaction,.** clo
e420: 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d se it now. Argum
e430: 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 ent eOp must be
e440: 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 either SAVEPOINT
e450: 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 _ROLLBACK or.**
e460: 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 SAVEPOINT_RELEAS
e470: 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 E. If it is SAVE
e480: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 POINT_ROLLBACK,
e490: 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 then the stateme
e4a0: 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f nt.** transactio
e4b0: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b n is rolled back
e4c0: 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 . If eOp is SAVE
e4d0: 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 POINT_RELEASE, t
e4e0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 hen the .** stat
e4f0: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
e500: 6e 20 69 73 20 63 6f 6d 6d 74 74 65 64 2e 0a 2a n is commtted..*
e510: 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 *.** If an IO er
e520: 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 ror occurs, an S
e530: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 QLITE_IOERR_XXX
e540: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 error code is re
e550: 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 turned. .** Othe
e560: 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e rwise SQLITE_OK.
e570: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 .*/.int sqlite3V
e580: 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e dbeCloseStatemen
e590: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 t(Vdbe *p, int e
e5a0: 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a Op){. sqlite3 *
e5b0: 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 const db = p->db
e5c0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c ;. int rc = SQL
e5d0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 ITE_OK;.. /* If
e5e0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 p->iStatement i
e5f0: 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a s greater than z
e600: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 ero, then this V
e610: 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 dbe opened a .
e620: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 ** statement tra
e630: 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 nsaction that sh
e640: 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 ould be closed h
e650: 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 ere. The only ex
e660: 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 ception. ** is
e670: 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 that an IO error
e680: 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 may have occure
e690: 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d d, causing an em
e6a0: 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b ergency rollback
e6b0: 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 .. ** In this c
e6c0: 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d ase (db->nStatem
e6d0: 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 ent==0), and the
e6e0: 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f re is nothing to
e6f0: 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 do.. */. if(
e700: 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 db->nStatement &
e710: 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 & p->iStatement
e720: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 ){. int i;.
e730: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 const int iSav
e740: 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 epoint = p->iSta
e750: 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 tement-1;.. a
e760: 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 ssert( eOp==SAVE
e770: 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c POINT_ROLLBACK |
e780: 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 | eOp==SAVEPOINT
e790: 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 _RELEASE);. a
e7a0: 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 ssert( db->nStat
e7b0: 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 ement>0 );. a
e7c0: 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 ssert( p->iState
e7d0: 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 ment==(db->nStat
e7e0: 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 ement+db->nSavep
e7f0: 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f oint) );.. fo
e800: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 r(i=0; i<db->nDb
e810: 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 ; i++){ . i
e820: 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f nt rc2 = SQLITE_
e830: 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 OK;. Btree
e840: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 *pBt = db->aDb[i
e850: 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 ].pBt;. if(
e860: 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 pBt ){.
e870: 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 if( eOp==SAVEPOI
e880: 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 NT_ROLLBACK ){.
e890: 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 rc2 = s
e8a0: 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 qlite3BtreeSavep
e8b0: 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f oint(pBt, SAVEPO
e8c0: 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 INT_ROLLBACK, iS
e8d0: 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 avepoint);.
e8e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
e8f0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 rc2==SQLITE_OK
e900: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 ){. rc2
e910: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 = sqlite3BtreeS
e920: 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 avepoint(pBt, SA
e930: 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c VEPOINT_RELEASE,
e940: 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 iSavepoint);.
e950: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
e960: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f if( rc==SQLITE_O
e970: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 K ){. r
e980: 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 c = rc2;.
e990: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
e9a0: 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d . db->nStatem
e9b0: 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 ent--;. p->iS
e9c0: 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 tatement = 0;..
e9d0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 /* If the sta
e9e0: 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 tement transacti
e9f0: 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c on is being roll
ea00: 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 ed back, also re
ea10: 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a store the . *
ea20: 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c * database handl
ea30: 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 es deferred cons
ea40: 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 traint counter t
ea50: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 o the value it h
ea60: 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 ad when . **
ea70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 the statement tr
ea80: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 ansaction was op
ea90: 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 ened. */. if
eaa0: 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 ( eOp==SAVEPOINT
eab0: 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 _ROLLBACK ){.
eac0: 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 db->nDeferred
ead0: 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 Cons = p->nStmtD
eae0: 65 66 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 efCons;. }.
eaf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d }. return rc;.}
eb00: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 ../*.** If SQLit
eb10: 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f e is compiled to
eb20: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d support shared-
eb30: 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 cache mode and t
eb40: 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c o be threadsafe,
eb50: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 .** this routine
eb60: 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 obtains the mut
eb70: 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ex associated wi
eb80: 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 th each BtShared
eb90: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 structure.** th
eba0: 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 at may be access
ebb0: 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 ed by the VM pas
ebc0: 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 sed as an argume
ebd0: 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 nt. In doing so
ebe0: 69 74 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 it.** sets the B
ebf0: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 tShared.db membe
ec00: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 r of each of the
ec10: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 BtShared struct
ec20: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a ures, ensuring.*
ec30: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 * that the corre
ec40: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 ct busy-handler
ec50: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f callback is invo
ec60: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e ked if required.
ec70: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 .**.** If SQLite
ec80: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 is not threadsa
ec90: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 fe but does supp
eca0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 ort shared-cache
ecb0: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 mode, then.** s
ecc0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 qlite3BtreeEnter
ecd0: 41 6c 6c 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 All() is invoked
ece0: 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 68 to set the BtSh
ecf0: 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c 65 ared.db variable
ed00: 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 s.** of all of B
ed10: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 tShared structur
ed20: 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 69 es accessible vi
ed30: 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 a the database h
ed40: 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 andle .** associ
ed50: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 4d ated with the VM
ed60: 2e 20 4f 66 20 63 6f 75 72 73 65 20 6f 6e 6c 79 . Of course only
ed70: 20 61 20 73 75 62 73 65 74 20 6f 66 20 74 68 65 a subset of the
ed80: 73 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a se structures.**
ed90: 20 77 69 6c 6c 20 62 65 20 61 63 63 65 73 73 65 will be accesse
eda0: 64 20 62 79 20 74 68 65 20 56 4d 2c 20 61 6e 64 d by the VM, and
edb0: 20 77 65 20 63 6f 75 6c 64 20 75 73 65 20 56 64 we could use Vd
edc0: 62 65 2e 62 74 72 65 65 4d 61 73 6b 20 74 6f 20 be.btreeMask to
edd0: 66 69 67 75 72 65 0a 2a 2a 20 74 68 61 74 20 73 figure.** that s
ede0: 75 62 73 65 74 20 6f 75 74 2c 20 62 75 74 20 74 ubset out, but t
edf0: 68 65 72 65 20 69 73 20 6e 6f 20 61 64 76 61 6e here is no advan
ee00: 74 61 67 65 20 74 6f 20 64 6f 69 6e 67 20 73 6f tage to doing so
ee10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 ..**.** If SQLit
ee20: 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 e is not threads
ee30: 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 afe and does not
ee40: 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d support shared-
ee50: 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 cache mode, this
ee60: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 .** function is
ee70: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 23 69 66 6e a no-op..*/.#ifn
ee80: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
ee90: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 76 6f 69 SHARED_CACHE.voi
eea0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 74 d sqlite3VdbeMut
eeb0: 65 78 41 72 72 61 79 45 6e 74 65 72 28 56 64 62 exArrayEnter(Vdb
eec0: 65 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 e *p){.#if SQLIT
eed0: 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20 73 E_THREADSAFE. s
eee0: 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 qlite3BtreeMutex
eef0: 41 72 72 61 79 45 6e 74 65 72 28 26 70 2d 3e 61 ArrayEnter(&p->a
ef00: 4d 75 74 65 78 29 3b 0a 23 65 6c 73 65 0a 20 20 Mutex);.#else.
ef10: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 sqlite3BtreeEnte
ef20: 72 41 6c 6c 28 70 2d 3e 64 62 29 3b 0a 23 65 6e rAll(p->db);.#en
ef30: 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a dif.}.#endif../*
ef40: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
ef50: 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e n is called when
ef60: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f a transaction o
ef70: 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 pened by the dat
ef80: 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 abase .** handle
ef90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
efa0: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 the VM passed a
efb0: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 s an argument is
efc0: 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a about to be .**
efd0: 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 committed. If t
efe0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e here are outstan
eff0: 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f ding deferred fo
f000: 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 reign key constr
f010: 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f aint.** violatio
f020: 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ns, return SQLIT
f030: 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 E_ERROR. Otherwi
f040: 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a se, SQLITE_OK..*
f050: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 *.** If there ar
f060: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b e outstanding FK
f070: 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 violations and
f080: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 this function re
f090: 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 turns .** SQLITE
f0a0: 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 _ERROR, set the
f0b0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d result of the VM
f0c0: 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 to SQLITE_CONST
f0d0: 52 41 49 4e 54 20 61 6e 64 20 77 72 69 74 65 0a RAINT and write.
f0e0: 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 ** an error mess
f0f0: 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 age to it. Then
f100: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 return SQLITE_ER
f110: 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 ROR..*/.#ifndef
f120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 SQLITE_OMIT_FORE
f130: 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 IGN_KEY.int sqli
f140: 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 te3VdbeCheckFk(V
f150: 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 dbe *p, int defe
f160: 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 rred){. sqlite3
f170: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 *db = p->db;.
f180: 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 if( (deferred &&
f190: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f db->nDeferredCo
f1a0: 6e 73 3e 30 29 20 7c 7c 20 28 21 64 65 66 65 72 ns>0) || (!defer
f1b0: 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e red && p->nFkCon
f1c0: 73 74 72 61 69 6e 74 3e 30 29 20 29 7b 0a 20 20 straint>0) ){.
f1d0: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 p->rc = SQLITE
f1e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 3b 0a 20 20 20 _CONSTRAINT;.
f1f0: 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 p->errorAction
f200: 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 = OE_Abort;.
f210: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 sqlite3SetString
f220: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62 (&p->zErrMsg, db
f230: 2c 20 22 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 , "foreign key c
f240: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 onstraint failed
f250: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ");. return S
f260: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d QLITE_ERROR;. }
f270: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
f280: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f _OK;.}.#endif../
f290: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
f2a0: 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 e is called the
f2b0: 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 when a VDBE trie
f2c0: 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 s to halt. If t
f2d0: 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d he VDBE.** has m
f2e0: 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 ade changes and
f2f0: 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 is in autocommit
f300: 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d mode, then comm
f310: 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e it those.** chan
f320: 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 ges. If a rollb
f330: 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 ack is needed, t
f340: 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 hen do the rollb
f350: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ack..**.** This
f360: 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f routine is the o
f370: 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 nly way to move
f380: 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 the state of a V
f390: 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 M from.** SQLITE
f3a0: 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 _MAGIC_RUN to SQ
f3b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e LITE_MAGIC_HALT.
f3c0: 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 It is harmless
f3d0: 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 to.** call this
f3e0: 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 on a VM that is
f3f0: 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d in the SQLITE_M
f400: 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e AGIC_HALT state.
f410: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e .**.** Return an
f420: 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 error code. If
f430: 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c the commit coul
f440: 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 d not complete b
f450: 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 ecause of.** loc
f460: 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 k contention, re
f470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 turn SQLITE_BUSY
f480: 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 . If SQLITE_BUS
f490: 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 Y is returned, i
f4a0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 t.** means the c
f4b0: 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 lose did not hap
f4c0: 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f pen and needs to
f4d0: 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f be repeated..*/
f4e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
f4f0: 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 Halt(Vdbe *p){.
f500: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 int rc;
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f520: 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 /* Used to stor
f530: 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 e transient retu
f540: 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 rn codes */. sq
f550: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
f560: 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 b;.. /* This fu
f570: 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 nction contains
f580: 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 the logic that d
f590: 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 etermines if a s
f5a0: 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a tatement or. **
f5b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c transaction wil
f5c0: 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f l be committed o
f5d0: 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 r rolled back as
f5e0: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
f5f0: 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 . ** execution
f600: 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 of this virtual
f610: 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 machine. . **.
f620: 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 ** If any of th
f630: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f e following erro
f640: 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 rs occur:. **.
f650: 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e ** SQLITE_N
f660: 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 OMEM. ** SQ
f670: 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 LITE_IOERR. **
f680: 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a SQLITE_FULL.
f690: 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f ** SQLITE_
f6a0: 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 INTERRUPT. **.
f6b0: 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 ** Then the int
f6c0: 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 ernal cache migh
f6d0: 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 t have been left
f6e0: 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 in an inconsist
f6f0: 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 ent. ** state.
f700: 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c We need to roll
f710: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 back the stateme
f720: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 nt transaction,
f730: 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a if there is. **
f740: 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d one, or the com
f750: 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f plete transactio
f760: 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f n if there is no
f770: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 statement trans
f780: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 action.. */..
f790: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f if( p->db->mallo
f7a0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 cFailed ){. p
f7b0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f ->rc = SQLITE_NO
f7c0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 MEM;. }. close
f7d0: 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 AllCursors(p);.
f7e0: 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 if( p->magic!=V
f7f0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b DBE_MAGIC_RUN ){
f800: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 . return SQLI
f810: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 TE_OK;. }. che
f820: 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 ckActiveVdbeCnt(
f830: 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f db);.. /* No co
f840: 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b mmit or rollback
f850: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 needed if the p
f860: 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 rogram never sta
f870: 72 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 70 2d rted */. if( p-
f880: 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e >pc>=0 ){. in
f890: 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d t mrc; /* Prim
f8a0: 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 ary error code f
f8b0: 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 rom p->rc */.
f8c0: 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f int eStatementO
f8d0: 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 p = 0;. int i
f8e0: 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 sSpecialError;
f8f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 /* Set
f900: 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 to true if a 's
f910: 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f pecial' error */
f920: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c .. /* Lock al
f930: 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 l btrees used by
f940: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a the statement *
f950: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 /. sqlite3Vdb
f960: 65 4d 75 74 65 78 41 72 72 61 79 45 6e 74 65 72 eMutexArrayEnter
f970: 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 (p);.. /* Che
f980: 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 ck for one of th
f990: 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 e special errors
f9a0: 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d */. mrc = p-
f9b0: 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 >rc & 0xff;.
f9c0: 61 73 73 65 72 74 28 20 70 2d 3e 72 63 21 3d 53 assert( p->rc!=S
f9d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 QLITE_IOERR_BLOC
f9e0: 4b 45 44 20 29 3b 20 20 2f 2a 20 54 68 69 73 20 KED ); /* This
f9f0: 65 72 72 6f 72 20 6e 6f 20 6c 6f 6e 67 65 72 20 error no longer
fa00: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 73 exists */. is
fa10: 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d SpecialError = m
fa20: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d rc==SQLITE_NOMEM
fa30: 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f || mrc==SQLITE_
fa40: 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 IOERR.
fa50: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 || mr
fa60: 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 c==SQLITE_INTERR
fa70: 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 UPT || mrc==SQLI
fa80: 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 TE_FULL;. if(
fa90: 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 isSpecialError
faa0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 ){. /* If t
fab0: 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61 he query was rea
fac0: 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 d-only and the e
fad0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c rror code is SQL
fae0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a ITE_INTERRUPT, .
faf0: 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c ** no roll
fb00: 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72 back is necessar
fb10: 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74 y. Otherwise, at
fb20: 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69 least a savepoi
fb30: 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 nt . ** tra
fb40: 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 nsaction must be
fb50: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 rolled back to
fb60: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 restore the data
fb70: 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20 base to a .
fb80: 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 ** consistent s
fb90: 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 tate.. **.
fba0: 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 ** Even if
fbb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 the statement is
fbc0: 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 read-only, it i
fbd0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 s important to p
fbe0: 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 erform. **
fbf0: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 a statement or t
fc00: 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 ransaction rollb
fc10: 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 ack operation. I
fc20: 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20 f the error .
fc30: 20 20 20 2a 2a 20 6f 63 63 75 72 65 64 20 77 68 ** occured wh
fc40: 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 ile writing to t
fc50: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d he journal, sub-
fc60: 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 journal or datab
fc70: 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c ase. ** fil
fc80: 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 e as part of an
fc90: 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 effort to free u
fca0: 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28 73 p cache space (s
fcb0: 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 ee function.
fcc0: 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 ** pagerStress
fcd0: 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 () in pager.c),
fce0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 the rollback is
fcf0: 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 required to rest
fd00: 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 ore . ** th
fd10: 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e e pager to a con
fd20: 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 sistent state..
fd30: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
fd40: 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c ( !p->readOnly |
fd50: 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e | mrc!=SQLITE_IN
fd60: 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 TERRUPT ){.
fd70: 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c if( (mrc==SQL
fd80: 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 ITE_NOMEM || mrc
fd90: 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 ==SQLITE_FULL) &
fda0: 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 & p->usesStmtJou
fdb0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 rnal ){.
fdc0: 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d eStatementOp =
fdd0: 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 SAVEPOINT_ROLLB
fde0: 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c ACK;. }el
fdf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a se{. /*
fe00: 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 We are forced t
fe10: 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 o roll back the
fe20: 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 active transacti
fe30: 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 on. Before doing
fe40: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f . ** so
fe50: 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 , abort any othe
fe60: 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 r statements thi
fe70: 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 s handle current
fe80: 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 ly has active..
fe90: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 */.
fea0: 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 invalidate
feb0: 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 65 CursorsOnModifie
fec0: 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 20 dBtrees(db);.
fed0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f sqlite3Ro
fee0: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 llbackAll(db);.
fef0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
ff00: 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 CloseSavepoints(
ff10: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 db);. d
ff20: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 b->autoCommit =
ff30: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 1;. }.
ff40: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
ff50: 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d /* Check for imm
ff60: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b ediate foreign k
ff70: 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a ey violations. *
ff80: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d /. if( p->rc=
ff90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
ffa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 sqlite3VdbeC
ffb0: 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 heckFk(p, 0);.
ffc0: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 }. . /* If
ffd0: 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 the auto-commit
ffe0: 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 flag is set and
fff0: 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c this is the onl
10000 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72 20 y active writer
10010 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e . ** VM, then
10020 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 we do either a
10030 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 commit or rollba
10040 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e ck of the curren
10050 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a t transaction. .
10060 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f **. ** No
10070 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 te: This block a
10080 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 lso runs if one
10090 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 of the special e
100a0 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 rrors handled .
100b0 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 ** above has
100c0 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a occurred. . *
100d0 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 /. if( !sqlit
100e0 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 e3VtabInSync(db)
100f0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 . && db->au
10100 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 toCommit . &
10110 26 20 64 62 2d 3e 77 72 69 74 65 56 64 62 65 43 & db->writeVdbeC
10120 6e 74 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 nt==(p->readOnly
10130 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 ==0) . ){.
10140 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 if( p->rc==SQ
10150 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 LITE_OK || (p->e
10160 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 rrorAction==OE_F
10170 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 ail && !isSpecia
10180 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 lError) ){.
10190 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 rc = sqlite3V
101a0 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 dbeCheckFk(p, 1)
101b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 ;. if( rc
101c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
101d0 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 if( NEV
101e0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 ER(p->readOnly)
101f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 ){. s
10200 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 78 qlite3BtreeMutex
10210 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e 61 ArrayLeave(&p->a
10220 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 Mutex);.
10230 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
10240 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 E_ERROR;.
10250 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 }. r
10260 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 c = SQLITE_CONST
10270 52 41 49 4e 54 3b 0a 20 20 20 20 20 20 20 20 7d RAINT;. }
10280 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 else{ .
10290 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d /* The auto-com
102a0 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 mit flag is true
102b0 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 , the vdbe progr
102c0 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 am was successfu
102d0 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 l . **
102e0 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 or hit an 'OR FA
102f0 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 IL' constraint a
10300 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 nd there are no
10310 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e deferred foreign
10320 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 . ** ke
10330 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f y constraints to
10340 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 hold up the tra
10350 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d nsaction. This m
10360 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 eans a commit .
10370 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 ** is r
10380 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 equired. */.
10390 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 rc = vdbeC
103a0 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 ommit(db, p);.
103b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
103c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 if( rc==SQLITE_B
103d0 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e USY && p->readOn
103e0 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 ly ){.
103f0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 75 74 65 sqlite3BtreeMute
10400 78 41 72 72 61 79 4c 65 61 76 65 28 26 70 2d 3e xArrayLeave(&p->
10410 61 4d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 aMutex);.
10420 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
10430 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d _BUSY;. }
10440 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c else if( rc!=SQL
10450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
10460 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a p->rc = rc;.
10470 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
10480 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3RollbackAll(db)
10490 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
104a0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e . db->n
104b0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 DeferredCons = 0
104c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 ;. sqli
104d0 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 te3CommitInterna
104e0 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 lChanges(db);.
104f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 }. }e
10500 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c lse{. sql
10510 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 ite3RollbackAll(
10520 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 db);. }.
10530 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e db->nStatemen
10540 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 t = 0;. }else
10550 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f if( eStatementO
10560 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 p==0 ){. if
10570 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
10580 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 OK || p->errorAc
10590 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b tion==OE_Fail ){
105a0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d . eStatem
105b0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e entOp = SAVEPOIN
105c0 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 T_RELEASE;.
105d0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 }else if( p->er
105e0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 rorAction==OE_Ab
105f0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 ort ){. e
10600 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 StatementOp = SA
10610 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b VEPOINT_ROLLBACK
10620 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
10630 20 20 20 20 20 20 20 69 6e 76 61 6c 69 64 61 74 invalidat
10640 65 43 75 72 73 6f 72 73 4f 6e 4d 6f 64 69 66 69 eCursorsOnModifi
10650 65 64 42 74 72 65 65 73 28 64 62 29 3b 0a 20 20 edBtrees(db);.
10660 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c sqlite3Rol
10670 6c 62 61 63 6b 41 6c 6c 28 64 62 29 3b 0a 20 20 lbackAll(db);.
10680 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f sqlite3Clo
10690 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 seSavepoints(db)
106a0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 ;. db->au
106b0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 toCommit = 1;.
106c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 }. }. .
106d0 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d /* If eStatem
106e0 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 entOp is non-zer
106f0 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d o, then a statem
10700 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ent transaction
10710 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 needs to. **
10720 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 be committed or
10730 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c rolled back. Cal
10740 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f l sqlite3VdbeClo
10750 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f seStatement() to
10760 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 . ** do so. I
10770 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e f this operation
10780 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f returns an erro
10790 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 r, and the curre
107a0 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 nt statement.
107b0 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 ** error code i
107c0 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 s SQLITE_OK or S
107d0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
107e0 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 , then promote t
107f0 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e he. ** curren
10800 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f t statement erro
10810 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2a 0a 20 r code.. **.
10820 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 ** Note that
10830 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 sqlite3VdbeClose
10840 53 74 61 74 65 6d 65 6e 74 28 29 20 63 61 6e 20 Statement() can
10850 6f 6e 6c 79 20 66 61 69 6c 20 69 66 20 65 53 74 only fail if eSt
10860 61 74 65 6d 65 6e 74 4f 70 0a 20 20 20 20 2a 2a atementOp. **
10870 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f is SAVEPOINT_RO
10880 4c 4c 42 41 43 4b 2e 20 20 42 75 74 20 69 66 20 LLBACK. But if
10890 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b p->rc==SQLITE_OK
108a0 20 74 68 65 6e 20 65 53 74 61 74 65 6d 65 6e 74 then eStatement
108b0 4f 70 0a 20 20 20 20 2a 2a 20 6d 75 73 74 20 62 Op. ** must b
108c0 65 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 e SAVEPOINT_RELE
108d0 41 53 45 2e 20 20 48 65 6e 63 65 20 74 68 65 20 ASE. Hence the
108e0 4e 45 56 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c NEVER(p->rc==SQL
108f0 49 54 45 5f 4f 4b 29 20 69 6e 20 0a 20 20 20 20 ITE_OK) in .
10900 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** the following
10910 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 code.. */.
10920 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 if( eStatement
10930 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d Op ){. rc =
10940 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 sqlite3VdbeClos
10950 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 eStatement(p, eS
10960 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 tatementOp);.
10970 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 if( rc ){.
10980 20 20 20 20 20 61 73 73 65 72 74 28 20 65 53 74 assert( eSt
10990 61 74 65 6d 65 6e 74 4f 70 3d 3d 53 41 56 45 50 atementOp==SAVEP
109a0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b OINT_ROLLBACK );
109b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 . if( NEV
109c0 45 52 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 ER(p->rc==SQLITE
109d0 5f 4f 4b 29 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 _OK) || p->rc==S
109e0 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 QLITE_CONSTRAINT
109f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d ){. p-
10a00 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 >rc = rc;.
10a10 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 sqlite3DbFre
10a20 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 e(db, p->zErrMsg
10a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e );. p->
10a40 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 zErrMsg = 0;.
10a50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
10a60 6e 76 61 6c 69 64 61 74 65 43 75 72 73 6f 72 73 nvalidateCursors
10a70 4f 6e 4d 6f 64 69 66 69 65 64 42 74 72 65 65 73 OnModifiedBtrees
10a80 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 (db);. sq
10a90 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c lite3RollbackAll
10aa0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 73 71 (db);. sq
10ab0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f lite3CloseSavepo
10ac0 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 ints(db);.
10ad0 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 db->autoCommit
10ae0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 1;. }.
10af0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 }. . /* If
10b00 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 this was an INS
10b10 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 ERT, UPDATE or D
10b20 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 ELETE and no sta
10b30 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 tement transacti
10b40 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 on. ** has be
10b50 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 en rolled back,
10b60 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 update the datab
10b70 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 ase connection c
10b80 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a hange-counter. .
10b90 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 */. if( p
10ba0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b ->changeCntOn ){
10bb0 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 . if( eStat
10bc0 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 ementOp!=SAVEPOI
10bd0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 NT_ROLLBACK ){.
10be0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
10bf0 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c beSetChanges(db,
10c00 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 p->nChange);.
10c10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
10c20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 sqlite3VdbeSe
10c30 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b tChanges(db, 0);
10c40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 . }. p
10c50 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 ->nChange = 0;.
10c60 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 }. . /* R
10c70 6f 6c 6c 62 61 63 6b 20 6f 72 20 63 6f 6d 6d 69 ollback or commi
10c80 74 20 61 6e 79 20 73 63 68 65 6d 61 20 63 68 61 t any schema cha
10c90 6e 67 65 73 20 74 68 61 74 20 6f 63 63 75 72 72 nges that occurr
10ca0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 ed. */. if( p
10cb0 2d 3e 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ->rc!=SQLITE_OK
10cc0 26 26 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c && db->flags&SQL
10cd0 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 ITE_InternChange
10ce0 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 s ){. sqlit
10cf0 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 e3ResetInternalS
10d00 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20 20 chema(db, 0);.
10d10 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 3d 20 db->flags =
10d20 28 64 62 2d 3e 66 6c 61 67 73 20 7c 20 53 51 4c (db->flags | SQL
10d30 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 ITE_InternChange
10d40 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f s);. }.. /
10d50 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f * Release the lo
10d60 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 cks */. sqlit
10d70 65 33 42 74 72 65 65 4d 75 74 65 78 41 72 72 61 e3BtreeMutexArra
10d80 79 4c 65 61 76 65 28 26 70 2d 3e 61 4d 75 74 65 yLeave(&p->aMute
10d90 78 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 x);. }.. /* We
10da0 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c have successful
10db0 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c ly halted and cl
10dc0 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 osed the VM. Re
10dd0 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 cord this fact.
10de0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d */. if( p->pc>=
10df0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 61 63 74 0 ){. db->act
10e00 69 76 65 56 64 62 65 43 6e 74 2d 2d 3b 0a 20 20 iveVdbeCnt--;.
10e10 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e if( !p->readOn
10e20 6c 79 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e ly ){. db->
10e30 77 72 69 74 65 56 64 62 65 43 6e 74 2d 2d 3b 0a writeVdbeCnt--;.
10e40 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 }. assert
10e50 28 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 ( db->activeVdbe
10e60 43 6e 74 3e 3d 64 62 2d 3e 77 72 69 74 65 56 64 Cnt>=db->writeVd
10e70 62 65 43 6e 74 20 29 3b 0a 20 20 7d 0a 20 20 70 beCnt );. }. p
10e80 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d ->magic = VDBE_M
10e90 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 AGIC_HALT;. che
10ea0 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 ckActiveVdbeCnt(
10eb0 64 62 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 db);. if( p->db
10ec0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
10ed0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 {. p->rc = SQ
10ee0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a LITE_NOMEM;. }.
10ef0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 . /* If the aut
10f00 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 o-commit flag is
10f10 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 set to true, th
10f20 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 en any locks tha
10f30 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a t were held. **
10f40 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 by connection d
10f50 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 b have now been
10f60 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 released. Call s
10f70 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e qlite3Connection
10f80 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a Unlocked() . **
10f90 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 to invoke any r
10fa0 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e equired unlock-n
10fb0 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e otify callbacks.
10fc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e . */. if( db->
10fd0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 autoCommit ){.
10fe0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 sqlite3Connect
10ff0 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b ionUnlocked(db);
11000 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 . }.. assert(
11010 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e db->activeVdbeCn
11020 74 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 t>0 || db->autoC
11030 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e ommit==0 || db->
11040 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b nStatement==0 );
11050 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 . return (p->rc
11060 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 ==SQLITE_BUSY ?
11070 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 SQLITE_BUSY : SQ
11080 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a LITE_OK);.}.../*
11090 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f .** Each VDBE ho
110a0 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f lds the result o
110b0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e f the most recen
110c0 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 t sqlite3_step()
110d0 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 call.** in p->r
110e0 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 c. This routine
110f0 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c sets that resul
11100 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 t back to SQLITE
11110 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c _OK..*/.void sql
11120 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 ite3VdbeResetSte
11130 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 pResult(Vdbe *p)
11140 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 {. p->rc = SQLI
11150 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
11160 43 6c 65 61 6e 20 75 70 20 61 20 56 44 42 45 20 Clean up a VDBE
11170 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 after execution
11180 62 75 74 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 but do not delet
11190 65 20 74 68 65 20 56 44 42 45 20 6a 75 73 74 20 e the VDBE just
111a0 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e yet..** Write an
111b0 79 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 y error messages
111c0 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e into *pzErrMsg.
111d0 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 Return the res
111e0 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 ult code..**.**
111f0 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 After this routi
11200 6e 65 20 69 73 20 72 75 6e 2c 20 74 68 65 20 56 ne is run, the V
11210 44 42 45 20 73 68 6f 75 6c 64 20 62 65 20 72 65 DBE should be re
11220 61 64 79 20 74 6f 20 62 65 20 65 78 65 63 75 74 ady to be execut
11230 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a ed.** again..**.
11240 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 ** To look at it
11250 20 61 6e 6f 74 68 65 72 20 77 61 79 2c 20 74 68 another way, th
11260 69 73 20 72 6f 75 74 69 6e 65 20 72 65 73 65 74 is routine reset
11270 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 s the state of t
11280 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 he.** virtual ma
11290 63 68 69 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f chine from VDBE_
112a0 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 MAGIC_RUN or VDB
112b0 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 62 61 63 E_MAGIC_HALT bac
112c0 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 k to.** VDBE_MAG
112d0 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 IC_INIT..*/.int
112e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 sqlite3VdbeReset
112f0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c (Vdbe *p){. sql
11300 69 74 65 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d ite3 *db;. db =
11310 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 p->db;.. /* If
11320 20 74 68 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 the VM did not
11330 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f run to completio
11340 6e 20 6f 72 20 69 66 20 69 74 20 65 6e 63 6f 75 n or if it encou
11350 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 ntered an. ** e
11360 72 72 6f 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 rror, then it mi
11370 67 68 74 20 6e 6f 74 20 68 61 76 65 20 62 65 65 ght not have bee
11380 6e 20 68 61 6c 74 65 64 20 70 72 6f 70 65 72 6c n halted properl
11390 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a y. So halt. **
113a0 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 it now.. */.
113b0 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 sqlite3VdbeHalt(
113c0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 p);.. /* If the
113d0 20 56 44 42 45 20 68 61 73 20 62 65 20 72 75 6e VDBE has be run
113e0 20 65 76 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c even partially,
113f0 20 74 68 65 6e 20 74 72 61 6e 73 66 65 72 20 74 then transfer t
11400 68 65 20 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 he error code.
11410 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 ** and error mes
11420 73 61 67 65 20 66 72 6f 6d 20 74 68 65 20 56 44 sage from the VD
11430 42 45 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e BE into the main
11440 20 64 61 74 61 62 61 73 65 20 73 74 72 75 63 74 database struct
11450 75 72 65 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 ure. But. ** i
11460 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 6a f the VDBE has j
11470 75 73 74 20 62 65 65 6e 20 73 65 74 20 74 6f 20 ust been set to
11480 72 75 6e 20 62 75 74 20 68 61 73 20 6e 6f 74 20 run but has not
11490 61 63 74 75 61 6c 6c 79 20 65 78 65 63 75 74 65 actually execute
114a0 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 d any. ** instr
114b0 75 63 74 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 uctions yet, lea
114c0 76 65 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 ve the main data
114d0 62 61 73 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 base error infor
114e0 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 mation unchanged
114f0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e .. */. if( p->
11500 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 pc>=0 ){. if(
11510 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 p->zErrMsg ){.
11520 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 sqlite3Begi
11530 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b nBenignMalloc();
11540 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 . sqlite3Va
11550 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 lueSetStr(db->pE
11560 72 72 2c 2d 31 2c 70 2d 3e 7a 45 72 72 4d 73 67 rr,-1,p->zErrMsg
11570 2c 53 51 4c 49 54 45 5f 55 54 46 38 2c 53 51 4c ,SQLITE_UTF8,SQL
11580 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a ITE_TRANSIENT);.
11590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 sqlite3End
115a0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a BenignMalloc();.
115b0 20 20 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 db->errCod
115c0 65 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 20 20 20 e = p->rc;.
115d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
115e0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a b, p->zErrMsg);.
115f0 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 p->zErrMsg
11600 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 = 0;. }else
11610 69 66 28 20 70 2d 3e 72 63 20 29 7b 0a 20 20 20 if( p->rc ){.
11620 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 sqlite3Error(
11630 64 62 2c 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 db, p->rc, 0);.
11640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
11650 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c sqlite3Error(db,
11660 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a SQLITE_OK, 0);.
11670 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d }. if( p-
11680 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 >runOnlyOnce ) p
11690 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 ->expired = 1;.
116a0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 }else if( p->rc
116b0 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 && p->expired )
116c0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 {. /* The exp
116d0 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 ired flag was se
116e0 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 t on the VDBE be
116f0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 fore the first c
11700 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 all. ** to sq
11710 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f lite3_step(). Fo
11720 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 r consistency (s
11730 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 ince sqlite3_ste
11740 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 p() was. ** c
11750 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 alled), set the
11760 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 database error i
11770 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 n this case as w
11780 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ell.. */.
11790 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c sqlite3Error(db,
117a0 20 70 2d 3e 72 63 2c 20 30 29 3b 0a 20 20 20 20 p->rc, 0);.
117b0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 sqlite3ValueSetS
117c0 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c tr(db->pErr, -1,
117d0 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c p->zErrMsg, SQL
117e0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 ITE_UTF8, SQLITE
117f0 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 _TRANSIENT);.
11800 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
11810 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a b, p->zErrMsg);.
11820 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d p->zErrMsg =
11830 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 0;. }.. /* Re
11840 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 claim all memory
11850 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 used by the VDB
11860 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 E. */. Cleanup
11870 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 (p);.. /* Save
11880 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d profiling inform
11890 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 ation from this
118a0 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 VDBE run.. */.#
118b0 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 ifdef VDBE_PROFI
118c0 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 LE. {. FILE
118d0 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 *out = fopen("vd
118e0 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c be_profile.out",
118f0 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f "a");. if( o
11900 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 ut ){. int
11910 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 i;. fprintf
11920 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a (out, "---- ");.
11930 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 for(i=0; i
11940 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 <p->nOp; i++){.
11950 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f fprintf(o
11960 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 ut, "%02x", p->a
11970 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 Op[i].opcode);.
11980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 }. fpr
11990 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b intf(out, "\n");
119a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 . for(i=0;
119b0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a i<p->nOp; i++){.
119c0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 fprintf(
119d0 6f 75 74 2c 20 22 25 36 64 20 25 31 30 6c 6c 64 out, "%6d %10lld
119e0 20 25 38 6c 6c 64 20 22 2c 0a 20 20 20 20 20 20 %8lld ",.
119f0 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 p->aOp[i].c
11a00 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 nt,. p
11a10 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c ->aOp[i].cycles,
11a20 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 . p->a
11a30 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d Op[i].cnt>0 ? p-
11a40 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 >aOp[i].cycles/p
11a50 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 ->aOp[i].cnt : 0
11a60 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 . );.
11a70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 sqlite3VdbeP
11a80 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 rintOp(out, i, &
11a90 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 p->aOp[i]);.
11aa0 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 }. fclose
11ab0 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d (out);. }. }
11ac0 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 6d 61 67 .#endif. p->mag
11ad0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f ic = VDBE_MAGIC_
11ae0 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20 70 INIT;. return p
11af0 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d 61 ->rc & db->errMa
11b00 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c sk;.}. ./*.** Cl
11b10 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65 74 ean up and delet
11b20 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65 e a VDBE after e
11b30 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75 72 xecution. Retur
11b40 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 n an integer whi
11b50 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65 73 ch is.** the res
11b60 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74 65 ult code. Write
11b70 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61 any error messa
11b80 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70 7a ge text into *pz
11b90 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 ErrMsg..*/.int s
11ba0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c 69 qlite3VdbeFinali
11bb0 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 ze(Vdbe *p){. i
11bc0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
11bd0 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 K;. if( p->magi
11be0 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 c==VDBE_MAGIC_RU
11bf0 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 N || p->magic==V
11c00 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 29 DBE_MAGIC_HALT )
11c10 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 {. rc = sqlit
11c20 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b 0a e3VdbeReset(p);.
11c30 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63 20 assert( (rc
11c40 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73 6b & p->db->errMask
11c50 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20 73 )==rc );. }. s
11c60 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
11c70 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 (p);. return rc
11c80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 ;.}../*.** Call
11c90 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 the destructor f
11ca0 6f 72 20 65 61 63 68 20 61 75 78 64 61 74 61 20 or each auxdata
11cb0 65 6e 74 72 79 20 69 6e 20 70 56 64 62 65 46 75 entry in pVdbeFu
11cc0 6e 63 20 66 6f 72 20 77 68 69 63 68 0a 2a 2a 20 nc for which.**
11cd0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e the correspondin
11ce0 67 20 62 69 74 20 69 6e 20 6d 61 73 6b 20 69 73 g bit in mask is
11cf0 20 63 6c 65 61 72 2e 20 20 41 75 78 64 61 74 61 clear. Auxdata
11d00 20 65 6e 74 72 69 65 73 20 62 65 79 6f 6e 64 20 entries beyond
11d10 33 31 0a 2a 2a 20 61 72 65 20 61 6c 77 61 79 73 31.** are always
11d20 20 64 65 73 74 72 6f 79 65 64 2e 20 20 54 6f 20 destroyed. To
11d30 64 65 73 74 72 6f 79 20 61 6c 6c 20 61 75 78 64 destroy all auxd
11d40 61 74 61 20 65 6e 74 72 69 65 73 2c 20 63 61 6c ata entries, cal
11d50 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e l this.** routin
11d60 65 20 77 69 74 68 20 6d 61 73 6b 3d 3d 30 2e 0a e with mask==0..
11d70 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
11d80 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 dbeDeleteAuxData
11d90 28 56 64 62 65 46 75 6e 63 20 2a 70 56 64 62 65 (VdbeFunc *pVdbe
11da0 46 75 6e 63 2c 20 69 6e 74 20 6d 61 73 6b 29 7b Func, int mask){
11db0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 . int i;. for(
11dc0 69 3d 30 3b 20 69 3c 70 56 64 62 65 46 75 6e 63 i=0; i<pVdbeFunc
11dd0 2d 3e 6e 41 75 78 3b 20 69 2b 2b 29 7b 0a 20 20 ->nAux; i++){.
11de0 20 20 73 74 72 75 63 74 20 41 75 78 44 61 74 61 struct AuxData
11df0 20 2a 70 41 75 78 20 3d 20 26 70 56 64 62 65 46 *pAux = &pVdbeF
11e00 75 6e 63 2d 3e 61 70 41 75 78 5b 69 5d 3b 0a 20 unc->apAux[i];.
11e10 20 20 20 69 66 28 20 28 69 3e 33 31 20 7c 7c 20 if( (i>31 ||
11e20 21 28 6d 61 73 6b 26 28 28 28 75 33 32 29 31 29 !(mask&(((u32)1)
11e30 3c 3c 69 29 29 29 20 26 26 20 70 41 75 78 2d 3e <<i))) && pAux->
11e40 70 41 75 78 20 29 7b 0a 20 20 20 20 20 20 69 66 pAux ){. if
11e50 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 ( pAux->xDelete
11e60 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d ){. pAux-
11e70 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 >xDelete(pAux->p
11e80 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 Aux);. }.
11e90 20 20 20 20 70 41 75 78 2d 3e 70 41 75 78 20 3d pAux->pAux =
11ea0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0;. }. }.}.
11eb0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 ./*.** Free all
11ec0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 memory associate
11ed0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 d with the Vdbe
11ee0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 passed as the se
11ef0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a cond argument..*
11f00 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 * The difference
11f10 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 between this fu
11f20 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 nction and sqlit
11f30 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 e3VdbeDelete() i
11f40 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 s that.** VdbeDe
11f50 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 lete() also unli
11f60 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f nks the Vdbe fro
11f70 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d m the list of VM
11f80 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 s associated wit
11f90 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 h.** the databas
11fa0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f e connection..*/
11fb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
11fc0 65 44 65 6c 65 74 65 4f 62 6a 65 63 74 28 73 71 eDeleteObject(sq
11fd0 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 lite3 *db, Vdbe
11fe0 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 *p){. SubProgra
11ff0 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b m *pSub, *pNext;
12000 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 . assert( p->db
12010 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 ==0 || p->db==db
12020 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d );. releaseMem
12030 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 Array(p->aVar, p
12040 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 ->nVar);. relea
12050 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 seMemArray(p->aC
12060 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 olName, p->nResC
12070 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 olumn*COLNAME_N)
12080 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e ;. for(pSub=p->
12090 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 pProgram; pSub;
120a0 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 pSub=pNext){.
120b0 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 pNext = pSub->p
120c0 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 Next;. vdbeFr
120d0 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 eeOpArray(db, pS
120e0 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e ub->aOp, pSub->n
120f0 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 Op);. sqlite3
12100 44 62 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 DbFree(db, pSub)
12110 3b 0a 20 20 7d 0a 20 20 76 64 62 65 46 72 65 65 ;. }. vdbeFree
12120 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e 61 OpArray(db, p->a
12130 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 Op, p->nOp);. s
12140 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
12150 20 70 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 73 p->aLabel);. s
12160 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
12170 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 p->aColName);.
12180 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
12190 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 b, p->zSql);. s
121a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
121b0 20 70 2d 3e 70 46 72 65 65 29 3b 0a 20 20 73 71 p->pFree);. sq
121c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
121d0 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c p);.}../*.** Del
121e0 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 ete an entire VD
121f0 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 BE..*/.void sqli
12200 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 te3VdbeDelete(Vd
12210 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 be *p){. sqlite
12220 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 3 *db;.. if( NE
12230 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 VER(p==0) ) retu
12240 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 rn;. db = p->db
12250 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 ;. if( p->pPrev
12260 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 ){. p->pPrev
12270 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 ->pNext = p->pNe
12280 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 xt;. }else{.
12290 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 assert( db->pVd
122a0 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d be==p );. db-
122b0 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 >pVdbe = p->pNex
122c0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e t;. }. if( p->
122d0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e pNext ){. p->
122e0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 pNext->pPrev = p
122f0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 ->pPrev;. }. p
12300 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d ->magic = VDBE_M
12310 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e AGIC_DEAD;. p->
12320 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 db = 0;. sqlite
12330 33 56 64 62 65 44 65 6c 65 74 65 4f 62 6a 65 63 3VdbeDeleteObjec
12340 74 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a t(db, p);.}../*.
12350 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 ** Make sure the
12360 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 cursor p is rea
12370 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 dy to read or wr
12380 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 ite the row to w
12390 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c hich it.** was l
123a0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 ast positioned.
123b0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 Return an error
123c0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 code if an OOM
123d0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 fault or I/O err
123e0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 or.** prevents u
123f0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 s from positioni
12400 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f ng the cursor to
12410 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 its correct pos
12420 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ition..**.** If
12430 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 a MoveTo operati
12440 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e on is pending on
12450 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f the given curso
12460 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a r, then do that.
12470 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 ** MoveTo now.
12480 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 If no move is pe
12490 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 nding, check to
124a0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 see if the row h
124b0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 as been.** delet
124c0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 ed out from unde
124d0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 r the cursor and
124e0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b if it has, mark
124f0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 the row as.** a
12500 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a NULL row..**.**
12510 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 If the cursor i
12520 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 s already pointi
12530 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 ng to the correc
12540 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 t row and that r
12550 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 ow has.** not be
12560 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 en deleted out f
12570 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 rom under the cu
12580 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 rsor, then this
12590 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d routine is a no-
125a0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 op..*/.int sqlit
125b0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 e3VdbeCursorMove
125c0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 to(VdbeCursor *p
125d0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65 66 65 ){. if( p->defe
125e0 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 rredMoveto ){.
125f0 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 int res, rc;.#
12600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 ifdef SQLITE_TES
12610 54 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 T. extern int
12620 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f sqlite3_search_
12630 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 count;.#endif.
12640 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 assert( p->isT
12650 61 62 6c 65 20 29 3b 0a 20 20 20 20 72 63 20 3d able );. rc =
12660 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 sqlite3BtreeMov
12670 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 70 etoUnpacked(p->p
12680 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f Cursor, 0, p->mo
12690 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 vetoTarget, 0, &
126a0 72 65 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 res);. if( rc
126b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 ) return rc;.
126c0 20 20 70 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d p->lastRowid =
126d0 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 p->movetoTarget
126e0 3b 0a 20 20 20 20 69 66 28 20 72 65 73 21 3d 30 ;. if( res!=0
126f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 ) return SQLITE
12700 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 _CORRUPT_BKPT;.
12710 20 20 20 70 2d 3e 72 6f 77 69 64 49 73 56 61 6c p->rowidIsVal
12720 69 64 20 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 id = 1;.#ifdef S
12730 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 20 20 73 QLITE_TEST. s
12740 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f qlite3_search_co
12750 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 unt++;.#endif.
12760 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 p->deferredMov
12770 65 74 6f 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e eto = 0;. p->
12780 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 cacheStatus = CA
12790 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 7d 65 6c CHE_STALE;. }el
127a0 73 65 20 69 66 28 20 41 4c 57 41 59 53 28 70 2d se if( ALWAYS(p-
127b0 3e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 >pCursor) ){.
127c0 20 69 6e 74 20 68 61 73 4d 6f 76 65 64 3b 0a 20 int hasMoved;.
127d0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 int rc = sqli
127e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 te3BtreeCursorHa
127f0 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f sMoved(p->pCurso
12800 72 2c 20 26 68 61 73 4d 6f 76 65 64 29 3b 0a 20 r, &hasMoved);.
12810 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 if( rc ) retu
12820 72 6e 20 72 63 3b 0a 20 20 20 20 69 66 28 20 68 rn rc;. if( h
12830 61 73 4d 6f 76 65 64 20 29 7b 0a 20 20 20 20 20 asMoved ){.
12840 20 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 p->cacheStatus
12850 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 = CACHE_STALE;.
12860 20 20 20 20 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 p->nullRow
12870 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 = 1;. }. }.
12880 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
12890 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 K;.}../*.** The
128a0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 following functi
128b0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 ons:.**.** sqlit
128c0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
128d0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 ().** sqlite3Vdb
128e0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 eSerialTypeLen()
128f0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 .** sqlite3VdbeS
12900 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 erialLen().** sq
12910 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 lite3VdbeSerialP
12920 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 ut().** sqlite3V
12930 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a dbeSerialGet().*
12940 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 *.** encapsulate
12950 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73 the code that s
12960 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 erializes values
12970 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20 for storage in
12980 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 SQLite.** data a
12990 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 nd index records
129a0 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65 . Each serialize
129b0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 d value consists
129c0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c of a.** 'serial
129d0 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f -type' and a blo
129e0 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73 b of data. The s
129f0 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e erial type is an
12a00 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64 8-byte unsigned
12a10 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f .** integer, sto
12a20 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e red as a varint.
12a30 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c .**.** In an SQL
12a40 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 ite index record
12a50 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 , the serial typ
12a60 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65 e is stored dire
12a70 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 ctly before.** t
12a80 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 he blob of data
12a90 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f that it correspo
12aa0 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 nds to. In a tab
12ab0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 le record, all s
12ac0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 erial.** types a
12ad0 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 re stored at the
12ae0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65 start of the re
12af0 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c cord, and the bl
12b00 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a obs of data at.*
12b10 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 * the end. Hence
12b20 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 these functions
12b30 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 allow the calle
12b40 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a r to handle the.
12b50 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61 ** serial-type a
12b60 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70 nd data blob sep
12b70 65 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 erately..**.** T
12b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 he following tab
12b90 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 le describes the
12ba0 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65 various storage
12bb0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74 classes for dat
12bc0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 a:.**.** seria
12bd0 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79 l type by
12be0 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20 tes of data
12bf0 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d type.** -----
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d --------- --
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 -------------
12c20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
12c30 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20 .** 0
12c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
12c50 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c NULL
12c60 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20 .** 1
12c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 1
12c80 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e sign
12c90 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 ed integer.**
12ca0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 2
12cb0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20 2
12cc0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 signed int
12cd0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 eger.** 3
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12cf0 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 3
12d00 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a signed integer.*
12d10 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 * 4
12d20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20 4
12d30 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 signed
12d40 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 integer.**
12d50 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5
12d60 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 6
12d70 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 signed integ
12d80 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20 er.** 6
12d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12da0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69 8 si
12db0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 gned integer.**
12dc0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20 7
12dd0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 8
12de0 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f IEEE flo
12df0 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20 at.** 8
12e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e10 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 0 In
12e20 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 teger constant 0
12e30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20 .** 9
12e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0
12e50 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 Inte
12e60 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a ger constant 1.*
12e70 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20 * 10,11
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12e90 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76 reserv
12ea0 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e ed for expansion
12eb0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 .** N>=12 and
12ec0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 even (N-1
12ed0 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42 2)/2 BLOB
12ee0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 .** N>=13 and
12ef0 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31 odd (N-1
12f00 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74 3)/2 text
12f10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 .**.** The 8 and
12f20 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64 9 types were ad
12f30 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 ded in 3.3.0, fi
12f40 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 le format 4. Pr
12f50 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 ior versions.**
12f60 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e of SQLite will n
12f70 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 ot understand th
12f80 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 ose serial types
12f90 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 ..*/../*.** Retu
12fa0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79 rn the serial-ty
12fb0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 pe for the value
12fc0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e stored in pMem.
12fd0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 .*/.u32 sqlite3V
12fe0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65 dbeSerialType(Me
12ff0 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c m *pMem, int fil
13000 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e 74 e_format){. int
13010 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 flags = pMem->f
13020 6c 61 67 73 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a lags;. int n;..
13030 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f if( flags&MEM_
13040 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 Null ){. retu
13050 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 rn 0;. }. if(
13060 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b flags&MEM_Int ){
13070 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f . /* Figure o
13080 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 ut whether to us
13090 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 e 1, 2, 4, 6 or
130a0 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 8 bytes. */.#
130b0 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 define MAX_6BYTE
130c0 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 ((((i64)0x00008
130d0 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 000)<<32)-1).
130e0 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 i64 i = pMem->u
130f0 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 .i;. u64 u;.
13100 20 20 20 69 66 28 20 66 69 6c 65 5f 66 6f 72 6d if( file_form
13110 61 74 3e 3d 34 20 26 26 20 28 69 26 31 29 3d 3d at>=4 && (i&1)==
13120 69 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 i ){. retur
13130 6e 20 38 2b 28 75 33 32 29 69 3b 0a 20 20 20 20 n 8+(u32)i;.
13140 7d 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b }. if( i<0 ){
13150 0a 20 20 20 20 20 20 69 66 28 20 69 3c 28 2d 4d . if( i<(-M
13160 41 58 5f 36 42 59 54 45 29 20 29 20 72 65 74 75 AX_6BYTE) ) retu
13170 72 6e 20 36 3b 0a 20 20 20 20 20 20 2f 2a 20 50 rn 6;. /* P
13180 72 65 76 69 6f 75 73 20 74 65 73 74 20 70 72 65 revious test pre
13190 76 65 6e 74 73 3a 20 20 75 20 3d 20 2d 28 2d 39 vents: u = -(-9
131a0 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 2233720368547758
131b0 30 38 29 20 2a 2f 0a 20 20 20 20 20 20 75 20 3d 08) */. u =
131c0 20 2d 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a -i;. }else{.
131d0 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 u = i;.
131e0 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 }. if( u<=12
131f0 37 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7 ) return 1;.
13200 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 if( u<=32767 )
13210 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 return 2;. i
13220 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 f( u<=8388607 )
13230 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 return 3;. if
13240 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 ( u<=2147483647
13250 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 ) return 4;.
13260 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 if( u<=MAX_6BYTE
13270 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 ) return 5;.
13280 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 return 6;. }.
13290 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 if( flags&MEM_R
132a0 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 eal ){. retur
132b0 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 n 7;. }. asser
132c0 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c t( pMem->db->mal
132d0 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 locFailed || fla
132e0 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f gs&(MEM_Str|MEM_
132f0 42 6c 6f 62 29 20 29 3b 0a 20 20 6e 20 3d 20 70 Blob) );. n = p
13300 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c Mem->n;. if( fl
13310 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 ags & MEM_Zero )
13320 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d {. n += pMem-
13330 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 >u.nZero;. }.
13340 61 73 73 65 72 74 28 20 6e 3e 3d 30 20 29 3b 0a assert( n>=0 );.
13350 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 return ((n*2)
13360 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d + 12 + ((flags&M
13370 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a EM_Str)!=0));.}.
13380 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 ./*.** Return th
13390 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 e length of the
133a0 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 data correspondi
133b0 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 ng to the suppli
133c0 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a ed serial-type..
133d0 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 */.u32 sqlite3Vd
133e0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
133f0 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 u32 serial_type)
13400 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 {. if( serial_t
13410 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 72 ype>=12 ){. r
13420 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 eturn (serial_ty
13430 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 pe-12)/2;. }els
13440 65 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f e{. static co
13450 6e 73 74 20 75 38 20 61 53 69 7a 65 5b 5d 20 3d nst u8 aSize[] =
13460 20 7b 20 30 2c 20 31 2c 20 32 2c 20 33 2c 20 34 { 0, 1, 2, 3, 4
13470 2c 20 36 2c 20 38 2c 20 38 2c 20 30 2c 20 30 2c , 6, 8, 8, 0, 0,
13480 20 30 2c 20 30 20 7d 3b 0a 20 20 20 20 72 65 74 0, 0 };. ret
13490 75 72 6e 20 61 53 69 7a 65 5b 73 65 72 69 61 6c urn aSize[serial
134a0 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f _type];. }.}../
134b0 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f *.** If we are o
134c0 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 n an architectur
134d0 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 e with mixed-end
134e0 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a ian floating .**
134f0 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d points (ex: ARM
13500 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 7) then swap the
13510 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 lower 4 bytes w
13520 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 ith the .** uppe
13530 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 r 4 bytes. Retu
13540 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a rn the result..*
13550 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 *.** For most ar
13560 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 chitectures, thi
13570 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a s is a no-op..**
13580 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 .** (later): It
13590 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 is reported to
135a0 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 me that the mixe
135b0 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d d-endian problem
135c0 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 .** on ARM7 is a
135d0 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 43 n issue with GCC
135e0 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 , not with the A
135f0 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 RM7 chip. It se
13600 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c ems.** that earl
13610 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 y versions of GC
13620 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f C stored the two
13630 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 words of a 64-b
13640 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 it.** float in t
13650 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 he wrong order.
13660 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 And that error
13670 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 has been propaga
13680 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 ted.** ever sinc
13690 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 e. The blame is
136a0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 not necessarily
136b0 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 with GCC, thoug
136c0 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 h..** GCC might
136d0 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e have just copyin
136e0 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 g the problem fr
136f0 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 om a prior compi
13700 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 ler..** I am als
13710 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 o told that newe
13720 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 r versions of GC
13730 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 C that follow a
13740 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 different.** ABI
13750 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 get the byte or
13760 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a der right..**.**
13770 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e Developers usin
13780 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 g SQLite on an A
13790 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 RM7 should compi
137a0 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 le and run their
137b0 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 .** application
137c0 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 using -DSQLITE_D
137d0 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 EBUG=1 at least
137e0 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 once. With DEBU
137f0 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f G.** enabled, so
13800 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 me asserts below
13810 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 will ensure tha
13820 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 t the byte order
13830 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 of.** floating
13840 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 point values is
13850 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 correct..**.** (
13860 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 2007-08-30) Fra
13870 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 nk van Vugt has
13880 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 6f studied this pro
13890 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 blem closely.**
138a0 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 and has send his
138b0 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 findings to the
138c0 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 SQLite develope
138d0 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 rs. Frank.** wr
138e0 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c ites that some L
138f0 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 inux kernels off
13900 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e er floating poin
13910 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d t hardware.** em
13920 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 ulation that use
13930 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 s only 32-bit ma
13940 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 ntissas instead
13950 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 of a full .** 48
13960 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 65 -bits as require
13970 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 74 d by the IEEE st
13980 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 andard. (This i
13990 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f s the.** CONFIG_
139a0 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 FPE_FASTFPE opti
139b0 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 on.) On such sy
139c0 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 stems, floating
139d0 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 point.** byte sw
139e0 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 apping becomes v
139f0 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e ery complicated.
13a00 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c To avoid probl
13a10 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 ems,.** the nece
13a20 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 70 ssary byte swapp
13a30 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 6f ing is carried o
13a40 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 ut using a 64-bi
13a50 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 t integer.** rat
13a60 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 her than a 64-bi
13a70 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 t float. Frank
13a80 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 20 assures us that
13a90 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a the code here.**
13aa0 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 works for him.
13ab0 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 We, the develop
13ac0 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 ers, have no way
13ad0 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c to independentl
13ae0 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 y.** verify this
13af0 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d , but Frank seem
13b00 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 s to know what h
13b10 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f e is talking abo
13b20 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 ut.** so we trus
13b30 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 t him..*/.#ifdef
13b40 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e SQLITE_MIXED_EN
13b50 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 DIAN_64BIT_FLOAT
13b60 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 .static u64 floa
13b70 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 tSwap(u64 in){.
13b80 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 union {. u64
13b90 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d r;. u32 i[2]
13ba0 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 ;. } u;. u32 t
13bb0 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 ;.. u.r = in;.
13bc0 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 t = u.i[0];. u
13bd0 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a .i[0] = u.i[1];.
13be0 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 u.i[1] = t;.
13bf0 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 return u.r;.}.#
13c00 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 define swapMixed
13c10 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 EndianFloat(X)
13c20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 X = floatSwap(X)
13c30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 .#else.# define
13c40 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 swapMixedEndianF
13c50 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a loat(X).#endif..
13c60 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 /*.** Write the
13c70 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 serialized data
13c80 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c blob for the val
13c90 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 ue stored in pMe
13ca0 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 m into .** buf.
13cb0 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 It is assumed th
13cc0 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 at the caller ha
13cd0 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 s allocated suff
13ce0 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a icient space..**
13cf0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 Return the numb
13d00 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 er of bytes writ
13d10 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 ten..**.** nBuf
13d20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 is the amount of
13d30 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 space left in b
13d40 75 66 5b 5d 2e 20 20 6e 42 75 66 20 6d 75 73 74 uf[]. nBuf must
13d50 20 61 6c 77 61 79 73 20 62 65 0a 2a 2a 20 6c 61 always be.** la
13d60 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f rge enough to ho
13d70 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 ld the entire fi
13d80 65 6c 64 2e 20 20 45 78 63 65 70 74 2c 20 69 66 eld. Except, if
13d90 20 74 68 65 20 66 69 65 6c 64 20 69 73 0a 2a 2a the field is.**
13da0 20 61 20 62 6c 6f 62 20 77 69 74 68 20 61 20 7a a blob with a z
13db0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2c ero-filled tail,
13dc0 20 74 68 65 6e 20 62 75 66 5b 5d 20 6d 69 67 68 then buf[] migh
13dd0 74 20 62 65 20 6a 75 73 74 20 74 68 65 20 72 69 t be just the ri
13de0 67 68 74 0a 2a 2a 20 73 69 7a 65 20 74 6f 20 68 ght.** size to h
13df0 6f 6c 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 old everything e
13e00 78 63 65 70 74 20 66 6f 72 20 74 68 65 20 7a 65 xcept for the ze
13e10 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 2e 20 ro-filled tail.
13e20 20 49 66 20 62 75 66 5b 5d 0a 2a 2a 20 69 73 20 If buf[].** is
13e30 6f 6e 6c 79 20 62 69 67 20 65 6e 6f 75 67 68 20 only big enough
13e40 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 6f 6e 2d to hold the non-
13e50 7a 65 72 6f 20 70 72 65 66 69 78 2c 20 74 68 65 zero prefix, the
13e60 6e 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 61 n only write tha
13e70 74 0a 2a 2a 20 70 72 65 66 69 78 20 69 6e 74 6f t.** prefix into
13e80 20 62 75 66 5b 5d 2e 20 20 42 75 74 20 69 66 20 buf[]. But if
13e90 62 75 66 5b 5d 20 69 73 20 6c 61 72 67 65 20 65 buf[] is large e
13ea0 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 62 6f nough to hold bo
13eb0 74 68 20 74 68 65 0a 2a 2a 20 70 72 65 66 69 78 th the.** prefix
13ec0 20 61 6e 64 20 74 68 65 20 74 61 69 6c 20 74 68 and the tail th
13ed0 65 6e 20 77 72 69 74 65 20 74 68 65 20 70 72 65 en write the pre
13ee0 66 69 78 20 61 6e 64 20 73 65 74 20 74 68 65 20 fix and set the
13ef0 74 61 69 6c 20 74 6f 20 61 6c 6c 0a 2a 2a 20 7a tail to all.** z
13f00 65 72 6f 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 eros..**.** Retu
13f10 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 rn the number of
13f20 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 bytes actually
13f30 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 written into buf
13f40 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a []. The number.
13f50 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 ** of bytes in t
13f60 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 he zero-filled t
13f70 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 ail is included
13f80 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 in the return va
13f90 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 lue only.** if t
13fa0 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 hose bytes were
13fb0 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e zeroed in buf[].
13fc0 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 .*/ .u32 sqlite3
13fd0 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 VdbeSerialPut(u8
13fe0 20 2a 62 75 66 2c 20 69 6e 74 20 6e 42 75 66 2c *buf, int nBuf,
13ff0 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 Mem *pMem, int
14000 66 69 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 file_format){.
14010 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 20 u32 serial_type
14020 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 = sqlite3VdbeSer
14030 69 61 6c 54 79 70 65 28 70 4d 65 6d 2c 20 66 69 ialType(pMem, fi
14040 6c 65 5f 66 6f 72 6d 61 74 29 3b 0a 20 20 75 33 le_format);. u3
14050 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 2 len;.. /* Int
14060 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f eger and Real */
14070 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 . if( serial_ty
14080 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f pe<=7 && serial_
14090 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 type>0 ){. u6
140a0 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 4 v;. u32 i;.
140b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 if( serial_t
140c0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 ype==7 ){.
140d0 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 assert( sizeof(v
140e0 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e )==sizeof(pMem->
140f0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 r) );. memc
14100 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 72 2c py(&v, &pMem->r,
14110 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 sizeof(v));.
14120 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 swapMixedEndi
14130 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 anFloat(v);.
14140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d }else{. v =
14150 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 pMem->u.i;.
14160 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 }. len = i =
14170 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
14180 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f lTypeLen(serial_
14190 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65 72 type);. asser
141a0 74 28 20 6c 65 6e 3c 3d 28 75 33 32 29 6e 42 75 t( len<=(u32)nBu
141b0 66 20 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 f );. while(
141c0 69 2d 2d 20 29 7b 0a 20 20 20 20 20 20 62 75 66 i-- ){. buf
141d0 5b 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 [i] = (u8)(v&0xF
141e0 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 F);. v >>=
141f0 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 8;. }. ret
14200 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 urn len;. }..
14210 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f /* String or blo
14220 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 b */. if( seria
14230 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 l_type>=12 ){.
14240 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e assert( pMem->
14250 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 n + ((pMem->flag
14260 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d s & MEM_Zero)?pM
14270 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 em->u.nZero:0).
14280 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 == (
14290 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 int)sqlite3VdbeS
142a0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 erialTypeLen(ser
142b0 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 ial_type) );.
142c0 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e assert( pMem->n
142d0 3c 3d 6e 42 75 66 20 29 3b 0a 20 20 20 20 6c 65 <=nBuf );. le
142e0 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 n = pMem->n;.
142f0 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 memcpy(buf, pMe
14300 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 m->z, len);.
14310 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 if( pMem->flags
14320 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 & MEM_Zero ){.
14330 20 20 20 20 6c 65 6e 20 2b 3d 20 70 4d 65 6d 2d len += pMem-
14340 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 >u.nZero;.
14350 61 73 73 65 72 74 28 20 6e 42 75 66 3e 3d 30 20 assert( nBuf>=0
14360 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 6e );. if( len
14370 20 3e 20 28 75 33 32 29 6e 42 75 66 20 29 7b 0a > (u32)nBuf ){.
14380 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 28 75 len = (u
14390 33 32 29 6e 42 75 66 3b 0a 20 20 20 20 20 20 7d 32)nBuf;. }
143a0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 62 . memset(&b
143b0 75 66 5b 70 4d 65 6d 2d 3e 6e 5d 2c 20 30 2c 20 uf[pMem->n], 0,
143c0 6c 65 6e 2d 70 4d 65 6d 2d 3e 6e 29 3b 0a 20 20 len-pMem->n);.
143d0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6c }. return l
143e0 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 en;. }.. /* NU
143f0 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 LL or constants
14400 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 0 or 1 */. retu
14410 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 rn 0;.}../*.** D
14420 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 eserialize the d
14430 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 ata blob pointed
14440 20 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 to by buf as se
14450 72 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c rial type serial
14460 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f _type.** and sto
14470 72 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e re the result in
14480 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 pMem. Return t
14490 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
144a0 65 73 20 72 65 61 64 2e 0a 2a 2f 20 0a 75 33 32 es read..*/ .u32
144b0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
144c0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 alGet(. const u
144d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 nsigned char *bu
144e0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 f, /* Buffer
144f0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 to deserialize
14500 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 from */. u32 se
14510 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 rial_type,
14520 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 /* Seria
14530 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 l type to deseri
14540 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a alize */. Mem *
14550 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 pMem
14560 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f /* Memo
14570 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 ry cell to write
14580 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 value into */.)
14590 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 {. switch( seri
145a0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 al_type ){. c
145b0 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 ase 10: /* Res
145c0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 erved for future
145d0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 use */. case
145e0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 11: /* Reserv
145f0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 ed for future us
14600 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a e */. case 0:
14610 20 7b 20 20 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 { /* NULL */.
14620 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
14630 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 = MEM_Null;.
14640 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
14650 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a case 1: { /*
14660 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 1-byte signed i
14670 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 nteger */.
14680 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 28 73 69 67 pMem->u.i = (sig
14690 6e 65 64 20 63 68 61 72 29 62 75 66 5b 30 5d 3b ned char)buf[0];
146a0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
146b0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
146c0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
146d0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 }. case 2:
146e0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e { /* 2-byte sign
146f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 ed integer */.
14700 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 pMem->u.i =
14710 28 28 28 73 69 67 6e 65 64 20 63 68 61 72 29 62 (((signed char)b
14720 75 66 5b 30 5d 29 3c 3c 38 29 20 7c 20 62 75 66 uf[0])<<8) | buf
14730 5b 31 5d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d [1];. pMem-
14740 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 >flags = MEM_Int
14750 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 ;. return 2
14760 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
14770 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 3: { /* 3-byte
14780 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a signed integer *
14790 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e /. pMem->u.
147a0 69 20 3d 20 28 28 28 73 69 67 6e 65 64 20 63 68 i = (((signed ch
147b0 61 72 29 62 75 66 5b 30 5d 29 3c 3c 31 36 29 20 ar)buf[0])<<16)
147c0 7c 20 28 62 75 66 5b 31 5d 3c 3c 38 29 20 7c 20 | (buf[1]<<8) |
147d0 62 75 66 5b 32 5d 3b 0a 20 20 20 20 20 20 70 4d buf[2];. pM
147e0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
147f0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 Int;. retur
14800 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 n 3;. }. c
14810 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 ase 4: { /* 4-by
14820 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 te signed intege
14830 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d r */. pMem-
14840 3e 75 2e 69 20 3d 20 28 62 75 66 5b 30 5d 3c 3c >u.i = (buf[0]<<
14850 32 34 29 20 7c 20 28 62 75 66 5b 31 5d 3c 3c 31 24) | (buf[1]<<1
14860 36 29 20 7c 20 28 62 75 66 5b 32 5d 3c 3c 38 29 6) | (buf[2]<<8)
14870 20 7c 20 62 75 66 5b 33 5d 3b 0a 20 20 20 20 20 | buf[3];.
14880 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d pMem->flags = M
14890 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 EM_Int;. re
148a0 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 turn 4;. }.
148b0 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 case 5: { /* 6
148c0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 -byte signed int
148d0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 75 36 eger */. u6
148e0 34 20 78 20 3d 20 28 28 28 73 69 67 6e 65 64 20 4 x = (((signed
148f0 63 68 61 72 29 62 75 66 5b 30 5d 29 3c 3c 38 29 char)buf[0])<<8)
14900 20 7c 20 62 75 66 5b 31 5d 3b 0a 20 20 20 20 20 | buf[1];.
14910 20 75 33 32 20 79 20 3d 20 28 62 75 66 5b 32 5d u32 y = (buf[2]
14920 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 33 5d 3c <<24) | (buf[3]<
14930 3c 31 36 29 20 7c 20 28 62 75 66 5b 34 5d 3c 3c <16) | (buf[4]<<
14940 38 29 20 7c 20 62 75 66 5b 35 5d 3b 0a 20 20 20 8) | buf[5];.
14950 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c x = (x<<32) |
14960 20 79 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e y;. pMem->
14970 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b u.i = *(i64*)&x;
14980 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
14990 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
149a0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 return 6;.
149b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 }. case 6:
149c0 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e /* 8-byte sign
149d0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 ed integer */.
149e0 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 case 7: { /* I
149f0 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 EEE floating poi
14a00 6e 74 20 2a 2f 0a 20 20 20 20 20 20 75 36 34 20 nt */. u64
14a10 78 3b 0a 20 20 20 20 20 20 75 33 32 20 79 3b 0a x;. u32 y;.
14a20 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 #if !defined(NDE
14a30 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 BUG) && !defined
14a40 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f (SQLITE_OMIT_FLO
14a50 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 ATING_POINT).
14a60 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 /* Verify tha
14a70 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 t integers and f
14a80 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 loating point va
14a90 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d lues use the sam
14aa0 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 e. ** byte
14ab0 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 order. Or, that
14ac0 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 if SQLITE_MIXED
14ad0 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c _ENDIAN_64BIT_FL
14ae0 4f 41 54 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 OAT is. **
14af0 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d defined that 64-
14b00 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 bit floating poi
14b10 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 nt values really
14b20 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 20 are mixed.
14b30 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 ** endian..
14b40 20 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 */. stati
14b50 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d c const u64 t1 =
14b60 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 ((u64)0x3ff0000
14b70 30 29 3c 3c 33 32 3b 0a 20 20 20 20 20 20 73 74 0)<<32;. st
14b80 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c atic const doubl
14b90 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 e r1 = 1.0;.
14ba0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 u64 t2 = t1;.
14bb0 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e swapMixedEn
14bc0 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 dianFloat(t2);.
14bd0 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a assert( siz
14be0 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 eof(r1)==sizeof(
14bf0 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 t2) && memcmp(&r
14c00 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 1, &t2, sizeof(r
14c10 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 1))==0 );.#endif
14c20 0a 0a 20 20 20 20 20 20 78 20 3d 20 28 62 75 66 .. x = (buf
14c30 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b [0]<<24) | (buf[
14c40 31 5d 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 32 1]<<16) | (buf[2
14c50 5d 3c 3c 38 29 20 7c 20 62 75 66 5b 33 5d 3b 0a ]<<8) | buf[3];.
14c60 20 20 20 20 20 20 79 20 3d 20 28 62 75 66 5b 34 y = (buf[4
14c70 5d 3c 3c 32 34 29 20 7c 20 28 62 75 66 5b 35 5d ]<<24) | (buf[5]
14c80 3c 3c 31 36 29 20 7c 20 28 62 75 66 5b 36 5d 3c <<16) | (buf[6]<
14c90 3c 38 29 20 7c 20 62 75 66 5b 37 5d 3b 0a 20 20 <8) | buf[7];.
14ca0 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 x = (x<<32)
14cb0 7c 20 79 3b 0a 20 20 20 20 20 20 69 66 28 20 73 | y;. if( s
14cc0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b erial_type==6 ){
14cd0 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 . pMem->u
14ce0 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a .i = *(i64*)&x;.
14cf0 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c pMem->fl
14d00 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 ags = MEM_Int;.
14d10 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
14d20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 assert( size
14d30 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 of(x)==8 && size
14d40 6f 66 28 70 4d 65 6d 2d 3e 72 29 3d 3d 38 20 29 of(pMem->r)==8 )
14d50 3b 0a 20 20 20 20 20 20 20 20 73 77 61 70 4d 69 ;. swapMi
14d60 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 xedEndianFloat(x
14d70 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 );. memcp
14d80 79 28 26 70 4d 65 6d 2d 3e 72 2c 20 26 78 2c 20 y(&pMem->r, &x,
14d90 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 sizeof(x));.
14da0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
14db0 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 = sqlite3IsNaN(p
14dc0 4d 65 6d 2d 3e 72 29 20 3f 20 4d 45 4d 5f 4e 75 Mem->r) ? MEM_Nu
14dd0 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 ll : MEM_Real;.
14de0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 }. ret
14df0 75 72 6e 20 38 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 8;. }.
14e00 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 case 8: /* I
14e10 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 nteger 0 */.
14e20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e case 9: { /* In
14e30 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 teger 1 */.
14e40 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 pMem->u.i = ser
14e50 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 ial_type-8;.
14e60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
14e70 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 MEM_Int;. r
14e80 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 eturn 0;. }.
14e90 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 default: {.
14ea0 20 20 20 20 75 33 32 20 6c 65 6e 20 3d 20 28 73 u32 len = (s
14eb0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 erial_type-12)/2
14ec0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 ;. pMem->z
14ed0 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 = (char *)buf;.
14ee0 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 6c pMem->n = l
14ef0 65 6e 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e en;. pMem->
14f00 78 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 xDel = 0;.
14f10 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 26 if( serial_type&
14f20 30 78 30 31 20 29 7b 0a 20 20 20 20 20 20 20 20 0x01 ){.
14f30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
14f40 4d 5f 53 74 72 20 7c 20 4d 45 4d 5f 45 70 68 65 M_Str | MEM_Ephe
14f50 6d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a m;. }else{.
14f60 20 20 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c pMem->fl
14f70 61 67 73 20 3d 20 4d 45 4d 5f 42 6c 6f 62 20 7c ags = MEM_Blob |
14f80 20 4d 45 4d 5f 45 70 68 65 6d 3b 0a 20 20 20 20 MEM_Ephem;.
14f90 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e }. return
14fa0 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a len;. }. }.
14fb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a return 0;.}...
14fc0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 /*.** Given the
14fd0 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 nKey-byte encodi
14fe0 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 ng of a record i
14ff0 6e 20 70 4b 65 79 5b 5d 2c 20 70 61 72 73 65 20 n pKey[], parse
15000 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64 20 69 6e the.** record in
15010 74 6f 20 61 20 55 6e 70 61 63 6b 65 64 52 65 63 to a UnpackedRec
15020 6f 72 64 20 73 74 72 75 63 74 75 72 65 2e 20 20 ord structure.
15030 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 Return a pointer
15040 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 74 72 75 to.** that stru
15050 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 cture..**.** The
15060 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f calling functio
15070 6e 20 6d 69 67 68 74 20 70 72 6f 76 69 64 65 20 n might provide
15080 73 7a 53 70 61 63 65 20 62 79 74 65 73 20 6f 66 szSpace bytes of
15090 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63 65 memory.** space
150a0 20 61 74 20 70 53 70 61 63 65 2e 20 20 54 68 69 at pSpace. Thi
150b0 73 20 73 70 61 63 65 20 63 61 6e 20 62 65 20 75 s space can be u
150c0 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 sed to hold the
150d0 72 65 74 75 72 6e 65 64 0a 2a 2a 20 56 44 62 65 returned.** VDbe
150e0 50 61 72 73 65 64 52 65 63 6f 72 64 20 73 74 72 ParsedRecord str
150f0 75 63 74 75 72 65 20 69 66 20 69 74 20 69 73 20 ucture if it is
15100 6c 61 72 67 65 20 65 6e 6f 75 67 68 2e 20 20 49 large enough. I
15110 66 20 69 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 62 f it is.** not b
15120 69 67 20 65 6e 6f 75 67 68 2c 20 73 70 61 63 65 ig enough, space
15130 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f is obtained fro
15140 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 m sqlite3_malloc
15150 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 ()..**.** The re
15160 74 75 72 6e 65 64 20 73 74 72 75 63 74 75 72 65 turned structure
15170 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 should be close
15180 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 2a d by a call to.*
15190 2a 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c * sqlite3VdbeDel
151a0 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 eteUnpackedRecor
151b0 64 28 29 2e 0a 2a 2f 20 0a 55 6e 70 61 63 6b 65 d()..*/ .Unpacke
151c0 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 dRecord *sqlite3
151d0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b VdbeRecordUnpack
151e0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 (. KeyInfo *pKe
151f0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e yInfo, /* In
15200 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 formation about
15210 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 the record forma
15220 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c t */. int nKey,
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
15240 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e Size of the bin
15250 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 ary record */.
15260 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
15270 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 , /* The bi
15280 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 nary record */.
15290 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 char *pSpace,
152a0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 /* Unali
152b0 67 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c gned space avail
152c0 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 able to hold the
152d0 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 object */. int
152e0 20 73 7a 53 70 61 63 65 20 20 20 20 20 20 20 20 szSpace
152f0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 /* Size of p
15300 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 Space[] in bytes
15310 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 */.){. const u
15320 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b nsigned char *aK
15330 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 ey = (const unsi
15340 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 gned char *)pKey
15350 3b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f ;. UnpackedReco
15360 72 64 20 2a 70 3b 20 20 2f 2a 20 54 68 65 20 75 rd *p; /* The u
15370 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 npacked record t
15380 68 61 74 20 77 65 20 77 69 6c 6c 20 72 65 74 75 hat we will retu
15390 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 rn */. int nByt
153a0 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d e; /* M
153b0 65 6d 6f 72 79 20 73 70 61 63 65 20 6e 65 65 64 emory space need
153c0 65 64 20 74 6f 20 68 6f 6c 64 20 70 2c 20 69 6e ed to hold p, in
153d0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 bytes */. int
153e0 64 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 d;. u32 idx;.
153f0 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 u16 u;
15400 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 /* Unsigned
15410 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a loop counter */.
15420 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d u32 szHdr;. M
15430 65 6d 20 2a 70 4d 65 6d 3b 0a 20 20 69 6e 74 20 em *pMem;. int
15440 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 nOff;
15450 2f 2a 20 49 6e 63 72 65 61 73 65 20 70 53 70 61 /* Increase pSpa
15460 63 65 20 62 79 20 74 68 69 73 20 6d 75 63 68 20 ce by this much
15470 74 6f 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 20 to 8-byte align
15480 69 74 20 2a 2f 0a 20 20 0a 20 20 2f 2a 0a 20 20 it */. . /*.
15490 2a 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 ** We want to sh
154a0 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 ift the pointer
154b0 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 pSpace up such t
154c0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 hat it is 8-byte
154d0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 aligned.. ** T
154e0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 hus, we need to
154f0 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 calculate a valu
15500 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e e, nOff, between
15510 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 0 and 7, to shi
15520 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 ft . ** it by.
15530 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c If pSpace is al
15540 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 ready 8-byte ali
15550 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c gned, nOff shoul
15560 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a d be zero.. */.
15570 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 nOff = (8 - (S
15580 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 QLITE_PTR_TO_INT
15590 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 (pSpace) & 7)) &
155a0 20 37 3b 0a 20 20 70 53 70 61 63 65 20 2b 3d 20 7;. pSpace +=
155b0 6e 4f 66 66 3b 0a 20 20 73 7a 53 70 61 63 65 20 nOff;. szSpace
155c0 2d 3d 20 6e 4f 66 66 3b 0a 20 20 6e 42 79 74 65 -= nOff;. nByte
155d0 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 = ROUND8(sizeof
155e0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 (UnpackedRecord)
155f0 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a ) + sizeof(Mem)*
15600 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c (pKeyInfo->nFiel
15610 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 d+1);. if( nByt
15620 65 3e 73 7a 53 70 61 63 65 20 29 7b 0a 20 20 20 e>szSpace ){.
15630 20 70 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 p = sqlite3DbMa
15640 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f llocRaw(pKeyInfo
15650 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 ->db, nByte);.
15660 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 if( p==0 ) ret
15670 75 72 6e 20 30 3b 0a 20 20 20 20 70 2d 3e 66 6c urn 0;. p->fl
15680 61 67 73 20 3d 20 55 4e 50 41 43 4b 45 44 5f 4e ags = UNPACKED_N
15690 45 45 44 5f 46 52 45 45 20 7c 20 55 4e 50 41 43 EED_FREE | UNPAC
156a0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 KED_NEED_DESTROY
156b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 ;. }else{. p
156c0 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f = (UnpackedReco
156d0 72 64 2a 29 70 53 70 61 63 65 3b 0a 20 20 20 20 rd*)pSpace;.
156e0 70 2d 3e 66 6c 61 67 73 20 3d 20 55 4e 50 41 43 p->flags = UNPAC
156f0 4b 45 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 KED_NEED_DESTROY
15700 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4b 65 79 49 ;. }. p->pKeyI
15710 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a nfo = pKeyInfo;.
15720 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b p->nField = pK
15730 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b eyInfo->nField +
15740 20 31 3b 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 1;. p->aMem =
15750 70 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 pMem = (Mem*)&((
15760 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 char*)p)[ROUND8(
15770 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 sizeof(UnpackedR
15780 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 ecord))];. asse
15790 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 rt( EIGHT_BYTE_A
157a0 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 LIGNMENT(pMem) )
157b0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 ;. idx = getVar
157c0 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 int32(aKey, szHd
157d0 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b r);. d = szHdr;
157e0 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c . u = 0;. whil
157f0 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 e( idx<szHdr &&
15800 75 3c 70 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 u<p->nField && d
15810 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 <=nKey ){. u3
15820 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 2 serial_type;..
15830 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 idx += getVa
15840 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 rint32(&aKey[idx
15850 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b ], serial_type);
15860 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d . pMem->enc =
15870 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a pKeyInfo->enc;.
15880 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 pMem->db = p
15890 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 KeyInfo->db;.
158a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 pMem->flags = 0
158b0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 4d 61 6c ;. pMem->zMal
158c0 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b loc = 0;. d +
158d0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 = sqlite3VdbeSer
158e0 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c ialGet(&aKey[d],
158f0 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d serial_type, pM
15900 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b em);. pMem++;
15910 0a 20 20 20 20 75 2b 2b 3b 0a 20 20 7d 0a 20 20 . u++;. }.
15920 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 assert( u<=pKeyI
15930 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 nfo->nField + 1
15940 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d );. p->nField =
15950 20 75 3b 0a 20 20 72 65 74 75 72 6e 20 28 76 6f u;. return (vo
15960 69 64 2a 29 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 id*)p;.}../*.**
15970 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 65 73 This routine des
15980 74 72 6f 79 73 20 61 20 55 6e 70 61 63 6b 65 64 troys a Unpacked
15990 52 65 63 6f 72 64 20 6f 62 6a 65 63 74 2e 0a 2a Record object..*
159a0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
159b0 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 beDeleteUnpacked
159c0 52 65 63 6f 72 64 28 55 6e 70 61 63 6b 65 64 52 Record(UnpackedR
159d0 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 6e 74 ecord *p){. int
159e0 20 69 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 3b i;. Mem *pMem;
159f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 .. assert( p!=0
15a00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d );. assert( p-
15a10 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 4b 45 >flags & UNPACKE
15a20 44 5f 4e 45 45 44 5f 44 45 53 54 52 4f 59 20 29 D_NEED_DESTROY )
15a30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 4d 65 ;. for(i=0, pMe
15a40 6d 3d 70 2d 3e 61 4d 65 6d 3b 20 69 3c 70 2d 3e m=p->aMem; i<p->
15a50 6e 46 69 65 6c 64 3b 20 69 2b 2b 2c 20 70 4d 65 nField; i++, pMe
15a60 6d 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 m++){. /* The
15a70 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 unpacked record
15a80 20 69 73 20 61 6c 77 61 79 73 20 63 6f 6e 73 74 is always const
15a90 72 75 63 74 65 64 20 62 79 20 74 68 65 0a 20 20 ructed by the.
15aa0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 ** sqlite3Vdbe
15ab0 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 UnpackRecord() f
15ac0 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2c 20 77 unction above, w
15ad0 68 69 63 68 20 6d 61 6b 65 73 20 61 6c 6c 0a 20 hich makes all.
15ae0 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 61 6e ** strings an
15af0 64 20 62 6c 6f 62 73 20 73 74 61 74 69 63 2e 20 d blobs static.
15b00 20 41 6e 64 20 6e 6f 6e 65 20 6f 66 20 74 68 65 And none of the
15b10 20 65 6c 65 6d 65 6e 74 73 20 61 72 65 0a 20 20 elements are.
15b20 20 20 2a 2a 20 65 76 65 72 20 74 72 61 6e 73 66 ** ever transf
15b30 6f 72 6d 65 64 2c 20 73 6f 20 74 68 65 72 65 20 ormed, so there
15b40 69 73 20 6e 65 76 65 72 20 61 6e 79 74 68 69 6e is never anythin
15b50 67 20 74 6f 20 64 65 6c 65 74 65 2e 0a 20 20 20 g to delete..
15b60 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45 */. if( NEVE
15b70 52 28 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 29 R(pMem->zMalloc)
15b80 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 ) sqlite3VdbeMe
15b90 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b 0a mRelease(pMem);.
15ba0 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 }. if( p->fla
15bb0 67 73 20 26 20 55 4e 50 41 43 4b 45 44 5f 4e 45 gs & UNPACKED_NE
15bc0 45 44 5f 46 52 45 45 20 29 7b 0a 20 20 20 20 73 ED_FREE ){. s
15bd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e qlite3DbFree(p->
15be0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 70 29 pKeyInfo->db, p)
15bf0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 ;. }.}../*.** T
15c00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d his function com
15c10 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 pares the two ta
15c20 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 ble rows or inde
15c30 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 x records.** spe
15c40 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 cified by {nKey1
15c50 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b , pKey1} and pPK
15c60 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 ey2. It returns
15c70 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 a negative, zer
15c80 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 o.** or positive
15c90 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 integer if key1
15ca0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
15cb0 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 qual to or .** g
15cc0 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 reater than key2
15cd0 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 . The {nKey1, p
15ce0 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 Key1} key must b
15cf0 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 e a blob.** crea
15d00 74 65 64 20 62 79 20 74 68 20 4f 50 5f 4d 61 6b ted by th OP_Mak
15d10 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f eRecord opcode o
15d20 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 f the VDBE. The
15d30 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d pPKey2.** key m
15d40 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 ust be a parsed
15d50 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 key such as obta
15d60 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c ined from.** sql
15d70 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 ite3VdbeParseRec
15d80 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 ord..**.** Key1
15d90 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 and Key2 do not
15da0 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 have to contain
15db0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 the same number
15dc0 6f 66 20 66 69 65 6c 64 73 2e 0a 2a 2a 20 54 68 of fields..** Th
15dd0 65 20 6b 65 79 20 77 69 74 68 20 66 65 77 65 72 e key with fewer
15de0 20 66 69 65 6c 64 73 20 69 73 20 75 73 75 61 6c fields is usual
15df0 6c 79 20 63 6f 6d 70 61 72 65 73 20 6c 65 73 73 ly compares less
15e00 20 74 68 61 6e 20 74 68 65 20 0a 2a 2a 20 6c 6f than the .** lo
15e10 6e 67 65 72 20 6b 65 79 2e 20 20 48 6f 77 65 76 nger key. Howev
15e20 65 72 20 69 66 20 74 68 65 20 55 4e 50 41 43 4b er if the UNPACK
15e30 45 44 5f 49 4e 43 52 4b 45 59 20 66 6c 61 67 73 ED_INCRKEY flags
15e40 20 69 6e 20 70 50 4b 65 79 32 20 69 73 20 73 65 in pPKey2 is se
15e50 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 63 6f 6d t.** and the com
15e60 6d 6f 6e 20 70 72 65 66 69 78 65 73 20 61 72 65 mon prefixes are
15e70 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 6b 65 79 equal, then key
15e80 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6b 1 is less than k
15e90 65 79 32 2e 0a 2a 2a 20 4f 72 20 69 66 20 74 68 ey2..** Or if th
15ea0 65 20 55 4e 50 41 43 4b 45 44 5f 4d 41 54 43 48 e UNPACKED_MATCH
15eb0 5f 50 52 45 46 49 58 20 66 6c 61 67 20 69 73 20 _PREFIX flag is
15ec0 73 65 74 20 61 6e 64 20 74 68 65 20 70 72 65 66 set and the pref
15ed0 69 78 65 73 20 61 72 65 0a 2a 2a 20 65 71 75 61 ixes are.** equa
15ee0 6c 2c 20 74 68 65 6e 20 74 68 65 20 6b 65 79 73 l, then the keys
15ef0 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 are considered
15f00 74 6f 20 62 65 20 65 71 75 61 6c 20 61 6e 64 0a to be equal and.
15f10 2a 2a 20 74 68 65 20 70 61 72 74 73 20 62 65 79 ** the parts bey
15f20 6f 6e 64 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 70 ond the common p
15f30 72 65 66 69 78 20 61 72 65 20 69 67 6e 6f 72 65 refix are ignore
15f40 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 d..**.** If the
15f50 55 4e 50 41 43 4b 45 44 5f 49 47 4e 4f 52 45 5f UNPACKED_IGNORE_
15f60 52 4f 57 49 44 20 66 6c 61 67 20 69 73 20 73 65 ROWID flag is se
15f70 74 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 t, then the last
15f80 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 byte of.** the
15f90 68 65 61 64 65 72 20 6f 66 20 70 4b 65 79 31 20 header of pKey1
15fa0 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 49 74 20 is ignored. It
15fb0 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 is assumed that
15fc0 70 4b 65 79 31 20 69 73 0a 2a 2a 20 61 6e 20 69 pKey1 is.** an i
15fd0 6e 64 65 78 20 6b 65 79 2c 20 61 6e 64 20 74 68 ndex key, and th
15fe0 75 73 20 65 6e 64 73 20 77 69 74 68 20 61 20 72 us ends with a r
15ff0 6f 77 69 64 20 76 61 6c 75 65 2e 20 20 54 68 65 owid value. The
16000 20 6c 61 73 74 20 62 79 74 65 0a 2a 2a 20 6f 66 last byte.** of
16010 20 74 68 65 20 68 65 61 64 65 72 20 77 69 6c 6c the header will
16020 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 68 therefore be th
16030 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f 66 e serial type of
16040 20 74 68 65 20 72 6f 77 69 64 3a 0a 2a 2a 20 6f the rowid:.** o
16050 6e 65 20 6f 66 20 31 2c 20 32 2c 20 33 2c 20 34 ne of 1, 2, 3, 4
16060 2c 20 35 2c 20 36 2c 20 38 2c 20 6f 72 20 39 20 , 5, 6, 8, or 9
16070 2d 20 74 68 65 20 69 6e 74 65 67 65 72 20 73 65 - the integer se
16080 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2a 20 54 rial types..** T
16090 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 6f he serial type o
160a0 66 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 f the final rowi
160b0 64 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 d will always be
160c0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a a single byte..
160d0 2a 2a 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 ** By ignoring t
160e0 68 69 73 20 6c 61 73 74 20 62 79 74 65 20 6f 66 his last byte of
160f0 20 74 68 65 20 68 65 61 64 65 72 2c 20 77 65 20 the header, we
16100 66 6f 72 63 65 20 74 68 65 20 63 6f 6d 70 61 72 force the compar
16110 69 73 6f 6e 0a 2a 2a 20 74 6f 20 69 67 6e 6f 72 ison.** to ignor
16120 65 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 e the rowid at t
16130 68 65 20 65 6e 64 20 6f 66 20 6b 65 79 31 2e 0a he end of key1..
16140 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
16150 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
16160 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f . int nKey1, co
16170 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c nst void *pKey1,
16180 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a /* Left key */.
16190 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 UnpackedRecord
161a0 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 *pPKey2
161b0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a /* Right key */.
161c0 29 7b 0a 20 20 69 6e 74 20 64 31 3b 20 20 20 20 ){. int d1;
161d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 /* Offse
161e0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 t into aKey[] of
161f0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 next data eleme
16200 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 nt */. u32 idx1
16210 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 ; /* Of
16220 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d fset into aKey[]
16230 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 of next header
16240 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 element */. u32
16250 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 szHdr1;
16260 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
16270 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a es in header */.
16280 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 int i = 0;. i
16290 6e 74 20 6e 46 69 65 6c 64 3b 0a 20 20 69 6e 74 nt nField;. int
162a0 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 rc = 0;. const
162b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
162c0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 aKey1 = (const u
162d0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 nsigned char *)p
162e0 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 Key1;. KeyInfo
162f0 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d *pKeyInfo;. Mem
16300 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e mem1;.. pKeyIn
16310 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 fo = pPKey2->pKe
16320 79 49 6e 66 6f 3b 0a 20 20 6d 65 6d 31 2e 65 6e yInfo;. mem1.en
16330 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e c = pKeyInfo->en
16340 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 c;. mem1.db = p
16350 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f KeyInfo->db;. /
16360 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 * mem1.flags = 0
16370 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e ; // Will be in
16380 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c itialized by sql
16390 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 ite3VdbeSerialGe
163a0 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c t() */. VVA_ONL
163b0 59 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 20 Y( mem1.zMalloc
163c0 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e = 0; ) /* Only n
163d0 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 eeded by assert(
163e0 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a ) statements */.
163f0 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 . /* Compilers
16400 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 may complain tha
16410 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f t mem1.u.i is po
16420 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 tentially uninit
16430 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 ialized.. ** We
16440 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a could initializ
16450 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 e it, as shown h
16460 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 ere, to silence
16470 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 those complaints
16480 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 .. ** But in fa
16490 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c ct, mem1.u.i wil
164a0 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 l never actually
164b0 20 62 65 20 75 73 65 64 20 69 6e 69 74 69 61 6c be used initial
164c0 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 ized, and doing
164d0 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 . ** the unnece
164e0 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 ssary initializa
164f0 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 tion has a measu
16500 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 rable negative p
16510 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 erformance. **
16520 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 impact, since th
16530 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 is routine is a
16540 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 very high runner
16550 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 . And so, we ch
16560 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e oose. ** to ign
16570 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 ore the compiler
16580 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 warnings and le
16590 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c ave this variabl
165a0 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e e uninitialized.
165b0 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 . */. /* mem1
165c0 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f .u.i = 0; // no
165d0 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 t needed, here t
165e0 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c o silence compil
165f0 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 er warning */.
16600 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 . idx1 = getVar
16610 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 int32(aKey1, szH
16620 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73 7a 48 dr1);. d1 = szH
16630 64 72 31 3b 0a 20 20 69 66 28 20 70 50 4b 65 79 dr1;. if( pPKey
16640 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 2->flags & UNPAC
16650 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 KED_IGNORE_ROWID
16660 20 29 7b 0a 20 20 20 20 73 7a 48 64 72 31 2d 2d ){. szHdr1--
16670 3b 0a 20 20 7d 0a 20 20 6e 46 69 65 6c 64 20 3d ;. }. nField =
16680 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c pKeyInfo->nFiel
16690 64 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 31 d;. while( idx1
166a0 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b <szHdr1 && i<pPK
166b0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 7b 0a 20 ey2->nField ){.
166c0 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 u32 serial_ty
166d0 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 pe1;.. /* Rea
166e0 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 d the serial typ
166f0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 es for the next
16700 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 element in each
16710 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 key. */. idx1
16720 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 += getVarint32(
16730 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 aKey1+idx1, ser
16740 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 20 20 20 ial_type1 );.
16750 20 69 66 28 20 64 31 3e 3d 6e 4b 65 79 31 20 26 if( d1>=nKey1 &
16760 26 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 & sqlite3VdbeSer
16770 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 ialTypeLen(seria
16780 6c 5f 74 79 70 65 31 29 3e 30 20 29 20 62 72 65 l_type1)>0 ) bre
16790 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 ak;.. /* Extr
167a0 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 act the values t
167b0 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 o be compared..
167c0 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 */. d1 +=
167d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 sqlite3VdbeSeria
167e0 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c lGet(&aKey1[d1],
167f0 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 serial_type1, &
16800 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 mem1);.. /* D
16810 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e o the comparison
16820 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d . */. rc =
16830 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 sqlite3MemCompa
16840 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 re(&mem1, &pPKey
16850 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 0a 20 20 20 20 2->aMem[i],.
16860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16870 20 20 20 20 20 20 20 69 3c 6e 46 69 65 6c 64 20 i<nField
16880 3f 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c ? pKeyInfo->aCol
16890 6c 5b 69 5d 20 3a 20 30 29 3b 0a 20 20 20 20 69 l[i] : 0);. i
168a0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 f( rc!=0 ){.
168b0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 7a assert( mem1.z
168c0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a Malloc==0 ); /*
168d0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c See comment bel
168e0 6f 77 20 2a 2f 0a 0a 20 20 20 20 20 20 2f 2a 20 ow */.. /*
168f0 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75 6c Invert the resul
16900 74 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e t if we are usin
16910 67 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 g DESC sort orde
16920 72 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 r. */. if(
16930 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f pKeyInfo->aSortO
16940 72 64 65 72 20 26 26 20 69 3c 6e 46 69 65 6c 64 rder && i<nField
16950 20 26 26 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 && pKeyInfo->aS
16960 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 ortOrder[i] ){.
16970 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b rc = -rc;
16980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 . }. .
16990 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 52 /* If the PR
169a0 45 46 49 58 5f 53 45 41 52 43 48 20 66 6c 61 67 EFIX_SEARCH flag
169b0 20 69 73 20 73 65 74 20 61 6e 64 20 61 6c 6c 20 is set and all
169c0 66 69 65 6c 64 73 20 65 78 63 65 70 74 20 74 68 fields except th
169d0 65 20 66 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a e final. **
169e0 20 72 6f 77 69 64 20 66 69 65 6c 64 20 77 65 72 rowid field wer
169f0 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 63 6c e equal, then cl
16a00 65 61 72 20 74 68 65 20 50 52 45 46 49 58 5f 53 ear the PREFIX_S
16a10 45 41 52 43 48 20 66 6c 61 67 20 61 6e 64 20 73 EARCH flag and s
16a20 65 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 50 4b et . ** pPK
16a30 65 79 32 2d 3e 72 6f 77 69 64 20 74 6f 20 74 68 ey2->rowid to th
16a40 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 72 e value of the r
16a50 6f 77 69 64 20 66 69 65 6c 64 20 69 6e 20 28 70 owid field in (p
16a60 4b 65 79 31 2c 20 6e 4b 65 79 31 29 2e 0a 20 20 Key1, nKey1)..
16a70 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 75 ** This is u
16a80 73 65 64 20 62 79 20 74 68 65 20 4f 50 5f 49 73 sed by the OP_Is
16a90 55 6e 69 71 75 65 20 6f 70 63 6f 64 65 2e 0a 20 Unique opcode..
16aa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 */. if
16ab0 28 20 28 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 ( (pPKey2->flags
16ac0 20 26 20 55 4e 50 41 43 4b 45 44 5f 50 52 45 46 & UNPACKED_PREF
16ad0 49 58 5f 53 45 41 52 43 48 29 20 26 26 20 69 3d IX_SEARCH) && i=
16ae0 3d 28 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 =(pPKey2->nField
16af0 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 -1) ){. a
16b00 73 73 65 72 74 28 20 69 64 78 31 3d 3d 73 7a 48 ssert( idx1==szH
16b10 64 72 31 20 26 26 20 72 63 20 29 3b 0a 20 20 20 dr1 && rc );.
16b20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d assert( mem
16b30 31 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 1.flags & MEM_In
16b40 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 4b t );. pPK
16b50 65 79 32 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 ey2->flags &= ~U
16b60 4e 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 53 NPACKED_PREFIX_S
16b70 45 41 52 43 48 3b 0a 20 20 20 20 20 20 20 20 70 EARCH;. p
16b80 50 4b 65 79 32 2d 3e 72 6f 77 69 64 20 3d 20 6d PKey2->rowid = m
16b90 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20 7d em1.u.i;. }
16ba0 0a 20 20 20 20 0a 20 20 20 20 20 20 72 65 74 75 . . retu
16bb0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 rn rc;. }.
16bc0 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 i++;. }.. /*
16bd0 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 No memory alloca
16be0 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 tion is ever use
16bf0 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 d on mem1. Prov
16c00 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a e this using. *
16c10 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * the following
16c20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 assert(). If th
16c30 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 e assert() fails
16c40 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 , it indicates a
16c50 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 . ** memory lea
16c60 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 k and a need to
16c70 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 call sqlite3Vdbe
16c80 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 MemRelease(&mem1
16c90 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 ).. */. assert
16ca0 28 20 6d 65 6d 31 2e 7a 4d 61 6c 6c 6f 63 3d 3d ( mem1.zMalloc==
16cb0 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 0 );.. /* rc==0
16cc0 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 here means that
16cd0 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 one of the keys
16ce0 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c ran out of fiel
16cf0 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 ds and. ** all
16d00 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f the fields up to
16d10 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 that point were
16d20 20 65 71 75 61 6c 2e 20 49 66 20 74 68 65 20 55 equal. If the U
16d30 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 59 0a NPACKED_INCRKEY.
16d40 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 ** flag is set
16d50 2c 20 74 68 65 6e 20 62 72 65 61 6b 20 74 68 65 , then break the
16d60 20 74 69 65 20 62 79 20 74 72 65 61 74 69 6e 67 tie by treating
16d70 20 6b 65 79 32 20 61 73 20 6c 61 72 67 65 72 2e key2 as larger.
16d80 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 55 50 41 . ** If the UPA
16d90 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 54 43 CKED_PREFIX_MATC
16da0 48 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 H flag is set, t
16db0 68 65 6e 20 6b 65 79 73 20 77 69 74 68 20 63 6f hen keys with co
16dc0 6d 6d 6f 6e 20 70 72 65 66 69 78 65 73 0a 20 20 mmon prefixes.
16dd0 2a 2a 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 ** are considere
16de0 64 20 74 6f 20 62 65 20 65 71 75 61 6c 2e 20 20 d to be equal.
16df0 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65 20 6c Otherwise, the l
16e00 6f 6e 67 65 72 20 6b 65 79 20 69 73 20 74 68 65 onger key is the
16e10 20 0a 20 20 2a 2a 20 6c 61 72 67 65 72 2e 20 20 . ** larger.
16e20 41 73 20 69 74 20 68 61 70 70 65 6e 73 2c 20 74 As it happens, t
16e30 68 65 20 70 50 4b 65 79 32 20 77 69 6c 6c 20 61 he pPKey2 will a
16e40 6c 77 61 79 73 20 62 65 20 74 68 65 20 6c 6f 6e lways be the lon
16e50 67 65 72 0a 20 20 2a 2a 20 69 66 20 74 68 65 72 ger. ** if ther
16e60 65 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 63 e is a differenc
16e70 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 e.. */. assert
16e80 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 69 66 28 ( rc==0 );. if(
16e90 20 70 50 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 pPKey2->flags &
16ea0 20 55 4e 50 41 43 4b 45 44 5f 49 4e 43 52 4b 45 UNPACKED_INCRKE
16eb0 59 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 2d 31 Y ){. rc = -1
16ec0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 ;. }else if( pP
16ed0 4b 65 79 32 2d 3e 66 6c 61 67 73 20 26 20 55 4e Key2->flags & UN
16ee0 50 41 43 4b 45 44 5f 50 52 45 46 49 58 5f 4d 41 PACKED_PREFIX_MA
16ef0 54 43 48 20 29 7b 0a 20 20 20 20 2f 2a 20 4c 65 TCH ){. /* Le
16f00 61 76 65 20 72 63 3d 3d 30 20 2a 2f 0a 20 20 7d ave rc==0 */. }
16f10 65 6c 73 65 20 69 66 28 20 69 64 78 31 3c 73 7a else if( idx1<sz
16f20 48 64 72 31 20 29 7b 0a 20 20 20 20 72 63 20 3d Hdr1 ){. rc =
16f30 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 1;. }. return
16f40 20 72 63 3b 0a 7d 0a 20 0a 0a 2f 2a 0a 2a 2a 20 rc;.}. ../*.**
16f50 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 pCur points at a
16f60 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 n index entry cr
16f70 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 eated using the
16f80 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 OP_MakeRecord op
16f90 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 code..** Read th
16fa0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 e rowid (the las
16fb0 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 t field in the r
16fc0 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 ecord) and store
16fd0 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a it in *rowid..*
16fe0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f * Return SQLITE_
16ff0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 OK if everything
17000 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 works, or an er
17010 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 ror code otherwi
17020 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d se..**.** pCur m
17030 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 ight be pointing
17040 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 to text obtaine
17050 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 d from a corrupt
17060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a database file..
17070 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e ** So the conten
17080 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 t cannot be trus
17090 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 ted. Do appropr
170a0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 iate checks on t
170b0 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 he content..*/.i
170c0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 nt sqlite3VdbeId
170d0 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a xRowid(sqlite3 *
170e0 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 db, BtCursor *pC
170f0 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b ur, i64 *rowid){
17100 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 . i64 nCellKey
17110 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 = 0;. int rc;.
17120 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 u32 szHdr;
17130 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 /* Size of th
17140 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 e header */. u3
17150 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2 typeRowid;
17160 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f /* Serial type o
17170 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 f the rowid */.
17180 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 u32 lenRowid;
17190 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 /* Size of th
171a0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d e rowid */. Mem
171b0 20 6d 2c 20 76 3b 0a 0a 20 20 55 4e 55 53 45 44 m, v;.. UNUSED
171c0 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a _PARAMETER(db);.
171d0 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 . /* Get the si
171e0 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 ze of the index
171f0 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 entry. Only ind
17200 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 ices entries of
17210 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 less. ** than 2
17220 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 GiB are support
17230 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 - anything large
17240 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 must be databas
17250 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 e corruption..
17260 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f ** Any corruptio
17270 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e n is detected in
17280 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 sqlite3BtreePar
17290 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f seCellPtr(), tho
172a0 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 ugh, so. ** thi
172b0 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c s code can safel
172c0 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 y assume that nC
172d0 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 ellKey is 32-bit
172e0 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 s . */. asser
172f0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 t( sqlite3BtreeC
17300 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 ursorIsValid(pCu
17310 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c r) );. rc = sql
17320 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 ite3BtreeKeySize
17330 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 (pCur, &nCellKey
17340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d );. assert( rc=
17350 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 =SQLITE_OK );
17360 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 /* pCur is alw
17370 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 ays valid so Key
17380 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c Size cannot fail
17390 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e */. assert( (n
173a0 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 CellKey & SQLITE
173b0 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 _MAX_U32)==(u64)
173c0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f nCellKey );.. /
173d0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f * Read in the co
173e0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f mplete content o
173f0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 f the index entr
17400 79 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d y */. memset(&m
17410 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 29 29 3b , 0, sizeof(m));
17420 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 . rc = sqlite3V
17430 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 dbeMemFromBtree(
17440 70 43 75 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 pCur, 0, (int)nC
17450 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a ellKey, 1, &m);.
17460 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
17470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a return rc;. }..
17480 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 /* The index e
17490 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 ntry must begin
174a0 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 with a header si
174b0 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 ze */. (void)ge
174c0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d tVarint32((u8*)m
174d0 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 .z, szHdr);. te
174e0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 stcase( szHdr==3
174f0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
17500 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 szHdr==m.n );.
17510 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 if( unlikely(szH
17520 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 dr<3 || (int)szH
17530 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 dr>m.n) ){. g
17540 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f oto idx_rowid_co
17550 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 rruption;. }..
17560 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 /* The last fie
17570 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 ld of the index
17580 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 should be an int
17590 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 eger - the ROWID
175a0 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 .. ** Verify th
175b0 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 at the last entr
175c0 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 y really is an i
175d0 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f nteger. */. (vo
175e0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 id)getVarint32((
175f0 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 u8*)&m.z[szHdr-1
17600 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 ], typeRowid);.
17610 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 testcase( typeR
17620 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 owid==1 );. tes
17630 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 tcase( typeRowid
17640 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 ==2 );. testcas
17650 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 e( typeRowid==3
17660 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 );. testcase( t
17670 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 ypeRowid==4 );.
17680 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 testcase( typeR
17690 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 owid==5 );. tes
176a0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 tcase( typeRowid
176b0 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 ==6 );. testcas
176c0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 e( typeRowid==8
176d0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 );. testcase( t
176e0 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 ypeRowid==9 );.
176f0 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 if( unlikely(ty
17700 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 peRowid<1 || typ
17710 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 eRowid>9 || type
17720 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 Rowid==7) ){.
17730 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f goto idx_rowid_
17740 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a corruption;. }.
17750 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c lenRowid = sql
17760 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 ite3VdbeSerialTy
17770 70 65 4c 65 6e 28 74 79 70 65 52 6f 77 69 64 29 peLen(typeRowid)
17780 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 ;. testcase( (u
17790 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 32)m.n==szHdr+le
177a0 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 nRowid );. if(
177b0 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e unlikely((u32)m.
177c0 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 n<szHdr+lenRowid
177d0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 ) ){. goto id
177e0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 x_rowid_corrupti
177f0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 on;. }.. /* Fe
17800 74 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 tch the integer
17810 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 off the end of t
17820 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 he index record
17830 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 */. sqlite3Vdbe
17840 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 SerialGet((u8*)&
17850 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 m.z[m.n-lenRowid
17860 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 ], typeRowid, &v
17870 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e );. *rowid = v.
17880 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 u.i;. sqlite3Vd
17890 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 beMemRelease(&m)
178a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
178b0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 E_OK;.. /* Jump
178c0 20 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 here if databas
178d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 e corruption is
178e0 64 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d detected after m
178f0 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 has been. ** a
17900 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 llocated. Free
17910 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 the m object and
17920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 return SQLITE_C
17930 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 ORRUPT. */.idx_r
17940 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a owid_corruption:
17950 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 7a . testcase( m.z
17960 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 Malloc!=0 );. s
17970 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
17980 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 ease(&m);. retu
17990 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 rn SQLITE_CORRUP
179a0 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a T_BKPT;.}../*.**
179b0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 Compare the key
179c0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e of the index en
179d0 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 try that cursor
179e0 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 pC is pointing t
179f0 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 o against.** the
17a00 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 key string in p
17a10 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 Unpacked. Write
17a20 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 into *pRes a nu
17a30 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 mber.** that is
17a40 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 negative, zero,
17a50 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 or positive if p
17a60 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 C is less than,
17a70 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 equal to,.** or
17a80 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e greater than pUn
17a90 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 packed. Return
17aa0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 SQLITE_OK on suc
17ab0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 cess..**.** pUnp
17ac0 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 acked is either
17ad0 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 created without
17ae0 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 a rowid or is tr
17af0 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 uncated so that
17b00 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 it.** omits the
17b10 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 rowid at the end
17b20 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 . The rowid at
17b30 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 the end of the i
17b40 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 ndex entry.** is
17b50 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c ignored as well
17b60 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 . Hence, this r
17b70 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 outine only comp
17b80 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 ares the prefixe
17b90 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 s .** of the key
17ba0 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 s prior to the f
17bb0 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 inal rowid, not
17bc0 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a the entire key..
17bd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
17be0 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 beIdxKeyCompare(
17bf0 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 . VdbeCursor *p
17c00 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f C, /
17c10 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 * The cursor to
17c20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 compare against
17c30 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 */. UnpackedRec
17c40 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 ord *pUnpacked,
17c50 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 /* Unpacked ver
17c60 73 69 6f 6e 20 6f 66 20 6b 65 79 20 74 6f 20 63 sion of key to c
17c70 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a ompare against *
17c80 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 /. int *res
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17ca0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d /* Write the com
17cb0 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 parison result h
17cc0 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 ere */.){. i64
17cd0 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 nCellKey = 0;.
17ce0 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 int rc;. BtCurs
17cf0 6f 72 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 or *pCur = pC->p
17d00 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b Cursor;. Mem m;
17d10 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 .. assert( sqli
17d20 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 te3BtreeCursorIs
17d30 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 Valid(pCur) );.
17d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 rc = sqlite3Btr
17d50 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 eeKeySize(pCur,
17d60 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 &nCellKey);. as
17d70 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 sert( rc==SQLITE
17d80 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 _OK ); /* pCu
17d90 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 r is always vali
17da0 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e d so KeySize can
17db0 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a not fail */. /*
17dc0 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 nCellKey will a
17dd0 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e lways be between
17de0 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 0 and 0xfffffff
17df0 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 f because of the
17e00 20 73 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 say. ** that b
17e10 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 treeParseCellPtr
17e20 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 () and sqlite3Ge
17e30 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 tVarint32() are
17e40 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 implemented */.
17e50 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 if( nCellKey<=0
17e60 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 || nCellKey>0x7
17e70 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a fffffff ){. *
17e80 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 res = 0;. ret
17e90 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 urn SQLITE_CORRU
17ea0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 6d PT_BKPT;. }. m
17eb0 65 6d 73 65 74 28 26 6d 2c 20 30 2c 20 73 69 7a emset(&m, 0, siz
17ec0 65 6f 66 28 6d 29 29 3b 0a 20 20 72 63 20 3d 20 eof(m));. rc =
17ed0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 sqlite3VdbeMemFr
17ee0 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43 75 72 omBtree(pC->pCur
17ef0 73 6f 72 2c 20 30 2c 20 28 69 6e 74 29 6e 43 65 sor, 0, (int)nCe
17f00 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 llKey, 1, &m);.
17f10 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 if( rc ){. r
17f20 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 eturn rc;. }.
17f30 61 73 73 65 72 74 28 20 70 55 6e 70 61 63 6b 65 assert( pUnpacke
17f40 64 2d 3e 66 6c 61 67 73 20 26 20 55 4e 50 41 43 d->flags & UNPAC
17f50 4b 45 44 5f 49 47 4e 4f 52 45 5f 52 4f 57 49 44 KED_IGNORE_ROWID
17f60 20 29 3b 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c );. *res = sql
17f70 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
17f80 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 mpare(m.n, m.z,
17f90 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 pUnpacked);. sq
17fa0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
17fb0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 ase(&m);. retur
17fc0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
17fd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 /*.** This routi
17fe0 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 ne sets the valu
17ff0 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 e to be returned
18000 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 by subsequent c
18010 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 alls to.** sqlit
18020 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 e3_changes() on
18030 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e the database han
18040 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f dle 'db'. .*/.vo
18050 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 id sqlite3VdbeSe
18060 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 tChanges(sqlite3
18070 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 *db, int nChang
18080 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 e){. assert( sq
18090 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 lite3_mutex_held
180a0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 (db->mutex) );.
180b0 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e db->nChange = n
180c0 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 Change;. db->nT
180d0 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 otalChange += nC
180e0 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 hange;.}../*.**
180f0 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 Set a flag in th
18100 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 e vdbe to update
18110 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e the change coun
18120 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 ter when it is f
18130 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 inalised.** or r
18140 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 eset..*/.void sq
18150 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 lite3VdbeCountCh
18160 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a anges(Vdbe *v){.
18170 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e v->changeCntOn
18180 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d = 1;.}../*.** M
18190 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 ark every prepar
181a0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 ed statement ass
181b0 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 ociated with a d
181c0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 atabase connecti
181d0 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 on.** as expired
181e0 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 ..**.** An expir
181f0 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 ed statement mea
18200 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c ns that recompil
18210 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 ation of the sta
18220 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 tement is.** rec
18230 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 ommend. Stateme
18240 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 nts expire when
18250 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 things happen th
18260 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a at make their.**
18270 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 programs obsole
18280 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 te. Removing us
18290 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 er-defined funct
182a0 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e ions or collatin
182b0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 g.** sequences,
182c0 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 or changing an a
182d0 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e uthorization fun
182e0 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 ction are the ty
182f0 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 pes of.** things
18300 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 that make prepa
18310 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f red statements o
18320 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 bsolete..*/.void
18330 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 sqlite3ExpirePr
18340 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 eparedStatements
18350 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 (sqlite3 *db){.
18360 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 Vdbe *p;. for(
18370 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 p = db->pVdbe; p
18380 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 ; p=p->pNext){.
18390 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 p->expired =
183a0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 1;. }.}../*.**
183b0 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 Return the datab
183c0 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 ase associated w
183d0 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f ith the Vdbe..*/
183e0 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 .sqlite3 *sqlite
183f0 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 3VdbeDb(Vdbe *v)
18400 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 {. return v->db
18410 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 ;.}../*.** Retur
18420 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 n a pointer to a
18430 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 n sqlite3_value
18440 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 structure contai
18450 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 ning the value b
18460 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 ound.** paramete
18470 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 r iVar of VM v.
18480 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 Except, if the v
18490 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e alue is an SQL N
184a0 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 ULL, return .**
184b0 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 0 instead. Unles
184c0 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 s it is NULL, ap
184d0 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 ply affinity aff
184e0 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c (one of the SQL
184f0 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e ITE_AFF_*.** con
18500 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 stants) to the v
18510 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 alue before retu
18520 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 rning it..**.**
18530 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c The returned val
18540 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 ue must be freed
18550 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 by the caller u
18560 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 sing sqlite3Valu
18570 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 eFree()..*/.sqli
18580 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 te3_value *sqlit
18590 65 33 56 64 62 65 47 65 74 56 61 6c 75 65 28 56 e3VdbeGetValue(V
185a0 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 dbe *v, int iVar
185b0 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 , u8 aff){. ass
185c0 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 ert( iVar>0 );.
185d0 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 if( v ){. Me
185e0 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 m *pMem = &v->aV
185f0 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 ar[iVar-1];.
18600 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c if( 0==(pMem->fl
18610 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 ags & MEM_Null)
18620 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
18630 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 _value *pRet = s
18640 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 qlite3ValueNew(v
18650 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 ->db);. if(
18660 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 pRet ){.
18670 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 sqlite3VdbeMemC
18680 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c opy((Mem *)pRet,
18690 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 pMem);.
186a0 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c sqlite3ValueAppl
186b0 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 yAffinity(pRet,
186c0 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 aff, SQLITE_UTF8
186d0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 );. sqlit
186e0 65 33 56 64 62 65 4d 65 6d 53 74 6f 72 65 54 79 e3VdbeMemStoreTy
186f0 70 65 28 28 4d 65 6d 20 2a 29 70 52 65 74 29 3b pe((Mem *)pRet);
18700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 . }. r
18710 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 eturn pRet;.
18720 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 }. }. return 0
18730 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 ;.}../*.** Confi
18740 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c gure SQL variabl
18750 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 e iVar so that b
18760 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c inding a new val
18770 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 ue to it signals
18780 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 .** to sqlite3_r
18790 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 eoptimize() that
187a0 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 re-preparing th
187b0 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 e statement may
187c0 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 result.** in a b
187d0 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e etter query plan
187e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
187f0 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 3VdbeSetVarmask(
18800 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 Vdbe *v, int iVa
18810 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 r){. assert( iV
18820 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 ar>0 );. if( iV
18830 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e ar>32 ){. v->
18840 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 expmask = 0xffff
18850 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ffff;. }else{.
18860 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d v->expmask |=
18870 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 ((u32)1 << (iVa
18880 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a r-1));. }.}.