0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65 /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 ing:.**.** Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 d not evil..**
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 ive others..**
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 May you share
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65 le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69 used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20 ng, destroying,
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20 * a VDBE (or an
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61 "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72 the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64 ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74 ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72 e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73 se *pParse){. s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20 rse->db;. Vdbe
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 *p;. p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29 , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 ;. if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62 eturn 0;. p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d = db;. if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62 >pVdbe ){. db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65 p;. }. p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 . p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 BE_MAGIC_INIT;.
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61 p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 rse;. assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30 Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 );. assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20 arse->nLabel==0
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 );. assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30 rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 );. assert( pP
0410: 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d arse->szOpAlloc=
0420: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 =0 );. return p
0430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 ;.}../*.** Chang
0440: 65 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69 e the error stri
0450: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62 ng stored in Vdb
0460: 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69 e.zErrMsg.*/.voi
0470: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 d sqlite3VdbeErr
0480: 6f 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 or(Vdbe *p, cons
0490: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
04a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 ...){. va_list
04b0: 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 ap;. sqlite3Db
04c0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a Free(p->db, p->z
04d0: 45 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74 ErrMsg);. va_st
04e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 art(ap, zFormat)
04f0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d ;. p->zErrMsg =
0500: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 sqlite3VMPrintf
0510: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c (p->db, zFormat,
0520: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 ap);. va_end(a
0530: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d p);.}../*.** Rem
0540: 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74 ember the SQL st
0550: 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61 ring for a prepa
0560: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a red statement..*
0570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
0580: 62 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70 beSetSql(Vdbe *p
0590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c , const char *z,
05a0: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72 int n, int isPr
05b0: 65 70 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65 epareV2){. asse
05c0: 72 74 28 20 69 73 50 72 65 70 61 72 65 56 32 3d rt( isPrepareV2=
05d0: 3d 31 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56 =1 || isPrepareV
05e0: 32 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d 2==0 );. if( p=
05f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 =0 ) return;.#if
0600: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
0610: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21 OMIT_TRACE) && !
0620: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 defined(SQLITE_E
0630: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 NABLE_SQLLOG).
0640: 69 66 28 20 21 69 73 50 72 65 70 61 72 65 56 32 if( !isPrepareV2
0650: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69 ) return;.#endi
0660: 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a f. assert( p->z
0670: 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a Sql==0 );. p->z
0680: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53 Sql = sqlite3DbS
0690: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c trNDup(p->db, z,
06a0: 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70 n);. p->isPrep
06b0: 61 72 65 56 32 20 3d 20 28 75 38 29 69 73 50 72 areV2 = (u8)isPr
06c0: 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a epareV2;.}../*.*
06d0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 53 51 4c * Return the SQL
06e0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
06f0: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 a prepared stat
0700: 65 6d 65 6e 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 ement.*/.const c
0710: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 71 6c har *sqlite3_sql
0720: 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 (sqlite3_stmt *p
0730: 53 74 6d 74 29 7b 0a 20 20 56 64 62 65 20 2a 70 Stmt){. Vdbe *p
0740: 20 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 = (Vdbe *)pStmt
0750: 3b 0a 20 20 72 65 74 75 72 6e 20 70 20 3f 20 70 ;. return p ? p
0760: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f ->zSql : 0;.}../
0770: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f *.** Swap all co
0780: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77 ntent between tw
0790: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65 o VDBE structure
07a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 s..*/.void sqlit
07b0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20 e3VdbeSwap(Vdbe
07c0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a *pA, Vdbe *pB){.
07d0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d Vdbe tmp, *pTm
07e0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b p;. char *zTmp;
07f0: 0a 20 20 61 73 73 65 72 74 28 20 70 41 2d 3e 64 . assert( pA->d
0800: 62 3d 3d 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74 b==pB->db );. t
0810: 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 mp = *pA;. *pA
0820: 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 = *pB;. *pB = t
0830: 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d mp;. pTmp = pA-
0840: 3e 70 4e 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e >pNext;. pA->pN
0850: 65 78 74 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b ext = pB->pNext;
0860: 0a 20 20 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 . pB->pNext = p
0870: 54 6d 70 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 Tmp;. pTmp = pA
0880: 2d 3e 70 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 ->pPrev;. pA->p
0890: 50 72 65 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 Prev = pB->pPrev
08a0: 3b 0a 20 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 ;. pB->pPrev =
08b0: 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 pTmp;. zTmp = p
08c0: 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a A->zSql;. pA->z
08d0: 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a Sql = pB->zSql;.
08e0: 20 20 70 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d pB->zSql = zTm
08f0: 70 3b 0a 20 20 70 42 2d 3e 69 73 50 72 65 70 61 p;. pB->isPrepa
0900: 72 65 56 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 reV2 = pA->isPre
0910: 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a pareV2;.}../*.**
0920: 20 52 65 73 69 7a 65 20 74 68 65 20 56 64 62 65 Resize the Vdbe
0930: 2e 61 4f 70 20 61 72 72 61 79 20 73 6f 20 74 68 .aOp array so th
0940: 61 74 20 69 74 20 69 73 20 61 74 20 6c 65 61 73 at it is at leas
0950: 74 20 6e 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c t nOp elements l
0960: 61 72 67 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69 arger .** than i
0970: 74 73 20 63 75 72 72 65 6e 74 20 73 69 7a 65 2e ts current size.
0980: 20 6e 4f 70 20 69 73 20 67 75 61 72 61 6e 74 65 nOp is guarante
0990: 65 64 20 74 6f 20 62 65 20 6c 65 73 73 20 74 68 ed to be less th
09a0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 an or equal.** t
09b0: 6f 20 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 o 1024/sizeof(Op
09c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f )..**.** If an o
09d0: 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 ut-of-memory err
09e0: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 or occurs while
09f0: 72 65 73 69 7a 69 6e 67 20 74 68 65 20 61 72 72 resizing the arr
0a00: 61 79 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 ay, return.** SQ
0a10: 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 LITE_NOMEM. In t
0a20: 68 69 73 20 63 61 73 65 20 56 64 62 65 2e 61 4f his case Vdbe.aO
0a30: 70 20 61 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41 p and Parse.nOpA
0a40: 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 lloc remain .**
0a50: 75 6e 63 68 61 6e 67 65 64 20 28 74 68 69 73 20 unchanged (this
0a60: 69 73 20 73 6f 20 74 68 61 74 20 61 6e 79 20 6f is so that any o
0a70: 70 63 6f 64 65 73 20 61 6c 72 65 61 64 79 20 61 pcodes already a
0a80: 6c 6c 6f 63 61 74 65 64 20 63 61 6e 20 62 65 20 llocated can be
0a90: 0a 2a 2a 20 63 6f 72 72 65 63 74 6c 79 20 64 65 .** correctly de
0aa0: 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 allocated along
0ab0: 77 69 74 68 20 74 68 65 20 72 65 73 74 20 6f 66 with the rest of
0ac0: 20 74 68 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 the Vdbe)..*/.s
0ad0: 74 61 74 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 tatic int growOp
0ae0: 41 72 72 61 79 28 56 64 62 65 20 2a 76 2c 20 69 Array(Vdbe *v, i
0af0: 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f nt nOp){. VdbeO
0b00: 70 20 2a 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 p *pNew;. Parse
0b10: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b *p = v->pParse;
0b20: 0a 0a 20 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 .. /* The SQLIT
0b30: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 E_TEST_REALLOC_S
0b40: 54 52 45 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69 TRESS compile-ti
0b50: 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 64 65 73 me option is des
0b60: 69 67 6e 65 64 20 74 6f 20 66 6f 72 63 65 0a 20 igned to force.
0b70: 20 2a 2a 20 6d 6f 72 65 20 66 72 65 71 75 65 6e ** more frequen
0b80: 74 20 72 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68 t reallocs and h
0b90: 65 6e 63 65 20 70 72 6f 76 69 64 65 20 6d 6f 72 ence provide mor
0ba0: 65 20 6f 70 70 6f 72 74 75 6e 69 74 69 65 73 20 e opportunities
0bb0: 66 6f 72 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 for . ** simula
0bc0: 74 65 64 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 ted OOM faults.
0bd0: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 SQLITE_TEST_REA
0be0: 4c 4c 4f 43 5f 53 54 52 45 53 53 20 69 73 20 67 LLOC_STRESS is g
0bf0: 65 6e 65 72 61 6c 6c 79 20 75 73 65 64 0a 20 20 enerally used.
0c00: 2a 2a 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e ** during testin
0c10: 67 20 6f 6e 6c 79 2e 20 20 57 69 74 68 20 53 51 g only. With SQ
0c20: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f LITE_TEST_REALLO
0c30: 43 5f 53 54 52 45 53 53 20 67 72 6f 77 20 74 68 C_STRESS grow th
0c40: 65 20 6f 70 20 61 72 72 61 79 0a 20 20 2a 2a 20 e op array. **
0c50: 62 79 20 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 by the minimum*
0c60: 61 6d 6f 75 6e 74 20 72 65 71 75 69 72 65 64 20 amount required
0c70: 75 6e 74 69 6c 20 74 68 65 20 73 69 7a 65 20 72 until the size r
0c80: 65 61 63 68 65 73 20 35 31 32 2e 20 20 4e 6f 72 eaches 512. Nor
0c90: 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 mal. ** operati
0ca0: 6f 6e 20 28 77 69 74 68 6f 75 74 20 53 51 4c 49 on (without SQLI
0cb0: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f TE_TEST_REALLOC_
0cc0: 53 54 52 45 53 53 29 20 69 73 20 74 6f 20 64 6f STRESS) is to do
0cd0: 75 62 6c 65 20 74 68 65 20 63 75 72 72 65 6e 74 uble the current
0ce0: 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 . ** size of th
0cf0: 65 20 6f 70 20 61 72 72 61 79 20 6f 72 20 61 64 e op array or ad
0d00: 64 20 31 4b 42 20 6f 66 20 73 70 61 63 65 2c 20 d 1KB of space,
0d10: 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 whichever is sma
0d20: 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20 ller. */.#ifdef
0d30: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c SQLITE_TEST_REAL
0d40: 4c 4f 43 5f 53 54 52 45 53 53 0a 20 20 69 6e 74 LOC_STRESS. int
0d50: 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 nNew = (p->nOpA
0d60: 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e lloc>=512 ? p->n
0d70: 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e OpAlloc*2 : p->n
0d80: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 OpAlloc+nOp);.#e
0d90: 6c 73 65 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d lse. int nNew =
0da0: 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 (p->nOpAlloc ?
0db0: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 p->nOpAlloc*2 :
0dc0: 28 69 6e 74 29 28 31 30 32 34 2f 73 69 7a 65 6f (int)(1024/sizeo
0dd0: 66 28 4f 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 f(Op)));. UNUSE
0de0: 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 D_PARAMETER(nOp)
0df0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 ;.#endif.. asse
0e00: 72 74 28 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 rt( nOp<=(1024/s
0e10: 69 7a 65 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 izeof(Op)) );.
0e20: 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 assert( nNew>=(p
0e30: 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 ->nOpAlloc+nOp)
0e40: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 );. pNew = sqli
0e50: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e te3DbRealloc(p->
0e60: 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 db, v->aOp, nNew
0e70: 2a 73 69 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 *sizeof(Op));.
0e80: 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 if( pNew ){.
0e90: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 p->szOpAlloc = s
0ea0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 qlite3DbMallocSi
0eb0: 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b ze(p->db, pNew);
0ec0: 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 . p->nOpAlloc
0ed0: 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f = p->szOpAlloc/
0ee0: 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 sizeof(Op);.
0ef0: 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 v->aOp = pNew;.
0f00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 4e 65 }. return (pNe
0f10: 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 w ? SQLITE_OK :
0f20: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 7d SQLITE_NOMEM);.}
0f30: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
0f40: 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f DEBUG./* This ro
0f50: 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 utine is just a
0f60: 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 convenient place
0f70: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 to set a breakp
0f80: 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a oint that will.*
0f90: 2a 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 * fire after eac
0fa0: 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 h opcode is inse
0fb0: 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 rted and display
0fc0: 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 ed using.** "PRA
0fd0: 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 GMA vdbe_addoptr
0fe0: 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 ace=on"..*/.stat
0ff0: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 ic void test_add
1000: 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f op_breakpoint(vo
1010: 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e id){. static in
1020: 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a t n = 0;. n++;.
1030: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 }.#endif../*.**
1040: 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 Add a new instru
1050: 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 ction to the lis
1060: 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e t of instruction
1070: 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 s current in the
1080: 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 .** VDBE. Retur
1090: 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 n the address of
10a0: 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 the new instruc
10b0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 tion..**.** Para
10c0: 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 meters:.**.**
10d0: 20 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p
10e0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 Pointer to the
10f0: 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 VDBE.**.** op
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 Th
1110: 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 e opcode for thi
1120: 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a s instruction.**
1130: 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 .** p1, p2, p
1140: 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 3 Operands.
1150: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 **.** Use the sq
1160: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 lite3VdbeResolve
1170: 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e Label() function
1180: 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 to fix an addre
1190: 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 ss and.** the sq
11a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 lite3VdbeChangeP
11b0: 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 4() function to
11c0: 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 change the value
11d0: 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 of the P4.** op
11e0: 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 erand..*/.static
11f0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 SQLITE_NOINLINE
1200: 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64 62 int growOp3(Vdb
1210: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e e *p, int op, in
1220: 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e t p1, int p2, in
1230: 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74 28 t p3){. assert(
1240: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 p->pParse->nOpA
1250: 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a lloc<=p->nOp );.
1260: 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 if( growOpArra
1270: 79 28 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e y(p, 1) ) return
1280: 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 1;. assert( p-
1290: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f >pParse->nOpAllo
12a0: 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 c>p->nOp );. re
12b0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 turn sqlite3Vdbe
12c0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 AddOp3(p, op, p1
12d0: 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e 74 , p2, p3);.}.int
12e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
12f0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 p3(Vdbe *p, int
1300: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 op, int p1, int
1310: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 p2, int p3){. i
1320: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a nt i;. VdbeOp *
1330: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e pOp;.. i = p->n
1340: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d Op;. assert( p-
1350: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
1360: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 IC_INIT );. ass
1370: 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f 70 ert( op>=0 && op
1380: 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 <0xff );. if( p
1390: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c ->pParse->nOpAll
13a0: 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 oc<=i ){. ret
13b0: 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f urn growOp3(p, o
13c0: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a p, p1, p2, p3);.
13d0: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a }. p->nOp++;.
13e0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b pOp = &p->aOp[
13f0: 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 i];. pOp->opcod
1400: 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f e = (u8)op;. pO
1410: 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 p->p5 = 0;. pOp
1420: 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 ->p1 = p1;. pOp
1430: 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 ->p2 = p2;. pOp
1440: 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 ->p3 = p3;. pOp
1450: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f ->p4.p = 0;. pO
1460: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e p->p4type = P4_N
1470: 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 OTUSED;.#ifdef S
1480: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 QLITE_ENABLE_EXP
1490: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 LAIN_COMMENTS.
14a0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 pOp->zComment =
14b0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 0;.#endif.#ifdef
14c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 SQLITE_DEBUG.
14d0: 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 if( p->db->flags
14e0: 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 & SQLITE_VdbeAd
14f0: 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 dopTrace ){.
1500: 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 int jj, kk;.
1510: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 Parse *pParse =
1520: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66 p->pParse;. f
1530: 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 or(jj=kk=0; jj<S
1540: 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 QLITE_N_COLCACHE
1550: 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 ; jj++){. s
1560: 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 truct yColCache
1570: 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f *x = pParse->aCo
1580: 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 lCache + jj;.
1590: 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c if( x->iLevel
15a0: 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c >pParse->iCacheL
15b0: 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d evel || x->iReg=
15c0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 =0 ) continue;.
15d0: 20 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b printf(" r[
15e0: 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d %d]={%d:%d}", x-
15f0: 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 >iReg, x->iTable
1600: 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 , x->iColumn);.
1610: 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d kk++;. }
1620: 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72 . if( kk ) pr
1630: 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 intf("\n");.
1640: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 sqlite3VdbePrint
1650: 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 Op(0, i, &p->aOp
1660: 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 [i]);. test_a
1670: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 ddop_breakpoint(
1680: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 );. }.#endif.#i
1690: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c fdef VDBE_PROFIL
16a0: 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 E. pOp->cycles
16b0: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 = 0;. pOp->cnt
16c0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 = 0;.#endif.#ifd
16d0: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 ef SQLITE_VDBE_C
16e0: 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 OVERAGE. pOp->i
16f0: 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e SrcLine = 0;.#en
1700: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a dif. return i;.
1710: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 }.int sqlite3Vdb
1720: 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c eAddOp0(Vdbe *p,
1730: 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 int op){. retu
1740: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 rn sqlite3VdbeAd
1750: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 dOp3(p, op, 0, 0
1760: 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 , 0);.}.int sqli
1770: 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 te3VdbeAddOp1(Vd
1780: 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 be *p, int op, i
1790: 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e nt p1){. return
17a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
17b0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c p3(p, op, p1, 0,
17c0: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 0);.}.int sqlit
17d0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 e3VdbeAddOp2(Vdb
17e0: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e e *p, int op, in
17f0: 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 t p1, int p2){.
1800: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
1810: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c dbeAddOp3(p, op,
1820: 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a p1, p2, 0);.}..
1830: 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 /* Generate code
1840: 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 for an uncondit
1850: 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e ional jump to in
1860: 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a struction iDest.
1870: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
1880: 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 beGoto(Vdbe *p,
1890: 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 int iDest){. re
18a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 turn sqlite3Vdbe
18b0: 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 AddOp3(p, OP_Got
18c0: 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b o, 0, iDest, 0);
18d0: 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 .}../* Generate
18e0: 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 code to cause th
18f0: 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f e string zStr to
1900: 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a be loaded into.
1910: 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73 ** register iDes
1920: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 t.*/.int sqlite3
1930: 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 VdbeLoadString(V
1940: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 dbe *p, int iDes
1950: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a t, const char *z
1960: 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 Str){. return s
1970: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 qlite3VdbeAddOp4
1980: 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 (p, OP_String8,
1990: 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 0, iDest, 0, zSt
19a0: 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 r, 0);.}../*.**
19b0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 Generate code th
19c0: 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d at initializes m
19d0: 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 ultiple register
19e0: 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 s to string or i
19f0: 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 nteger.** consta
1a00: 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 nts. The regist
1a10: 65 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 ers begin with i
1a20: 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 Dest and increas
1a30: 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e e consecutively.
1a40: 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 .** One register
1a50: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 is initialized
1a60: 66 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67 for each characg
1a70: 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e ter in zTypes[].
1a80: 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 For each.** "s
1a90: 22 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a " character in z
1aa0: 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 Types[], the reg
1ab0: 69 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e ister is a strin
1ac0: 67 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e g if the argumen
1ad0: 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c t is.** not NULL
1ae0: 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 , or OP_Null if
1af0: 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e the value is a n
1b00: 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f ull pointer. Fo
1b10: 72 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61 r each "i" chara
1b20: 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 cter.** in zType
1b30: 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 s[], the registe
1b40: 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 r is initialized
1b50: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a to an integer..
1b60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
1b70: 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62 dbeMultiLoad(Vdb
1b80: 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c e *p, int iDest,
1b90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 const char *zTy
1ba0: 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f pes, ...){. va_
1bb0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69 list ap;. int i
1bc0: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61 ;. char c;. va
1bd0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65 _start(ap, zType
1be0: 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 s);. for(i=0; (
1bf0: 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d c = zTypes[i])!=
1c00: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 0; i++){. if(
1c10: 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20 c=='s' ){.
1c20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d const char *z =
1c30: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 va_arg(ap, cons
1c40: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 t char*);.
1c50: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
1c60: 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 4(p, z==0 ? OP_N
1c70: 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 ull : OP_String8
1c80: 2c 20 30 2c 20 69 44 65 73 74 2b 2b 2c 20 30 2c , 0, iDest++, 0,
1c90: 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 z, 0);. }els
1ca0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 e{. assert(
1cb0: 20 63 3d 3d 27 69 27 20 29 3b 0a 20 20 20 20 20 c=='i' );.
1cc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
1cd0: 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 p2(p, OP_Integer
1ce0: 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 , va_arg(ap, int
1cf0: 29 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 ), iDest++);.
1d00: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 }. }. va_end(
1d10: 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 ap);.}../*.** Ad
1d20: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 d an opcode that
1d30: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 includes the p4
1d40: 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e value as a poin
1d50: 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 ter..*/.int sqli
1d60: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 te3VdbeAddOp4(.
1d70: 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 Vdbe *p,
1d80: 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 /* Add the
1d90: 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 opcode to this V
1da0: 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 M */. int op,
1db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
1dc0: 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a e new opcode */.
1dd0: 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 int p1,
1de0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 /* The P1
1df0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
1e00: 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 p2,
1e10: 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 /* The P2 opera
1e20: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 nd */. int p3,
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
1e40: 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f he P3 operand */
1e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
1e60: 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 P4, /* The P4
1e70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e operand */. in
1e80: 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 t p4type
1e90: 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 /* P4 operand
1ea0: 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 type */.){. int
1eb0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 addr = sqlite3V
1ec0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c dbeAddOp3(p, op,
1ed0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 p1, p2, p3);.
1ee0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 sqlite3VdbeChang
1ef0: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 eP4(p, addr, zP4
1f00: 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 , p4type);. ret
1f10: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a urn addr;.}../*.
1f20: 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 ** Add an opcode
1f30: 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 that includes t
1f40: 68 65 20 70 34 20 76 61 6c 75 65 20 77 69 74 68 he p4 value with
1f50: 20 61 20 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a a P4_INT64 or.*
1f60: 2a 20 50 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a * P4_REAL type..
1f70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
1f80: 62 65 41 64 64 4f 70 34 44 75 70 38 28 0a 20 20 beAddOp4Dup8(.
1f90: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 Vdbe *p,
1fa0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f /* Add the o
1fb0: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d pcode to this VM
1fc0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 */. int op,
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
1fe0: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 new opcode */.
1ff0: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 int p1,
2000: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f /* The P1 o
2010: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 perand */. int
2020: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 p2,
2030: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e /* The P2 operan
2040: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 d */. int p3,
2050: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
2060: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a e P3 operand */.
2070: 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c const u8 *zP4,
2080: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 /* The P4
2090: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
20a0: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20 p4type
20b0: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 /* P4 operand t
20c0: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 ype */.){. char
20d0: 20 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 *p4copy = sqlit
20e0: 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 e3DbMallocRawNN(
20f0: 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 sqlite3VdbeDb(p)
2100: 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34 63 6f , 8);. if( p4co
2110: 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34 63 6f py ) memcpy(p4co
2120: 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 py, zP4, 8);. r
2130: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 eturn sqlite3Vdb
2140: 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 eAddOp4(p, op, p
2150: 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 1, p2, p3, p4cop
2160: 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f y, p4type);.}../
2170: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 *.** Add an OP_P
2180: 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 arseSchema opcod
2190: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 e. This routine
21a0: 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 is broken out f
21b0: 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 rom.** sqlite3Vd
21c0: 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 beAddOp4() since
21d0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 it needs to als
21e0: 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 o needs to mark
21f0: 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 all btrees.** as
2200: 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 having been use
2210: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 d..**.** The zWh
2220: 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 ere string must
2230: 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e have been obtain
2240: 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f ed from sqlite3_
2250: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 malloc()..** Thi
2260: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 s routine will t
2270: 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 ake ownership of
2280: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d the allocated m
2290: 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 emory..*/.void s
22a0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 qlite3VdbeAddPar
22b0: 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 seSchemaOp(Vdbe
22c0: 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 *p, int iDb, cha
22d0: 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e r *zWhere){. in
22e0: 74 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 t j;. sqlite3Vd
22f0: 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 beAddOp4(p, OP_P
2300: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c arseSchema, iDb,
2310: 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 0, 0, zWhere, P
2320: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 4_DYNAMIC);. fo
2330: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e r(j=0; j<p->db->
2340: 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 nDb; j++) sqlite
2350: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 3VdbeUsesBtree(p
2360: 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 , j);.}../*.** A
2370: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 dd an opcode tha
2380: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 t includes the p
2390: 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 4 value as an in
23a0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 teger..*/.int sq
23b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 lite3VdbeAddOp4I
23c0: 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 nt(. Vdbe *p,
23d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 /* Add
23e0: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 the opcode to t
23f0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 his VM */. int
2400: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 op,
2410: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 /* The new opcod
2420: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 e */. int p1,
2430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
2440: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a e P1 operand */.
2450: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 int p2,
2460: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 /* The P2
2470: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
2480: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 p3,
2490: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 /* The P3 opera
24a0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 nd */. int p4
24b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
24c0: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 he P4 operand as
24d0: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 an integer */.)
24e0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 {. int addr = s
24f0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 qlite3VdbeAddOp3
2500: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 (p, op, p1, p2,
2510: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 p3);. sqlite3Vd
2520: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 beChangeP4(p, ad
2530: 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 dr, SQLITE_INT_T
2540: 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e O_PTR(p4), P4_IN
2550: 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 T32);. return a
2560: 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 ddr;.}../* Inser
2570: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 t the end of a c
2580: 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 o-routine.*/.voi
2590: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 d sqlite3VdbeEnd
25a0: 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a Coroutine(Vdbe *
25b0: 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 v, int regYield)
25c0: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 {. sqlite3VdbeA
25d0: 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 ddOp1(v, OP_EndC
25e0: 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 oroutine, regYie
25f0: 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 ld);.. /* Clear
2600: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 the temporary r
2610: 65 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 egister cache, t
2620: 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 hereby ensuring
2630: 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 that each. ** c
2640: 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 o-routine has it
2650: 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e s own independen
2660: 74 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 t set of registe
2670: 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 rs, because co-r
2680: 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 outines. ** mig
2690: 68 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 ht expect their
26a0: 72 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 registers to be
26b0: 70 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 preserved across
26c0: 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e an OP_Yield, an
26d0: 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c d. ** that coul
26e0: 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 d cause problems
26f0: 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 if two or more
2700: 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 co-routines are
2710: 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 using the same.
2720: 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 ** temporary re
2730: 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 gister.. */. v
2740: 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 ->pParse->nTempR
2750: 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 eg = 0;. v->pPa
2760: 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d rse->nRangeReg =
2770: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 0;.}../*.** Cre
2780: 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c ate a new symbol
2790: 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 ic label for an
27a0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 instruction that
27b0: 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a has yet to be.*
27c0: 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 * coded. The sy
27d0: 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 mbolic label is
27e0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 really just a ne
27f0: 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 gative number.
2800: 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e The.** label can
2810: 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 be used as the
2820: 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f P2 value of an o
2830: 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 peration. Later
2840: 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 , when.** the la
2850: 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 bel is resolved
2860: 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 to a specific ad
2870: 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 dress, the VDBE
2880: 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 will scan.** thr
2890: 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 ough its operati
28a0: 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e on list and chan
28b0: 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 ge all values of
28c0: 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a P2 which match.
28d0: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 ** the label int
28e0: 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 o the resolved a
28f0: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 ddress..**.** Th
2900: 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 e VDBE knows tha
2910: 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 t a P2 value is
2920: 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 a label because
2930: 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c labels are.** al
2940: 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e ways negative an
2950: 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 d P2 values are
2960: 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f suppose to be no
2970: 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 n-negative..** H
2980: 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 ence, a negative
2990: 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c P2 value is a l
29a0: 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 abel that has ye
29b0: 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 t to be resolved
29c0: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 ..**.** Zero is
29d0: 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 returned if a ma
29e0: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f lloc() fails..*/
29f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
2a00: 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a MakeLabel(Vdbe *
2a10: 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d v){. Parse *p =
2a20: 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e v->pParse;. in
2a30: 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b t i = p->nLabel+
2a40: 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e +;. assert( v->
2a50: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
2a60: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 C_INIT );. if(
2a70: 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 (i & (i-1))==0 )
2a80: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 {. p->aLabel
2a90: 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c = sqlite3DbReall
2aa0: 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 ocOrFree(p->db,
2ab0: 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 p->aLabel, .
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ae0: 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f (i*2+1)*sizeo
2af0: 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 f(p->aLabel[0]))
2b00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 ;. }. if( p->a
2b10: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e Label ){. p->
2b20: 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a aLabel[i] = -1;.
2b30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 }. return ADD
2b40: 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 R(i);.}../*.** R
2b50: 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 esolve label "x"
2b60: 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 to be the addre
2b70: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 ss of the next i
2b80: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a nstruction to.**
2b90: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 be inserted. T
2ba0: 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 he parameter "x"
2bb0: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 must have been
2bc0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a obtained from.**
2bd0: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f a prior call to
2be0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 sqlite3VdbeMake
2bf0: 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 Label()..*/.void
2c00: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f sqlite3VdbeReso
2c10: 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 lveLabel(Vdbe *v
2c20: 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 , int x){. Pars
2c30: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 e *p = v->pParse
2c40: 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 ;. int j = ADDR
2c50: 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 (x);. assert( v
2c60: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
2c70: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 GIC_INIT );. as
2c80: 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 sert( j<p->nLabe
2c90: 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a l );. assert( j
2ca0: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e >=0 );. if( p->
2cb0: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d aLabel ){. p-
2cc0: 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e >aLabel[j] = v->
2cd0: 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 nOp;. }. p->iF
2ce0: 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20 ixedOp = v->nOp
2cf0: 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 - 1;.}../*.** Ma
2d00: 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f rk the VDBE as o
2d10: 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 ne that can only
2d20: 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 be run one time
2d30: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
2d40: 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 3VdbeRunOnlyOnce
2d50: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e (Vdbe *p){. p->
2d60: 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b runOnlyOnce = 1;
2d70: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 .}..#ifdef SQLIT
2d80: 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 E_DEBUG /* sqlit
2d90: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 e3AssertMayAbort
2da0: 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a () logic */../*.
2db0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 ** The following
2dc0: 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 type and functi
2dd0: 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 on are used to i
2de0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 terate through a
2df0: 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e ll opcodes.** in
2e00: 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f a Vdbe main pro
2e10: 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 gram and each of
2e20: 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d the sub-program
2e30: 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 20 s (triggers) it
2e40: 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 may .** invoke d
2e50: 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 irectly or indir
2e60: 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 ectly. It should
2e70: 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c be used as foll
2e80: 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 ows:.**.** Op
2e90: 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f *pOp;.** VdbeO
2ea0: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a pIter sIter;.**.
2eb0: 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 ** memset(&sIt
2ec0: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 er, 0, sizeof(sI
2ed0: 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 ter));.** sIte
2ee0: 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 r.v = v;
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f00: 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 // v is of t
2f10: 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 ype Vdbe* .**
2f20: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 while( (pOp = op
2f30: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 IterNext(&sIter)
2f40: 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 ) ){.** // D
2f50: 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 o something with
2f60: 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 pOp.** }.**
2f70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 sqlite3DbFree(v
2f80: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 ->db, sIter.apSu
2f90: 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 b);.** .*/.typed
2fa0: 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 ef struct VdbeOp
2fb0: 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b Iter VdbeOpIter;
2fc0: 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 .struct VdbeOpIt
2fd0: 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 er {. Vdbe *v;
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ff0: 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 /* Vdbe to ite
3000: 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 rate through the
3010: 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 opcodes of */.
3020: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 SubProgram **ap
3030: 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 Sub; /* A
3040: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 rray of subprogr
3050: 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 ams */. int nSu
3060: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 b;
3070: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
3080: 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 entries in apSu
3090: 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 b */. int iAddr
30a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
30b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 /* Address of
30c0: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e next instruction
30d0: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 to return */.
30e0: 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 int iSub;
30f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 /* 0
3100: 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 = main program,
3110: 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 1 = first sub-pr
3120: 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b ogram etc. */.};
3130: 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 .static Op *opIt
3140: 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 erNext(VdbeOpIte
3150: 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 r *p){. Vdbe *v
3160: 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 = p->v;. Op *p
3170: 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 Ret = 0;. Op *a
3180: 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a Op;. int nOp;..
3190: 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 if( p->iSub<=p
31a0: 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 ->nSub ){.. i
31b0: 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b f( p->iSub==0 ){
31c0: 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e . aOp = v->
31d0: 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d aOp;. nOp =
31e0: 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c v->nOp;. }el
31f0: 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 se{. aOp =
3200: 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 p->apSub[p->iSub
3210: 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 -1]->aOp;.
3220: 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 nOp = p->apSub[p
3230: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a ->iSub-1]->nOp;.
3240: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 }. assert
3250: 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 ( p->iAddr<nOp )
3260: 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 ;.. pRet = &a
3270: 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 Op[p->iAddr];.
3280: 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 p->iAddr++;.
3290: 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d if( p->iAddr==
32a0: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e nOp ){. p->
32b0: 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d iSub++;. p-
32c0: 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 >iAddr = 0;.
32d0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 }. . if( pRe
32e0: 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 t->p4type==P4_SU
32f0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 BPROGRAM ){.
3300: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 int nByte = (p
3310: 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 ->nSub+1)*sizeof
3320: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 (SubProgram*);.
3330: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 int j;.
3340: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e for(j=0; j<p->
3350: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 nSub; j++){.
3360: 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 if( p->apSub
3370: 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 [j]==pRet->p4.pP
3380: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a rogram ) break;.
3390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 }. if
33a0: 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a ( j==p->nSub ){.
33b0: 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 p->apSub
33c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c = sqlite3DbReal
33d0: 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c locOrFree(v->db,
33e0: 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 p->apSub, nByte
33f0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 );. if( !
3400: 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 p->apSub ){.
3410: 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a pRet = 0;.
3420: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
3430: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 p->apSu
3440: 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 b[p->nSub++] = p
3450: 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d Ret->p4.pProgram
3460: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
3470: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 }. }. }..
3480: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a return pRet;.}.
3490: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 ./*.** Check if
34a0: 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 the program stor
34b0: 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 ed in the VM ass
34c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 61 ociated with pPa
34d0: 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 rse may.** throw
34e0: 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 an ABORT except
34f0: 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 ion (causing the
3500: 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 statement, but
3510: 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 not entire trans
3520: 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 action.** to be
3530: 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 rolled back). Th
3540: 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 is condition is
3550: 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e true if the main
3560: 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a program or any.
3570: 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 ** sub-programs
3580: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 contains any of
3590: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a the following:.*
35a0: 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c *.** * OP_Hal
35b0: 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 t with P1=SQLITE
35c0: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 _CONSTRAINT and
35d0: 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 P2=OE_Abort..**
35e0: 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 * OP_HaltIfNu
35f0: 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 ll with P1=SQLIT
3600: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 E_CONSTRAINT and
3610: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a P2=OE_Abort..**
3620: 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 * OP_Destroy
3630: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 .** * OP_VUpd
3640: 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 ate.** * OP_V
3650: 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f Rename.** * O
3660: 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 P_FkCounter with
3670: 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 P2==0 (immediat
3680: 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f e foreign key co
3690: 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a nstraint).** *
36a0: 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 OP_CreateTable
36b0: 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f and OP_InitCoro
36c0: 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 utine (for CREAT
36d0: 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 E TABLE AS SELEC
36e0: 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 T ...).**.** The
36f0: 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 n check that the
3700: 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e value of Parse.
3710: 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 mayAbort is true
3720: 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 if an.** ABORT
3730: 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f may be thrown, o
3740: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 r false otherwis
3750: 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 e. Return true i
3760: 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 f it does.** mat
3770: 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 ch, or false oth
3780: 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e erwise. This fun
3790: 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 ction is intende
37a0: 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a d to be used as.
37b0: 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 ** part of an as
37c0: 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 sert statement i
37d0: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 n the compiler.
37e0: 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a Similar to:.**.*
37f0: 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 * assert( sqli
3800: 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 te3VdbeAssertMay
3810: 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 Abort(pParse->pV
3820: 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 dbe, pParse->may
3830: 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 Abort) );.*/.int
3840: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 sqlite3VdbeAsse
3850: 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 rtMayAbort(Vdbe
3860: 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 *v, int mayAbort
3870: 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 ){. int hasAbor
3880: 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 t = 0;. int has
3890: 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 FkCounter = 0;.
38a0: 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 int hasCreateTa
38b0: 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 ble = 0;. int h
38c0: 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 asInitCoroutine
38d0: 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a = 0;. Op *pOp;.
38e0: 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 VdbeOpIter sIt
38f0: 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 er;. memset(&sI
3900: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 ter, 0, sizeof(s
3910: 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e Iter));. sIter.
3920: 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 v = v;.. while(
3930: 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 (pOp = opIterNe
3940: 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 xt(&sIter))!=0 )
3950: 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 {. int opcode
3960: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a = pOp->opcode;.
3970: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d if( opcode==
3980: 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 OP_Destroy || op
3990: 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 code==OP_VUpdate
39a0: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 || opcode==OP_V
39b0: 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 Rename . ||
39c0: 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c ((opcode==OP_Hal
39d0: 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f t || opcode==OP_
39e0: 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 HaltIfNull) .
39f0: 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 && ((pOp->p1&
3a00: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 0xff)==SQLITE_CO
3a10: 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d NSTRAINT && pOp-
3a20: 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a >p2==OE_Abort)).
3a30: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 ){. has
3a40: 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 Abort = 1;.
3a50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
3a60: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 if( opcode==OP
3a70: 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 _CreateTable ) h
3a80: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 asCreateTable =
3a90: 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 1;. if( opcod
3aa0: 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 e==OP_InitCorout
3ab0: 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 ine ) hasInitCor
3ac0: 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e outine = 1;.#ifn
3ad0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f def SQLITE_OMIT_
3ae0: 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 FOREIGN_KEY.
3af0: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 if( opcode==OP_F
3b00: 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d kCounter && pOp-
3b10: 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 >p1==0 && pOp->p
3b20: 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 2==1 ){. ha
3b30: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a sFkCounter = 1;.
3b40: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d }.#endif. }
3b50: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 . sqlite3DbFree
3b60: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 (v->db, sIter.ap
3b70: 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 Sub);.. /* Retu
3b80: 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 rn true if hasAb
3b90: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f ort==mayAbort. O
3ba0: 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 r if a malloc fa
3bb0: 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a ilure occurred..
3bc0: 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 ** If malloc f
3bd0: 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 ailed, then the
3be0: 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f while() loop abo
3bf0: 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 ve may not have
3c00: 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 iterated. ** th
3c10: 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 rough all opcode
3c20: 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d s and hasAbort m
3c30: 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 ay be set incorr
3c40: 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 ectly. Return.
3c50: 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 ** true for this
3c60: 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 case to prevent
3c70: 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e the assert() in
3c80: 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 the callers fra
3c90: 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 me. ** from fai
3ca0: 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 ling. */. retu
3cb0: 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c rn ( v->db->mall
3cc0: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 ocFailed || hasA
3cd0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c bort==mayAbort |
3ce0: 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 | hasFkCounter.
3cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 ||
3d00: 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 (hasCreateTable
3d10: 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 && hasInitCorout
3d20: 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 ine) );.}.#endif
3d30: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 /* SQLITE_DEBUG
3d40: 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 - the sqlite3As
3d50: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 sertMayAbort() f
3d60: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a unction */../*.*
3d70: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 * This routine i
3d80: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 s called after a
3d90: 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 ll opcodes have
3da0: 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 been inserted.
3db0: 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f It loops.** thro
3dc0: 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f ugh all the opco
3dd0: 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 des and fixes up
3de0: 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a some details..*
3df0: 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 *.** (1) For eac
3e00: 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 h jump instructi
3e10: 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 on with a negati
3e20: 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c ve P2 value (a l
3e30: 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 abel).** res
3e40: 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 olve the P2 valu
3e50: 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 e to an actual a
3e60: 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 ddress..**.** (2
3e70: 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 ) Compute the ma
3e80: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 ximum number of
3e90: 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 arguments used b
3ea0: 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 y any SQL functi
3eb0: 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 on.** and st
3ec0: 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 ore that value i
3ed0: 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e n *pMaxFuncArgs.
3ee0: 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 .**.** (3) Updat
3ef0: 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f e the Vdbe.readO
3f00: 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 nly and Vdbe.bIs
3f10: 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 Reader flags to
3f20: 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 accurately.**
3f30: 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 indicate what
3f40: 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 the prepared sta
3f50: 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 tement actually
3f60: 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 does..**.** (4)
3f70: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 Initialize the p
3f80: 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 4.xAdvance point
3f90: 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 er on opcodes th
3fa0: 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a at use it..**.**
3fb0: 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 (5) Reclaim the
3fc0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 memory allocate
3fd0: 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 d for storing la
3fe0: 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 bels..*/.static
3ff0: 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 61 void resolveP2Va
4000: 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 6e lues(Vdbe *p, in
4010: 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 29 t *pMaxFuncArgs)
4020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 {. int i;. int
4030: 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 nMaxArgs = *pMa
4040: 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 xFuncArgs;. Op
4050: 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 *pOp;. Parse *p
4060: 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 Parse = p->pPars
4070: 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c e;. int *aLabel
4080: 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 = pParse->aLabe
4090: 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 l;. p->readOnly
40a0: 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 = 1;. p->bIsRe
40b0: 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 ader = 0;. for(
40c0: 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 2d pOp=p->aOp, i=p-
40d0: 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d >nOp-1; i>=0; i-
40e0: 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 75 -, pOp++){. u
40f0: 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 8 opcode = pOp->
4100: 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a 20 opcode;.. /*
4110: 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f NOTE: Be sure to
4120: 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 update mkopcode
4130: 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e h.tcl when addin
4140: 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 g or removing.
4150: 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20 ** cases from
4160: 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a this switch! */.
4170: 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63 6f switch( opco
4180: 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 de ){. case
4190: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a OP_Transaction:
41a0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 {. if( p
41b0: 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 Op->p2!=0 ) p->r
41c0: 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 eadOnly = 0;.
41d0: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 /* fall thr
41e0: 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 u */. }.
41f0: 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 case OP_AutoC
4200: 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 73 ommit:. cas
4210: 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 e OP_Savepoint:
4220: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 {. p->bIs
4230: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 Reader = 1;.
4240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
4250: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 }.#ifndef SQLIT
4260: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 E_OMIT_WAL.
4270: 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f case OP_Checkpo
4280: 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 int:.#endif.
4290: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d case OP_Vacuum
42a0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f :. case OP_
42b0: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 JournalMode: {.
42c0: 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e p->readOn
42d0: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 ly = 0;.
42e0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 p->bIsReader = 1
42f0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
4300: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 . }.#ifndef
4310: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 SQLITE_OMIT_VIR
4320: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 TUALTABLE.
4330: 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a case OP_VUpdate:
4340: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 {. if( p
4350: 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 Op->p2>nMaxArgs
4360: 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 ) nMaxArgs = pOp
4370: 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62 72 ->p2;. br
4380: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
4390: 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 case OP_VFilt
43a0: 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e er: {. in
43b0: 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 t n;. ass
43c0: 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 ert( p->nOp - i
43d0: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20 >= 3 );.
43e0: 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e assert( pOp[-1].
43f0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 opcode==OP_Integ
4400: 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 er );. n
4410: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 = pOp[-1].p1;.
4420: 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 if( n>nMax
4430: 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 Args ) nMaxArgs
4440: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 = n;. bre
4450: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 ak;. }.#end
4460: 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 if. case OP
4470: 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61 73 _Next:. cas
4480: 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a e OP_NextIfOpen:
4490: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 . case OP_S
44a0: 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 orterNext: {.
44b0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 pOp->p4.xAd
44c0: 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 vance = sqlite3B
44d0: 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 treeNext;.
44e0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 pOp->p4type =
44f0: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 P4_ADVANCE;.
4500: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
4510: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 }. case OP
4520: 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61 73 _Prev:. cas
4530: 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a e OP_PrevIfOpen:
4540: 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e {. pOp->
4550: 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 p4.xAdvance = sq
4560: 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f lite3BtreePrevio
4570: 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d us;. pOp-
4580: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 >p4type = P4_ADV
4590: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 ANCE;. br
45a0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 eak;. }.
45b0: 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 }.. pOp->opf
45c0: 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 lags = sqlite3Op
45d0: 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 codeProperty[opc
45e0: 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 ode];. if( (p
45f0: 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 Op->opflags & OP
4600: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 FLG_JUMP)!=0 &&
4610: 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 pOp->p2<0 ){.
4620: 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 28 assert( ADDR(
4630: 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d pOp->p2)<pParse-
4640: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 >nLabel );.
4650: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 pOp->p2 = aLabe
4660: 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d l[ADDR(pOp->p2)]
4670: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 ;. }. }. sq
4680: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 lite3DbFree(p->d
4690: 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 b, pParse->aLabe
46a0: 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c l);. pParse->aL
46b0: 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 abel = 0;. pPar
46c0: 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a se->nLabel = 0;.
46d0: 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 *pMaxFuncArgs
46e0: 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 = nMaxArgs;. as
46f0: 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 sert( p->bIsRead
4700: 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 er!=0 || DbMaskA
4710: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d llZero(p->btreeM
4720: 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ask) );.}../*.**
4730: 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 Return the addr
4740: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 ess of the next
4750: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 instruction to b
4760: 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 e inserted..*/.i
4770: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 nt sqlite3VdbeCu
4780: 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a rrentAddr(Vdbe *
4790: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d p){. assert( p-
47a0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
47b0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 IC_INIT );. ret
47c0: 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f urn p->nOp;.}../
47d0: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 *.** Verify that
47e0: 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f at least N opco
47f0: 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 de slots are ava
4800: 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68 ilable in p with
4810: 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f out.** having to
4820: 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 malloc for more
4830: 20 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77 space (except w
4840: 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 hen compiled usi
4850: 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 ng.** SQLITE_TES
4860: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 T_REALLOC_STRESS
4870: 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61 ). This interfa
4880: 63 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e ce is used durin
4890: 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 g testing.** to
48a0: 76 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74 verify that cert
48b0: 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c ain calls to sql
48c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 ite3VdbeAddOpLis
48d0: 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a t() can never.**
48e0: 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f fail due to a O
48f0: 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e OM fault and hen
4900: 63 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 ce that the retu
4910: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a rn value from.**
4920: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f sqlite3VdbeAddO
4930: 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 pList() will alw
4940: 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e ays be non-NULL.
4950: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 .*/.#if defined(
4960: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 SQLITE_DEBUG) &&
4970: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
4980: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 _TEST_REALLOC_ST
4990: 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 RESS).void sqlit
49a0: 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 e3VdbeVerifyNoMa
49b0: 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62 llocRequired(Vdb
49c0: 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 e *p, int N){.
49d0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b assert( p->nOp +
49e0: 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73 65 2d N <= p->pParse-
49f0: 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 >nOpAlloc );.}.#
4a00: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 endif../*.** Thi
4a10: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
4a20: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 ns a pointer to
4a30: 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 the array of opc
4a40: 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 odes associated
4a50: 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 with.** the Vdbe
4a60: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 passed as the f
4a70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 irst argument. I
4a80: 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 t is the callers
4a90: 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a responsibility.
4aa0: 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f ** to arrange fo
4ab0: 72 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 r the returned a
4ac0: 72 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 rray to be event
4ad0: 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e ually freed usin
4ae0: 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 g the .** vdbeFr
4af0: 65 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 eeOpArray() func
4b00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f tion..**.** Befo
4b10: 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 re returning, *p
4b20: 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 nOp is set to th
4b30: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 e number of entr
4b40: 69 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 ies in the retur
4b50: 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c ned.** array. Al
4b60: 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 so, *pnMaxArg is
4b70: 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 set to the larg
4b80: 65 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e er of its curren
4b90: 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 t value and .**
4ba0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e the number of en
4bb0: 74 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 tries in the Vdb
4bc0: 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 e.apArg[] array
4bd0: 72 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 required to exec
4be0: 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 ute the .** retu
4bf0: 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f rned program..*/
4c00: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 .VdbeOp *sqlite3
4c10: 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 VdbeTakeOpArray(
4c20: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e Vdbe *p, int *pn
4c30: 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 Op, int *pnMaxAr
4c40: 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f g){. VdbeOp *aO
4c50: 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 p = p->aOp;. as
4c60: 73 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d sert( aOp && !p-
4c70: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
4c80: 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b d );.. /* Check
4c90: 20 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 that sqlite3Vdb
4ca0: 65 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 eUsesBtree() was
4cb0: 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 not called on t
4cc0: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 his VM */. asse
4cd0: 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 rt( DbMaskAllZer
4ce0: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 o(p->btreeMask)
4cf0: 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 );.. resolveP2V
4d00: 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 alues(p, pnMaxAr
4d10: 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d g);. *pnOp = p-
4d20: 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d >nOp;. p->aOp =
4d30: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 0;. return aOp
4d40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 ;.}../*.** Add a
4d50: 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f whole list of o
4d60: 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 perations to the
4d70: 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b operation stack
4d80: 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 . Return a.** p
4d90: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 ointer to the fi
4da0: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e rst operation in
4db0: 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f serted..**.** No
4dc0: 6e 2d 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 n-zero P2 argume
4dd0: 6e 74 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 nts to jump inst
4de0: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 ructions are aut
4df0: 6f 6d 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 omatically adjus
4e00: 74 65 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 ted.** so that t
4e10: 68 65 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 he jump target i
4e20: 73 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 s relative to th
4e30: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f e first operatio
4e40: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 n inserted..*/.V
4e50: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 dbeOp *sqlite3Vd
4e60: 62 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 beAddOpList(. V
4e70: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 dbe *p,
4e80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
4e90: 64 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 dd opcodes to th
4ea0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 e prepared state
4eb0: 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f ment */. int nO
4ec0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p,
4ed0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
4ee0: 20 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 of opcodes to a
4ef0: 64 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 dd */. VdbeOpLi
4f00: 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 st const *aOp,
4f10: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f /* The opco
4f20: 64 65 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 des to be added
4f30: 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f */. int iLineno
4f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4f50: 20 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 /* Source-file
4f60: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 line number of
4f70: 66 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a first opcode */.
4f80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 ){. int i;. Vd
4f90: 62 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 beOp *pOut, *pFi
4fa0: 72 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e rst;. assert( n
4fb0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 Op>0 );. assert
4fc0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
4fd0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
4fe0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f if( p->nOp + nO
4ff0: 70 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e p > p->pParse->n
5000: 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f OpAlloc && growO
5010: 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 pArray(p, nOp) )
5020: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a {. return 0;.
5030: 20 20 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 }. pFirst = p
5040: 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d Out = &p->aOp[p-
5050: 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 >nOp];. for(i=0
5060: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f ; i<nOp; i++, aO
5070: 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 p++, pOut++){.
5080: 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d pOut->opcode =
5090: 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 aOp->opcode;.
50a0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 pOut->p1 = aOp
50b0: 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e ->p1;. pOut->
50c0: 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 p2 = aOp->p2;.
50d0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 assert( aOp->p
50e0: 32 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 2>=0 );. if(
50f0: 28 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 (sqlite3OpcodePr
5100: 6f 70 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f operty[aOp->opco
5110: 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 de] & OPFLG_JUMP
5120: 29 21 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e )!=0 && aOp->p2>
5130: 30 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 0 ){. pOut-
5140: 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 >p2 += p->nOp;.
5150: 20 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 }. pOut->p
5160: 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 3 = aOp->p3;.
5170: 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 pOut->p4type =
5180: 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 P4_NOTUSED;.
5190: 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a pOut->p4.p = 0;.
51a0: 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 pOut->p5 = 0
51b0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ;.#ifdef SQLITE_
51c0: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 ENABLE_EXPLAIN_C
51d0: 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 OMMENTS. pOut
51e0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a ->zComment = 0;.
51f0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 #endif.#ifdef SQ
5200: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 LITE_VDBE_COVERA
5210: 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 GE. pOut->iSr
5220: 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b cLine = iLineno+
5230: 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f i;.#else. (vo
5240: 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 id)iLineno;.#end
5250: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 if.#ifdef SQLITE
5260: 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 _DEBUG. if( p
5270: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 ->db->flags & SQ
5280: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 LITE_VdbeAddopTr
5290: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c ace ){. sql
52a0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 ite3VdbePrintOp(
52b0: 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 0, i+p->nOp, &p-
52c0: 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b >aOp[i+p->nOp]);
52d0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
52e0: 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f }. p->nOp += nO
52f0: 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72 p;. return pFir
5300: 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e st;.}..#if defin
5310: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ed(SQLITE_ENABLE
5320: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 _STMT_SCANSTATUS
5330: 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 )./*.** Add an e
5340: 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 ntry to the arra
5350: 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 y of counters ma
5360: 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 naged by sqlite3
5370: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 _stmt_scanstatus
5380: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ()..*/.void sqli
5390: 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 te3VdbeScanStatu
53a0: 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 s(. Vdbe *p,
53b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
53c0: 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 /* VM to ad
53d0: 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 d scanstatus() t
53e0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 o */. int addrE
53f0: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 xplain,
5400: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 /* Addres
5410: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 s of OP_Explain
5420: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 (or 0) */. int
5430: 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 addrLoop,
5440: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
5450: 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 ddress of loop c
5460: 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 ounter */ . int
5470: 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 addrVisit,
5480: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
5490: 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 Address of rows
54a0: 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 visited counter
54b0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 */. LogEst nEst
54c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
54d0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 /* Estimate
54e0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 d number of outp
54f0: 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e ut rows */. con
5500: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 st char *zName
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
5520: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 Name of table or
5530: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 index being sca
5540: 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 nned */.){. int
5550: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 nByte = (p->nSc
5560: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 an+1) * sizeof(S
5570: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 canStatus);. Sc
5580: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a anStatus *aNew;.
5590: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 aNew = (ScanSt
55a0: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 atus*)sqlite3DbR
55b0: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d ealloc(p->db, p-
55c0: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a >aScan, nByte);.
55d0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 if( aNew ){.
55e0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e ScanStatus *pN
55f0: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 ew = &aNew[p->nS
5600: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 can++];. pNew
5610: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 ->addrExplain =
5620: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 addrExplain;.
5630: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 pNew->addrLoop
5640: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 = addrLoop;.
5650: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 pNew->addrVisit
5660: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 = addrVisit;.
5670: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 pNew->nEst = nE
5680: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e st;. pNew->zN
5690: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 ame = sqlite3DbS
56a0: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 trDup(p->db, zNa
56b0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 me);. p->aSca
56c0: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a n = aNew;. }.}.
56d0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 #endif.../*.** C
56e0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 hange the value
56f0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f of the opcode, o
5700: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 r P1, P2, P3, or
5710: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 P5 operands.**
5720: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 for a specific i
5730: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 nstruction..*/.v
5740: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 oid sqlite3VdbeC
5750: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 hangeOpcode(Vdbe
5760: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 *p, u32 addr, u
5770: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 8 iNewOpcode){.
5780: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f sqlite3VdbeGetO
5790: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 p(p,addr)->opcod
57a0: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a e = iNewOpcode;.
57b0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 }.void sqlite3Vd
57c0: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 beChangeP1(Vdbe
57d0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e *p, u32 addr, in
57e0: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 t val){. sqlite
57f0: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 3VdbeGetOp(p,add
5800: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a r)->p1 = val;.}.
5810: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
5820: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 ChangeP2(Vdbe *p
5830: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 , u32 addr, int
5840: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 val){. sqlite3V
5850: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 dbeGetOp(p,addr)
5860: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f ->p2 = val;.}.vo
5870: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 id sqlite3VdbeCh
5880: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 angeP3(Vdbe *p,
5890: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 u32 addr, int va
58a0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 l){. sqlite3Vdb
58b0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e eGetOp(p,addr)->
58c0: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 p3 = val;.}.void
58d0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
58e0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 geP5(Vdbe *p, u8
58f0: 20 70 35 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e p5){. if( !p->
5900: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
5910: 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 ) p->aOp[p->nOp
5920: 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a -1].p5 = p5;.}..
5930: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 /*.** Change the
5940: 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 P2 operand of i
5950: 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 nstruction addr
5960: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 so that it point
5970: 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 s to.** the addr
5980: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 ess of the next
5990: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 instruction to b
59a0: 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 e coded..*/.void
59b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 sqlite3VdbeJump
59c0: 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e Here(Vdbe *p, in
59d0: 74 20 61 64 64 72 29 7b 0a 20 20 70 2d 3e 70 50 t addr){. p->pP
59e0: 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20 3d arse->iFixedOp =
59f0: 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 73 p->nOp - 1;. s
5a00: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 qlite3VdbeChange
5a10: 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e P2(p, addr, p->n
5a20: 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 Op);.}.../*.** I
5a30: 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e 63 f the input Func
5a40: 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69 73 Def structure is
5a50: 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65 6e ephemeral, then
5a60: 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a 2a free it. If.**
5a70: 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73 20 the FuncDef is
5a80: 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74 68 not ephermal, th
5a90: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a en do nothing..*
5aa0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 /.static void fr
5ab0: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 eeEphemeralFunct
5ac0: 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62 2c ion(sqlite3 *db,
5ad0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29 7b FuncDef *pDef){
5ae0: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 44 . if( ALWAYS(pD
5af0: 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66 75 ef) && (pDef->fu
5b00: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 ncFlags & SQLITE
5b10: 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30 20 _FUNC_EPHEM)!=0
5b20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 ){. sqlite3Db
5b30: 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b 0a Free(db, pDef);.
5b40: 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f }.}..static vo
5b50: 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 id vdbeFreeOpArr
5b60: 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f 70 ay(sqlite3 *, Op
5b70: 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a *, int);../*.**
5b80: 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61 6c Delete a P4 val
5b90: 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e ue if necessary.
5ba0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
5bb0: 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a freeP4(sqlite3 *
5bc0: 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 db, int p4type,
5bd0: 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66 28 void *p4){. if(
5be0: 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65 72 p4 ){. asser
5bf0: 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77 69 t( db );. swi
5c00: 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 tch( p4type ){.
5c10: 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e case P4_FUN
5c20: 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20 20 CCTX: {.
5c30: 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e freeEphemeralFun
5c40: 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c 69 ction(db, ((sqli
5c50: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34 29 te3_context*)p4)
5c60: 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 ->pFunc);.
5c70: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 /* Fall throug
5c80: 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74 20 h into the next
5c90: 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d 0a case */. }.
5ca0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 case P4_RE
5cb0: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 AL:. case P
5cc0: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63 4_INT64:. c
5cd0: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a ase P4_DYNAMIC:.
5ce0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e case P4_IN
5cf0: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 TARRAY: {.
5d00: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
5d10: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20 db, p4);.
5d20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
5d30: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 case P4_KE
5d40: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20 YINFO: {.
5d50: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 if( db->pnBytes
5d60: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 Freed==0 ) sqlit
5d70: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28 e3KeyInfoUnref((
5d80: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 KeyInfo*)p4);.
5d90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
5da0: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 }.#ifdef SQLI
5db0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 TE_ENABLE_CURSOR
5dc0: 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63 61 73 _HINTS. cas
5dd0: 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 e P4_EXPR: {.
5de0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 sqlite3Expr
5df0: 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 Delete(db, (Expr
5e00: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 *)p4);. b
5e10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 reak;. }.#e
5e20: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 ndif. case
5e30: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20 P4_MPRINTF: {.
5e40: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e if( db->pn
5e50: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 BytesFreed==0 )
5e60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29 sqlite3_free(p4)
5e70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b ;. break;
5e80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 . }. c
5e90: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 ase P4_FUNCDEF:
5ea0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 {. freeEp
5eb0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 hemeralFunction(
5ec0: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 db, (FuncDef*)p4
5ed0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b );. break
5ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
5ef0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 case P4_MEM: {.
5f00: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 if( db->p
5f10: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 nBytesFreed==0 )
5f20: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 {. sqli
5f30: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71 te3ValueFree((sq
5f40: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29 lite3_value*)p4)
5f50: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
5f60: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a . Mem *
5f70: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 p = (Mem*)p4;.
5f80: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 if( p->s
5f90: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 zMalloc ) sqlite
5fa0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 3DbFree(db, p->z
5fb0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 Malloc);.
5fc0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
5fd0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 (db, p);.
5fe0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b }. break
5ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
6000: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b case P4_VTAB : {
6010: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d . if( db-
6020: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 >pnBytesFreed==0
6030: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e ) sqlite3VtabUn
6040: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 lock((VTable *)p
6050: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 4);. brea
6060: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d k;. }. }
6070: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 . }.}../*.** Fr
6080: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c ee the space all
6090: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61 ocated for aOp a
60a0: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73 nd any p4 values
60b0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 allocated for t
60c0: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f he.** opcodes co
60d0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20 ntained within.
60e0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55 If aOp is not NU
60f0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64 LL it is assumed
6100: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 to contain .**
6110: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f nOp entries. .*/
6120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 .static void vdb
6130: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c eFreeOpArray(sql
6140: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f ite3 *db, Op *aO
6150: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 p, int nOp){. i
6160: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70 f( aOp ){. Op
6170: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70 *pOp;. for(p
6180: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 Op=aOp; pOp<&aOp
6190: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 [nOp]; pOp++){.
61a0: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 if( pOp->p4
61b0: 74 79 70 65 20 29 20 66 72 65 65 50 34 28 64 62 type ) freeP4(db
61c0: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 , pOp->p4type, p
61d0: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 Op->p4.p);.#ifde
61e0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
61f0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 EXPLAIN_COMMENTS
6200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 . sqlite3Db
6210: 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 Free(db, pOp->zC
6220: 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 omment);.#endif
6230: 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 . }. }.
6240: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
6250: 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a b, aOp);.}../*.*
6260: 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 * Link the SubPr
6270: 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 ogram object pas
6280: 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e sed as the secon
6290: 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 d argument into
62a0: 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 the linked.** li
62b0: 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 st at Vdbe.pSubP
62c0: 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 rogram. This lis
62d0: 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c t is used to del
62e0: 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 ete all sub-prog
62f0: 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 ram.** objects w
6300: 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f hen the VM is no
6310: 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 longer required
6320: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
6330: 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 3VdbeLinkSubProg
6340: 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c ram(Vdbe *pVdbe,
6350: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b SubProgram *p){
6360: 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 . p->pNext = pV
6370: 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 dbe->pProgram;.
6380: 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d pVdbe->pProgram
6390: 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 = p;.}../*.** C
63a0: 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 hange the opcode
63b0: 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 at addr into OP
63c0: 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71 6c _Noop.*/.int sql
63d0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f ite3VdbeChangeTo
63e0: 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e Noop(Vdbe *p, in
63f0: 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65 4f t addr){. VdbeO
6400: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70 2d p *pOp;. if( p-
6410: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
6420: 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 d ) return 0;.
6430: 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30 20 assert( addr>=0
6440: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 && addr<p->nOp )
6450: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f ;. pOp = &p->aO
6460: 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65 50 p[addr];. freeP
6470: 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 4(p->db, pOp->p4
6480: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 type, pOp->p4.p)
6490: 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 ;. pOp->p4type
64a0: 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 = P4_NOTUSED;.
64b0: 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20 30 3b 0a 20 pOp->p4.z = 0;.
64c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f pOp->opcode = O
64d0: 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65 74 75 72 6e P_Noop;. return
64e0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 1;.}../*.** If
64f0: 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65 20 the last opcode
6500: 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20 69 is "op" and it i
6510: 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65 73 s not a jump des
6520: 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68 65 tination,.** the
6530: 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52 65 n remove it. Re
6540: 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e 64 turn true if and
6550: 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63 6f only if an opco
6560: 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e 0a de was removed..
6570: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
6580: 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70 63 beDeletePriorOpc
6590: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38 20 ode(Vdbe *p, u8
65a0: 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e 6e op){. if( (p->n
65b0: 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73 65 Op-1)>(p->pParse
65c0: 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20 70 ->iFixedOp) && p
65d0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e ->aOp[p->nOp-1].
65e0: 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20 opcode==op ){.
65f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
6600: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 VdbeChangeToNoop
6610: 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20 (p, p->nOp-1);.
6620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 }else{. retu
6630: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a rn 0;. }.}../*.
6640: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 ** Change the va
6650: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70 lue of the P4 op
6660: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 erand for a spec
6670: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e ific instruction
6680: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e ..** This routin
6690: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e e is useful when
66a0: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d a large program
66b0: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 is loaded from
66c0: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61 a.** static arra
66d0: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 y using sqlite3V
66e0: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74 dbeAddOpList but
66f0: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65 we want to make
6700: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20 a.** few minor
6710: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70 changes to the p
6720: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 rogram..**.** If
6730: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50 n>=0 then the P
6740: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e 4 operand is dyn
6750: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68 amic, meaning th
6760: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20 at a copy of.**
6770: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61 the string is ma
6780: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f de into memory o
6790: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c btained from sql
67a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a ite3_malloc()..*
67b0: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d * A value of n==
67c0: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74 0 means copy byt
67d0: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20 es of zP4 up to
67e0: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 and including th
67f0: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20 e.** first null
6800: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68 byte. If n>0 th
6810: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65 en copy n+1 byte
6820: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a s of zP4..** .**
6830: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66 Other values of
6840: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50 n (P4_STATIC, P
6850: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20 4_COLLSEQ etc.)
6860: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50 indicate that zP
6870: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61 4 points.** to a
6880: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63 string or struc
6890: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61 ture that is gua
68a0: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 ranteed to exist
68b0: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d for the lifetim
68c0: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65 e of.** the Vdbe
68d0: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 . In these cases
68e0: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70 we can just cop
68f0: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a y the pointer..*
6900: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74 *.** If addr<0 t
6910: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e hen change P4 on
6920: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 the most recent
6930: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74 ly inserted inst
6940: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 ruction..*/.stat
6950: 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e ic void SQLITE_N
6960: 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e OINLINE vdbeChan
6970: 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65 geP4Full(. Vdbe
6980: 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a *p,. Op *pOp,.
6990: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 const char *zP
69a0: 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20 4,. int n.){.
69b0: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 if( pOp->p4type
69c0: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d ){. freeP4(p-
69d0: 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 >db, pOp->p4type
69e0: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 , pOp->p4.p);.
69f0: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 pOp->p4type =
6a00: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 0;. pOp->p4.p
6a10: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 = 0;. }. if(
6a20: 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 n<0 ){. sqlit
6a30: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 e3VdbeChangeP4(p
6a40: 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d , (int)(pOp - p-
6a50: 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a >aOp), zP4, n);.
6a60: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 }else{. if(
6a70: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 n==0 ) n = sqli
6a80: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 te3Strlen30(zP4)
6a90: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 ;. pOp->p4.z
6aa0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 = sqlite3DbStrND
6ab0: 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e up(p->db, zP4, n
6ac0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 );. pOp->p4ty
6ad0: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b pe = P4_DYNAMIC;
6ae0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 . }.}.void sqli
6af0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 te3VdbeChangeP4(
6b00: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 Vdbe *p, int add
6b10: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a r, const char *z
6b20: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 P4, int n){. Op
6b30: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 *pOp;. sqlite3
6b40: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 *db;. assert(
6b50: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 p!=0 );. db = p
6b60: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 ->db;. assert(
6b70: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d p->magic==VDBE_M
6b80: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 AGIC_INIT );. a
6b90: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30 ssert( p->aOp!=0
6ba0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 || db->mallocFa
6bb0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 iled );. if( db
6bc0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 ->mallocFailed )
6bd0: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f {. if( n!=P4_
6be0: 56 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62 VTAB ) freeP4(db
6bf0: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 , n, (void*)*(ch
6c00: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 ar**)&zP4);.
6c10: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 return;. }. as
6c20: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 sert( p->nOp>0 )
6c30: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72 ;. assert( addr
6c40: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 <p->nOp );. if(
6c50: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61 addr<0 ){. a
6c60: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 ddr = p->nOp - 1
6c70: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70 ;. }. pOp = &p
6c80: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69 ->aOp[addr];. i
6c90: 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e f( n>=0 || pOp->
6ca0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64 p4type ){. vd
6cb0: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70 beChangeP4Full(p
6cc0: 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a , pOp, zP4, n);.
6cd0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a return;. }.
6ce0: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 if( n==P4_INT3
6cf0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 2 ){. /* Note
6d00: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 : this cast is s
6d10: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 afe, because the
6d20: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 origin data poi
6d30: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 nt was an int.
6d40: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 ** that was ca
6d50: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 st to a (const c
6d60: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 har *). */. p
6d70: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 Op->p4.i = SQLIT
6d80: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 E_PTR_TO_INT(zP4
6d90: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 );. pOp->p4ty
6da0: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 pe = P4_INT32;.
6db0: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d }else if( zP4!=
6dc0: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 0 ){. assert(
6dd0: 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d n<0 );. pOp-
6de0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a >p4.p = (void*)z
6df0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 P4;. pOp->p4t
6e00: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 ype = (signed ch
6e10: 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d ar)n;. if( n=
6e20: 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74 =P4_VTAB ) sqlit
6e30: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 e3VtabLock((VTab
6e40: 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a le*)zP4);. }.}.
6e50: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50 ./*.** Set the P
6e60: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 4 on the most re
6e70: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63 cently added opc
6e80: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e ode to the KeyIn
6e90: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e fo for the.** in
6ea0: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f dex given..*/.vo
6eb0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 id sqlite3VdbeSe
6ec0: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65 tP4KeyInfo(Parse
6ed0: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20 *pParse, Index
6ee0: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a *pIdx){. Vdbe *
6ef0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 v = pParse->pVdb
6f00: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d e;. assert( v!=
6f10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
6f20: 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 Idx!=0 );. sqli
6f30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 te3VdbeChangeP4(
6f40: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71 v, -1, (char*)sq
6f50: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e lite3KeyInfoOfIn
6f60: 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78 dex(pParse, pIdx
6f70: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
6f80: 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49 P4_KEYI
6f90: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 NFO);.}..#ifdef
6fa0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 SQLITE_ENABLE_EX
6fb0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f PLAIN_COMMENTS./
6fc0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 *.** Change the
6fd0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d comment on the m
6fe0: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64 ost recently cod
6ff0: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 ed instruction.
7000: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20 Or.** insert a
7010: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68 No-op and add th
7020: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61 e comment to tha
7030: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f t new instructio
7040: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65 n. This.** make
7050: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65 s the code easie
7060: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67 r to read during
7070: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e debugging. Non
7080: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e e of this happen
7090: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63 s.** in a produc
70a0: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73 tion build..*/.s
70b0: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56 tatic void vdbeV
70c0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c Comment(Vdbe *p,
70d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f const char *zFo
70e0: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70 rmat, va_list ap
70f0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e ){. assert( p->
7100: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d nOp>0 || p->aOp=
7110: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
7120: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e p->aOp==0 || p->
7130: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 aOp[p->nOp-1].zC
7140: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e omment==0 || p->
7150: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
7160: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 );. if( p->nOp
7170: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 ){. assert(
7180: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71 p->aOp );. sq
7190: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 lite3DbFree(p->d
71a0: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 b, p->aOp[p->nOp
71b0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 -1].zComment);.
71c0: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 p->aOp[p->nOp
71d0: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73 -1].zComment = s
71e0: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70 qlite3VMPrintf(p
71f0: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 ->db, zFormat, a
7200: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 p);. }.}.void s
7210: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e qlite3VdbeCommen
7220: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 t(Vdbe *p, const
7230: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
7240: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 ...){. va_list
7250: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 ap;. if( p ){.
7260: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 va_start(ap,
7270: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 zFormat);. vd
7280: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 beVComment(p, zF
7290: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 ormat, ap);.
72a0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a va_end(ap);. }.
72b0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 }.void sqlite3Vd
72c0: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64 beNoopComment(Vd
72d0: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 be *p, const cha
72e0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 r *zFormat, ...)
72f0: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a {. va_list ap;.
7300: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73 if( p ){. s
7310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30 qlite3VdbeAddOp0
7320: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20 (p, OP_Noop);.
7330: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a va_start(ap, z
7340: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62 Format);. vdb
7350: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f eVComment(p, zFo
7360: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 rmat, ap);. v
7370: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d a_end(ap);. }.}
7380: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42 .#endif /* NDEB
7390: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 UG */..#ifdef SQ
73a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 LITE_VDBE_COVERA
73b0: 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 GE./*.** Set the
73c0: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53 value if the iS
73d0: 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72 rcLine field for
73e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 the previously
73f0: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f coded instructio
7400: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 n..*/.void sqlit
7410: 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d e3VdbeSetLineNum
7420: 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 ber(Vdbe *v, int
7430: 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74 iLine){. sqlit
7440: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31 e3VdbeGetOp(v,-1
7450: 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c )->iSrcLine = iL
7460: 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a ine;.}.#endif /*
7470: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 SQLITE_VDBE_COV
7480: 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 ERAGE */../*.**
7490: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64 Return the opcod
74a0: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64 e for a given ad
74b0: 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61 dress. If the a
74c0: 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68 ddress is -1, th
74d0: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 en.** return the
74e0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69 most recently i
74f0: 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a nserted opcode..
7500: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 **.** If a memor
7510: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 y allocation err
7520: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 or has occurred
7530: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c prior to the cal
7540: 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20 ling of this.**
7550: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20 routine, then a
7560: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d pointer to a dum
7570: 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62 my VdbeOp will b
7580: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61 e returned. Tha
7590: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72 t opcode.** is r
75a0: 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20 eadable but not
75b0: 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68 writable, though
75c0: 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61 it is cast to a
75d0: 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e writable value.
75e0: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f .** The return o
75f0: 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65 f a dummy opcode
7600: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c allows the call
7610: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e to continue fun
7620: 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65 ctioning.** afte
7630: 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77 r an OOM fault w
7640: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f ithout having to
7650: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 check to see if
7660: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d the return from
7670: 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e .** this routin
7680: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69 e is a valid poi
7690: 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75 nter. But becau
76a0: 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63 se the dummy.opc
76b0: 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d ode is 0,.** dum
76c0: 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 my will never be
76d0: 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68 written to. Th
76e0: 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62 is is verified b
76f0: 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f y code inspectio
7700: 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e n and.** by runn
7710: 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e ing with Valgrin
7720: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 d..*/.VdbeOp *sq
7730: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56 lite3VdbeGetOp(V
7740: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 dbe *p, int addr
7750: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63 ){. /* C89 spec
7760: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63 ifies that the c
7770: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20 onstant "dummy"
7780: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 will be initiali
7790: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20 zed to all. **
77a0: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20 zeros, which is
77b0: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67 correct. MSVC g
77c0: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69 enerates a warni
77d0: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73 ng, nevertheless
77e0: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64 . */. static Vd
77f0: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20 beOp dummy; /*
7800: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20 Ignore the MSVC
7810: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f warning about no
7820: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a initializer */.
7830: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 assert( p->mag
7840: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 ic==VDBE_MAGIC_I
7850: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64 NIT );. if( add
7860: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20 r<0 ){. addr
7870: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 = p->nOp - 1;.
7880: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64 }. assert( (add
7890: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e r>=0 && addr<p->
78a0: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d nOp) || p->db->m
78b0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
78c0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c if( p->db->mall
78d0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 ocFailed ){.
78e0: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29 return (VdbeOp*)
78f0: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b &dummy;. }else{
7900: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e . return &p->
7910: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d aOp[addr];. }.}
7920: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 ..#if defined(SQ
7930: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c LITE_ENABLE_EXPL
7940: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a AIN_COMMENTS)./*
7950: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e .** Return an in
7960: 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 teger value for
7970: 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d one of the param
7980: 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63 eters to the opc
7990: 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72 ode pOp.** deter
79a0: 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74 mined by charact
79b0: 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 er c..*/.static
79c0: 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63 int translateP(c
79d0: 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20 har c, const Op
79e0: 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d *pOp){. if( c==
79f0: 27 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 '1' ) return pOp
7a00: 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27 ->p1;. if( c=='
7a10: 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 2' ) return pOp-
7a20: 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33 >p2;. if( c=='3
7a30: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e ' ) return pOp->
7a40: 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27 p3;. if( c=='4'
7a50: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 ) return pOp->p
7a60: 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 4.i;. return pO
7a70: 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 p->p5;.}../*.**
7a80: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 Compute a string
7a90: 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e for the "commen
7aa0: 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44 t" field of a VD
7ab0: 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e BE opcode listin
7ac0: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e g..**.** The Syn
7ad0: 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20 opsis: field in
7ae0: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 comments in the
7af0: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69 vdbe.c source fi
7b00: 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65 le gets converte
7b10: 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61 d.** to an extra
7b20: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 string that is
7b30: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 appended to the
7b40: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d sqlite3OpcodeNam
7b50: 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20 e(). In the.**
7b60: 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72 absence of other
7b70: 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20 comments, this
7b80: 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73 synopsis becomes
7b90: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 the comment on
7ba0: 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53 the opcode..** S
7bb0: 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 ome translation
7bc0: 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 occurs:.**.**
7bd0: 20 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e "PX" ->
7be0: 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20 "r[X]".**
7bf0: 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20 "PX@PY" ->
7c00: 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f "r[X..X+Y-1]" o
7c10: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 r "r[x]" if y is
7c20: 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20 0 or 1.**
7c30: 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22 "PX@PY+1" -> "
7c40: 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72 r[X..X+Y]" or
7c50: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20 "r[x]" if y is
7c60: 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e 0.** "PY..
7c70: 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59 PY" -> "r[X..Y
7c80: 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d ]" or "r[x]
7c90: 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61 " if y<=x.*/.sta
7ca0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43 tic int displayC
7cb0: 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20 omment(. const
7cc0: 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20 Op *pOp, /*
7cd0: 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65 The opcode to be
7ce0: 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 commented */.
7cf0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c const char *zP4,
7d00: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79 /* Previously
7d10: 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20 obtained value
7d20: 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72 for P4 */. char
7d30: 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f *zTemp, /
7d40: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68 * Write result h
7d50: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 ere */. int nTe
7d60: 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 mp /* S
7d70: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69 pace available i
7d80: 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a n zTemp[] */.){.
7d90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f const char *zO
7da0: 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 pName;. const c
7db0: 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a har *zSynopsis;.
7dc0: 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20 int nOpName;.
7dd0: 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 7a int ii, jj;. z
7de0: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 OpName = sqlite3
7df0: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e OpcodeName(pOp->
7e00: 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e 61 opcode);. nOpNa
7e10: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c me = sqlite3Strl
7e20: 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a 20 en30(zOpName);.
7e30: 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 if( zOpName[nOp
7e40: 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20 69 Name+1] ){. i
7e50: 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b 0a nt seenCom = 0;.
7e60: 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 char c;.
7e70: 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70 4e zSynopsis = zOpN
7e80: 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20 2b ame += nOpName +
7e90: 20 31 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 6a 1;. for(ii=j
7ea0: 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d 31 20 j=0; jj<nTemp-1
7eb0: 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70 73 69 && (c = zSynopsi
7ec0: 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b 2b 29 s[ii])!=0; ii++)
7ed0: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 {. if( c=='
7ee0: 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 P' ){. c
7ef0: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b 69 69 = zSynopsis[++ii
7f00: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 ];. if( c
7f10: 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20 20 20 =='4' ){.
7f20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
7f30: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 ntf(nTemp-jj, zT
7f40: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 7a 50 emp+jj, "%s", zP
7f50: 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 4);. }els
7f60: 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29 7b 0a e if( c=='X' ){.
7f70: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
7f80: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 3_snprintf(nTemp
7f90: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 -jj, zTemp+jj, "
7fa0: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 %s", pOp->zComme
7fb0: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 nt);. s
7fc0: 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20 20 20 eenCom = 1;.
7fd0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
7fe0: 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20 74 72 int v1 = tr
7ff0: 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f 70 29 anslateP(c, pOp)
8000: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 ;. int
8010: 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 v2;. sq
8020: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
8030: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a Temp-jj, zTemp+j
8040: 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a 20 20 j, "%d", v1);.
8050: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e if( strn
8060: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 cmp(zSynopsis+ii
8070: 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d 30 20 +1, "@P", 2)==0
8080: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 ){. i
8090: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 i += 3;.
80a0: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 jj += sqlite
80b0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 3Strlen30(zTemp+
80c0: 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 jj);.
80d0: 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 v2 = translateP
80e0: 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 2c 20 (zSynopsis[ii],
80f0: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 pOp);.
8100: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 if( strncmp(zS
8110: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22 2b 31 ynopsis+ii+1,"+1
8120: 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ",2)==0 ){.
8130: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 32 ii += 2
8140: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;.
8150: 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 v2++;.
8160: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 }.
8170: 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20 20 20 if( v2>1 ){.
8180: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
8190: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 3_snprintf(nTemp
81a0: 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 -jj, zTemp+jj, "
81b0: 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31 29 3b ..%d", v1+v2-1);
81c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
81d0: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 }else i
81e0: 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f f( strncmp(zSyno
81f0: 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e 50 33 psis+ii+1, "..P3
8200: 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f 70 2d ", 4)==0 && pOp-
8210: 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 >p3==0 ){.
8220: 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b 0a 20 ii += 4;.
8230: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
8240: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a 6a 20 }. jj
8250: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e += sqlite3Strlen
8260: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 30(zTemp+jj);.
8270: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
8280: 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d zTemp[jj++] =
8290: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 c;. }.
82a0: 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65 6e 43 }. if( !seenC
82b0: 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70 2d 35 om && jj<nTemp-5
82c0: 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e && pOp->zCommen
82d0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 t ){. sqlit
82e0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
82f0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 p-jj, zTemp+jj,
8300: 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f "; %s", pOp->zCo
8310: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 6a 6a mment);. jj
8320: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 += sqlite3Strle
8330: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 n30(zTemp+jj);.
8340: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a 6a 3c }. if( jj<
8350: 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b 6a 6a nTemp ) zTemp[jj
8360: 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 ] = 0;. }else i
8370: 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 f( pOp->zComment
8380: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f ){. sqlite3_
8390: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 snprintf(nTemp,
83a0: 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70 4f 70 zTemp, "%s", pOp
83b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 ->zComment);.
83c0: 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53 74 72 jj = sqlite3Str
83d0: 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 len30(zTemp);.
83e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65 6d 70 }else{. zTemp
83f0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a 6a 20 [0] = 0;. jj
8400: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 = 0;. }. retur
8410: 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f n jj;.}.#endif /
8420: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a * SQLITE_DEBUG *
8430: 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 /..#if VDBE_DISP
8440: 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 LAY_P4 && define
8450: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f d(SQLITE_ENABLE_
8460: 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a 2f 2a CURSOR_HINTS)./*
8470: 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20 74 68 .** Translate th
8480: 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c 75 65 e P4.pExpr value
8490: 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72 73 6f for an OP_Curso
84a0: 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69 6e 74 rHint opcode int
84b0: 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74 20 63 o text.** that c
84c0: 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65 64 20 an be displayed
84d0: 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75 6d 6e in the P4 column
84e0: 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75 74 70 of EXPLAIN outp
84f0: 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ut..*/.static vo
8500: 69 64 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 id displayP4Expr
8510: 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20 45 78 (StrAccum *p, Ex
8520: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f pr *pExpr){. co
8530: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 nst char *zOp =
8540: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 0;. switch( pEx
8550: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 pr->op ){. ca
8560: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 se TK_STRING:.
8570: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e sqlite3XPrin
8580: 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45 78 70 tf(p, "%Q", pExp
8590: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20 r->u.zToken);.
85a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 break;. c
85b0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a ase TK_INTEGER:.
85c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 sqlite3XPr
85d0: 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20 70 45 intf(p, "%d", pE
85e0: 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29 3b 0a xpr->u.iValue);.
85f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
8600: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 case TK_NULL:.
8610: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 sqlite3XPri
8620: 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a ntf(p, "NULL");.
8630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
8640: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45 case TK_REGISTE
8650: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 R: {. sqlit
8660: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 5b e3XPrintf(p, "r[
8670: 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 %d]", pExpr->iTa
8680: 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 ble);. brea
8690: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
86a0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 e TK_COLUMN: {.
86b0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e if( pExpr->
86c0: 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 iColumn<0 ){.
86d0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 sqlite3XPri
86e0: 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22 29 3b ntf(p, "rowid");
86f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
8700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 sqlite3XPr
8710: 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c 20 28 intf(p, "c%d", (
8720: 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f 6c 75 int)pExpr->iColu
8730: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 mn);. }.
8740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
8750: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 case TK_LT:
8760: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54 22 3b zOp = "LT";
8770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
8780: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 case TK_LE:
8790: 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20 20 20 zOp = "LE";
87a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
87b0: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 7a se TK_GT: z
87c0: 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20 20 20 Op = "GT";
87d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
87e0: 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f 70 20 TK_GE: zOp
87f0: 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62 72 65 = "GE"; bre
8800: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f ak;. case TK_
8810: 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 NE: zOp = "
8820: 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b NE"; break;
8830: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a . case TK_EQ:
8840: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45 51 22 zOp = "EQ"
8850: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 ; break;.
8860: 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20 20 20 case TK_IS:
8870: 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b 20 20 zOp = "IS";
8880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 break;. c
8890: 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 ase TK_ISNOT:
88a0: 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20 zOp = "ISNOT";
88b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
88c0: 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 4f 70 TK_AND: zOp
88d0: 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20 62 72 = "AND"; br
88e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b eak;. case TK
88f0: 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 _OR: zOp =
8900: 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65 61 6b "OR"; break
8910: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c ;. case TK_PL
8920: 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22 41 44 US: zOp = "AD
8930: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 D"; break;.
8940: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a case TK_STAR:
8950: 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b zOp = "MUL";
8960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
8970: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 case TK_MINUS:
8980: 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20 20 20 zOp = "SUB";
8990: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
89a0: 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20 7a 4f e TK_REM: zO
89b0: 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20 20 62 p = "REM"; b
89c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
89d0: 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70 20 3d K_BITAND: zOp =
89e0: 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72 65 61 "BITAND"; brea
89f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 k;. case TK_B
8a00: 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20 22 42 ITOR: zOp = "B
8a10: 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b 3b 0a ITOR"; break;.
8a20: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 case TK_SLAS
8a30: 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49 56 22 H: zOp = "DIV"
8a40: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 ; break;.
8a50: 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a case TK_LSHIFT:
8a60: 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46 54 22 zOp = "LSHIFT"
8a70: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ; break;. ca
8a80: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 7a se TK_RSHIFT: z
8a90: 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b 20 20 Op = "RSHIFT";
8aa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
8ab0: 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 TK_CONCAT: zOp
8ac0: 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62 72 65 = "CONCAT"; bre
8ad0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f ak;. case TK_
8ae0: 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d 20 22 UMINUS: zOp = "
8af0: 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61 6b 3b MINUS"; break;
8b00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c . case TK_UPL
8b10: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50 4c 55 US: zOp = "PLU
8b20: 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 S"; break;.
8b30: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 case TK_BITNOT
8b40: 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e 4f 54 : zOp = "BITNOT
8b50: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 "; break;. c
8b60: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 ase TK_NOT:
8b70: 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20 20 zOp = "NOT";
8b80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
8b90: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 TK_ISNULL: zOp
8ba0: 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20 62 72 = "ISNULL"; br
8bb0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b eak;. case TK
8bc0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 _NOTNULL: zOp =
8bd0: 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65 61 6b "NOTNULL"; break
8be0: 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a ;.. default:.
8bf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 sqlite3XPr
8c00: 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20 22 65 intf(p, "%s", "e
8c10: 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62 72 65 xpr");. bre
8c20: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 7a ak;. }.. if( z
8c30: 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 Op ){. sqlite
8c40: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73 28 3XPrintf(p, "%s(
8c50: 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64 69 73 ", zOp);. dis
8c60: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45 playP4Expr(p, pE
8c70: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 xpr->pLeft);.
8c80: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 if( pExpr->pRig
8c90: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 ht ){. sqli
8ca0: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e te3StrAccumAppen
8cb0: 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a 20 20 d(p, ",", 1);.
8cc0: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 displayP4Exp
8cd0: 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 r(p, pExpr->pRig
8ce0: 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ht);. }. s
8cf0: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 qlite3StrAccumAp
8d00: 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31 29 3b pend(p, ")", 1);
8d10: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a . }.}.#endif /*
8d20: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 VDBE_DISPLAY_P4
8d30: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 && defined(SQLI
8d40: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 TE_ENABLE_CURSOR
8d50: 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 _HINTS) */...#if
8d60: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 VDBE_DISPLAY_P4
8d70: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 ./*.** Compute a
8d80: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 string that des
8d90: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61 cribes the P4 pa
8da0: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f rameter for an o
8db0: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 pcode..** Use zT
8dc0: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 emp for any requ
8dd0: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 ired temporary b
8de0: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a uffer space..*/.
8df0: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 static char *dis
8e00: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 playP4(Op *pOp,
8e10: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 char *zTemp, int
8e20: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 nTemp){. char
8e30: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 *zP4 = zTemp;.
8e40: 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20 61 73 StrAccum x;. as
8e50: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 sert( nTemp>=20
8e60: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74 72 41 );. sqlite3StrA
8e70: 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30 2c 20 ccumInit(&x, 0,
8e80: 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20 30 29 zTemp, nTemp, 0)
8e90: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d ;. switch( pOp-
8ea0: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63 >p4type ){. c
8eb0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 ase P4_KEYINFO:
8ec0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 {. int j;.
8ed0: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b KeyInfo *pK
8ee0: 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 eyInfo = pOp->p4
8ef0: 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 .pKeyInfo;.
8f00: 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 assert( pKeyInf
8f10: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 o->aSortOrder!=0
8f20: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 );. sqlite
8f30: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 6b 28 3XPrintf(&x, "k(
8f40: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e %d", pKeyInfo->n
8f50: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 66 6f Field);. fo
8f60: 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e 66 r(j=0; j<pKeyInf
8f70: 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29 7b o->nField; j++){
8f80: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 . CollSeq
8f90: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49 6e *pColl = pKeyIn
8fa0: 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 fo->aColl[j];.
8fb0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 const char
8fc0: 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c 20 *zColl = pColl
8fd0: 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a ? pColl->zName :
8fe0: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 "";. if(
8ff0: 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c 20 22 strcmp(zColl, "
9000: 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20 7a 43 BINARY")==0 ) zC
9010: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20 oll = "B";.
9020: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 sqlite3XPrint
9030: 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c 20 70 f(&x, ",%s%s", p
9040: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 KeyInfo->aSortOr
9050: 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a 20 22 der[j] ? "-" : "
9060: 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 ", zColl);.
9070: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 }. sqlite3
9080: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 StrAccumAppend(&
9090: 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 20 20 x, ")", 1);.
90a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 break;. }.#
90b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
90c0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 BLE_CURSOR_HINTS
90d0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45 58 50 . case P4_EXP
90e0: 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73 70 6c R: {. displ
90f0: 61 79 50 34 45 78 70 72 28 26 78 2c 20 70 4f 70 ayP4Expr(&x, pOp
9100: 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 ->p4.pExpr);.
9110: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
9120: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 #endif. case
9130: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 P4_COLLSEQ: {.
9140: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f CollSeq *pCo
9150: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f ll = pOp->p4.pCo
9160: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ll;. sqlite
9170: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 28 25 3XPrintf(&x, "(%
9180: 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a .20s)", pColl->z
9190: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 Name);. bre
91a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
91b0: 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b se P4_FUNCDEF: {
91c0: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a . FuncDef *
91d0: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 pDef = pOp->p4.p
91e0: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 Func;. sqli
91f0: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 te3XPrintf(&x, "
9200: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a %s(%d)", pDef->z
9210: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 Name, pDef->nArg
9220: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
9230: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c }.#ifdef SQL
9240: 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 63 61 ITE_DEBUG. ca
9250: 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b se P4_FUNCCTX: {
9260: 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a . FuncDef *
9270: 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 pDef = pOp->p4.p
9280: 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 Ctx->pFunc;.
9290: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 sqlite3XPrintf
92a0: 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 (&x, "%s(%d)", p
92b0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 Def->zName, pDef
92c0: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 ->nArg);. b
92d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 reak;. }.#end
92e0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 if. case P4_I
92f0: 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 NT64: {. sq
9300: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c lite3XPrintf(&x,
9310: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 "%lld", *pOp->p
9320: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 4.pI64);. b
9330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
9340: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b case P4_INT32: {
9350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 . sqlite3XP
9360: 72 69 6e 74 66 28 26 78 2c 20 22 25 64 22 2c 20 rintf(&x, "%d",
9370: 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 pOp->p4.i);.
9380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
9390: 20 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a case P4_REAL:
93a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 {. sqlite3
93b0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31 XPrintf(&x, "%.1
93c0: 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 52 6g", *pOp->p4.pR
93d0: 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 eal);. brea
93e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
93f0: 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 e P4_MEM: {.
9400: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 4f Mem *pMem = pO
9410: 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20 20 20 p->p4.pMem;.
9420: 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 if( pMem->flag
9430: 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 s & MEM_Str ){.
9440: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4d 65 zP4 = pMe
9450: 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 m->z;. }els
9460: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 e if( pMem->flag
9470: 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 s & MEM_Int ){.
9480: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 sqlite3XP
9490: 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22 rintf(&x, "%lld"
94a0: 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 , pMem->u.i);.
94b0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d }else if( pM
94c0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f em->flags & MEM_
94d0: 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 Real ){.
94e0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 sqlite3XPrintf(&
94f0: 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d x, "%.16g", pMem
9500: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 ->u.r);. }e
9510: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c lse if( pMem->fl
9520: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 ags & MEM_Null )
9530: 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 {. zP4 =
9540: 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20 7d 65 "NULL";. }e
9550: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 lse{. ass
9560: 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 ert( pMem->flags
9570: 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 & MEM_Blob );.
9580: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22 28 62 zP4 = "(b
9590: 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 lob)";. }.
95a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
95b0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 }.#ifndef SQLITE
95c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 _OMIT_VIRTUALTAB
95d0: 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34 5f 56 LE. case P4_V
95e0: 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c TAB: {. sql
95f0: 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 ite3_vtab *pVtab
9600: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 = pOp->p4.pVtab
9610: 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20 20 73 ->pVtab;. s
9620: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 qlite3XPrintf(&x
9630: 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70 56 74 , "vtab:%p", pVt
9640: 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b ab);. break
9650: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 ;. }.#endif.
9660: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 case P4_INTAR
9670: 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 RAY: {. int
9680: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 i;. int *a
9690: 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69 3b 0a i = pOp->p4.ai;.
96a0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 61 69 int n = ai
96b0: 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20 66 69 [0]; /* The fi
96c0: 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 61 rst element of a
96d0: 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20 61 6c n INTARRAY is al
96e0: 77 61 79 73 20 74 68 65 0a 20 20 20 20 20 20 20 ways the.
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9700: 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 ** count of the
9710: 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e number of elemen
9720: 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a 2f 0a ts to follow */.
9730: 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 for(i=1; i
9740: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 <n; i++){.
9750: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 sqlite3XPrintf
9760: 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69 5b 69 (&x, ",%d", ai[i
9770: 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ]);. }.
9780: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27 5b 27 zTemp[0] = '['
9790: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 ;. sqlite3S
97a0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 78 trAccumAppend(&x
97b0: 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20 20 20 , "]", 1);.
97c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
97d0: 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52 4f case P4_SUBPRO
97e0: 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73 71 GRAM: {. sq
97f0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c lite3XPrintf(&x,
9800: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 "program");.
9810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
9820: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 case P4_ADVA
9830: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 NCE: {. zTe
9840: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 mp[0] = 0;.
9850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
9860: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 default: {.
9870: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 zP4 = pOp->p4
9880: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 .z;. if( zP
9890: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4==0 ){.
98a0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 zP4 = zTemp;.
98b0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 zTemp[0] =
98c0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0;. }. }
98d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 . }. sqlite3St
98e0: 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 rAccumFinish(&x)
98f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 ;. assert( zP4!
9900: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a =0 );. return z
9910: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 P4;.}.#endif /*
9920: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 VDBE_DISPLAY_P4
9930: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 */../*.** Declar
9940: 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 e to the Vdbe th
9950: 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a at the BTree obj
9960: 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 ect at db->aDb[i
9970: 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a ] is used..**.**
9980: 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 The prepared st
9990: 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f atements need to
99a0: 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 know in advance
99b0: 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 the complete se
99c0: 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 t of.** attached
99d0: 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 databases that
99e0: 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 will be use. A
99f0: 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 mask of these da
9a00: 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 tabases.** is ma
9a10: 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 intained in p->b
9a20: 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 treeMask. The p
9a30: 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 ->lockMask value
9a40: 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f is the subset o
9a50: 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 f.** p->btreeMas
9a60: 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 k of databases t
9a70: 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 hat will require
9a80: 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 a lock..*/.void
9a90: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 sqlite3VdbeUses
9aa0: 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 Btree(Vdbe *p, i
9ab0: 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 nt i){. assert(
9ac0: 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 i>=0 && i<p->db
9ad0: 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 ->nDb && i<(int)
9ae0: 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a sizeof(yDbMask)*
9af0: 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 8 );. assert( i
9b00: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e <(int)sizeof(p->
9b10: 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a btreeMask)*8 );.
9b20: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 DbMaskSet(p->b
9b30: 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 treeMask, i);.
9b40: 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 if( i!=1 && sqli
9b50: 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 te3BtreeSharable
9b60: 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 (p->db->aDb[i].p
9b70: 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 Bt) ){. DbMas
9b80: 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b kSet(p->lockMask
9b90: 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 , i);. }.}..#if
9ba0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 !defined(SQLITE
9bb0: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 _OMIT_SHARED_CAC
9bc0: 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c HE)./*.** If SQL
9bd0: 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 ite is compiled
9be0: 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 to support share
9bf0: 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 d-cache mode and
9c00: 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 to be threadsaf
9c10: 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 e,.** this routi
9c20: 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d ne obtains the m
9c30: 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 utex associated
9c40: 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 with each BtShar
9c50: 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 ed structure.**
9c60: 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 that may be acce
9c70: 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 ssed by the VM p
9c80: 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 assed as an argu
9c90: 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 ment. In doing s
9ca0: 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 o it also.** set
9cb0: 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 s the BtShared.d
9cc0: 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 b member of each
9cd0: 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 of the BtShared
9ce0: 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 structures, ens
9cf0: 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 uring.** that th
9d00: 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 e correct busy-h
9d10: 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 andler callback
9d20: 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 is invoked if re
9d30: 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 quired..**.** If
9d40: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 SQLite is not t
9d50: 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f hreadsafe but do
9d60: 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 es support share
9d70: 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 d-cache mode, th
9d80: 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 en.** sqlite3Btr
9d90: 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 eeEnter() is inv
9da0: 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 oked to set the
9db0: 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 BtShared.db vari
9dc0: 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 ables.** of all
9dd0: 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 of BtShared stru
9de0: 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c ctures accessibl
9df0: 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 e via the databa
9e00: 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 se handle .** as
9e10: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 sociated with th
9e20: 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 e VM..**.** If S
9e30: 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 QLite is not thr
9e40: 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 eadsafe and does
9e50: 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 not support sha
9e60: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 red-cache mode,
9e70: 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e this.** function
9e80: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a is a no-op..**.
9e90: 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d ** The p->btreeM
9ea0: 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 ask field is a b
9eb0: 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 itmask of all bt
9ec0: 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 rees that the pr
9ed0: 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 epared .** state
9ee0: 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 ment p will ever
9ef0: 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 use. Let N be
9f00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 the number of bi
9f10: 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 ts in p->btreeMa
9f20: 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 sk.** correspond
9f30: 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 ing to btrees th
9f40: 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 at use shared ca
9f50: 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 che. Then the r
9f60: 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 untime of.** thi
9f70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e s routine is N*N
9f80: 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 . But as N is r
9f90: 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 arely more than
9fa0: 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 1, this should n
9fb0: 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c ot.** be a probl
9fc0: 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 em..*/.void sqli
9fd0: 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 te3VdbeEnter(Vdb
9fe0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a e *p){. int i;.
9ff0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 sqlite3 *db;.
a000: 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 Db *aDb;. int
a010: 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 nDb;. if( DbMas
a020: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b kAllZero(p->lock
a030: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 Mask) ) return;
a040: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 /* The common c
a050: 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d ase */. db = p-
a060: 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d >db;. aDb = db-
a070: 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 >aDb;. nDb = db
a080: 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 ->nDb;. for(i=0
a090: 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 ; i<nDb; i++){.
a0a0: 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 if( i!=1 && D
a0b0: 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 bMaskTest(p->loc
a0c0: 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 kMask,i) && ALWA
a0d0: 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 YS(aDb[i].pBt!=0
a0e0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 ) ){. sqlit
a0f0: 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 e3BtreeEnter(aDb
a100: 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a [i].pBt);. }.
a110: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 }.}.#endif..#i
a120: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 f !defined(SQLIT
a130: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 E_OMIT_SHARED_CA
a140: 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 CHE) && SQLITE_T
a150: 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a HREADSAFE>0./*.*
a160: 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 * Unlock all of
a170: 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 the btrees previ
a180: 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 ously locked by
a190: 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 a call to sqlite
a1a0: 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 3VdbeEnter()..*/
a1b0: 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e .static SQLITE_N
a1c0: 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 OINLINE void vdb
a1d0: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b eLeave(Vdbe *p){
a1e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 . int i;. sqli
a1f0: 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 te3 *db;. Db *a
a200: 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 Db;. int nDb;.
a210: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 db = p->db;. a
a220: 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 Db = db->aDb;.
a230: 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 nDb = db->nDb;.
a240: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b for(i=0; i<nDb;
a250: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 i++){. if( i
a260: 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 !=1 && DbMaskTes
a270: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 t(p->lockMask,i)
a280: 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 && ALWAYS(aDb[i
a290: 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 ].pBt!=0) ){.
a2a0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c sqlite3BtreeL
a2b0: 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 eave(aDb[i].pBt)
a2c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f ;. }. }.}.vo
a2d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 id sqlite3VdbeLe
a2e0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ave(Vdbe *p){.
a2f0: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 if( DbMaskAllZer
a300: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 o(p->lockMask) )
a310: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 return; /* The
a320: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a common case */.
a330: 20 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a vdbeLeave(p);.
a340: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 }.#endif..#if de
a350: 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 fined(VDBE_PROFI
a360: 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 LE) || defined(S
a370: 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a QLITE_DEBUG)./*.
a380: 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c ** Print a singl
a390: 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 e opcode. This
a3a0: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 routine is used
a3b0: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e for debugging on
a3c0: 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ly..*/.void sqli
a3d0: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 te3VdbePrintOp(F
a3e0: 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 ILE *pOut, int p
a3f0: 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 c, Op *pOp){. c
a400: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 har *zP4;. char
a410: 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 zPtr[50];. cha
a420: 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 r zCom[100];. s
a430: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
a440: 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 *zFormat1 = "%4
a450: 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 d %-13s %4d %4d
a460: 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 %4d %-13s %.2X %
a470: 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 s\n";. if( pOut
a480: 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 ==0 ) pOut = std
a490: 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 out;. zP4 = dis
a4a0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 playP4(pOp, zPtr
a4b0: 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b , sizeof(zPtr));
a4c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
a4d0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f NABLE_EXPLAIN_CO
a4e0: 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 MMENTS. display
a4f0: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 Comment(pOp, zP4
a500: 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a , zCom, sizeof(z
a510: 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a Com));.#else. z
a520: 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 Com[0] = 0;.#end
a530: 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 if. /* NB: The
a540: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 sqlite3OpcodeNa
a550: 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 me() function is
a560: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 implemented by
a570: 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a code created. *
a580: 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 * by the mkopcod
a590: 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 eh.awk and mkopc
a5a0: 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 odec.awk scripts
a5b0: 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74 which extract t
a5c0: 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 he. ** informat
a5d0: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 ion from the vdb
a5e0: 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 e.c source text
a5f0: 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 */. fprintf(pOu
a600: 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c t, zFormat1, pc,
a610: 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f . sqlite3O
a620: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f pcodeName(pOp->o
a630: 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c pcode), pOp->p1,
a640: 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 pOp->p2, pOp->p
a650: 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 3, zP4, pOp->p5,
a660: 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b . zCom. );
a670: 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b . fflush(pOut);
a680: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a .}.#endif../*.**
a690: 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 Release an arra
a6a0: 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 y of N Mem eleme
a6b0: 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f nts.*/.static vo
a6c0: 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 id releaseMemArr
a6d0: 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e ay(Mem *p, int N
a6e0: 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 ){. if( p && N
a6f0: 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 ){. Mem *pEnd
a700: 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 = &p[N];. sq
a710: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
a720: 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 b;. if( db->p
a730: 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 nBytesFreed ){.
a740: 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 do{.
a750: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 if( p->szMalloc
a760: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 ) sqlite3DbFree
a770: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 (db, p->zMalloc)
a780: 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 ;. }while(
a790: 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 (++p)<pEnd );.
a7a0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 return;.
a7b0: 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 }. do{.
a7c0: 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d assert( (&p[1])=
a7d0: 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 =pEnd || p[0].db
a7e0: 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 ==p[1].db );.
a7f0: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 assert( sqlit
a800: 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e e3VdbeCheckMemIn
a810: 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a variants(p) );..
a820: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c /* This bl
a830: 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e ock is really an
a840: 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e inlined version
a850: 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d of sqlite3VdbeM
a860: 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 emRelease().
a870: 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 ** that takes
a880: 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 advantage of the
a890: 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d fact that the m
a8a0: 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 emory cell value
a8b0: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 is . ** be
a8c0: 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 ing set to NULL
a8d0: 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 after releasing
a8e0: 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f any dynamic reso
a8f0: 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a urces.. **.
a900: 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 ** The jus
a910: 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 tification for d
a920: 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 uplicating code
a930: 69 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e is that accordin
a940: 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 g to . ** c
a950: 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 allgrind, this c
a960: 61 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 auses a certain
a970: 74 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 test case to hit
a980: 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 the CPU 4.7 .
a990: 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c ** percent l
a9a0: 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 ess (x86 linux,
a9b0: 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e gcc version 4.1.
a9c0: 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 2, -O6) than if
a9d0: 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 . ** sqlite
a9e0: 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 3MemRelease() we
a9f0: 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 re called from h
aa00: 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 ere. With -O2, t
aa10: 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 his jumps.
aa20: 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e ** to 6.6 percen
aa30: 74 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 t. The test case
aa40: 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 is inserting 10
aa50: 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 00 rows into a t
aa60: 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 able . ** w
aa70: 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 ith no indexes u
aa80: 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 sing a single pr
aa90: 65 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 epared INSERT st
aaa0: 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 atement, bind()
aab0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 . ** and re
aac0: 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 set(). Inserts a
aad0: 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 re grouped into
aae0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 a transaction..
aaf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 */. te
ab00: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 stcase( p->flags
ab10: 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 & MEM_Agg );.
ab20: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d testcase( p-
ab30: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e >flags & MEM_Dyn
ab40: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 );. testca
ab50: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d se( p->flags & M
ab60: 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 EM_Frame );.
ab70: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 testcase( p->f
ab80: 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 lags & MEM_RowSe
ab90: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 t );. if( p
aba0: 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 ->flags&(MEM_Agg
abb0: 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 |MEM_Dyn|MEM_Fra
abc0: 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 me|MEM_RowSet) )
abd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
abe0: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
abf0: 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 p);. }else
ac00: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 if( p->szMalloc
ac10: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ){. sqlit
ac20: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e e3DbFree(db, p->
ac30: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 zMalloc);.
ac40: 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 p->szMalloc =
ac50: 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 0;. }..
ac60: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d p->flags = MEM
ac70: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 _Undefined;.
ac80: 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 }while( (++p)<pE
ac90: 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a nd );. }.}../*.
aca0: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 ** Delete a Vdbe
acb0: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 Frame object and
acc0: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 its contents. V
acd0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 dbeFrame objects
ace0: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 are.** allocate
acf0: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 d by the OP_Prog
ad00: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 ram opcode in sq
ad10: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e lite3VdbeExec().
ad20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
ad30: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 VdbeFrameDelete(
ad40: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 VdbeFrame *p){.
ad50: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 int i;. Mem *a
ad60: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d Mem = VdbeFrameM
ad70: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 em(p);. VdbeCur
ad80: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 sor **apCsr = (V
ad90: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d dbeCursor **)&aM
ada0: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d em[p->nChildMem]
adb0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 ;. for(i=0; i<p
adc0: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b ->nChildCsr; i++
add0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 ){. sqlite3Vd
ade0: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e beFreeCursor(p->
adf0: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 v, apCsr[i]);.
ae00: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 }. releaseMemAr
ae10: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 ray(aMem, p->nCh
ae20: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 ildMem);. sqlit
ae30: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 e3DbFree(p->v->d
ae40: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 b, p);.}..#ifnde
ae50: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 f SQLITE_OMIT_EX
ae60: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 PLAIN./*.** Give
ae70: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 a listing of th
ae80: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 e program in the
ae90: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 virtual machine
aea0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 ..**.** The inte
aeb0: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d rface is the sam
aec0: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 e as sqlite3Vdbe
aed0: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 Exec(). But ins
aee0: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 tead of.** runni
aef0: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 ng the code, it
af00: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c invokes the call
af10: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 back once for ea
af20: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a ch instruction..
af30: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 ** This feature
af40: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 is used to imple
af50: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a ment "EXPLAIN"..
af60: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 **.** When p->ex
af70: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 plain==1, each i
af80: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 nstruction is li
af90: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 sted. When.** p
afa0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e ->explain==2, on
afb0: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e ly OP_Explain in
afc0: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c structions are l
afd0: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a isted and these.
afe0: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 ** are shown in
aff0: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d a different form
b000: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d at. p->explain=
b010: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d =2 is used to im
b020: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 plement.** EXPLA
b030: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a IN QUERY PLAN..*
b040: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 *.** When p->exp
b050: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 lain==1, first t
b060: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 he main program
b070: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 is listed, then
b080: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 each of.** the t
b090: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 rigger subprogra
b0a0: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e ms are listed on
b0b0: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 e by one..*/.int
b0c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 sqlite3VdbeList
b0d0: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 (. Vdbe *p
b0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
b0f0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a The VDBE */.){.
b100: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 int nRow;
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b120: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 /* Stop w
b130: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 hen row count re
b140: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 aches this */.
b150: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 int nSub = 0;
b160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b170: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
b180: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e f sub-vdbes seen
b190: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 so far */. Sub
b1a0: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 Program **apSub
b1b0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 0;
b1c0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 /* Array of su
b1d0: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d b-vdbes */. Mem
b1e0: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 *pSub = 0;
b1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b200: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c /* Memory cell
b210: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 hold array of s
b220: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c ubprogs */. sql
b230: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 ite3 *db = p->db
b240: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
b250: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 /* The databas
b260: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a e connection */.
b270: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 int i;
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b290: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 /* Loop c
b2a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 ounter */. int
b2b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 rc = SQLITE_OK;
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
b2d0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 /* Return code
b2e0: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d */. Mem *pMem =
b2f0: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 &p->aMem[1];
b300: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 /* Fir
b310: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 st Mem of result
b320: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 set */.. asser
b330: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b t( p->explain );
b340: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 . assert( p->ma
b350: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
b360: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 RUN );. assert(
b370: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f p->rc==SQLITE_O
b380: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 K || p->rc==SQLI
b390: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 TE_BUSY || p->rc
b3a0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 ==SQLITE_NOMEM )
b3b0: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f ;.. /* Even tho
b3c0: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 ugh this opcode
b3d0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e does not use dyn
b3e0: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 amic strings for
b3f0: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 . ** the result
b400: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 , result columns
b410: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 may become dyna
b420: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 mic if the user
b430: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 calls. ** sqlit
b440: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 e3_column_text16
b450: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 (), causing a tr
b460: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 anslation to UTF
b470: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 -16 encoding..
b480: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 */. releaseMemA
b490: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 rray(pMem, 8);.
b4a0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d p->pResultSet =
b4b0: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 0;.. if( p->rc
b4c0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 ==SQLITE_NOMEM )
b4d0: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 {. /* This ha
b4e0: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f ppens if a mallo
b4f0: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c c() inside a cal
b500: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c l to sqlite3_col
b510: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 umn_text() or.
b520: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c ** sqlite3_col
b530: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 umn_text16() fai
b540: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c led. */. sql
b550: 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 ite3OomFault(db)
b560: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c ;. return SQL
b570: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a ITE_ERROR;. }..
b580: 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 /* When the nu
b590: 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 mber of output r
b5a0: 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 ows reaches nRow
b5b0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 , that means the
b5c0: 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 . ** listing ha
b5d0: 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 s finished and s
b5e0: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 qlite3_step() sh
b5f0: 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 ould return SQLI
b600: 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 TE_DONE.. ** nR
b610: 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 ow is the sum of
b620: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 the number of r
b630: 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 ows in the main
b640: 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 program, plus.
b650: 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 ** the sum of th
b660: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 e number of rows
b670: 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 in all trigger
b680: 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f subprograms enco
b690: 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 untered. ** so
b6a0: 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 far. The nRow v
b6b0: 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 alue will increa
b6c0: 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 se as new trigge
b6d0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 r subprograms ar
b6e0: 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 e. ** encounter
b6f0: 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 ed, but p->pc wi
b700: 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 ll eventually ca
b710: 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a tch up to nRow..
b720: 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d */. nRow = p-
b730: 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 >nOp;. if( p->e
b740: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 xplain==1 ){.
b750: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 /* The first 8
b760: 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 memory cells are
b770: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 used for the re
b780: 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 sult set. So we
b790: 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d will. ** com
b7a0: 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 mandeer the 9th
b7b0: 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 cell to use as s
b7c0: 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 torage for an ar
b7d0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a ray of pointers.
b7e0: 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 ** to trigge
b7f0: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 r subprograms.
b800: 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 The VDBE is guar
b810: 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 anteed to have a
b820: 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a t least 9. **
b830: 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 cells. */.
b840: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e assert( p->nMem>
b850: 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 9 );. pSub =
b860: 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 &p->aMem[9];.
b870: 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 if( pSub->flags
b880: 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 &MEM_Blob ){.
b890: 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 /* On the fir
b8a0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 st call to sqlit
b8b0: 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 e3_step(), pSub
b8c0: 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c will hold a NULL
b8d0: 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a . It is. *
b8e0: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f * initialized to
b8f0: 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 a BLOB by the P
b900: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 4_SUBPROGRAM pro
b910: 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 cessing logic be
b920: 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 low */. nSu
b930: 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 b = pSub->n/size
b940: 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 of(Vdbe*);.
b950: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f apSub = (SubPro
b960: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b gram **)pSub->z;
b970: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 . }. for(i
b980: 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 =0; i<nSub; i++)
b990: 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 {. nRow +=
b9a0: 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 apSub[i]->nOp;.
b9b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a }. }.. do{.
b9c0: 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b i = p->pc++;
b9d0: 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f . }while( i<nRo
b9e0: 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d w && p->explain=
b9f0: 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e =2 && p->aOp[i].
ba00: 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 opcode!=OP_Expla
ba10: 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e in );. if( i>=n
ba20: 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 Row ){. p->rc
ba30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 = SQLITE_OK;.
ba40: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f rc = SQLITE_DO
ba50: 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 NE;. }else if(
ba60: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 db->u1.isInterru
ba70: 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 pted ){. p->r
ba80: 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 c = SQLITE_INTER
ba90: 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 RUPT;. rc = S
baa0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 QLITE_ERROR;.
bab0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f sqlite3VdbeErro
bac0: 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 r(p, sqlite3ErrS
bad0: 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 tr(p->rc));. }e
bae0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a lse{. char *z
baf0: 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b P4;. Op *pOp;
bb00: 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f . if( i<p->nO
bb10: 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 p ){. /* Th
bb20: 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 e output line nu
bb30: 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e mber is small en
bb40: 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 ough that we are
bb50: 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 still in the.
bb60: 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 ** main prog
bb70: 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f ram. */. pO
bb80: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a p = &p->aOp[i];.
bb90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
bba0: 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 /* We are curre
bbb0: 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 ntly listing sub
bbc0: 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 programs. Figur
bbd0: 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 e out which one
bbe0: 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 and. ** pic
bbf0: 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 k up the appropr
bc00: 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a iate opcode. */.
bc10: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 int j;.
bc20: 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a i -= p->nOp;.
bc30: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 for(j=0; i
bc40: 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b >=apSub[j]->nOp;
bc50: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 j++){. i
bc60: 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f -= apSub[j]->nO
bc70: 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 p;. }.
bc80: 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d pOp = &apSub[j]
bc90: 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a ->aOp[i];. }.
bca0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 if( p->expla
bcb0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 in==1 ){. p
bcc0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d Mem->flags = MEM
bcd0: 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d _Int;. pMem
bce0: 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 ->u.i = i;
bcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f /* Pro
bd10: 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a gram counter */.
bd20: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 pMem++;.
bd30: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
bd40: 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c gs = MEM_Static|
bd50: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d MEM_Str|MEM_Term
bd60: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 ;. pMem->z
bd70: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 = (char*)sqlite3
bd80: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e OpcodeName(pOp->
bd90: 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f opcode); /* Opco
bda0: 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 de */. asse
bdb0: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 rt( pMem->z!=0 )
bdc0: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 ;. pMem->n
bdd0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 = sqlite3Strlen3
bde0: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 0(pMem->z);.
bdf0: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 pMem->enc = SQ
be00: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 LITE_UTF8;.
be10: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 pMem++;..
be20: 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 /* When an OP_Pr
be30: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 ogram opcode is
be40: 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f encounter (the o
be50: 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 nly opcode that
be60: 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 has. ** a P
be70: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 4_SUBPROGRAM arg
be80: 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 ument), expand t
be90: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 he size of the a
bea0: 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 rray of subprogr
beb0: 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 ams. ** kep
bec0: 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e t in p->aMem[9].
bed0: 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 z to hold the ne
bee0: 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 w program - assu
bef0: 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f ming this subpro
bf00: 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 gram. ** ha
bf10: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 s not already be
bf20: 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a en seen.. *
bf30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d /. if( pOp-
bf40: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 >p4type==P4_SUBP
bf50: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 ROGRAM ){.
bf60: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e int nByte = (n
bf70: 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 Sub+1)*sizeof(Su
bf80: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 bProgram*);.
bf90: 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 int j;.
bfa0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 for(j=0; j<nS
bfb0: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 ub; j++){.
bfc0: 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d if( apSub[j]
bfd0: 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 ==pOp->p4.pProgr
bfe0: 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 am ) break;.
bff0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 }. if
c000: 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c ( j==nSub && SQL
c010: 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 ITE_OK==sqlite3V
c020: 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c dbeMemGrow(pSub,
c030: 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 nByte, nSub!=0)
c040: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 ){. ap
c050: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 Sub = (SubProgra
c060: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 m **)pSub->z;.
c070: 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 apSub[nS
c080: 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e ub++] = pOp->p4.
c090: 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 pProgram;.
c0a0: 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 pSub->flags
c0b0: 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 |= MEM_Blob;.
c0c0: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d pSub->n =
c0d0: 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 nSub*sizeof(Sub
c0e0: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 Program*);.
c0f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
c100: 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c }.. pMem->fl
c110: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 ags = MEM_Int;.
c120: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 pMem->u.i = p
c130: 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 Op->p1;
c140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c150: 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d /* P1 */. pM
c160: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d em++;.. pMem-
c170: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 >flags = MEM_Int
c180: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 ;. pMem->u.i
c190: 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 = pOp->p2;
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c1b0: 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 /* P2 */.
c1c0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d pMem++;.. pM
c1d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
c1e0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 Int;. pMem->u
c1f0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 .i = pOp->p3;
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
c210: 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a /* P3 */.
c220: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 pMem++;..
c230: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 if( sqlite3Vdbe
c240: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a MemClearAndResiz
c250: 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 e(pMem, 100) ){
c260: 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 /* P4 */. a
c270: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 ssert( p->db->ma
c280: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 llocFailed );.
c290: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
c2a0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 E_ERROR;. }.
c2b0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d pMem->flags =
c2c0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 MEM_Str|MEM_Ter
c2d0: 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 m;. zP4 = dis
c2e0: 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d playP4(pOp, pMem
c2f0: 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c ->z, pMem->szMal
c300: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 loc);. if( zP
c310: 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 4!=pMem->z ){.
c320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
c330: 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a emSetStr(pMem, z
c340: 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 P4, -1, SQLITE_U
c350: 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c TF8, 0);. }el
c360: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 se{. assert
c370: 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a ( pMem->z!=0 );.
c380: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 pMem->n =
c390: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
c3a0: 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 pMem->z);.
c3b0: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 pMem->enc = SQLI
c3c0: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 TE_UTF8;. }.
c3d0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 pMem++;..
c3e0: 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d if( p->explain==
c3f0: 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 1 ){. if( s
c400: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 qlite3VdbeMemCle
c410: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d arAndResize(pMem
c420: 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 , 4) ){.
c430: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d assert( p->db->m
c440: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
c450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 return SQ
c460: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 LITE_ERROR;.
c470: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e }. pMem->
c480: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c flags = MEM_Str|
c490: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 MEM_Term;.
c4a0: 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 pMem->n = 2;.
c4b0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
c4c0: 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 ntf(3, pMem->z,
c4d0: 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 "%.2x", pOp->p5)
c4e0: 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 ; /* P5 */.
c4f0: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 pMem->enc = S
c500: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 QLITE_UTF8;.
c510: 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 pMem++;. .#if
c520: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
c530: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e E_EXPLAIN_COMMEN
c540: 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c TS. if( sql
c550: 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 ite3VdbeMemClear
c560: 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 AndResize(pMem,
c570: 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 500) ){.
c580: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d assert( p->db->m
c590: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
c5a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 return SQ
c5b0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 LITE_ERROR;.
c5c0: 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e }. pMem->
c5d0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c flags = MEM_Str|
c5e0: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 MEM_Term;.
c5f0: 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 pMem->n = displa
c600: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 yComment(pOp, zP
c610: 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 4, pMem->z, 500)
c620: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e ;. pMem->en
c630: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b c = SQLITE_UTF8;
c640: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 .#else. pMe
c650: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e m->flags = MEM_N
c660: 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 ull;
c670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
c680: 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a mment */.#endif.
c690: 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 }.. p->nR
c6a0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 esColumn = 8 - 4
c6b0: 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b *(p->explain-1);
c6c0: 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 . p->pResultS
c6d0: 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d et = &p->aMem[1]
c6e0: 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 ;. p->rc = SQ
c6f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 LITE_OK;. rc
c700: 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 = SQLITE_ROW;.
c710: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d }. return rc;.}
c720: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 .#endif /* SQLIT
c730: 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a E_OMIT_EXPLAIN *
c740: 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 /..#ifdef SQLITE
c750: 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 _DEBUG./*.** Pri
c760: 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 nt the SQL that
c770: 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 was used to gene
c780: 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 rate a VDBE prog
c790: 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ram..*/.void sql
c7a0: 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c ite3VdbePrintSql
c7b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e (Vdbe *p){. con
c7c0: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a st char *z = 0;.
c7d0: 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b if( p->zSql ){
c7e0: 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c . z = p->zSql
c7f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d ;. }else if( p-
c800: 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 >nOp>=1 ){. c
c810: 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 onst VdbeOp *pOp
c820: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 = &p->aOp[0];.
c830: 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f if( pOp->opco
c840: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 de==OP_Init && p
c850: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 Op->p4.z!=0 ){.
c860: 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 z = pOp->p4
c870: 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 .z;. while(
c880: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 sqlite3Isspace(
c890: 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d *z) ) z++;. }
c8a0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 . }. if( z ) p
c8b0: 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d rintf("SQL: [%s]
c8c0: 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 \n", z);.}.#endi
c8d0: 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 f..#if !defined(
c8e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 SQLITE_OMIT_TRAC
c8f0: 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 E) && defined(SQ
c900: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 LITE_ENABLE_IOTR
c910: 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 ACE)./*.** Print
c920: 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 an IOTRACE mess
c930: 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 age showing SQL
c940: 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 content..*/.void
c950: 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 sqlite3VdbeIOTr
c960: 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b aceSql(Vdbe *p){
c970: 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e . int nOp = p->
c980: 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 nOp;. VdbeOp *p
c990: 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 Op;. if( sqlite
c9a0: 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 3IoTrace==0 ) re
c9b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c turn;. if( nOp<
c9c0: 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 1 ) return;. pO
c9d0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a p = &p->aOp[0];.
c9e0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 if( pOp->opcod
c9f0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f e==OP_Init && pO
ca00: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 p->p4.z!=0 ){.
ca10: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 int i, j;.
ca20: 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 char z[1000];.
ca30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
ca40: 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c tf(sizeof(z), z,
ca50: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a "%s", pOp->p4.z
ca60: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 );. for(i=0;
ca70: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a sqlite3Isspace(z
ca80: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 [i]); i++){}.
ca90: 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 for(j=0; z[i];
caa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 i++){. if(
cab0: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a sqlite3Isspace(z
cac0: 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 [i]) ){.
cad0: 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 if( z[i-1]!=' '
cae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a ){. z[j
caf0: 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 ++] = ' ';.
cb00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 }. }else
cb10: 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d {. z[j++]
cb20: 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d = z[i];. }
cb30: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 . }. z[j]
cb40: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 = 0;. sqlite3
cb50: 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c IoTrace("SQL %s\
cb60: 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 n", z);. }.}.#e
cb70: 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f ndif /* !SQLITE_
cb80: 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 OMIT_TRACE && SQ
cb90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 LITE_ENABLE_IOTR
cba0: 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e ACE */../* An in
cbb0: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f stance of this o
cbc0: 62 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 bject describes
cbd0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 bulk memory avai
cbe0: 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a lable for use.**
cbf0: 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 by subcomponent
cc00: 73 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 s of a prepared
cc10: 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 statement. Spac
cc20: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f e is allocated o
cc30: 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 ut.** of a Reusa
cc40: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 bleSpace object
cc50: 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 by the allocSpac
cc60: 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f e() routine belo
cc70: 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 w..*/.struct Reu
cc80: 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 sableSpace {. u
cc90: 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 8 *pSpace;
cca0: 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 /* Available
ccb0: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 memory */. int
ccc0: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 nFree;
ccd0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 /* Bytes of av
cce0: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a ailable memory *
ccf0: 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b /. int nNeeded;
cd00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 /* Tota
cd10: 6c 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 l bytes that cou
cd20: 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 ld not be alloca
cd30: 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 ted */.};../* Tr
cd40: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 y to allocate nB
cd50: 79 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 yte bytes of 8-b
cd60: 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b yte aligned bulk
cd70: 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 memory for pBuf
cd80: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 .** from the Reu
cd90: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 sableSpace objec
cda0: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 t. Return a poi
cdb0: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f nter to the allo
cdc0: 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 cated.** memory
cdd0: 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 on success. If
cde0: 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d insufficient mem
cdf0: 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 ory is available
ce00: 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 in the.** Reusa
ce10: 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c bleSpace object,
ce20: 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 increase the Re
ce30: 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 usableSpace.nNee
ce40: 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 ded.** value by
ce50: 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 the amount neede
ce60: 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c d and return NUL
ce70: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 L..**.** If pBuf
ce80: 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c is not initiall
ce90: 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 y NULL, that mea
cea0: 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f ns that the memo
ceb0: 72 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a ry has already.*
cec0: 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 * been allocated
ced0: 20 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c by a prior call
cee0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 to this routine
cef0: 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e , so just return
cf00: 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 a copy.** of pB
cf10: 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 uf and leave Reu
cf20: 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 sableSpace uncha
cf30: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 nged..**.** This
cf40: 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d allocator is em
cf50: 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 ployed to repurp
cf60: 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 ose unused slots
cf70: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 at the end of t
cf80: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 he.** opcode arr
cf90: 61 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 ay of prepared s
cfa0: 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d tate for other m
cfb0: 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 emory needs of t
cfc0: 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 he prepared.** s
cfd0: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 tatement..*/.sta
cfe0: 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 tic void *allocS
cff0: 70 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 pace(. struct R
d000: 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c eusableSpace *p,
d010: 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 /* Bulk memory
d020: 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 available for a
d030: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 llocation */. v
d040: 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 oid *pBuf,
d050: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e /* Poin
d060: 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 ter to a prior a
d070: 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 llocation */. i
d080: 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 nt nByte
d090: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 /* Byte
d0a0: 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 s of memory need
d0b0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 ed */.){. asser
d0c0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c t( EIGHT_BYTE_AL
d0d0: 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 IGNMENT(p->pSpac
d0e0: 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 e) );. if( pBuf
d0f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 ==0 ){. nByte
d100: 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 = ROUND8(nByte)
d110: 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 ;. if( nByte
d120: 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 <= p->nFree ){.
d130: 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d p->nFree -=
d140: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 nByte;. pB
d150: 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b uf = &p->pSpace[
d160: 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d p->nFree];. }
d170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e else{. p->n
d180: 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b Needed += nByte;
d190: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 . }. }. ass
d1a0: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f ert( EIGHT_BYTE_
d1b0: 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 ALIGNMENT(pBuf)
d1c0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 );. return pBuf
d1d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e ;.}../*.** Rewin
d1e0: 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 d the VDBE back
d1f0: 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 to the beginning
d200: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 in preparation
d210: 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 for.** running i
d220: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 t..*/.void sqlit
d230: 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 e3VdbeRewind(Vdb
d240: 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e e *p){.#if defin
d250: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 ed(SQLITE_DEBUG)
d260: 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 || defined(VDBE
d270: 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 _PROFILE). int
d280: 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 i;.#endif. asse
d290: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 rt( p!=0 );. as
d2a0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
d2b0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
d2c0: 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 );.. /* There s
d2d0: 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 hould be at leas
d2e0: 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 t one opcode..
d2f0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e */. assert( p->
d300: 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 nOp>0 );.. /* S
d310: 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 et the magic to
d320: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 VDBE_MAGIC_RUN s
d330: 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 ooner rather tha
d340: 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d n later. */. p-
d350: 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 >magic = VDBE_MA
d360: 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 GIC_RUN;..#ifdef
d370: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 SQLITE_DEBUG.
d380: 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d for(i=1; i<p->nM
d390: 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 em; i++){. as
d3a0: 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d sert( p->aMem[i]
d3b0: 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 .db==p->db );.
d3c0: 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 }.#endif. p->pc
d3d0: 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d = -1;. p->rc =
d3e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d SQLITE_OK;. p-
d3f0: 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f >errorAction = O
d400: 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 E_Abort;. p->nC
d410: 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e hange = 0;. p->
d420: 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 cacheCtr = 1;.
d430: 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 p->minWriteFileF
d440: 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 ormat = 255;. p
d450: 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 ->iStatement = 0
d460: 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 ;. p->nFkConstr
d470: 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 aint = 0;.#ifdef
d480: 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 VDBE_PROFILE.
d490: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f for(i=0; i<p->nO
d4a0: 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e p; i++){. p->
d4b0: 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a aOp[i].cnt = 0;.
d4c0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 p->aOp[i].cy
d4d0: 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 cles = 0;. }.#e
d4e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 ndif.}../*.** Pr
d4f0: 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 epare a virtual
d500: 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 machine for exec
d510: 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 ution for the fi
d520: 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a rst time after.*
d530: 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 * creating the v
d540: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 irtual machine.
d550: 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 This involves t
d560: 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 hings such.** as
d570: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 allocating regi
d580: 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 sters and initia
d590: 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 lizing the progr
d5a0: 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 am counter..** A
d5b0: 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 fter the VDBE ha
d5c0: 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 s be prepped, it
d5d0: 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 can be executed
d5e0: 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a by one or more.
d5f0: 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 ** calls to sqli
d600: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 te3VdbeExec().
d610: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 .**.** This func
d620: 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c tion may be call
d630: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 ed exactly once
d640: 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 on each virtual
d650: 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 machine..** Afte
d660: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 r this routine i
d670: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 s called the VM
d680: 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 has been "packag
d690: 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 ed" and is ready
d6a0: 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 .** to run. Aft
d6b0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 er this routine
d6c0: 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 is called, furth
d6d0: 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 er calls to .**
d6e0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 sqlite3VdbeAddOp
d6f0: 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 () functions are
d700: 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 prohibited. Th
d710: 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f is routine disco
d720: 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 nnects.** the Vd
d730: 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 be from the Pars
d740: 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 e object that he
d750: 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 lped generate it
d760: 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 so that the.**
d770: 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 the Vdbe becomes
d780: 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 an independent
d790: 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 entity and the P
d7a0: 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 arse object can
d7b0: 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e be.** destroyed.
d7c0: 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 .**.** Use the s
d7d0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 qlite3VdbeRewind
d7e0: 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 () procedure to
d7f0: 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 restore a virtua
d800: 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a l machine back.*
d810: 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c * to its initial
d820: 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 state after it
d830: 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f has been run..*/
d840: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
d850: 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 eMakeReady(. Vd
d860: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 be *p,
d870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
d880: 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 The VDBE */. Pa
d890: 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 rse *pParse
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
d8b0: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 Parsing context
d8c0: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 */.){. sqlite3
d8d0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 *db;
d8e0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 /* The da
d8f0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
d900: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b n */. int nVar;
d910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d920: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
d930: 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f of parameters */
d940: 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 . int nMem;
d950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d960: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 /* Number of V
d970: 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 M memory registe
d980: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 rs */. int nCur
d990: 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 sor;
d9a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 /* Number
d9b0: 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 of cursors requ
d9c0: 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 ired */. int nA
d9d0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 rg;
d9e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 /* Numb
d9f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 er of arguments
da00: 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a in subprograms *
da10: 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 /. int nOnce;
da20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
da30: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
da40: 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 OP_Once instruct
da50: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b ions */. int n;
da60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
da70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 /* Loop
da80: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 counter */. st
da90: 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 ruct ReusableSpa
daa0: 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 ce x; /*
dab0: 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 Reusable bulk me
dac0: 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 mory */.. asser
dad0: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 t( p!=0 );. ass
dae0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b ert( p->nOp>0 );
daf0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 . assert( pPars
db00: 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 e!=0 );. assert
db10: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
db20: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
db30: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d assert( pParse=
db40: 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 =p->pParse );.
db50: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 db = p->db;. as
db60: 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 sert( db->malloc
db70: 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e Failed==0 );. n
db80: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 Var = pParse->nV
db90: 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 ar;. nMem = pPa
dba0: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 rse->nMem;. nCu
dbb0: 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e rsor = pParse->n
dbc0: 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 Tab;. nArg = pP
dbd0: 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 arse->nMaxArg;.
dbe0: 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d nOnce = pParse-
dbf0: 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f >nOnce;. if( nO
dc00: 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d nce==0 ) nOnce =
dc10: 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 1; /* Ensure at
dc20: 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 least one byte
dc30: 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b in p->aOnceFlag[
dc40: 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 ] */. . /* For
dc50: 20 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 each cursor req
dc60: 75 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f uired, also allo
dc70: 63 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 cate a memory ce
dc80: 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 ll. Memory. **
dc90: 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 cells (nMem+1-nC
dca0: 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e ursor)..nMem, in
dcb0: 63 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 clusive, will ne
dcc0: 76 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 ver be used by.
dcd0: 20 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f ** the vdbe pro
dce0: 67 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 gram. Instead th
dcf0: 65 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 ey are used to a
dd00: 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66 llocate memory f
dd10: 6f 72 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 or. ** VdbeCurs
dd20: 6f 72 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 or/BtCursor stru
dd30: 63 74 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 ctures. The blob
dd40: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 of memory assoc
dd50: 69 61 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a iated with . **
dd60: 20 63 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f cursor 0 is sto
dd70: 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 red in memory ce
dd80: 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 ll nMem. Memory
dd90: 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 cell (nMem-1).
dda0: 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c ** stores the bl
ddb0: 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 ob of memory ass
ddc0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75 72 ociated with cur
ddd0: 73 6f 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a sor 1, etc.. **
dde0: 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 . ** See also:
ddf0: 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 allocateCursor()
de00: 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d .. */. nMem +=
de10: 20 6e 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 nCursor;.. /*
de20: 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d Figure out how m
de30: 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d uch reusable mem
de40: 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 ory is available
de50: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 at the end of t
de60: 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 he. ** opcode a
de70: 72 72 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 rray. This extr
de80: 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 a memory will be
de90: 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 reallocated for
dea0: 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a other elements.
deb0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 ** of the prep
dec0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a ared statement..
ded0: 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 */. n = ROUND
dee0: 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 8(sizeof(Op)*p->
def0: 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 nOp);
df00: 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f /* Bytes of o
df10: 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 pcode memory use
df20: 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 d */. x.pSpace
df30: 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 = &((u8*)p->aOp)
df40: 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 [n];
df50: 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 /* Unused opc
df60: 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 ode memory */.
df70: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 assert( EIGHT_BY
df80: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 TE_ALIGNMENT(x.p
df90: 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 Space) );. x.nF
dfa0: 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 ree = ROUNDDOWN8
dfb0: 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c (pParse->szOpAll
dfc0: 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 oc - n); /* Byt
dfd0: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d es of unused mem
dfe0: 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 ory */. assert(
dff0: 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 x.nFree>=0 );.
e000: 20 69 66 28 20 78 2e 6e 46 72 65 65 3e 30 20 29 if( x.nFree>0 )
e010: 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 78 2e 70 {. memset(x.p
e020: 53 70 61 63 65 2c 20 30 2c 20 78 2e 6e 46 72 65 Space, 0, x.nFre
e030: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 e);. assert(
e040: 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e EIGHT_BYTE_ALIGN
e050: 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78 MENT(&x.pSpace[x
e060: 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20 7d 0a .nFree]) );. }.
e070: 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 . resolveP2Valu
e080: 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 es(p, &nArg);.
e090: 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e p->usesStmtJourn
e0a0: 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 al = (u8)(pParse
e0b0: 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 ->isMultiWrite &
e0c0: 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f & pParse->mayAbo
e0d0: 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 rt);. if( pPars
e0e0: 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d e->explain && nM
e0f0: 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 em<10 ){. nMe
e100: 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d m = 10;. }. p-
e110: 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 >expired = 0;..
e120: 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 /* Memory for r
e130: 65 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 egisters, parame
e140: 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 ters, cursor, et
e150: 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 c, is allocated
e160: 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20 in one or two.
e170: 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 ** passes. On t
e180: 68 65 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 he first pass, w
e190: 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 e try to reuse u
e1a0: 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20 nused memory at
e1b0: 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 the . ** end of
e1c0: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 the opcode arra
e1d0: 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 6e y. If we are un
e1e0: 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 able to satisfy
e1f0: 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 all memory. **
e200: 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 requirements by
e210: 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f reusing the opco
e220: 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 de array tail, t
e230: 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 hen the second.
e240: 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 ** pass will fi
e250: 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e ll in the remain
e260: 64 65 72 20 75 73 69 6e 67 20 61 20 66 72 65 73 der using a fres
e270: 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 h memory allocat
e280: 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a ion. . **. **
e290: 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 This two-pass a
e2a0: 70 70 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 pproach that reu
e2b0: 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f ses as much memo
e2c0: 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 ry as possible f
e2d0: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 rom. ** the lef
e2e0: 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20 tover memory at
e2f0: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f the end of the o
e300: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 pcode array. Th
e310: 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 is can significa
e320: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 ntly. ** reduce
e330: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d the amount of m
e340: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 emory held by a
e350: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 prepared stateme
e360: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a nt.. */. do {.
e370: 20 20 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 x.nNeeded =
e380: 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 0;. p->aMem =
e390: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 allocSpace(&x,
e3a0: 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 p->aMem, nMem*si
e3b0: 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 zeof(Mem));.
e3c0: 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 p->aVar = allocS
e3d0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 pace(&x, p->aVar
e3e0: 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 , nVar*sizeof(Me
e3f0: 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 m));. p->apAr
e400: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 g = allocSpace(&
e410: 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 x, p->apArg, nAr
e420: 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b g*sizeof(Mem*));
e430: 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 . p->apCsr =
e440: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 allocSpace(&x, p
e450: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 ->apCsr, nCursor
e460: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 *sizeof(VdbeCurs
e470: 6f 72 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 4f or*));. p->aO
e480: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 nceFlag = allocS
e490: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4f 6e 63 pace(&x, p->aOnc
e4a0: 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 29 3b 0a 23 eFlag, nOnce);.#
e4b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 ifdef SQLITE_ENA
e4c0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 BLE_STMT_SCANSTA
e4d0: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 TUS. p->anExe
e4e0: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 c = allocSpace(&
e4f0: 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d x, p->anExec, p-
e500: 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 >nOp*sizeof(i64)
e510: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 );.#endif. if
e520: 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 ( x.nNeeded==0 )
e530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 break;. x.pS
e540: 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 pace = p->pFree
e550: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f = sqlite3DbMallo
e560: 63 5a 65 72 6f 28 64 62 2c 20 78 2e 6e 4e 65 65 cZero(db, x.nNee
e570: 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 ded);. x.nFre
e580: 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 e = x.nNeeded;.
e590: 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 }while( !db->ma
e5a0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 llocFailed );..
e5b0: 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 p->nCursor = nC
e5c0: 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e 63 ursor;. p->nOnc
e5d0: 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a 20 eFlag = nOnce;.
e5e0: 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a if( p->aVar ){.
e5f0: 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 p->nVar = (y
e600: 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 nVar)nVar;. f
e610: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 or(n=0; n<nVar;
e620: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 n++){. p->a
e630: 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d Var[n].flags = M
e640: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 EM_Null;. p
e650: 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 ->aVar[n].db = d
e660: 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 b;. }. }. p
e670: 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 ->nzVar = pParse
e680: 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e 61 7a ->nzVar;. p->az
e690: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 7a Var = pParse->az
e6a0: 56 61 72 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e Var;. pParse->n
e6b0: 7a 56 61 72 20 3d 20 20 30 3b 0a 20 20 70 50 61 zVar = 0;. pPa
e6c0: 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 30 3b 0a rse->azVar = 0;.
e6d0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b if( p->aMem ){
e6e0: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 . p->aMem--;
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e700: 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 /* aMem[] g
e710: 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d oes from 1..nMem
e720: 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 */. p->nMem
e730: 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 = nMem;
e740: 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 /*
e750: 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 not from 0..nMe
e760: 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e m-1 */. for(n
e770: 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b =1; n<=nMem; n++
e780: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d ){. p->aMem
e790: 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f [n].flags = MEM_
e7a0: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 Undefined;.
e7b0: 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d p->aMem[n].db =
e7c0: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 db;. }. }.
e7d0: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 p->explain = pP
e7e0: 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 arse->explain;.
e7f0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 sqlite3VdbeRewi
e800: 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 nd(p);.}../*.**
e810: 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 Close a VDBE cur
e820: 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 sor and release
e830: 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 all the resource
e840: 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a s that cursor .*
e850: 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c * happens to hol
e860: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 d..*/.void sqlit
e870: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 e3VdbeFreeCursor
e880: 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 (Vdbe *p, VdbeCu
e890: 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 rsor *pCx){. if
e8a0: 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 ( pCx==0 ){.
e8b0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 return;. }. as
e8c0: 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74 3d 3d sert( pCx->pBt==
e8d0: 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 0 || pCx->eCurTy
e8e0: 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 pe==CURTYPE_BTRE
e8f0: 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 E );. switch( p
e900: 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a Cx->eCurType ){.
e910: 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 case CURTYPE
e920: 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 _SORTER: {.
e930: 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 sqlite3VdbeSort
e940: 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 erClose(p->db, p
e950: 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b Cx);. break
e960: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
e970: 20 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 CURTYPE_BTREE:
e980: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d {. if( pCx-
e990: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 >pBt ){.
e9a0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 sqlite3BtreeClos
e9b0: 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 e(pCx->pBt);.
e9c0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d /* The pCx-
e9d0: 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 >pCursor will be
e9e0: 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 close automatic
e9f0: 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 ally, if it exis
ea00: 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a ts, by. *
ea10: 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 * the call above
ea20: 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 . */. }else
ea30: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 {. assert
ea40: 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f ( pCx->uc.pCurso
ea50: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 r!=0 );.
ea60: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 sqlite3BtreeClos
ea70: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e eCursor(pCx->uc.
ea80: 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 pCursor);.
ea90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 }. break;.
eaa0: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c }.#ifndef SQL
eab0: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c ITE_OMIT_VIRTUAL
eac0: 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 TABLE. case C
ead0: 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 URTYPE_VTAB: {.
eae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 sqlite3_vta
eaf0: 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 b_cursor *pVCur
eb00: 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b = pCx->uc.pVCur;
eb10: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c . const sql
eb20: 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f ite3_module *pMo
eb30: 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 dule = pVCur->pV
eb40: 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 tab->pModule;.
eb50: 20 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75 assert( pVCu
eb60: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 r->pVtab->nRef>0
eb70: 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d );. pVCur-
eb80: 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a >pVtab->nRef--;.
eb90: 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 pModule->x
eba0: 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 Close(pVCur);.
ebb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
ebc0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f .#endif. }.}../
ebd0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 *.** Close all c
ebe0: 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 ursors in the cu
ebf0: 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a rrent frame..*/.
ec00: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 static void clos
ec10: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 eCursorsInFrame(
ec20: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 Vdbe *p){. if(
ec30: 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 p->apCsr ){.
ec40: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 int i;. for(i
ec50: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 =0; i<p->nCursor
ec60: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 ; i++){. Vd
ec70: 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 beCursor *pC = p
ec80: 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 ->apCsr[i];.
ec90: 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 if( pC ){.
eca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 sqlite3VdbeF
ecb0: 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 reeCursor(p, pC)
ecc0: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 ;. p->apC
ecd0: 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 sr[i] = 0;.
ece0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a }. }. }.}..
ecf0: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 /*.** Copy the v
ed00: 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 alues stored in
ed10: 74 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 the VdbeFrame st
ed20: 72 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 ructure to its V
ed30: 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 dbe. This.** is
ed40: 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c used, for exampl
ed50: 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 e, when a trigge
ed60: 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 r sub-program is
ed70: 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f halted to resto
ed80: 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f re.** control to
ed90: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 the main progra
eda0: 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 m..*/.int sqlite
edb0: 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 3VdbeFrameRestor
edc0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 e(VdbeFrame *pFr
edd0: 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 ame){. Vdbe *v
ede0: 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 = pFrame->v;. c
edf0: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 loseCursorsInFra
ee00: 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 me(v);.#ifdef SQ
ee10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 LITE_ENABLE_STMT
ee20: 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d _SCANSTATUS. v-
ee30: 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 >anExec = pFrame
ee40: 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 ->anExec;.#endif
ee50: 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 . v->aOnceFlag
ee60: 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 = pFrame->aOnceF
ee70: 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 lag;. v->nOnceF
ee80: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f lag = pFrame->nO
ee90: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f nceFlag;. v->aO
eea0: 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b p = pFrame->aOp;
eeb0: 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 . v->nOp = pFra
eec0: 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d me->nOp;. v->aM
eed0: 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 em = pFrame->aMe
eee0: 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 m;. v->nMem = p
eef0: 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 Frame->nMem;. v
ef00: 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 ->apCsr = pFrame
ef10: 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 ->apCsr;. v->nC
ef20: 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e ursor = pFrame->
ef30: 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 nCursor;. v->db
ef40: 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 ->lastRowid = pF
ef50: 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b rame->lastRowid;
ef60: 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 . v->nChange =
ef70: 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b pFrame->nChange;
ef80: 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 . v->db->nChang
ef90: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 e = pFrame->nDbC
efa0: 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 hange;. return
efb0: 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f pFrame->pc;.}../
efc0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 *.** Close all c
efd0: 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c ursors..**.** Al
efe0: 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 so release any d
eff0: 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 ynamic memory he
f000: 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 ld by the VM in
f010: 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 the Vdbe.aMem me
f020: 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 mory .** cell ar
f030: 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 ray. This is nec
f040: 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 essary as the me
f050: 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 mory cell array
f060: 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 may contain.** p
f070: 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 ointers to VdbeF
f080: 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 rame objects, wh
f090: 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 ich may in turn
f0a0: 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 contain pointers
f0b0: 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 to.** open curs
f0c0: 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 ors..*/.static v
f0d0: 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 oid closeAllCurs
f0e0: 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ors(Vdbe *p){.
f0f0: 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b if( p->pFrame ){
f100: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a . VdbeFrame *
f110: 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 pFrame;. for(
f120: 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 pFrame=p->pFrame
f130: 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e ; pFrame->pParen
f140: 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 t; pFrame=pFrame
f150: 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 ->pParent);.
f160: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 sqlite3VdbeFrame
f170: 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b Restore(pFrame);
f180: 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d . p->pFrame =
f190: 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 0;. p->nFram
f1a0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 e = 0;. }. ass
f1b0: 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d ert( p->nFrame==
f1c0: 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 0 );. closeCurs
f1d0: 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 orsInFrame(p);.
f1e0: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a if( p->aMem ){.
f1f0: 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 releaseMemAr
f200: 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c ray(&p->aMem[1],
f210: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 p->nMem);. }.
f220: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 while( p->pDelF
f230: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 rame ){. Vdbe
f240: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d Frame *pDel = p-
f250: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 >pDelFrame;.
f260: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 p->pDelFrame = p
f270: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 Del->pParent;.
f280: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 sqlite3VdbeFra
f290: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a meDelete(pDel);.
f2a0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 }.. /* Delete
f2b0: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c any auxdata all
f2c0: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 ocations made by
f2d0: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 the VM */. if(
f2e0: 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 p->pAuxData ) s
f2f0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
f300: 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 AuxData(p, -1, 0
f310: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
f320: 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d pAuxData==0 );.}
f330: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 ../*.** Clean up
f340: 20 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 the VM after a
f350: 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 single run..*/.s
f360: 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e tatic void Clean
f370: 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 up(Vdbe *p){. s
f380: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e qlite3 *db = p->
f390: 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 db;..#ifdef SQLI
f3a0: 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 TE_DEBUG. /* Ex
f3b0: 65 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 ecute assert() s
f3c0: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 tatements to ens
f3d0: 75 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 ure that the Vdb
f3e0: 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 e.apCsr[] and .
f3f0: 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 ** Vdbe.aMem[]
f400: 61 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 arrays have alre
f410: 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 ady been cleaned
f420: 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 up. */. int i
f430: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 ;. if( p->apCsr
f440: 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d ) for(i=0; i<p-
f450: 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 >nCursor; i++) a
f460: 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b ssert( p->apCsr[
f470: 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 i]==0 );. if( p
f480: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f ->aMem ){. fo
f490: 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 r(i=1; i<=p->nMe
f4a0: 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 m; i++) assert(
f4b0: 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 p->aMem[i].flags
f4c0: 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 ==MEM_Undefined
f4d0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 );. }.#endif..
f4e0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
f4f0: 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a b, p->zErrMsg);.
f500: 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 p->zErrMsg = 0
f510: 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 ;. p->pResultSe
f520: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 t = 0;.}../*.**
f530: 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f Set the number o
f540: 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 f result columns
f550: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 that will be re
f560: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 turned by this S
f570: 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e QL.** statement.
f580: 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 This is now set
f590: 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 at compile time
f5a0: 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 , rather than du
f5b0: 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f ring.** executio
f5c0: 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 n of the vdbe pr
f5d0: 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 ogram so that sq
f5e0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 lite3_column_cou
f5f0: 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 nt() can.** be c
f600: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 alled on an SQL
f610: 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 statement before
f620: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e sqlite3_step().
f630: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
f640: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 VdbeSetNumCols(V
f650: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 dbe *p, int nRes
f660: 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a Column){. Mem *
f670: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 pColName;. int
f680: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 n;. sqlite3 *db
f690: 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c = p->db;.. rel
f6a0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e easeMemArray(p->
f6b0: 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 aColName, p->nRe
f6c0: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f sColumn*COLNAME_
f6d0: 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 N);. sqlite3DbF
f6e0: 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e ree(db, p->aColN
f6f0: 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 ame);. n = nRes
f700: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e Column*COLNAME_N
f710: 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d ;. p->nResColum
f720: 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c n = (u16)nResCol
f730: 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 umn;. p->aColNa
f740: 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 me = pColName =
f750: 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d (Mem*)sqlite3DbM
f760: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 allocZero(db, si
f770: 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 zeof(Mem)*n );.
f780: 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 if( p->aColName
f790: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 ==0 ) return;.
f7a0: 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 while( n-- > 0 )
f7b0: 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e {. pColName->
f7c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c flags = MEM_Null
f7d0: 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e ;. pColName->
f7e0: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 db = p->db;.
f7f0: 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a pColName++;. }.
f800: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 }../*.** Set the
f810: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 name of the idx
f820: 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 'th column to be
f830: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 returned by the
f840: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a SQL statement..
f850: 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 ** zName must be
f860: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 a pointer to a
f870: 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 nul terminated s
f880: 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 tring..**.** Thi
f890: 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d s call must be m
f8a0: 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c ade after a call
f8b0: 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 to sqlite3VdbeS
f8c0: 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a etNumCols()..**.
f8d0: 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 ** The final par
f8e0: 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 ameter, xDel, mu
f8f0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c st be one of SQL
f900: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c ITE_DYNAMIC, SQL
f910: 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 ITE_STATIC.** or
f920: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e SQLITE_TRANSIEN
f930: 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 T. If it is SQLI
f940: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e TE_DYNAMIC, then
f950: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e the buffer poin
f960: 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 ted.** to by zNa
f970: 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 me will be freed
f980: 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 by sqlite3DbFre
f990: 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 e() when the vdb
f9a0: 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a e is destroyed..
f9b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
f9c0: 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 beSetColName(.
f9d0: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 Vdbe *p,
f9e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f9f0: 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 /* Vdbe being c
fa00: 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 onfigured */. i
fa10: 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 nt idx,
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
fa30: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 /* Index of colu
fa40: 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 mn zName applies
fa50: 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 to */. int var
fa60: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
fa70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 /* One
fa80: 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f of the COLNAME_
fa90: 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 * constants */.
faa0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 const char *zNa
fab0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 me,
fac0: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 /* Pointer to
fad0: 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e buffer containin
fae0: 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 g name */. void
faf0: 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 (*xDel)(void*)
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
fb10: 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e Memory managemen
fb20: 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a t strategy for z
fb30: 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 Name */.){. int
fb40: 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c rc;. Mem *pCol
fb50: 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 Name;. assert(
fb60: 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d idx<p->nResColum
fb70: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 n );. assert( v
fb80: 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a ar<COLNAME_N );.
fb90: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c if( p->db->mal
fba0: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 locFailed ){.
fbb0: 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 assert( !zName
fbc0: 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f || xDel!=SQLITE_
fbd0: 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 DYNAMIC );. r
fbe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d eturn SQLITE_NOM
fbf0: 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 EM;. }. assert
fc00: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 ( p->aColName!=0
fc10: 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d );. pColName =
fc20: 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 &(p->aColName[i
fc30: 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f dx+var*p->nResCo
fc40: 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 lumn]);. rc = s
fc50: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 qlite3VdbeMemSet
fc60: 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e Str(pColName, zN
fc70: 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f ame, -1, SQLITE_
fc80: 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 UTF8, xDel);. a
fc90: 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 ssert( rc!=0 ||
fca0: 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e !zName || (pColN
fcb0: 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 ame->flags&MEM_T
fcc0: 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 erm)!=0 );. ret
fcd0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a urn rc;.}../*.**
fce0: 20 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 A read or write
fcf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 transaction may
fd00: 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 or may not be a
fd10: 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 ctive on databas
fd20: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 e handle.** db.
fd30: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e If a transaction
fd40: 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d is active, comm
fd50: 69 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 it it. If there
fd60: 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 is a.** write-tr
fd70: 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 ansaction spanni
fd80: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 ng more than one
fd90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 database file,
fda0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 this routine.**
fdb0: 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 takes care of th
fdc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c e master journal
fdd0: 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 trickery..*/.st
fde0: 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d atic int vdbeCom
fdf0: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c mit(sqlite3 *db,
fe00: 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 Vdbe *p){. int
fe10: 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 i;. int nTrans
fe20: 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 = 0; /* Number
fe30: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 of databases wi
fe40: 74 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 th an active wri
fe50: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a te-transaction *
fe60: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c /. int rc = SQL
fe70: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 ITE_OK;. int ne
fe80: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a edXcommit = 0;..
fe90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d #ifdef SQLITE_OM
fea0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
feb0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f /* With this o
fec0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 ption, sqlite3Vt
fed0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 abSync() is defi
fee0: 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 ned to be simply
fef0: 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b . ** SQLITE_OK
ff00: 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 so p is not use
ff10: 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 d. . */. UNUSE
ff20: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a D_PARAMETER(p);.
ff30: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 #endif.. /* Bef
ff40: 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 ore doing anythi
ff50: 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 ng else, call th
ff60: 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 e xSync() callba
ff70: 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 ck for any. **
ff80: 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 virtual module t
ff90: 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e ables written in
ffa0: 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f this transactio
ffb0: 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 n. This has to.
ffc0: 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f ** be done befo
ffd0: 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 re determining w
ffe0: 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 hether a master
fff0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 journal file is
10000 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 . ** required,
10010 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 as an xSync() ca
10020 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 llback may add a
10030 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 n attached datab
10040 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 ase. ** to the
10050 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a transaction.. *
10060 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 /. rc = sqlite3
10070 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b VtabSync(db, p);
10080 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 .. /* This loop
10090 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 determines (a)
100a0 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f if the commit ho
100b0 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 ok should be inv
100c0 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 oked and. ** (b
100d0 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 ) how many datab
100e0 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f ase files have o
100f0 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 pen write transa
10100 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a ctions, not . *
10110 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 * including the
10120 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 temp database. (
10130 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 b) is important
10140 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 because if more
10150 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 than . ** one d
10160 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 atabase file has
10170 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 an open write t
10180 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 ransaction, a ma
10190 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a ster journal. *
101a0 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 * file is requir
101b0 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 ed for an atomic
101c0 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 commit.. */ .
101d0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 for(i=0; rc==SQ
101e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d LITE_OK && i<db-
101f0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 >nDb; i++){ .
10200 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 Btree *pBt = db
10210 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 ->aDb[i].pBt;.
10220 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 if( sqlite3Btr
10230 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 eeIsInTrans(pBt)
10240 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 ){. needXc
10250 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 ommit = 1;.
10260 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 if( i!=1 ) nTra
10270 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 ns++;. sqli
10280 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 te3BtreeEnter(pB
10290 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 t);. rc = s
102a0 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 qlite3PagerExclu
102b0 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65 33 siveLock(sqlite3
102c0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 29 BtreePager(pBt))
102d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 ;. sqlite3B
102e0 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a treeLeave(pBt);.
102f0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 }. }. if(
10300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc!=SQLITE_OK ){
10310 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a . return rc;.
10320 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 }.. /* If the
10330 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 re are any write
10340 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 -transactions at
10350 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 all, invoke the
10360 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a commit hook */.
10370 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 if( needXcommi
10380 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 t && db->xCommit
10390 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 Callback ){.
103a0 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 rc = db->xCommit
103b0 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f Callback(db->pCo
103c0 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 mmitArg);. if
103d0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 ( rc ){. re
103e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 turn SQLITE_CONS
103f0 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f TRAINT_COMMITHOO
10400 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 K;. }. }..
10410 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 /* The simple ca
10420 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 se - no more tha
10430 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 n one database f
10440 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e ile (not countin
10450 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 g the. ** TEMP
10460 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 database) has a
10470 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 transaction acti
10480 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e ve. There is n
10490 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 o need for the.
104a0 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e ** master-journ
104b0 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 al.. **. ** If
104c0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 the return valu
104d0 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 e of sqlite3Btre
104e0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 eGetFilename() i
104f0 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a s a zero length.
10500 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 ** string, it
10510 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 means the main d
10520 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f atabase is :memo
10530 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 ry: or a temp fi
10540 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 le. In . ** th
10550 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f at case we do no
10560 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 t support atomic
10570 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d multi-file comm
10580 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 its, so use the
10590 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 . ** simple cas
105a0 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f e then too.. */
105b0 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 . if( 0==sqlite
105c0 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 3Strlen30(sqlite
105d0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 3BtreeGetFilenam
105e0 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 e(db->aDb[0].pBt
105f0 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c )). || nTrans<
10600 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 =1. ){. for(
10610 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f i=0; rc==SQLITE_
10620 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b OK && i<db->nDb;
10630 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 i++){. Btr
10640 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
10650 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 b[i].pBt;.
10660 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 if( pBt ){.
10670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 rc = sqlite3B
10680 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f treeCommitPhaseO
10690 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 ne(pBt, 0);.
106a0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
106b0 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 * Do the commit
106c0 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 only if all data
106d0 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c bases successful
106e0 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 ly complete phas
106f0 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 e 1. . ** If
10700 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 one of the Btree
10710 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 CommitPhaseOne()
10720 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 calls fails, th
10730 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a is indicates an.
10740 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 ** IO error
10750 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f while deleting o
10760 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a r truncating a j
10770 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 ournal file. It
10780 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 is unlikely,.
10790 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 ** but could ha
107a0 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 ppen. In this ca
107b0 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 se abandon proce
107c0 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e ssing and return
107d0 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 the error..
107e0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 */. for(i=0;
107f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
10800 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 i<db->nDb; i++)
10810 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 {. Btree *p
10820 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e Bt = db->aDb[i].
10830 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 pBt;. if( p
10840 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 Bt ){. rc
10850 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 = sqlite3BtreeC
10860 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 ommitPhaseTwo(pB
10870 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 t, 0);. }.
10880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d }. if( rc=
10890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 =SQLITE_OK ){.
108a0 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 sqlite3VtabC
108b0 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d ommit(db);. }
108c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 . }.. /* The c
108d0 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 omplex case - Th
108e0 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 ere is a multi-f
108f0 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 ile write-transa
10900 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 ction active..
10910 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 ** This requires
10920 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 a master journa
10930 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 l file to ensure
10940 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
10950 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 is. ** committ
10960 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 ed atomically..
10970 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 */.#ifndef SQLI
10980 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 TE_OMIT_DISKIO.
10990 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 else{. sqlit
109a0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 e3_vfs *pVfs = d
109b0 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e 74 b->pVfs;. int
109c0 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 needSync = 0;.
109d0 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 char *zMaster
109e0 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d = 0; /* File-
109f0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61 73 name for the mas
10a00 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 ter journal */.
10a10 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a char const *z
10a20 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 MainFile = sqlit
10a30 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 e3BtreeGetFilena
10a40 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 me(db->aDb[0].pB
10a50 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f t);. sqlite3_
10a60 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 file *pMaster =
10a70 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 0;. i64 offse
10a80 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 t = 0;. int r
10a90 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 72 es;. int retr
10aa0 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 yCount = 0;.
10ab0 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a int nMainFile;..
10ac0 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 /* Select a
10ad0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 master journal f
10ae0 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 ile name */.
10af0 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 nMainFile = sqli
10b00 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 te3Strlen30(zMai
10b10 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 nFile);. zMas
10b20 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 ter = sqlite3MPr
10b30 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 intf(db, "%s-mjX
10b40 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 XXXXX9XXz", zMai
10b50 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 nFile);. if(
10b60 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65 74 zMaster==0 ) ret
10b70 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d urn SQLITE_NOMEM
10b80 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 ;. do {.
10b90 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 u32 iRandom;.
10ba0 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 if( retryCou
10bb0 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 nt ){. if
10bc0 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 ( retryCount>100
10bd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
10be0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 lite3_log(SQLITE
10bf0 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 _FULL, "MJ delet
10c00 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 e: %s", zMaster)
10c10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 ;. sqli
10c20 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 te3OsDelete(pVfs
10c30 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 , zMaster, 0);.
10c40 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
10c50 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 }else if
10c60 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 ( retryCount==1
10c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c ){. sql
10c80 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f ite3_log(SQLITE_
10c90 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 FULL, "MJ collid
10ca0 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 e: %s", zMaster)
10cb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
10cc0 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 }. retryC
10cd0 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 ount++;. sq
10ce0 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 lite3_randomness
10cf0 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 (sizeof(iRandom)
10d00 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 , &iRandom);.
10d10 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
10d20 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 ntf(13, &zMaster
10d30 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d [nMainFile], "-m
10d40 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 j%06X9%02X",.
10d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10d60 20 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 (iRa
10d70 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 ndom>>8)&0xfffff
10d80 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 f, iRandom&0xff)
10d90 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 ;. /* The a
10da0 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 ntipenultimate c
10db0 68 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 haracter of the
10dc0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e master journal n
10dd0 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a ame must. *
10de0 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 * be "9" to avoi
10df0 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e d name collision
10e00 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 s when using 8+3
10e10 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 filenames. */.
10e20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 assert( zMa
10e30 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c ster[sqlite3Strl
10e40 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d en30(zMaster)-3]
10e50 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 =='9' );. s
10e60 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 qlite3FileSuffix
10e70 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 3(zMainFile, zMa
10e80 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 ster);. rc
10e90 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 = sqlite3OsAcces
10ea0 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c s(pVfs, zMaster,
10eb0 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 SQLITE_ACCESS_E
10ec0 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 XISTS, &res);.
10ed0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 }while( rc==SQ
10ee0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 LITE_OK && res )
10ef0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 ;. if( rc==SQ
10f00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
10f10 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 /* Open the mas
10f20 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a ter journal. */.
10f30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 rc = sqlit
10f40 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 e3OsOpenMalloc(p
10f50 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 Vfs, zMaster, &p
10f60 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 Master, .
10f70 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 SQLITE_OPEN_R
10f80 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f EADWRITE|SQLITE_
10f90 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 OPEN_CREATE|.
10fa0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 SQLITE_OP
10fb0 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c EN_EXCLUSIVE|SQL
10fc0 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f ITE_OPEN_MASTER_
10fd0 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 JOURNAL, 0.
10fe0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 );. }. if
10ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
11000 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
11010 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 DbFree(db, zMast
11020 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 er);. retur
11030 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 n rc;. }. .
11040 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e /* Write the n
11050 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 ame of each data
11060 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 base file in the
11070 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 transaction int
11080 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a o the new. **
11090 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
110a0 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f file. If an erro
110b0 72 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 r occurs at this
110c0 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 point close.
110d0 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 ** and delete t
110e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 he master journa
110f0 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 l file. All the
11100 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e individual journ
11110 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 al files. **
11120 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c still have 'null
11130 27 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 ' as the master
11140 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c journal pointer,
11150 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f so they will ro
11160 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 ll. ** back i
11170 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 ndependently if
11180 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 a failure occurs
11190 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 .. */. for
111a0 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b (i=0; i<db->nDb;
111b0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 i++){. Btr
111c0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 ee *pBt = db->aD
111d0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 b[i].pBt;.
111e0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 if( sqlite3Btree
111f0 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 IsInTrans(pBt) )
11200 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 {. char c
11210 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 onst *zFile = sq
11220 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 lite3BtreeGetJou
11230 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 rnalname(pBt);.
11240 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 if( zFile
11250 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
11260 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 continue; /* I
11270 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a gnore TEMP and :
11280 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 memory: database
11290 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 s */. }.
112a0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a assert( z
112b0 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 File[0]!=0 );.
112c0 20 20 20 20 20 20 69 66 28 20 21 6e 65 65 64 53 if( !needS
112d0 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65 33 42 ync && !sqlite3B
112e0 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 treeSyncDisabled
112f0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 (pBt) ){.
11300 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b needSync = 1;
11310 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
11320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f rc = sqlite3O
11330 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20 sWrite(pMaster,
11340 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 zFile, sqlite3St
11350 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c rlen30(zFile)+1,
11360 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 offset);.
11370 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 offset += sqli
11380 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c te3Strlen30(zFil
11390 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66 e)+1;. if
113a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
113b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c ){. sql
113c0 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 ite3OsCloseFree(
113d0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 pMaster);.
113e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c sqlite3OsDel
113f0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 ete(pVfs, zMaste
11400 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 r, 0);.
11410 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
11420 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 b, zMaster);.
11430 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 return rc
11440 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
11450 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f }. }.. /
11460 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65 * Sync the maste
11470 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 r journal file.
11480 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 If the IOCAP_SEQ
11490 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20 UENTIAL device.
114a0 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 ** flag is se
114b0 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65 t this is not re
114c0 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 quired.. */.
114d0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 if( needSync
114e0 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73 71 6c . && 0==(sql
114f0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 ite3OsDeviceChar
11500 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 acteristics(pMas
11510 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 ter)&SQLITE_IOCA
11520 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 P_SEQUENTIAL).
11530 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 && SQLITE_OK!
11540 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 =(rc = sqlite3Os
11550 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 Sync(pMaster, SQ
11560 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c LITE_SYNC_NORMAL
11570 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 )). ){.
11580 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 sqlite3OsCloseFr
11590 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 ee(pMaster);.
115a0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 sqlite3OsDele
115b0 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 te(pVfs, zMaster
115c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 , 0);. sqli
115d0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d te3DbFree(db, zM
115e0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 aster);. re
115f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a turn rc;. }..
11600 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 /* Sync all
11610 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 the db files inv
11620 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 olved in the tra
11630 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 nsaction. The sa
11640 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 me call. ** s
11650 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a ets the master j
11660 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 ournal pointer i
11670 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 n each individua
11680 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 l journal. If.
11690 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 ** an error oc
116a0 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f curs here, do no
116b0 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 t delete the mas
116c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
116d0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 .. **. **
116e0 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 If the error occ
116f0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 urs during the f
11700 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 irst call to.
11710 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 ** sqlite3Btree
11720 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 CommitPhaseOne()
11730 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 , then there is
11740 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 a chance that th
11750 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 e. ** master
11760 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c journal file wil
11770 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 l be orphaned. B
11780 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c ut we cannot del
11790 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 ete it,. ** i
117a0 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 n case the maste
117b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e r journal file n
117c0 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 ame was written
117d0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c into the journal
117e0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 . ** file bef
117f0 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 ore the failure
11800 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f occurred.. */
11810 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 . for(i=0; rc
11820 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 ==SQLITE_OK && i
11830 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 <db->nDb; i++){
11840 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 . Btree *pB
11850 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 t = db->aDb[i].p
11860 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 Bt;. if( pB
11870 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 t ){. rc
11880 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f = sqlite3BtreeCo
11890 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 mmitPhaseOne(pBt
118a0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 , zMaster);.
118b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 }. }. sq
118c0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 lite3OsCloseFree
118d0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 (pMaster);. a
118e0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 ssert( rc!=SQLIT
118f0 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 E_BUSY );. if
11900 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc!=SQLITE_OK
11910 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 ){. sqlite3
11920 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 DbFree(db, zMast
11930 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 er);. retur
11940 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 n rc;. }..
11950 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d /* Delete the m
11960 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
11970 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 le. This commits
11980 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e the transaction
11990 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 . After. ** d
119a0 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 oing this the di
119b0 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 rectory is synce
119c0 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 d again before a
119d0 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 ny individual.
119e0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e ** transaction
119f0 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 files are delet
11a00 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 ed.. */. r
11a10 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c c = sqlite3OsDel
11a20 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 ete(pVfs, zMaste
11a30 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 r, needSync);.
11a40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
11a50 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 db, zMaster);.
11a60 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 zMaster = 0;.
11a70 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 if( rc ){.
11a80 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
11a90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 }.. /* All
11aa0 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74 files and direct
11ab0 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61 ories have alrea
11ac0 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20 dy been synced,
11ad0 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 so the following
11ae0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f . ** calls to
11af0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d sqlite3BtreeCom
11b00 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72 mitPhaseTwo() ar
11b10 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66 e only closing f
11b20 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 iles and. **
11b30 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e deleting or trun
11b40 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e cating journals.
11b50 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f If something go
11b60 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20 es wrong while.
11b70 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 ** this is ha
11b80 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74 ppening we don't
11b90 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68 really care. Th
11ba0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 e integrity of t
11bb0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 he. ** transa
11bc0 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 ction is already
11bd0 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74 guaranteed, but
11be0 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c some stray 'col
11bf0 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20 d' journals.
11c00 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20 ** may be lying
11c10 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e around. Returnin
11c20 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 g an error code
11c30 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65 won't help matte
11c40 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 rs.. */. d
11c50 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 isable_simulated
11c60 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 _io_errors();.
11c70 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 sqlite3BeginBe
11c80 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 nignMalloc();.
11c90 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d for(i=0; i<db-
11ca0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 >nDb; i++){ .
11cb0 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
11cc0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
11cd0 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b if( pBt ){
11ce0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
11cf0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 BtreeCommitPhase
11d00 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20 Two(pBt, 1);.
11d10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 }. }. s
11d20 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d qlite3EndBenignM
11d30 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61 alloc();. ena
11d40 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f ble_simulated_io
11d50 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20 _errors();..
11d60 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 sqlite3VtabCommi
11d70 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 t(db);. }.#endi
11d80 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a f.. return rc;.
11d90 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72 }../* .** This r
11da0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68 outine checks th
11db0 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e at the sqlite3.n
11dc0 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74 VdbeActive count
11dd0 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 variable.** mat
11de0 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 ches the number
11df0 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65 of vdbe's in the
11e00 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56 list sqlite3.pV
11e10 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20 dbe that are.**
11e20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65 currently active
11e30 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 . An assertion f
11e40 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20 ails if the two
11e50 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 counts do not ma
11e60 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 tch..** This is
11e70 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66 an internal self
11e80 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 -check only - it
11e90 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e is not an essen
11ea0 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a tial processing.
11eb0 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 ** step..**.** T
11ec0 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 his is a no-op i
11ed0 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69 f NDEBUG is defi
11ee0 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 ned..*/.#ifndef
11ef0 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f NDEBUG.static vo
11f00 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 id checkActiveVd
11f10 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 beCnt(sqlite3 *d
11f20 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 b){. Vdbe *p;.
11f30 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 int cnt = 0;.
11f40 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a int nWrite = 0;.
11f50 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b int nRead = 0;
11f60 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 . p = db->pVdbe
11f70 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a ;. while( p ){.
11f80 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f if( sqlite3_
11f90 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74 stmt_busy((sqlit
11fa0 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20 e3_stmt*)p) ){.
11fb0 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 cnt++;.
11fc0 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c if( p->readOnl
11fd0 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b y==0 ) nWrite++;
11fe0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49 . if( p->bI
11ff0 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b sReader ) nRead+
12000 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d +;. }. p =
12010 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 p->pNext;. }.
12020 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62 assert( cnt==db
12030 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b ->nVdbeActive );
12040 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74 . assert( nWrit
12050 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 e==db->nVdbeWrit
12060 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e e );. assert( n
12070 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 Read==db->nVdbeR
12080 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 ead );.}.#else.#
12090 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69 define checkActi
120a0 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e veVdbeCnt(x).#en
120b0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 dif../*.** If th
120c0 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 e Vdbe passed as
120d0 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d the first argum
120e0 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61 ent opened a sta
120f0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69 tement-transacti
12100 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20 on,.** close it
12110 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f now. Argument eO
12120 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 p must be either
12130 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 SAVEPOINT_ROLLB
12140 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f ACK or.** SAVEPO
12150 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20 INT_RELEASE. If
12160 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f it is SAVEPOINT_
12170 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74 ROLLBACK, then t
12180 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 he statement.**
12190 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 transaction is r
121a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65 olled back. If e
121b0 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f Op is SAVEPOINT_
121c0 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68 RELEASE, then th
121d0 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 e .** statement
121e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 transaction is c
121f0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 ommitted..**.**
12200 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f If an IO error o
12210 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45 ccurs, an SQLITE
12220 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72 _IOERR_XXX error
12230 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 code is returne
12240 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 d. .** Otherwise
12250 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 SQLITE_OK..*/.i
12260 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c nt sqlite3VdbeCl
12270 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62 oseStatement(Vdb
12280 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a e *p, int eOp){.
12290 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74 sqlite3 *const
122a0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 db = p->db;. i
122b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f nt rc = SQLITE_O
122c0 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69 K;.. /* If p->i
122d0 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65 Statement is gre
122e0 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 ater than zero,
122f0 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f then this Vdbe o
12300 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74 pened a . ** st
12310 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 atement transact
12320 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20 ion that should
12330 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20 be closed here.
12340 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69 The only excepti
12350 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20 on. ** is that
12360 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20 an IO error may
12370 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63 have occurred, c
12380 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65 ausing an emerge
12390 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 ncy rollback..
123a0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 ** In this case
123b0 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d (db->nStatement=
123c0 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69 =0), and there i
123d0 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e s nothing to do.
123e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e . */. if( db->
123f0 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d nStatement && p-
12400 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20 >iStatement ){.
12410 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f int i;. co
12420 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69 nst int iSavepoi
12430 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65 nt = p->iStateme
12440 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 nt-1;.. asser
12450 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e t( eOp==SAVEPOIN
12460 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f T_ROLLBACK || eO
12470 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c p==SAVEPOINT_REL
12480 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72 EASE);. asser
12490 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e t( db->nStatemen
124a0 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 t>0 );. asser
124b0 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 t( p->iStatement
124c0 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e ==(db->nStatemen
124d0 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 t+db->nSavepoint
124e0 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d ) );.. for(i=
124f0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 0; i<db->nDb; i+
12500 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72 +){ . int r
12510 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a c2 = SQLITE_OK;.
12520 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 Btree *pBt
12530 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 = db->aDb[i].pB
12540 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 t;. if( pBt
12550 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
12560 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 eOp==SAVEPOINT_R
12570 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 OLLBACK ){.
12580 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 rc2 = sqlit
12590 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 e3BtreeSavepoint
125a0 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f (pBt, SAVEPOINT_
125b0 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 ROLLBACK, iSavep
125c0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d oint);. }
125d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32 . if( rc2
125e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
125f0 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 rc2 = s
12600 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 qlite3BtreeSavep
12610 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f oint(pBt, SAVEPO
12620 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 INT_RELEASE, iSa
12630 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 vepoint);.
12640 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 }. if(
12650 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b rc==SQLITE_OK ){
12660 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
12670 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 rc2;. }.
12680 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
12690 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d db->nStatement-
126a0 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65 -;. p->iState
126b0 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 ment = 0;.. i
126c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b f( rc==SQLITE_OK
126d0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f ){. if( eO
126e0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c p==SAVEPOINT_ROL
126f0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 LBACK ){.
12700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 rc = sqlite3Vta
12710 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 bSavepoint(db, S
12720 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
12730 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a K, iSavepoint);.
12740 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 }. if
12750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ( rc==SQLITE_OK
12760 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
12770 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 sqlite3VtabSavep
12780 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 oint(db, SAVEPOI
12790 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76 NT_RELEASE, iSav
127a0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d epoint);. }
127b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 . }.. /* I
127c0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 f the statement
127d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62 transaction is b
127e0 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b eing rolled back
127f0 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74 , also restore t
12800 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 he . ** datab
12810 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65 ase handles defe
12820 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 rred constraint
12830 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76 counter to the v
12840 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e alue it had when
12850 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 . ** the sta
12860 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 tement transacti
12870 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20 on was opened.
12880 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d */. if( eOp==
12890 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
128a0 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e CK ){. db->
128b0 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 nDeferredCons =
128c0 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b p->nStmtDefCons;
128d0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 . db->nDefe
128e0 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d rredImmCons = p-
128f0 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 >nStmtDefImmCons
12900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 ;. }. }. re
12910 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
12920 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
12930 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 is called when a
12940 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 transaction ope
12950 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62 ned by the datab
12960 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 ase .** handle a
12970 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
12980 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20 he VM passed as
12990 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 an argument is a
129a0 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63 bout to be .** c
129b0 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65 ommitted. If the
129c0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 re are outstandi
129d0 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 ng deferred fore
129e0 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 ign key constrai
129f0 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 nt.** violations
12a00 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f , return SQLITE_
12a10 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65 ERROR. Otherwise
12a20 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a , SQLITE_OK..**.
12a30 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 ** If there are
12a40 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76 outstanding FK v
12a50 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68 iolations and th
12a60 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 is function retu
12a70 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 rns .** SQLITE_E
12a80 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65 RROR, set the re
12a90 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74 sult of the VM t
12aa0 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 o SQLITE_CONSTRA
12ab0 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a INT_FOREIGNKEY.*
12ac0 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65 * and write an e
12ad0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 rror message to
12ae0 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20 it. Then return
12af0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f SQLITE_ERROR..*/
12b00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f .#ifndef SQLITE_
12b10 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 OMIT_FOREIGN_KEY
12b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
12b30 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c CheckFk(Vdbe *p,
12b40 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a int deferred){.
12b50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
12b60 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65 p->db;. if( (de
12b70 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e ferred && (db->n
12b80 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d DeferredCons+db-
12b90 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e >nDeferredImmCon
12ba0 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64 s)>0) . || (!d
12bb0 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46 eferred && p->nF
12bc0 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a kConstraint>0) .
12bd0 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d ){. p->rc =
12be0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
12bf0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 NT_FOREIGNKEY;.
12c00 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f p->errorActio
12c10 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 n = OE_Abort;.
12c20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 sqlite3VdbeErr
12c30 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b or(p, "FOREIGN K
12c40 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 EY constraint fa
12c50 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 iled");. retu
12c60 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b rn SQLITE_ERROR;
12c70 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 . }. return SQ
12c80 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 LITE_OK;.}.#endi
12c90 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f f../*.** This ro
12ca0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 utine is called
12cb0 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 the when a VDBE
12cc0 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 tries to halt.
12cd0 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 If the VDBE.** h
12ce0 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 as made changes
12cf0 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f and is in autoco
12d00 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 mmit mode, then
12d10 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 commit those.**
12d20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 changes. If a r
12d30 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 ollback is neede
12d40 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 d, then do the r
12d50 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 ollback..**.** T
12d60 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 his routine is t
12d70 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d he only way to m
12d80 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 ove the state of
12d90 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 a VM from.** SQ
12da0 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 LITE_MAGIC_RUN t
12db0 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 o SQLITE_MAGIC_H
12dc0 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d ALT. It is harm
12dd0 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 less to.** call
12de0 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 this on a VM tha
12df0 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 t is in the SQLI
12e00 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 TE_MAGIC_HALT st
12e10 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 ate..**.** Retur
12e20 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e n an error code.
12e30 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 If the commit
12e40 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 could not comple
12e50 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a te because of.**
12e60 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e lock contention
12e70 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f , return SQLITE_
12e80 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 BUSY. If SQLITE
12e90 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 _BUSY is returne
12ea0 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 d, it.** means t
12eb0 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 he close did not
12ec0 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 happen and need
12ed0 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 s to be repeated
12ee0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
12ef0 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 VdbeHalt(Vdbe *p
12f00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 ){. int rc;
12f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12f20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 /* Used to
12f30 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 store transient
12f40 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a return codes */.
12f50 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
12f60 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 p->db;.. /* Thi
12f70 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 s function conta
12f80 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 ins the logic th
12f90 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 at determines if
12fa0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a a statement or.
12fb0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e ** transaction
12fc0 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 will be committ
12fd0 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 ed or rolled bac
12fe0 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 k as a result of
12ff0 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 the. ** execut
13000 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 ion of this virt
13010 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 ual machine. .
13020 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f **. ** If any o
13030 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 f the following
13040 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 errors occur:.
13050 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 **. ** SQLI
13060 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 TE_NOMEM. **
13070 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 SQLITE_IOERR.
13080 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 ** SQLITE_F
13090 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c ULL. ** SQL
130a0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 ITE_INTERRUPT.
130b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 **. ** Then the
130c0 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 internal cache
130d0 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 might have been
130e0 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e left in an incon
130f0 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 sistent. ** sta
13100 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 te. We need to
13110 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 rollback the sta
13120 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 tement transacti
13130 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a on, if there is.
13140 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 ** one, or the
13150 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 complete transa
13160 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 ction if there i
13170 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 s no statement t
13180 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f ransaction.. */
13190 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c .. if( db->mall
131a0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 ocFailed ){.
131b0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e p->rc = SQLITE_N
131c0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 OMEM;. }. if(
131d0 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d p->aOnceFlag ) m
131e0 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c emset(p->aOnceFl
131f0 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 ag, 0, p->nOnceF
13200 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c lag);. closeAll
13210 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 Cursors(p);. if
13220 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 ( p->magic!=VDBE
13230 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 _MAGIC_RUN ){.
13240 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
13250 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 OK;. }. checkA
13260 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 ctiveVdbeCnt(db)
13270 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 ;.. /* No commi
13280 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 t or rollback ne
13290 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 eded if the prog
132a0 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 ram never starte
132b0 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a d or if the. **
132c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 SQL statement d
132d0 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 oes not read or
132e0 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65 write a database
132f0 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 file. */. if(
13300 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e p->pc>=0 && p->
13310 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 bIsReader ){.
13320 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 int mrc; /* P
13330 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 rimary error cod
13340 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a e from p->rc */.
13350 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 int eStateme
13360 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e ntOp = 0;. in
13370 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 t isSpecialError
13380 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ; /*
13390 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 Set to true if a
133a0 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 'special' error
133b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b */.. /* Lock
133c0 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 all btrees used
133d0 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e by the statemen
133e0 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 t */. sqlite3
133f0 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 VdbeEnter(p);..
13400 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 /* Check for
13410 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 one of the speci
13420 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 al errors */.
13430 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 mrc = p->rc & 0
13440 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 xff;. isSpeci
13450 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 alError = mrc==S
13460 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d QLITE_NOMEM || m
13470 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 rc==SQLITE_IOERR
13480 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
13490 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 || mrc==SQ
134a0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c LITE_INTERRUPT |
134b0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 | mrc==SQLITE_FU
134c0 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 LL;. if( isSp
134d0 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 ecialError ){.
134e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 /* If the qu
134f0 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c ery was read-onl
13500 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 y and the error
13510 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 code is SQLITE_I
13520 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 NTERRUPT, .
13530 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 ** no rollback
13540 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 is necessary. Ot
13550 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 herwise, at leas
13560 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 t a savepoint .
13570 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 ** transact
13580 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c ion must be roll
13590 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f ed back to resto
135a0 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 re the database
135b0 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 to a . ** c
135c0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e onsistent state.
135d0 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 . **.
135e0 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 ** Even if the s
135f0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 tatement is read
13600 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 -only, it is imp
13610 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 ortant to perfor
13620 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 m. ** a sta
13630 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 tement or transa
13640 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f ction rollback o
13650 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 peration. If the
13660 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a error . **
13670 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 occurred while
13680 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a writing to the j
13690 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 ournal, sub-jour
136a0 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a nal or database.
136b0 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 ** file as
136c0 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f part of an effo
136d0 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 rt to free up ca
136e0 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 che space (see f
136f0 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a unction. **
13700 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 pagerStress() i
13710 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 n pager.c), the
13720 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 rollback is requ
13730 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 ired to restore
13740 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 . ** the pa
13750 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 ger to a consist
13760 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 ent state..
13770 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 */. if( !p
13780 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 ->readOnly || mr
13790 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 c!=SQLITE_INTERR
137a0 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 UPT ){. i
137b0 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f f( (mrc==SQLITE_
137c0 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 NOMEM || mrc==SQ
137d0 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d LITE_FULL) && p-
137e0 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c >usesStmtJournal
137f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 ){. eS
13800 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 tatementOp = SAV
13810 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b EPOINT_ROLLBACK;
13820 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
13830 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 /* We
13840 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f are forced to ro
13850 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 ll back the acti
13860 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 ve transaction.
13870 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 Before doing.
13880 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 ** so, ab
13890 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 ort any other st
138a0 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 atements this ha
138b0 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 ndle currently h
138c0 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 as active..
138d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 */.
138e0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 sqlite3Rollbac
138f0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f kAll(db, SQLITE_
13900 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b ABORT_ROLLBACK);
13910 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
13920 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 e3CloseSavepoint
13930 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 s(db);.
13940 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 db->autoCommit
13950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 = 1;. p
13960 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 ->nChange = 0;.
13970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
13980 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
13990 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 heck for immedia
139a0 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 te foreign key v
139b0 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 iolations. */.
139c0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c if( p->rc==SQL
139d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
139e0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b sqlite3VdbeCheck
139f0 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a Fk(p, 0);. }.
13a00 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 . /* If the
13a10 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 auto-commit fla
13a20 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 g is set and thi
13a30 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 s is the only ac
13a40 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 tive writer .
13a50 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 ** VM, then we
13a60 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d do either a comm
13a70 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f it or rollback o
13a80 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 f the current tr
13a90 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 ansaction. .
13aa0 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 **. ** Note:
13ab0 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 This block also
13ac0 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 runs if one of t
13ad0 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 he special error
13ae0 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a s handled . *
13af0 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 * above has occu
13b00 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 rred. . */.
13b10 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 if( !sqlite3Vt
13b20 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 abInSync(db) .
13b30 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f && db->autoCo
13b40 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 mmit . && db
13b50 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 ->nVdbeWrite==(p
13b60 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a ->readOnly==0) .
13b70 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 ){. if(
13b80 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f p->rc==SQLITE_O
13b90 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 K || (p->errorAc
13ba0 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 tion==OE_Fail &&
13bb0 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 !isSpecialError
13bc0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 ) ){. rc
13bd0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 = sqlite3VdbeChe
13be0 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 ckFk(p, 1);.
13bf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 if( rc!=SQLI
13c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 TE_OK ){.
13c10 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e if( NEVER(p->
13c20 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 readOnly) ){.
13c30 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
13c40 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 VdbeLeave(p);.
13c50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
13c60 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 SQLITE_ERROR;.
13c70 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
13c80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 rc = SQLITE
13c90 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 _CONSTRAINT_FORE
13ca0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 IGNKEY;.
13cb0 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 }else{ .
13cc0 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f /* The auto-co
13cd0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 mmit flag is tru
13ce0 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 e, the vdbe prog
13cf0 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 ram was successf
13d00 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a ul . **
13d10 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 or hit an 'OR F
13d20 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 AIL' constraint
13d30 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f and there are no
13d40 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 deferred foreig
13d50 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b n. ** k
13d60 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 ey constraints t
13d70 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 o hold up the tr
13d80 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 ansaction. This
13d90 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a means a commit .
13da0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 ** is
13db0 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 required. */.
13dc0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 rc = vdbe
13dd0 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 Commit(db, p);.
13de0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
13df0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f if( rc==SQLITE_
13e00 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f BUSY && p->readO
13e10 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 nly ){.
13e20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 sqlite3VdbeLeav
13e30 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 e(p);.
13e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 return SQLITE_BU
13e50 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 SY;. }els
13e60 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 e if( rc!=SQLITE
13e70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 _OK ){.
13e80 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 p->rc = rc;.
13e90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f sqlite3Ro
13ea0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 llbackAll(db, SQ
13eb0 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 LITE_OK);.
13ec0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d p->nChange =
13ed0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 0;. }els
13ee0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d e{. db-
13ef0 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d >nDeferredCons =
13f00 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 0;. db
13f10 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f ->nDeferredImmCo
13f20 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 ns = 0;.
13f30 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e db->flags &= ~
13f40 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b SQLITE_DeferFKs;
13f50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
13f60 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c e3CommitInternal
13f70 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 Changes(db);.
13f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c }. }el
13f90 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 se{. sqli
13fa0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 te3RollbackAll(d
13fb0 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 b, SQLITE_OK);.
13fc0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 p->nChang
13fd0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 e = 0;. }.
13fe0 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d db->nStatem
13ff0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c ent = 0;. }el
14000 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e se if( eStatemen
14010 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 tOp==0 ){.
14020 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 if( p->rc==SQLIT
14030 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 E_OK || p->error
14040 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 Action==OE_Fail
14050 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 ){. eStat
14060 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f ementOp = SAVEPO
14070 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 INT_RELEASE;.
14080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e }else if( p->
14090 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f errorAction==OE_
140a0 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 Abort ){.
140b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 eStatementOp =
140c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
140d0 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b CK;. }else{
140e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
140f0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 RollbackAll(db,
14100 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c SQLITE_ABORT_ROL
14110 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 LBACK);.
14120 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 sqlite3CloseSave
14130 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 points(db);.
14140 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d db->autoComm
14150 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 it = 1;.
14160 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a p->nChange = 0;.
14170 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
14180 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 . /* If eStat
14190 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a ementOp is non-z
141a0 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 ero, then a stat
141b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
141c0 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a n needs to. *
141d0 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f * be committed o
141e0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 r rolled back. C
141f0 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 all sqlite3VdbeC
14200 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 loseStatement()
14210 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e to. ** do so.
14220 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 If this operati
14230 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 on returns an er
14240 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 ror, and the cur
14250 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 rent statement.
14260 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 ** error code
14270 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 is SQLITE_OK or
14280 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
14290 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 NT, then promote
142a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 the. ** curr
142b0 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 ent statement er
142c0 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f ror code.. */
142d0 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d . if( eStatem
142e0 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 entOp ){. r
142f0 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 c = sqlite3VdbeC
14300 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c loseStatement(p,
14310 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a eStatementOp);.
14320 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a if( rc ){.
14330 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 if( p->r
14340 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 c==SQLITE_OK ||
14350 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 (p->rc&0xff)==SQ
14360 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 LITE_CONSTRAINT
14370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e ){. p->
14380 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 rc = rc;.
14390 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
143a0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 (db, p->zErrMsg)
143b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a ;. p->z
143c0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 ErrMsg = 0;.
143d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 }. sq
143e0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c lite3RollbackAll
143f0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 (db, SQLITE_ABOR
14400 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 T_ROLLBACK);.
14410 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 sqlite3Clos
14420 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b eSavepoints(db);
14430 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 . db->aut
14440 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 oCommit = 1;.
14450 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 p->nChange
14460 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 0;. }.
14470 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 }. . /* If
14480 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 this was an INSE
14490 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 RT, UPDATE or DE
144a0 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 LETE and no stat
144b0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f ement transactio
144c0 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 n. ** has bee
144d0 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 n rolled back, u
144e0 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62 61 pdate the databa
144f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 se connection ch
14500 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 ange-counter. .
14510 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d */. if( p-
14520 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a >changeCntOn ){.
14530 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74 65 if( eState
14540 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e mentOp!=SAVEPOIN
14550 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 T_ROLLBACK ){.
14560 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
14570 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 eSetChanges(db,
14580 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 p->nChange);.
14590 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
145a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 sqlite3VdbeSet
145b0 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a Changes(db, 0);.
145c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d }. p-
145d0 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 >nChange = 0;.
145e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 }.. /* Rele
145f0 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f ase the locks */
14600 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 . sqlite3Vdbe
14610 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 Leave(p);. }..
14620 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 /* We have succ
14630 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 essfully halted
14640 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 and closed the V
14650 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 M. Record this
14660 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 fact. */. if( p
14670 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 ->pc>=0 ){. d
14680 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d b->nVdbeActive--
14690 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 ;. if( !p->re
146a0 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 adOnly ) db->nVd
146b0 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 beWrite--;. i
146c0 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 f( p->bIsReader
146d0 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d ) db->nVdbeRead-
146e0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 -;. assert( d
146f0 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d b->nVdbeActive>=
14700 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b db->nVdbeRead );
14710 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d . assert( db-
14720 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e >nVdbeRead>=db->
14730 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 nVdbeWrite );.
14740 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 assert( db->nV
14750 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 dbeWrite>=0 );.
14760 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 }. p->magic =
14770 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b VDBE_MAGIC_HALT;
14780 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 . checkActiveVd
14790 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 beCnt(db);. if(
147a0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 db->mallocFaile
147b0 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d d ){. p->rc =
147c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 SQLITE_NOMEM;.
147d0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 }.. /* If the
147e0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 auto-commit flag
147f0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c is set to true,
14800 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 then any locks
14810 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 that were held.
14820 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f ** by connectio
14830 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 n db have now be
14840 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c en released. Cal
14850 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 l sqlite3Connect
14860 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 ionUnlocked() .
14870 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e ** to invoke an
14880 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 y required unloc
14890 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 k-notify callbac
148a0 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 ks.. */. if( d
148b0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b b->autoCommit ){
148c0 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e . sqlite3Conn
148d0 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 ectionUnlocked(d
148e0 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 b);. }.. asser
148f0 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 t( db->nVdbeActi
14900 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f ve>0 || db->auto
14910 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d Commit==0 || db-
14920 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 >nStatement==0 )
14930 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 ;. return (p->r
14940 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f c==SQLITE_BUSY ?
14950 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 SQLITE_BUSY : S
14960 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f QLITE_OK);.}.../
14970 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 *.** Each VDBE h
14980 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 olds the result
14990 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 of the most rece
149a0 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 nt sqlite3_step(
149b0 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e ) call.** in p->
149c0 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e rc. This routin
149d0 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 e sets that resu
149e0 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 lt back to SQLIT
149f0 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 E_OK..*/.void sq
14a00 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 lite3VdbeResetSt
14a10 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 epResult(Vdbe *p
14a20 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c ){. p->rc = SQL
14a30 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a ITE_OK;.}../*.**
14a40 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 Copy the error
14a50 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d code and error m
14a60 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 essage belonging
14a70 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 to the VDBE pas
14a80 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 sed.** as the fi
14a90 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 rst argument to
14aa0 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e its database han
14ab0 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 dle (so that the
14ac0 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 y will be .** re
14ad0 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 turned by calls
14ae0 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f to sqlite3_errco
14af0 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 de() and sqlite3
14b00 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a _errmsg())..**.*
14b10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
14b20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 does not clear t
14b30 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f he VDBE error co
14b40 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a de or message, j
14b50 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 ust.** copies th
14b60 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 em to the databa
14b70 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e se handle..*/.in
14b80 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 t sqlite3VdbeTra
14b90 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 nsferError(Vdbe
14ba0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a *p){. sqlite3 *
14bb0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e db = p->db;. in
14bc0 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 t rc = p->rc;.
14bd0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 if( p->zErrMsg )
14be0 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 {. db->bBenig
14bf0 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 nMalloc++;. s
14c00 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 qlite3BeginBenig
14c10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 nMalloc();. i
14c20 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 f( db->pErr==0 )
14c30 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 db->pErr = sqli
14c40 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b te3ValueNew(db);
14c50 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 . sqlite3Valu
14c60 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 eSetStr(db->pErr
14c70 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 , -1, p->zErrMsg
14c80 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 , SQLITE_UTF8, S
14c90 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 QLITE_TRANSIENT)
14ca0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 ;. sqlite3End
14cb0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a BenignMalloc();.
14cc0 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d db->bBenignM
14cd0 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d alloc--;. db-
14ce0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 >errCode = rc;.
14cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 }else{. sqli
14d00 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 te3Error(db, rc)
14d10 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 ;. }. return r
14d20 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c c;.}..#ifdef SQL
14d30 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f ITE_ENABLE_SQLLO
14d40 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 G./*.** If an SQ
14d50 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c LITE_CONFIG_SQLL
14d60 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 OG hook is regis
14d70 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d tered and the VM
14d80 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a has been run, .
14d90 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f ** invoke it..*/
14da0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 .static void vdb
14db0 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 eInvokeSqllog(Vd
14dc0 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 be *v){. if( sq
14dd0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
14de0 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e g.xSqllog && v->
14df0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 rc==SQLITE_OK &&
14e00 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 v->zSql && v->p
14e10 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 c>=0 ){. char
14e20 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 *zExpanded = sq
14e30 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 lite3VdbeExpandS
14e40 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a ql(v, v->zSql);.
14e50 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 assert( v->d
14e60 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 b->init.busy==0
14e70 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 );. if( zExpa
14e80 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 nded ){. sq
14e90 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 lite3GlobalConfi
14ea0 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 g.xSqllog(.
14eb0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 sqlite3Glob
14ec0 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 alConfig.pSqllog
14ed0 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 Arg, v->db, zExp
14ee0 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 anded, 1. )
14ef0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 ;. sqlite3D
14f00 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 bFree(v->db, zEx
14f10 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 panded);. }.
14f20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 }.}.#else.# def
14f30 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 ine vdbeInvokeSq
14f40 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a llog(x).#endif..
14f50 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 /*.** Clean up a
14f60 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 VDBE after exec
14f70 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 ution but do not
14f80 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 delete the VDBE
14f90 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 just yet..** Wr
14fa0 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 ite any error me
14fb0 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 ssages into *pzE
14fc0 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 rrMsg. Return t
14fd0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a he result code..
14fe0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 **.** After this
14ff0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c routine is run,
15000 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 the VDBE should
15010 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 be ready to be
15020 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 executed.** agai
15030 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b n..**.** To look
15040 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 at it another w
15050 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 ay, this routine
15060 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 resets the stat
15070 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 e of the.** virt
15080 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d ual machine from
15090 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 VDBE_MAGIC_RUN
150a0 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 or VDBE_MAGIC_HA
150b0 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 LT back to.** VD
150c0 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a BE_MAGIC_INIT..*
150d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
150e0 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b eReset(Vdbe *p){
150f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a . sqlite3 *db;.
15100 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 db = p->db;..
15110 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 /* If the VM di
15120 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d d not run to com
15130 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 pletion or if it
15140 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a encountered an.
15150 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e ** error, then
15160 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 it might not ha
15170 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 ve been halted p
15180 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c roperly. So hal
15190 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 t. ** it now..
151a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 */. sqlite3Vdb
151b0 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 eHalt(p);.. /*
151c0 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 If the VDBE has
151d0 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 be run even part
151e0 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e ially, then tran
151f0 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 sfer the error c
15200 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 ode. ** and err
15210 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 or message from
15220 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 the VDBE into th
15230 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 e main database
15240 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a structure. But.
15250 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 ** if the VDBE
15260 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 has just been s
15270 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 et to run but ha
15280 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 s not actually e
15290 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a xecuted any. **
152a0 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 instructions ye
152b0 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 t, leave the mai
152c0 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 n database error
152d0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 information unc
152e0 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 hanged.. */. i
152f0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 f( p->pc>=0 ){.
15300 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c vdbeInvokeSql
15310 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 log(p);. sqli
15320 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 te3VdbeTransferE
15330 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c rror(p);. sql
15340 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
15350 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 ->zErrMsg);.
15360 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a p->zErrMsg = 0;.
15370 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e if( p->runOn
15380 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 lyOnce ) p->expi
15390 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 red = 1;. }else
153a0 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d if( p->rc && p-
153b0 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 >expired ){.
153c0 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 /* The expired f
153d0 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 lag was set on t
153e0 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 he VDBE before t
153f0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 he first call.
15400 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f ** to sqlite3_
15410 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 step(). For cons
15420 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 istency (since s
15430 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 qlite3_step() wa
15440 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 s. ** called)
15450 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 , set the databa
15460 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 se error in this
15470 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 case as well..
15480 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 */. sqlite
15490 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 3ErrorWithMsg(db
154a0 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 , p->rc, p->zErr
154b0 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 Msg ? "%s" : 0,
154c0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 p->zErrMsg);.
154d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
154e0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a b, p->zErrMsg);.
154f0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d p->zErrMsg =
15500 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 0;. }.. /* Re
15510 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 claim all memory
15520 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 used by the VDB
15530 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 E. */. Cleanup
15540 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 (p);.. /* Save
15550 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d profiling inform
15560 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 ation from this
15570 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 VDBE run.. */.#
15580 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 ifdef VDBE_PROFI
15590 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 LE. {. FILE
155a0 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 *out = fopen("vd
155b0 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c be_profile.out",
155c0 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f "a");. if( o
155d0 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 ut ){. int
155e0 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 i;. fprintf
155f0 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a (out, "---- ");.
15600 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 for(i=0; i
15610 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 <p->nOp; i++){.
15620 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f fprintf(o
15630 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 ut, "%02x", p->a
15640 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 Op[i].opcode);.
15650 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 }. fpr
15660 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b intf(out, "\n");
15670 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 . if( p->zS
15680 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 ql ){. ch
15690 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 ar c, pc = 0;.
156a0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 fprintf(ou
156b0 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 t, "-- ");.
156c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d for(i=0; (c =
156d0 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b p->zSql[i])!=0;
156e0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 i++){.
156f0 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 if( pc=='\n' )
15700 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d fprintf(out, "--
15710 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 ");. p
15720 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 utc(c, out);.
15730 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 pc = c;.
15740 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
15750 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 if( pc!='\n' )
15760 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e fprintf(out, "\n
15770 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ");. }.
15780 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e for(i=0; i<p->
15790 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 nOp; i++){.
157a0 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 char zHdr[100
157b0 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 ];. sqlit
157c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 e3_snprintf(size
157d0 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 of(zHdr), zHdr,
157e0 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c "%6u %12llu %8ll
157f0 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 u ",.
15800 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 p->aOp[i].cnt,.
15810 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 p->aOp
15820 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 [i].cycles,.
15830 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d p->aOp[i]
15840 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b .cnt>0 ? p->aOp[
15850 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 i].cycles/p->aOp
15860 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 [i].cnt : 0.
15870 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 );. f
15880 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 printf(out, "%s"
15890 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 , zHdr);.
158a0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e sqlite3VdbePrin
158b0 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e tOp(out, i, &p->
158c0 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d aOp[i]);. }
158d0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 . fclose(ou
158e0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 t);. }. }.#e
158f0 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 ndif. p->iCurre
15900 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d ntTime = 0;. p-
15910 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 >magic = VDBE_MA
15920 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 GIC_INIT;. retu
15930 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 rn p->rc & db->e
15940 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a rrMask;.}. ./*.*
15950 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 * Clean up and d
15960 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 elete a VDBE aft
15970 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 er execution. R
15980 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
15990 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 which is.** the
159a0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 result code. W
159b0 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d rite any error m
159c0 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f essage text into
159d0 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 *pzErrMsg..*/.i
159e0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 nt sqlite3VdbeFi
159f0 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b nalize(Vdbe *p){
15a00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
15a10 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e TE_OK;. if( p->
15a20 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 magic==VDBE_MAGI
15a30 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 C_RUN || p->magi
15a40 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 c==VDBE_MAGIC_HA
15a50 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 LT ){. rc = s
15a60 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 qlite3VdbeReset(
15a70 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 p);. assert(
15a80 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 (rc & p->db->err
15a90 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d Mask)==rc );. }
15aa0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 . sqlite3VdbeDe
15ab0 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 lete(p);. retur
15ac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 n rc;.}../*.** I
15ad0 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 f parameter iOp
15ae0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 is less than zer
15af0 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 o, then invoke t
15b00 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f he destructor fo
15b10 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 r.** all auxilia
15b20 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 ry data pointers
15b30 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 currently cache
15b40 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 d by the VM pass
15b50 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 ed as.** the fir
15b60 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a st argument..**.
15b70 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 ** Or, if iOp is
15b80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 greater than or
15b90 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 equal to zero,
15ba0 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 then the destruc
15bb0 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 tor is.** only i
15bc0 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 nvoked for those
15bd0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 auxiliary data
15be0 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 pointers created
15bf0 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a by the user .**
15c00 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 function invoke
15c10 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 d by the OP_Func
15c20 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 tion opcode at i
15c30 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f nstruction iOp o
15c40 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 f .** VM pVdbe,
15c50 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 and only then if
15c60 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 :.**.** * the
15c70 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 associated func
15c80 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 tion parameter i
15c90 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 s the 32nd or la
15ca0 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a ter (counting.**
15cb0 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 from left
15cc0 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a to right), or.**
15cd0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 .** * the cor
15ce0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 responding bit i
15cf0 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 n argument mask
15d00 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 is clear (where
15d10 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 the first.**
15d20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d function param
15d30 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 eter corresponds
15d40 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e to bit 0 etc.).
15d50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
15d60 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 VdbeDeleteAuxDat
15d70 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69 a(Vdbe *pVdbe, i
15d80 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b nt iOp, int mask
15d90 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70 ){. AuxData **p
15da0 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78 p = &pVdbe->pAux
15db0 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a Data;. while( *
15dc0 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 pp ){. AuxDat
15dd0 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 a *pAux = *pp;.
15de0 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 if( (iOp<0).
15df0 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f || (pAux->iO
15e00 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d p==iOp && (pAux-
15e10 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 >iArg>31 || !(ma
15e20 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 sk & MASKBIT32(p
15e30 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 Aux->iArg)))).
15e40 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 ){. testc
15e50 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d ase( pAux->iArg=
15e60 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 =31 );. if(
15e70 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 pAux->xDelete )
15e80 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e {. pAux->
15e90 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 xDelete(pAux->pA
15ea0 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 ux);. }.
15eb0 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 *pp = pAux->p
15ec0 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 Next;. sqli
15ed0 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d te3DbFree(pVdbe-
15ee0 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 >db, pAux);.
15ef0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d }else{. pp=
15f00 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 &pAux->pNext;.
15f10 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a }. }.}../*.*
15f20 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 * Free all memor
15f30 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 y associated wit
15f40 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 h the Vdbe passe
15f50 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 d as the second
15f60 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 argument,.** exc
15f70 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 ept for object i
15f80 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 tself, which is
15f90 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a preserved..**.**
15fa0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 The difference
15fb0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e between this fun
15fc0 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 ction and sqlite
15fd0 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 3VdbeDelete() is
15fe0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c that.** VdbeDel
15ff0 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e ete() also unlin
16000 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d ks the Vdbe from
16010 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 the list of VMs
16020 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
16030 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 .** the database
16040 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 connection and
16050 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 frees the object
16060 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 itself..*/.void
16070 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 sqlite3VdbeClea
16080 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 rObject(sqlite3
16090 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 *db, Vdbe *p){.
160a0 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 SubProgram *pSu
160b0 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 b, *pNext;. int
160c0 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d i;. assert( p-
160d0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d >db==0 || p->db=
160e0 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 =db );. release
160f0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 MemArray(p->aVar
16100 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 , p->nVar);. re
16110 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d leaseMemArray(p-
16120 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 >aColName, p->nR
16130 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 esColumn*COLNAME
16140 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d _N);. for(pSub=
16150 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 p->pProgram; pSu
16160 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a b; pSub=pNext){.
16170 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 pNext = pSub
16180 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 ->pNext;. vdb
16190 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c eFreeOpArray(db,
161a0 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 pSub->aOp, pSub
161b0 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 ->nOp);. sqli
161c0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 te3DbFree(db, pS
161d0 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 ub);. }. for(i
161e0 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d =p->nzVar-1; i>=
161f0 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 0; i--) sqlite3D
16200 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 bFree(db, p->azV
16210 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65 ar[i]);. sqlite
16220 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 3DbFree(db, p->a
16230 7a 56 61 72 29 3b 0a 20 20 76 64 62 65 46 72 65 zVar);. vdbeFre
16240 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e eOpArray(db, p->
16250 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 aOp, p->nOp);.
16260 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
16270 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a , p->aColName);.
16280 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
16290 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20 db, p->zSql);.
162a0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
162b0 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66 , p->pFree);.#if
162c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
162d0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 E_STMT_SCANSTATU
162e0 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 S. for(i=0; i<p
162f0 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20 ->nScan; i++){.
16300 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
16310 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d (db, p->aScan[i]
16320 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 .zName);. }. s
16330 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
16340 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64 p->aScan);.#end
16350 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 if.}../*.** Dele
16360 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42 te an entire VDB
16370 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 E..*/.void sqlit
16380 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62 e3VdbeDelete(Vdb
16390 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 e *p){. sqlite3
163a0 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56 *db;.. if( NEV
163b0 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72 ER(p==0) ) retur
163c0 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b n;. db = p->db;
163d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
163e0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 e3_mutex_held(db
163f0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 ->mutex) );. sq
16400 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 lite3VdbeClearOb
16410 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69 ject(db, p);. i
16420 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20 f( p->pPrev ){.
16430 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 p->pPrev->pNe
16440 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 xt = p->pNext;.
16450 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 }else{. asse
16460 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70 rt( db->pVdbe==p
16470 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62 );. db->pVdb
16480 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 e = p->pNext;.
16490 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 }. if( p->pNext
164a0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 ){. p->pNext
164b0 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72 ->pPrev = p->pPr
164c0 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 ev;. }. p->mag
164d0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f ic = VDBE_MAGIC_
164e0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 DEAD;. p->db =
164f0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 0;. sqlite3DbFr
16500 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a ee(db, p);.}../*
16510 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22 .** The cursor "
16520 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67 p" has a pending
16530 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20 seek operation
16540 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74 that has not yet
16550 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64 been.** carried
16560 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20 out. Seek the
16570 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20 cursor now. If
16580 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c an error occurs,
16590 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61 return.** the a
165a0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 ppropriate error
165b0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 code..*/.static
165c0 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e int SQLITE_NOIN
165d0 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72 LINE handleDefer
165e0 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 redMoveto(VdbeCu
165f0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 rsor *p){. int
16600 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20 res, rc;.#ifdef
16610 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78 SQLITE_TEST. ex
16620 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 tern int sqlite3
16630 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23 _search_count;.#
16640 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 endif. assert(
16650 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 p->deferredMovet
16660 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 o );. assert( p
16670 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61 ->isTable );. a
16680 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 ssert( p->eCurTy
16690 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 pe==CURTYPE_BTRE
166a0 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 E );. rc = sqli
166b0 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e te3BtreeMovetoUn
166c0 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75 packed(p->uc.pCu
166d0 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65 rsor, 0, p->move
166e0 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65 toTarget, 0, &re
166f0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 s);. if( rc ) r
16700 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 eturn rc;. if(
16710 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20 res!=0 ) return
16720 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 SQLITE_CORRUPT_B
16730 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 KPT;.#ifdef SQLI
16740 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 TE_TEST. sqlite
16750 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b 3_search_count++
16760 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65 ;.#endif. p->de
16770 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30 ferredMoveto = 0
16780 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74 ;. p->cacheStat
16790 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45 us = CACHE_STALE
167a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 ;. return SQLIT
167b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 E_OK;.}../*.** S
167c0 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76 omething has mov
167d0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75 ed cursor "p" ou
167e0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79 t of place. May
167f0 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61 be the row it wa
16800 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 s.** pointed to
16810 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 was deleted out
16820 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20 from under it.
16830 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72 Or maybe the btr
16840 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61 ee was.** rebala
16850 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20 nced. Whatever
16860 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74 the cause, try t
16870 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f o restore "p" to
16880 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a the place it.**
16890 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20 is supposed to
168a0 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66 be pointing. If
168b0 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c the row was del
168c0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e eted out from un
168d0 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f der the.** curso
168e0 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f r, set the curso
168f0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 r to point to a
16900 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 NULL row..*/.sta
16910 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e tic int SQLITE_N
16920 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f OINLINE handleMo
16930 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75 vedCursor(VdbeCu
16940 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 rsor *p){. int
16950 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20 isDifferentRow,
16960 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d rc;. assert( p-
16970 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 >eCurType==CURTY
16980 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73 PE_BTREE );. as
16990 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72 sert( p->uc.pCur
169a0 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 sor!=0 );. asse
169b0 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 rt( sqlite3Btree
169c0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 CursorHasMoved(p
169d0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b ->uc.pCursor) );
169e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 . rc = sqlite3B
169f0 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72 treeCursorRestor
16a00 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c e(p->uc.pCursor,
16a10 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 &isDifferentRow
16a20 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 );. p->cacheSta
16a30 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c tus = CACHE_STAL
16a40 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65 E;. if( isDiffe
16a50 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c rentRow ) p->nul
16a60 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75 lRow = 1;. retu
16a70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
16a80 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20 Check to ensure
16a90 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 that the cursor
16aa0 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f is valid. Resto
16ab0 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a re the cursor.**
16ac0 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65 if need be. Re
16ad0 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72 turn any I/O err
16ae0 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74 or from the rest
16af0 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a ore operation..*
16b00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
16b10 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56 eCursorRestore(V
16b20 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 dbeCursor *p){.
16b30 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 assert( p->eCur
16b40 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 Type==CURTYPE_BT
16b50 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c REE );. if( sql
16b60 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 ite3BtreeCursorH
16b70 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 asMoved(p->uc.pC
16b80 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 ursor) ){. re
16b90 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 turn handleMoved
16ba0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 Cursor(p);. }.
16bb0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
16bc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 K;.}../*.** Make
16bd0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 sure the cursor
16be0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 p is ready to r
16bf0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 ead or write the
16c00 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 row to which it
16c10 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 .** was last pos
16c20 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e itioned. Return
16c30 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 an error code i
16c40 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f f an OOM fault o
16c50 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 r I/O error.** p
16c60 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 revents us from
16c70 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 positioning the
16c80 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f cursor to its co
16c90 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a rrect position..
16ca0 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 **.** If a MoveT
16cb0 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 o operation is p
16cc0 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 ending on the gi
16cd0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e ven cursor, then
16ce0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 do that.** Move
16cf0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d To now. If no m
16d00 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 ove is pending,
16d10 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 check to see if
16d20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e the row has been
16d30 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 .** deleted out
16d40 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 from under the c
16d50 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 ursor and if it
16d60 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f has, mark the ro
16d70 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 w as.** a NULL r
16d80 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 ow..**.** If the
16d90 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 cursor is alrea
16da0 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 dy pointing to t
16db0 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 he correct row a
16dc0 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a nd that row has.
16dd0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 ** not been dele
16de0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 ted out from und
16df0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 er the cursor, t
16e00 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 hen this routine
16e10 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a is a no-op..*/.
16e20 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 int sqlite3VdbeC
16e30 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 ursorMoveto(Vdbe
16e40 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74 Cursor **pp, int
16e50 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65 *piCol){. Vdbe
16e60 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b Cursor *p = *pp;
16e70 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54 79 . if( p->eCurTy
16e80 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 pe==CURTYPE_BTRE
16e90 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e E ){. if( p->
16ea0 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 deferredMoveto )
16eb0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 70 {. int iMap
16ec0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 ;. if( p->a
16ed0 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20 AltMap && (iMap
16ee0 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a = p->aAltMap[1+*
16ef0 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20 piCol])>0 ){.
16f00 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41 *pp = p->pA
16f10 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 ltCursor;.
16f20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20 *piCol = iMap
16f30 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 - 1;. ret
16f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 urn SQLITE_OK;.
16f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 }. ret
16f60 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72 urn handleDeferr
16f70 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 edMoveto(p);.
16f80 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 }. if( sqlit
16f90 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 e3BtreeCursorHas
16fa0 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 Moved(p->uc.pCur
16fb0 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 sor) ){. re
16fc0 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 turn handleMoved
16fd0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d Cursor(p);. }
16fe0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 . }. return SQ
16ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a LITE_OK;.}../*.*
17000 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
17010 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a functions:.**.**
17020 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
17030 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 alType().** sqli
17040 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 te3VdbeSerialTyp
17050 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 eLen().** sqlite
17060 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 3VdbeSerialLen()
17070 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 .** sqlite3VdbeS
17080 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 erialPut().** sq
17090 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 lite3VdbeSerialG
170a0 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 et().**.** encap
170b0 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20 sulate the code
170c0 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20 that serializes
170d0 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61 values for stora
170e0 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 ge in SQLite.**
170f0 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72 data and index r
17100 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72 ecords. Each ser
17110 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f ialized value co
17120 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 nsists of a.** '
17130 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 serial-type' and
17140 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e a blob of data.
17150 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 The serial type
17160 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e is an 8-byte un
17170 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 signed.** intege
17180 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76 r, stored as a v
17190 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 arint..**.** In
171a0 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20 an SQLite index
171b0 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69 record, the seri
171c0 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65 al type is store
171d0 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72 d directly befor
171e0 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 e.** the blob of
171f0 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f data that it co
17200 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e rresponds to. In
17210 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c a table record,
17220 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 all serial.** t
17230 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 ypes are stored
17240 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 at the start of
17250 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 the record, and
17260 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 the blobs of dat
17270 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e a at.** the end.
17280 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e Hence these fun
17290 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 ctions allow the
172a0 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c caller to handl
172b0 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d e the.** serial-
172c0 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c type and data bl
172d0 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a ob separately..*
172e0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 *.** The followi
172f0 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 ng table describ
17300 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 es the various s
17310 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66 torage classes f
17320 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 or data:.**.**
17330 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20 serial type
17340 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74 bytes of dat
17350 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 a type.**
17360 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 --------------
17370 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
17380 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d --- ---------
17390 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 ------.** 0
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
173b0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 0
173c0 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 NULL.** 1
173d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
173e0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 1
173f0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 signed integer
17400 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20 .** 2
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 2
17420 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e sign
17430 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 ed integer.**
17440 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20 3
17450 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20 3
17460 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 signed int
17470 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 eger.** 4
17480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17490 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 4
174a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a signed integer.*
174b0 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20 * 5
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20 6
174d0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 signed
174e0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 integer.**
174f0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6
17500 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 8
17510 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 signed integ
17520 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20 er.** 7
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17540 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45 8 IE
17550 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 EE float.**
17560 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20 8
17570 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 0
17580 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 Integer cons
17590 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 tant 0.** 9
175a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
175b0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 0
175c0 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 Integer consta
175d0 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 nt 1.** 10,1
175e0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 1
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17600 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70 reserved for exp
17610 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d ansion.** N>=
17620 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20 12 and even
17630 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 (N-12)/2
17640 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d BLOB.** N>=
17650 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20 13 and odd
17660 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 (N-13)/2
17670 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 text.**.** The
17680 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77 8 and 9 types w
17690 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33 ere added in 3.3
176a0 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 .0, file format
176b0 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f 4. Prior versio
176c0 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 ns.** of SQLite
176d0 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 will not underst
176e0 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c and those serial
176f0 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a types..*/../*.*
17700 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72 * Return the ser
17710 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65 ial-type for the
17720 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e value stored in
17730 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 pMem..*/.u32 sq
17740 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
17750 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 ype(Mem *pMem, i
17760 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 nt file_format,
17770 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e u32 *pLen){. in
17780 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e t flags = pMem->
17790 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a flags;. u32 n;.
177a0 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21 . assert( pLen!
177b0 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 =0 );. if( flag
177c0 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 s&MEM_Null ){.
177d0 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 *pLen = 0;.
177e0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 return 0;. }.
177f0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 if( flags&MEM_I
17800 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 nt ){. /* Fig
17810 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20 ure out whether
17820 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 to use 1, 2, 4,
17830 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 6 or 8 bytes. */
17840 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f .# define MAX_
17850 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78 6BYTE ((((i64)0x
17860 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 00008000)<<32)-1
17870 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d ). i64 i = pM
17880 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 em->u.i;. u64
17890 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20 u;. if( i<0
178a0 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b ){. u = ~i;
178b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
178c0 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 u = i;. }.
178d0 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b if( u<=127 ){
178e0 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29 . if( (i&1)
178f0 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d ==i && file_form
17900 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 at>=4 ){.
17910 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 *pLen = 0;.
17920 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33 return 8+(u3
17930 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 2)u;. }else
17940 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 {. *pLen
17950 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 = 1;. ret
17960 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 urn 1;. }.
17970 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d }. if( u<=
17980 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 32767 ){ *pLen =
17990 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 2; return 2; }.
179a0 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36 if( u<=83886
179b0 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 07 ){ *pLen = 3;
179c0 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 return 3; }.
179d0 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36 if( u<=21474836
179e0 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 47 ){ *pLen = 4;
179f0 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 return 4; }.
17a00 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 if( u<=MAX_6BYT
17a10 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 E ){ *pLen = 6;
17a20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 return 5; }.
17a30 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 *pLen = 8;. r
17a40 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 eturn 6;. }. i
17a50 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 f( flags&MEM_Rea
17a60 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d l ){. *pLen =
17a70 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37 8;. return 7
17a80 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 ;. }. assert(
17a90 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 pMem->db->malloc
17aa0 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 Failed || flags&
17ab0 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f (MEM_Str|MEM_Blo
17ac0 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 b) );. assert(
17ad0 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 pMem->n>=0 );.
17ae0 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e n = (u32)pMem->n
17af0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 ;. if( flags &
17b00 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 MEM_Zero ){.
17b10 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 n += pMem->u.nZe
17b20 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 ro;. }. *pLen
17b30 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 = n;. return ((
17b40 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c n*2) + 12 + ((fl
17b50 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 ags&MEM_Str)!=0)
17b60 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 );.}../*.** The
17b70 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c sizes for serial
17b80 20 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e types less than
17b90 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 128.*/.static c
17ba0 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53 onst u8 sqlite3S
17bb0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 mallTypeSizes[]
17bc0 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 = {. /*
17bd0 30 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20 0 1 2 3
17be0 34 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20 4 5 6 7
17bf0 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 8 9 */ ./*
17c00 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 0 */ 0, 1,
17c10 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 2, 3, 4, 6,
17c20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 8, 8, 0, 0,./
17c30 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 * 10 */ 0, 0
17c40 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 , 0, 0, 1, 1
17c50 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 , 2, 2, 3, 3
17c60 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c ,./* 20 */ 4,
17c70 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 4, 5, 5, 6,
17c80 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 6, 7, 7, 8,
17c90 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 8,./* 30 */
17ca0 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 9, 9, 10, 10,
17cb0 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 11, 11, 12, 12,
17cc0 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 13, 13,./* 40 *
17cd0 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 / 14, 14, 15, 1
17ce0 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 5, 16, 16, 17, 1
17cf0 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 7, 18, 18,./* 5
17d00 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 0 */ 19, 19, 20
17d10 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 , 20, 21, 21, 22
17d20 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a , 22, 23, 23,./*
17d30 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 60 */ 24, 24,
17d40 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 25, 25, 26, 26,
17d50 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 27, 27, 28, 28,
17d60 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 ./* 70 */ 29,
17d70 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 29, 30, 30, 31,
17d80 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 31, 32, 32, 33,
17d90 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 33,./* 80 */ 3
17da0 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 4, 34, 35, 35, 3
17db0 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 6, 36, 37, 37, 3
17dc0 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 8, 38,./* 90 */
17dd0 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 39, 39, 40, 40
17de0 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 , 41, 41, 42, 42
17df0 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 , 43, 43,./* 100
17e00 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c */ 44, 44, 45,
17e10 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 45, 46, 46, 47,
17e20 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 47, 48, 48,./*
17e30 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 110 */ 49, 49,
17e40 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 50, 50, 51, 51,
17e50 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 52, 52, 53, 53,.
17e60 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 /* 120 */ 54, 5
17e70 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 4, 55, 55, 56, 5
17e80 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 6, 57, 57.};../*
17e90 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c .** Return the l
17ea0 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 ength of the dat
17eb0 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 a corresponding
17ec0 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 to the supplied
17ed0 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a serial-type..*/.
17ee0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 u32 sqlite3VdbeS
17ef0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 erialTypeLen(u32
17f00 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 serial_type){.
17f10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 if( serial_type
17f20 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74 >=128 ){. ret
17f30 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 urn (serial_type
17f40 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b -12)/2;. }else{
17f50 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72 . assert( ser
17f60 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 ial_type<12 .
17f70 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 || sqli
17f80 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 te3SmallTypeSize
17f90 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d s[serial_type]==
17fa0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 (serial_type - 1
17fb0 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75 2)/2 );. retu
17fc0 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 rn sqlite3SmallT
17fd0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f ypeSizes[serial_
17fe0 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 type];. }.}.u8
17ff0 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79 sqlite3VdbeOneBy
18000 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 teSerialTypeLen(
18010 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b u8 serial_type){
18020 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 . assert( seria
18030 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 l_type<128 );.
18040 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d return sqlite3Sm
18050 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 allTypeSizes[ser
18060 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a ial_type]; .}..
18070 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20 /*.** If we are
18080 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75 on an architectu
18090 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e re with mixed-en
180a0 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a dian floating .*
180b0 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 * points (ex: AR
180c0 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68 M7) then swap th
180d0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20 e lower 4 bytes
180e0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 with the .** upp
180f0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74 er 4 bytes. Ret
18100 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a urn the result..
18110 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 **.** For most a
18120 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68 rchitectures, th
18130 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a is is a no-op..*
18140 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 *.** (later): I
18150 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f t is reported to
18160 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78 me that the mix
18170 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 ed-endian proble
18180 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 m.** on ARM7 is
18190 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43 an issue with GC
181a0 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20 C, not with the
181b0 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73 ARM7 chip. It s
181c0 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 eems.** that ear
181d0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 ly versions of G
181e0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77 CC stored the tw
181f0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d o words of a 64-
18200 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 bit.** float in
18210 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e the wrong order.
18220 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72 And that error
18230 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67 has been propag
18240 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e ated.** ever sin
18250 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69 ce. The blame i
18260 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c s not necessaril
18270 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75 y with GCC, thou
18280 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 gh..** GCC might
18290 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69 have just copyi
182a0 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 ng the problem f
182b0 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 rom a prior comp
182c0 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c iler..** I am al
182d0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 so told that new
182e0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 er versions of G
182f0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 CC that follow a
18300 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 different.** AB
18310 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f I get the byte o
18320 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a rder right..**.*
18330 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69 * Developers usi
18340 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 ng SQLite on an
18350 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 ARM7 should comp
18360 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69 ile and run thei
18370 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e r.** application
18380 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f using -DSQLITE_
18390 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74 DEBUG=1 at least
183a0 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42 once. With DEB
183b0 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 UG.** enabled, s
183c0 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f ome asserts belo
183d0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 w will ensure th
183e0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 at the byte orde
183f0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 r of.** floating
18400 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73 point values is
18410 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 correct..**.**
18420 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72 (2007-08-30) Fr
18430 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73 ank van Vugt has
18440 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72 studied this pr
18450 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a oblem closely.**
18460 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69 and has send hi
18470 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 s findings to th
18480 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 e SQLite develop
18490 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 ers. Frank.** w
184a0 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20 rites that some
184b0 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 Linux kernels of
184c0 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 fer floating poi
184d0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 nt hardware.** e
184e0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73 mulation that us
184f0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d es only 32-bit m
18500 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64 antissas instead
18510 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 of a full .** 4
18520 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72 8-bits as requir
18530 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73 ed by the IEEE s
18540 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20 tandard. (This
18550 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 is the.** CONFIG
18560 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74 _FPE_FASTFPE opt
18570 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 ion.) On such s
18580 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 ystems, floating
18590 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 point.** byte s
185a0 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 wapping becomes
185b0 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 very complicated
185c0 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 . To avoid prob
185d0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 lems,.** the nec
185e0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70 essary byte swap
185f0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20 ping is carried
18600 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62 out using a 64-b
18610 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 it integer.** ra
18620 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62 ther than a 64-b
18630 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b it float. Frank
18640 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74 assures us that
18650 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a the code here.*
18660 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e * works for him.
18670 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f We, the develo
18680 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 pers, have no wa
18690 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 y to independent
186a0 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69 ly.** verify thi
186b0 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65 s, but Frank see
186c0 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 ms to know what
186d0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 he is talking ab
186e0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 out.** so we tru
186f0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 st him..*/.#ifde
18700 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 f SQLITE_MIXED_E
18710 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 NDIAN_64BIT_FLOA
18720 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f T.static u64 flo
18730 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a atSwap(u64 in){.
18740 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 union {. u6
18750 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 4 r;. u32 i[2
18760 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 ];. } u;. u32
18770 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a t;.. u.r = in;.
18780 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 t = u.i[0];.
18790 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b u.i[0] = u.i[1];
187a0 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 . u.i[1] = t;.
187b0 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 return u.r;.}.#
187c0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 define swapMixe
187d0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 dEndianFloat(X)
187e0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 X = floatSwap(X
187f0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 ).#else.# define
18800 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e swapMixedEndian
18810 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a Float(X).#endif.
18820 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 ./*.** Write the
18830 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61 serialized data
18840 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61 blob for the va
18850 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d lue stored in pM
18860 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e em into .** buf.
18870 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 It is assumed t
18880 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 hat the caller h
18890 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 as allocated suf
188a0 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a ficient space..*
188b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d * Return the num
188c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 ber of bytes wri
188d0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 tten..**.** nBuf
188e0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f is the amount o
188f0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20 f space left in
18900 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c buf[]. The call
18910 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c er is responsibl
18920 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 e.** for allocat
18930 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65 ing enough space
18940 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c to buf[] to hol
18950 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65 d the entire fie
18960 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a ld, exclusive.**
18970 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e of the pMem->u.
18980 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20 nZero bytes for
18990 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 a MEM_Zero value
189a0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ..**.** Return t
189b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 he number of byt
189c0 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74 es actually writ
189d0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 ten into buf[].
189e0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f The number.** o
189f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a f bytes in the z
18a00 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 ero-filled tail
18a10 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 is included in t
18a20 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 he return value
18a30 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 only.** if those
18a40 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f bytes were zero
18a50 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 ed in buf[]..*/
18a60 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 .u32 sqlite3Vdbe
18a70 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75 SerialPut(u8 *bu
18a80 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 f, Mem *pMem, u3
18a90 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 2 serial_type){.
18aa0 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a u32 len;.. /*
18ab0 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61 Integer and Rea
18ac0 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 l */. if( seria
18ad0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72 l_type<=7 && ser
18ae0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 ial_type>0 ){.
18af0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32 u64 v;. u32
18b00 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69 i;. if( seri
18b10 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 al_type==7 ){.
18b20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 assert( size
18b30 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d of(v)==sizeof(pM
18b40 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 em->u.r) );.
18b50 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d memcpy(&v, &pM
18b60 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 em->u.r, sizeof(
18b70 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d v));. swapM
18b80 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 ixedEndianFloat(
18b90 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 v);. }else{.
18ba0 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 v = pMem->u
18bb0 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 .i;. }. le
18bc0 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53 n = i = sqlite3S
18bd0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 mallTypeSizes[se
18be0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 rial_type];.
18bf0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 assert( i>0 );.
18c00 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 do{. buf
18c10 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30 [--i] = (u8)(v&0
18c20 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e xFF);. v >>
18c30 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 = 8;. }while(
18c40 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e i );. return
18c50 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 len;. }.. /*
18c60 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a String or blob *
18c70 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 /. if( serial_t
18c80 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 ype>=12 ){. a
18c90 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b ssert( pMem->n +
18ca0 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 ((pMem->flags &
18cb0 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d MEM_Zero)?pMem-
18cc0 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 >u.nZero:0).
18cd0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 == (int
18ce0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 )sqlite3VdbeSeri
18cf0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c alTypeLen(serial
18d00 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 _type) );. le
18d10 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 n = pMem->n;.
18d20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d if( len>0 ) mem
18d30 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a cpy(buf, pMem->z
18d40 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 , len);. retu
18d50 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f rn len;. }.. /
18d60 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 * NULL or consta
18d70 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 nts 0 or 1 */.
18d80 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 return 0;.}../*
18d90 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73 Input "x" is a s
18da0 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 equence of unsig
18db0 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74 ned characters t
18dc0 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a hat represent a.
18dd0 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e ** big-endian in
18de0 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74 teger. Return t
18df0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 he equivalent na
18e00 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a tive integer.*/.
18e10 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 #define ONE_BYTE
18e20 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29 _INT(x) ((i8)
18e30 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 (x)[0]).#define
18e40 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 TWO_BYTE_INT(x)
18e50 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29 (256*(i8)((x)
18e60 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 [0])|(x)[1]).#de
18e70 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f fine THREE_BYTE_
18e80 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28 INT(x) (65536*(
18e90 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 i8)((x)[0])|((x)
18ea0 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a [1]<<8)|(x)[2]).
18eb0 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 #define FOUR_BYT
18ec0 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33 E_UINT(x) (((u3
18ed0 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 2)(x)[0]<<24)|((
18ee0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b x)[1]<<16)|((x)[
18ef0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 2]<<8)|(x)[3]).#
18f00 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 define FOUR_BYTE
18f10 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31 _INT(x) (1677721
18f20 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 6*(i8)((x)[0])|(
18f30 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 (x)[1]<<16)|((x)
18f40 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a [2]<<8)|(x)[3]).
18f50 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 ./*.** Deseriali
18f60 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62 ze the data blob
18f70 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62 pointed to by b
18f80 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70 uf as serial typ
18f90 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a e serial_type.**
18fa0 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72 and store the r
18fb0 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 esult in pMem.
18fc0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 Return the numbe
18fd0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e r of bytes read.
18fe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 .**.** This func
18ff0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e tion is implemen
19000 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72 ted as two separ
19010 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 ate routines for
19020 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a performance..**
19030 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74 The few cases t
19040 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61 hat require loca
19050 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 l variables are
19060 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 broken out into
19070 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f a separate.** ro
19080 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e utine so that in
19090 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20 most cases the
190a0 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 overhead of movi
190b0 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69 ng the stack poi
190c0 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 nter.** is avoid
190d0 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 ed..*/ .static u
190e0 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 32 SQLITE_NOINLI
190f0 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20 NE serialGet(.
19100 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
19110 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a har *buf, /*
19120 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 Buffer to deser
19130 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 ialize from */.
19140 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 u32 serial_type
19150 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f , /
19160 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f * Serial type to
19170 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a deserialize */.
19180 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 Mem *pMem
19190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
191a0 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 /* Memory cell t
191b0 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e o write value in
191c0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 to */.){. u64 x
191d0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e = FOUR_BYTE_UIN
191e0 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20 T(buf);. u32 y
191f0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 = FOUR_BYTE_UINT
19200 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 (buf+4);. x = (
19210 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 x<<32) + y;. if
19220 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 ( serial_type==6
19230 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 ){. /* EVIDE
19240 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d NCE-OF: R-29851-
19250 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61 52272 Value is a
19260 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 big-endian 64-b
19270 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 it. ** twos-c
19280 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 omplement intege
19290 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e r. */. pMem->
192a0 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b u.i = *(i64*)&x;
192b0 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 . pMem->flags
192c0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
192d0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e testcase( pMem->
192e0 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 u.i<0 );. }else
192f0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 {. /* EVIDENC
19300 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 E-OF: R-57343-49
19310 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 114 Value is a b
19320 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37 ig-endian IEEE 7
19330 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20 54-2008 64-bit.
19340 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 ** floating p
19350 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a oint number. */.
19360 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 #if !defined(NDE
19370 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64 BUG) && !defined
19380 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f (SQLITE_OMIT_FLO
19390 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 ATING_POINT).
193a0 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 /* Verify that
193b0 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f integers and flo
193c0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 ating point valu
193d0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a es use the same.
193e0 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 ** byte orde
193f0 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20 r. Or, that if
19400 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 SQLITE_MIXED_END
19410 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 IAN_64BIT_FLOAT
19420 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 is. ** define
19430 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c d that 64-bit fl
19440 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c oating point val
19450 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d ues really are m
19460 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 ixed. ** endi
19470 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 an.. */. s
19480 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20 tatic const u64
19490 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66 t1 = ((u64)0x3ff
194a0 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 00000)<<32;.
194b0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 static const dou
194c0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 ble r1 = 1.0;.
194d0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 u64 t2 = t1;.
194e0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 swapMixedEndi
194f0 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 anFloat(t2);.
19500 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 assert( sizeof(
19510 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 r1)==sizeof(t2)
19520 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 && memcmp(&r1, &
19530 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d t2, sizeof(r1))=
19540 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 =0 );.#endif.
19550 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 assert( sizeof(
19560 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 x)==8 && sizeof(
19570 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b pMem->u.r)==8 );
19580 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e . swapMixedEn
19590 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 dianFloat(x);.
195a0 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e memcpy(&pMem->
195b0 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 u.r, &x, sizeof(
195c0 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 x));. pMem->f
195d0 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73 lags = sqlite3Is
195e0 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f NaN(pMem->u.r) ?
195f0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f MEM_Null : MEM_
19600 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 Real;. }. retu
19610 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 rn 8;.}.u32 sqli
19620 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 te3VdbeSerialGet
19630 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e (. const unsign
19640 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 ed char *buf,
19650 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 /* Buffer to d
19660 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 eserialize from
19670 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f */. u32 serial_
19680 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 type,
19690 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 /* Serial typ
196a0 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 e to deserialize
196b0 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 */. Mem *pMem
196c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
196d0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 /* Memory ce
196e0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 ll to write valu
196f0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 e into */.){. s
19700 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 witch( serial_ty
19710 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 pe ){. case 1
19720 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 0: /* Reserved
19730 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 for future use
19740 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20 */. case 11:
19750 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f /* Reserved fo
19760 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a r future use */.
19770 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f case 0: { /
19780 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 * Null */.
19790 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 /* EVIDENCE-OF:
197a0 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61 R-24078-09375 Va
197b0 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a lue is a NULL. *
197c0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c /. pMem->fl
197d0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a ags = MEM_Null;.
197e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
197f0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b }. case 1: {
19800 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e . /* EVIDEN
19810 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 CE-OF: R-44885-2
19820 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e 5196 Value is an
19830 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 8-bit twos-comp
19840 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 lement. **
19850 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 integer. */.
19860 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e pMem->u.i = ON
19870 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b E_BYTE_INT(buf);
19880 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
19890 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
198a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d testcase( pM
198b0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 em->u.i<0 );.
198c0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 return 1;.
198d0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b }. case 2: {
198e0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 /* 2-byte signe
198f0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 d integer */.
19900 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f /* EVIDENCE-O
19910 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36 F: R-49794-35026
19920 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d Value is a big-
19930 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 endian 16-bit.
19940 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 ** twos-comp
19950 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 lement integer.
19960 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 */. pMem->u
19970 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e .i = TWO_BYTE_IN
19980 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d T(buf);. pM
19990 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f em->flags = MEM_
199a0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 Int;. testc
199b0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 ase( pMem->u.i<0
199c0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e );. return
199d0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 2;. }. ca
199e0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 se 3: { /* 3-byt
199f0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 e signed integer
19a00 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 */. /* EVI
19a10 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 DENCE-OF: R-3783
19a20 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73 9-54301 Value is
19a30 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 a big-endian 24
19a40 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 -bit. ** tw
19a50 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e os-complement in
19a60 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 teger. */.
19a70 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 pMem->u.i = THRE
19a80 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b E_BYTE_INT(buf);
19a90 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
19aa0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 gs = MEM_Int;.
19ab0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d testcase( pM
19ac0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 em->u.i<0 );.
19ad0 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 return 3;.
19ae0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b }. case 4: {
19af0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 /* 4-byte signe
19b00 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 d integer */.
19b10 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f /* EVIDENCE-O
19b20 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39 F: R-01849-26079
19b30 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d Value is a big-
19b40 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 endian 32-bit.
19b50 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 ** twos-comp
19b60 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 lement integer.
19b70 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 */. pMem->u
19b80 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 .i = FOUR_BYTE_I
19b90 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20 NT(buf);.#ifdef
19ba0 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f __HP_cc . /
19bb0 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 * Work around a
19bc0 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 sign-extension b
19bd0 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d ug in the HP com
19be0 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20 piler for HP/UX
19bf0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66 */. if( buf
19c00 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d [0]&0x80 ) pMem-
19c10 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66 >u.i |= 0xffffff
19c20 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 ff80000000LL;.#e
19c30 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d ndif. pMem-
19c40 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 >flags = MEM_Int
19c50 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
19c60 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b ( pMem->u.i<0 );
19c70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b . return 4;
19c80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
19c90 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 5: { /* 6-byte s
19ca0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
19cb0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e . /* EVIDEN
19cc0 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 CE-OF: R-50385-0
19cd0 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20 9674 Value is a
19ce0 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 big-endian 48-bi
19cf0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d t. ** twos-
19d00 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 complement integ
19d10 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 er. */. pMe
19d20 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 m->u.i = FOUR_BY
19d30 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b TE_UINT(buf+2) +
19d40 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a (((i64)1)<<32)*
19d50 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 TWO_BYTE_INT(buf
19d60 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 );. pMem->f
19d70 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
19d80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
19d90 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 pMem->u.i<0 );.
19da0 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 return 6;.
19db0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a }. case 6:
19dc0 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 /* 8-byte sig
19dd0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 ned integer */.
19de0 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 case 7: { /*
19df0 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f IEEE floating po
19e00 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 int */. /*
19e10 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 These use local
19e20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f variables, so do
19e30 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72 them in a separ
19e40 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 ate routine.
19e50 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 ** to avoid ha
19e60 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 ving to move the
19e70 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 frame pointer i
19e80 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 n the common cas
19e90 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 e */. retur
19ea0 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c n serialGet(buf,
19eb0 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d serial_type,pMem
19ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 );. }. cas
19ed0 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 e 8: /* Integ
19ee0 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 er 0 */. case
19ef0 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 9: { /* Intege
19f00 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 r 1 */. /*
19f10 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 EVIDENCE-OF: R-1
19f20 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65 2976-22893 Value
19f30 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 is the integer
19f40 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 0. */. /* E
19f50 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 VIDENCE-OF: R-18
19f60 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20 143-12121 Value
19f70 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31 is the integer 1
19f80 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d . */. pMem-
19f90 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 >u.i = serial_ty
19fa0 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d pe-8;. pMem
19fb0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e ->flags = MEM_In
19fc0 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 t;. return
19fd0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 0;. }. def
19fe0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a ault: {. /*
19ff0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d EVIDENCE-OF: R-
1a000 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75 14606-31564 Valu
1a010 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74 e is a BLOB that
1a020 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 is (N-12)/2 byt
1a030 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c es in. ** l
1a040 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 ength.. **
1a050 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 EVIDENCE-OF: R-2
1a060 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65 8401-00140 Value
1a070 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20 is a string in
1a080 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e the text encodin
1a090 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 g and. ** (
1a0a0 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e N-13)/2 bytes in
1a0b0 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 length. */.
1a0c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 static const u
1a0d0 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 16 aFlag[] = { M
1a0e0 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 EM_Blob|MEM_Ephe
1a0f0 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 m, MEM_Str|MEM_E
1a100 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d phem };. pM
1a110 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 em->z = (char *)
1a120 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d buf;. pMem-
1a130 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 >n = (serial_typ
1a140 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 e-12)/2;. p
1a150 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c Mem->flags = aFl
1a160 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31 ag[serial_type&1
1a170 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 ];. return
1a180 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 pMem->n;. }.
1a190 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d }. return 0;.}
1a1a0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 ./*.** This rout
1a1b0 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61 ine is used to a
1a1c0 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65 llocate sufficie
1a1d0 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20 nt space for an
1a1e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a UnpackedRecord.*
1a1f0 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67 * structure larg
1a200 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 e enough to be u
1a210 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 sed with sqlite3
1a220 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b VdbeRecordUnpack
1a230 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 () if.** the fir
1a240 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 st argument is a
1a250 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 pointer to KeyI
1a260 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b nfo structure pK
1a270 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 eyInfo..**.** Th
1a280 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65 e space is eithe
1a290 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e r allocated usin
1a2a0 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f g sqlite3DbMallo
1a2b0 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 cRaw() or from w
1a2c0 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 ithin.** the una
1a2d0 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61 ligned buffer pa
1a2e0 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63 ssed via the sec
1a2f0 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72 ond and third ar
1a300 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61 guments (presuma
1a310 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 bly.** stack spa
1a320 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d ce). If the form
1a330 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65 er, then *ppFree
1a340 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69 is set to a poi
1a350 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64 nter that should
1a360 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c .** be eventuall
1a370 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63 y freed by the c
1a380 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 aller using sqli
1a390 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c te3DbFree(). Or,
1a3a0 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f if the .** allo
1a3b0 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f cation comes fro
1a3c0 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53 m the pSpace/szS
1a3d0 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70 pace buffer, *pp
1a3e0 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e Free is set to N
1a3f0 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 ULL.** before re
1a400 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 turning..**.** I
1a410 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f f an OOM error o
1a420 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 ccurs, NULL is r
1a430 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 eturned..*/.Unpa
1a440 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 ckedRecord *sqli
1a450 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 te3VdbeAllocUnpa
1a460 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 ckedRecord(. Ke
1a470 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c yInfo *pKeyInfo,
1a480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
1a490 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 Description of
1a4a0 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 the record */.
1a4b0 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20 char *pSpace,
1a4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a4d0 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 /* Unaligned spa
1a4e0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a ce available */.
1a4f0 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 int szSpace,
1a500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a510 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 /* Size of pSp
1a520 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a ace[] in bytes *
1a530 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65 /. char **ppFre
1a540 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
1a550 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c /* OUT: Call
1a560 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74 er should free t
1a570 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 his pointer */.)
1a580 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f {. UnpackedReco
1a590 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 rd *p;
1a5a0 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 /* Unpacked
1a5b0 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e record to return
1a5c0 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 */. int nOff;
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a5e0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 /* Increme
1a5f0 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66 nt pSpace by nOf
1a600 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f f to align it */
1a610 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 . int nByte;
1a620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a630 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 /* Number of
1a640 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66 bytes required f
1a650 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 or *p */.. /* W
1a660 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20 e want to shift
1a670 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61 the pointer pSpa
1a680 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20 ce up such that
1a690 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69 it is 8-byte ali
1a6a0 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c gned.. ** Thus,
1a6b0 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 we need to calc
1a6c0 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e ulate a value, n
1a6d0 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61 Off, between 0 a
1a6e0 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a nd 7, to shift .
1a6f0 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20 ** it by. If
1a700 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64 pSpace is alread
1a710 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 y 8-byte aligned
1a720 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 , nOff should be
1a730 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f zero.. */. nO
1a740 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 ff = (8 - (SQLIT
1a750 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 E_PTR_TO_INT(pSp
1a760 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a ace) & 7)) & 7;.
1a770 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 nByte = ROUND8
1a780 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 (sizeof(Unpacked
1a790 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f Record)) + sizeo
1a7a0 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f f(Mem)*(pKeyInfo
1a7b0 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 ->nField+1);. i
1a7c0 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 f( nByte>szSpace
1a7d0 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d +nOff ){. p =
1a7e0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 (UnpackedRecord
1a7f0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c *)sqlite3DbMall
1a800 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e ocRaw(pKeyInfo->
1a810 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 db, nByte);.
1a820 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20 *ppFree = (char
1a830 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20 *)p;. if( !p
1a840 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 ) return 0;. }e
1a850 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e lse{. p = (Un
1a860 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 packedRecord*)&p
1a870 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 Space[nOff];.
1a880 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 *ppFree = 0;.
1a890 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 }.. p->aMem = (
1a8a0 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29 Mem*)&((char*)p)
1a8b0 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 [ROUND8(sizeof(U
1a8c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d npackedRecord))]
1a8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 ;. assert( pKey
1a8e0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 Info->aSortOrder
1a8f0 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 !=0 );. p->pKey
1a900 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b Info = pKeyInfo;
1a910 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 . p->nField = p
1a920 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 KeyInfo->nField
1a930 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b + 1;. return p;
1a940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 .}../*.** Given
1a950 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e the nKey-byte en
1a960 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f coding of a reco
1a970 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f rd in pKey[], po
1a980 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 pulate the .** U
1a990 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 npackedRecord st
1a9a0 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65 ructure indicate
1a9b0 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20 d by the fourth
1a9c0 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68 argument with th
1a9d0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 e.** contents of
1a9e0 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63 the decoded rec
1a9f0 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 ord..*/ .void sq
1aa00 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 lite3VdbeRecordU
1aa10 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f npack(. KeyInfo
1aa20 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 *pKeyInfo,
1aa30 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 /* Information a
1aa40 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20 bout the record
1aa50 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 format */. int
1aa60 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 nKey,
1aa70 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 /* Size of th
1aa80 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 e binary record
1aa90 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 */. const void
1aaa0 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 *pKey, /* T
1aab0 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 he binary record
1aac0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 */. UnpackedRe
1aad0 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 cord *p /*
1aae0 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74 Populate this st
1aaf0 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72 ructure before r
1ab00 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a eturning. */.){.
1ab10 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
1ab20 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 char *aKey = (c
1ab30 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
1ab40 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 ar *)pKey;. int
1ab50 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20 d; . u32 idx;
1ab60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ab70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 /* Offset
1ab80 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 in aKey[] to re
1ab90 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 ad from */. u16
1aba0 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 u;
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1abc0 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f Unsigned loop co
1abd0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 unter */. u32 s
1abe0 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 zHdr;. Mem *pMe
1abf0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 m = p->aMem;..
1ac00 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 p->default_rc =
1ac10 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 0;. assert( EIG
1ac20 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e HT_BYTE_ALIGNMEN
1ac30 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 T(pMem) );. idx
1ac40 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 = getVarint32(a
1ac50 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 Key, szHdr);. d
1ac60 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 = szHdr;. u =
1ac70 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 0;. while( idx<
1ac80 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 szHdr && d<=nKey
1ac90 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 ){. u32 seri
1aca0 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 al_type;.. id
1acb0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 x += getVarint32
1acc0 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 (&aKey[idx], ser
1acd0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 ial_type);. p
1ace0 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 Mem->enc = pKeyI
1acf0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d nfo->enc;. pM
1ad00 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 em->db = pKeyInf
1ad10 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d o->db;. /* pM
1ad20 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f em->flags = 0; /
1ad30 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 / sqlite3VdbeSer
1ad40 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65 ialGet() will se
1ad50 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f t this for us */
1ad60 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c . pMem->szMal
1ad70 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70 4d 65 loc = 0;. pMe
1ad80 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20 64 20 m->z = 0;. d
1ad90 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 += sqlite3VdbeSe
1ada0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d rialGet(&aKey[d]
1adb0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 , serial_type, p
1adc0 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b Mem);. pMem++
1add0 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e ;. if( (++u)>
1ade0 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 =p->nField ) bre
1adf0 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 ak;. }. assert
1ae00 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e ( u<=pKeyInfo->n
1ae10 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 Field + 1 );. p
1ae20 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a ->nField = u;.}.
1ae30 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 .#if SQLITE_DEBU
1ae40 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e G./*.** This fun
1ae50 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 ction compares t
1ae60 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c wo index or tabl
1ae70 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e e record keys in
1ae80 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a the same way.**
1ae90 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 as the sqlite3V
1aea0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1aeb0 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 () routine. Unli
1aec0 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d ke VdbeRecordCom
1aed0 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 pare(),.** this
1aee0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 function deseria
1aef0 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 lizes and compar
1af00 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 es values using
1af10 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 the.** sqlite3Vd
1af20 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e beSerialGet() an
1af30 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 d sqlite3MemComp
1af40 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e are() functions.
1af50 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 It is used.** i
1af60 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 n assert() state
1af70 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 ments to ensure
1af80 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a that the optimiz
1af90 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 ed code in.** sq
1afa0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 lite3VdbeRecordC
1afb0 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 ompare() returns
1afc0 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 results with th
1afd0 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 ese two primitiv
1afe0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e es..**.** Return
1aff0 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 true if the res
1b000 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f ult of compariso
1b010 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 n is equivalent
1b020 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 to desiredResult
1b030 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 ..** Return fals
1b040 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 e if there is a
1b050 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f disagreement..*/
1b060 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 .static int vdbe
1b070 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 RecordCompareDeb
1b080 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c ug(. int nKey1,
1b090 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 const void *pKe
1b0a0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 y1, /* Left key
1b0b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 */. const Unpac
1b0c0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 kedRecord *pPKey
1b0d0 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2, /* Right key
1b0e0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 */. int desired
1b0f0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 Result
1b100 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e /* Correct an
1b110 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 swer */.){. u32
1b120 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 d1;
1b130 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 /* Offset into a
1b140 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 Key[] of next da
1b150 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 ta element */.
1b160 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 u32 idx1;
1b170 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 /* Offset int
1b180 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 o aKey[] of next
1b190 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 header element
1b1a0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b */. u32 szHdr1;
1b1b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 /* Numbe
1b1c0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 r of bytes in he
1b1d0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 ader */. int i
1b1e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 = 0;. int rc =
1b1f0 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 0;. const unsig
1b200 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 ned char *aKey1
1b210 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 = (const unsigne
1b220 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a d char *)pKey1;.
1b230 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 KeyInfo *pKeyI
1b240 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b nfo;. Mem mem1;
1b250 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 .. pKeyInfo = p
1b260 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b PKey2->pKeyInfo;
1b270 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d . if( pKeyInfo-
1b280 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 >db==0 ) return
1b290 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 1;. mem1.enc =
1b2a0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 pKeyInfo->enc;.
1b2b0 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 mem1.db = pKeyI
1b2c0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 nfo->db;. /* me
1b2d0 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f m1.flags = 0; /
1b2e0 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 / Will be initia
1b2f0 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 lized by sqlite3
1b300 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 VdbeSerialGet()
1b310 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d */. VVA_ONLY( m
1b320 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 em1.szMalloc = 0
1b330 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 ; ) /* Only need
1b340 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 ed by assert() s
1b350 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 tatements */..
1b360 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 /* Compilers may
1b370 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d complain that m
1b380 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e em1.u.i is poten
1b390 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c tially uninitial
1b3a0 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f ized.. ** We co
1b3b0 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 uld initialize i
1b3c0 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 t, as shown here
1b3d0 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f , to silence tho
1b3e0 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 se complaints..
1b3f0 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c ** But in fact,
1b400 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e mem1.u.i will n
1b410 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 ever actually be
1b420 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 used uninitiali
1b430 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a zed, and doing .
1b440 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 ** the unneces
1b450 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 sary initializat
1b460 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 ion has a measur
1b470 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 able negative pe
1b480 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 rformance. ** i
1b490 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 mpact, since thi
1b4a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 s routine is a v
1b4b0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e ery high runner.
1b4c0 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f And so, we cho
1b4d0 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f ose. ** to igno
1b4e0 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 re the compiler
1b4f0 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 warnings and lea
1b500 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 ve this variable
1b510 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a uninitialized..
1b520 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e */. /* mem1.
1b530 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 u.i = 0; // not
1b540 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f needed, here to
1b550 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 silence compile
1b560 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a r warning */. .
1b570 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 idx1 = getVari
1b580 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 nt32(aKey1, szHd
1b590 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 r1);. if( szHdr
1b5a0 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 1>98307 ) return
1b5b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b SQLITE_CORRUPT;
1b5c0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a . d1 = szHdr1;.
1b5d0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e assert( pKeyIn
1b5e0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 fo->nField+pKeyI
1b5f0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 nfo->nXField>=pP
1b600 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 Key2->nField ||
1b610 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 CORRUPT_DB );.
1b620 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f assert( pKeyInfo
1b630 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 ->aSortOrder!=0
1b640 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 );. assert( pKe
1b650 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 yInfo->nField>0
1b660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 );. assert( idx
1b670 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 1<=szHdr1 || COR
1b680 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b RUPT_DB );. do{
1b690 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f . u32 serial_
1b6a0 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 type1;.. /* R
1b6b0 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 ead the serial t
1b6c0 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 ypes for the nex
1b6d0 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 t element in eac
1b6e0 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 h key. */. id
1b6f0 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 x1 += getVarint3
1b700 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 2( aKey1+idx1, s
1b710 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a erial_type1 );..
1b720 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 /* Verify th
1b730 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 at there is enou
1b740 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d gh key space rem
1b750 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a aining to avoid.
1b760 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 ** a buffer
1b770 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 overread. The "
1b780 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b d1+serial_type1+
1b790 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 2" subexpression
1b7a0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 will. ** alw
1b7b0 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 ays be greater t
1b7c0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 han or equal to
1b7d0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 the amount of re
1b7e0 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 quired key space
1b7f0 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 .. ** Use tha
1b800 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 t approximation
1b810 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 to avoid the mor
1b820 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c e expensive call
1b830 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 to. ** sqlit
1b840 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
1b850 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d Len() in the com
1b860 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f mon case.. */
1b870 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 . if( d1+seri
1b880 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 al_type1+2>(u32)
1b890 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 nKey1. && d1
1b8a0 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 +sqlite3VdbeSeri
1b8b0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c alTypeLen(serial
1b8c0 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 _type1)>(u32)nKe
1b8d0 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 y1 . ){.
1b8e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 break;. }..
1b8f0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 /* Extract th
1b900 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 e values to be c
1b910 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a ompared.. */.
1b920 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 d1 += sqlite
1b930 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 3VdbeSerialGet(&
1b940 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 aKey1[d1], seria
1b950 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b l_type1, &mem1);
1b960 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 .. /* Do the
1b970 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a comparison. *
1b980 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 /. rc = sqlit
1b990 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 e3MemCompare(&me
1b9a0 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 m1, &pPKey2->aMe
1b9b0 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e m[i], pKeyInfo->
1b9c0 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 aColl[i]);. i
1b9d0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 f( rc!=0 ){.
1b9e0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 assert( mem1.s
1b9f0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f zMalloc==0 ); /
1ba00 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 * See comment be
1ba10 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 low */. if(
1ba20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 pKeyInfo->aSort
1ba30 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 Order[i] ){.
1ba40 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f rc = -rc; /
1ba50 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 * Invert the res
1ba60 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 ult for DESC sor
1ba70 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 t order. */.
1ba80 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 }. goto d
1ba90 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a ebugCompareEnd;.
1baa0 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 }. i++;.
1bab0 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a }while( idx1<sz
1bac0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 Hdr1 && i<pPKey2
1bad0 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f ->nField );.. /
1bae0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f * No memory allo
1baf0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 cation is ever u
1bb00 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 sed on mem1. Pr
1bb10 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 ove this using.
1bb20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e ** the followin
1bb30 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 g assert(). If
1bb40 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 the assert() fai
1bb50 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 ls, it indicates
1bb60 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c a. ** memory l
1bb70 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 eak and a need t
1bb80 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 o call sqlite3Vd
1bb90 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 beMemRelease(&me
1bba0 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 m1).. */. asse
1bbb0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f rt( mem1.szMallo
1bbc0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 c==0 );.. /* rc
1bbd0 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 ==0 here means t
1bbe0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b hat one of the k
1bbf0 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 eys ran out of f
1bc00 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 ields and. ** a
1bc10 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 ll the fields up
1bc20 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 to that point w
1bc30 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 ere equal. Retur
1bc40 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 n the default_rc
1bc50 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f . ** value. */
1bc60 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e . rc = pPKey2->
1bc70 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 default_rc;..deb
1bc80 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 ugCompareEnd:.
1bc90 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c if( desiredResul
1bca0 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 t==0 && rc==0 )
1bcb0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 return 1;. if(
1bcc0 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 desiredResult<0
1bcd0 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e && rc<0 ) return
1bce0 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 1;. if( desire
1bcf0 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e dResult>0 && rc>
1bd00 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 0 ) return 1;.
1bd10 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 if( CORRUPT_DB )
1bd20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 return 1;. if(
1bd30 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d pKeyInfo->db->m
1bd40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 allocFailed ) re
1bd50 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e turn 1;. return
1bd60 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 0;.}.#endif..#i
1bd70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f f SQLITE_DEBUG./
1bd80 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e *.** Count the n
1bd90 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 umber of fields
1bda0 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 (a.k.a. columns)
1bdb0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 in the record g
1bdc0 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c iven by.** pKey,
1bdd0 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 nKey. The verif
1bde0 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e y that this coun
1bdf0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f t is less than o
1be00 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a r equal to the.*
1be10 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 * limit given by
1be20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c pKeyInfo->nFiel
1be30 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 d + pKeyInfo->nX
1be40 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 Field..**.** If
1be50 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 this constraint
1be60 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 is not satisfied
1be70 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 , it means that
1be80 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a the high-speed.*
1be90 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 * vdbeRecordComp
1bea0 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 areInt() and vdb
1beb0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 eRecordCompareSt
1bec0 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 ring() routines
1bed0 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b will.** not work
1bee0 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 correctly. If
1bef0 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76 this assert() ev
1bf00 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f er fires, it pro
1bf10 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 bably means.** t
1bf20 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e hat the KeyInfo.
1bf30 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 nField or KeyInf
1bf40 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 o.nXField values
1bf50 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a were computed.*
1bf60 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a * incorrectly..*
1bf70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 /.static void vd
1bf80 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 beAssertFieldCou
1bf90 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a ntWithinLimits(.
1bfa0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 int nKey, cons
1bfb0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 t void *pKey,
1bfc0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f /* The record to
1bfd0 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f verify */ . co
1bfe0 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 nst KeyInfo *pKe
1bff0 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 yInfo /* C
1c000 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 ompare size with
1c010 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f this KeyInfo */
1c020 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 .){. int nField
1c030 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 = 0;. u32 szHd
1c040 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 r;. u32 idx;.
1c050 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 u32 notUsed;. c
1c060 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
1c070 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 ar *aKey = (cons
1c080 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a t unsigned char*
1c090 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f )pKey;.. if( CO
1c0a0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 RRUPT_DB ) retur
1c0b0 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 n;. idx = getVa
1c0c0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 rint32(aKey, szH
1c0d0 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e dr);. assert( n
1c0e0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 Key>=0 );. asse
1c0f0 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 rt( szHdr<=(u32)
1c100 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 nKey );. while(
1c110 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 idx<szHdr ){.
1c120 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 idx += getVari
1c130 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e nt32(aKey+idx, n
1c140 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 otUsed);. nFi
1c150 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 eld++;. }. ass
1c160 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 ert( nField <= p
1c170 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b KeyInfo->nField+
1c180 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c pKeyInfo->nXFiel
1c190 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 d );.}.#else.# d
1c1a0 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 efine vdbeAssert
1c1b0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e FieldCountWithin
1c1c0 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 Limits(A,B,C).#e
1c1d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 ndif../*.** Both
1c1e0 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 *pMem1 and *pMe
1c1f0 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e m2 contain strin
1c200 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 g values. Compar
1c210 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 e the two values
1c220 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f .** using the co
1c230 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 llation sequence
1c240 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c pColl. As usual
1c250 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 , return a negat
1c260 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 ive , zero.** or
1c270 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 positive value
1c280 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 if *pMem1 is les
1c290 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f s than, equal to
1c2a0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e or greater than
1c2b0 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 .** *pMem2, res
1c2c0 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c pectively. Simil
1c2d0 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 ar in spirit to
1c2e0 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d "rc = (*pMem1) -
1c2f0 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a (*pMem2);"..*/.
1c300 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 static int vdbeC
1c310 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 ompareMemString(
1c320 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d . const Mem *pM
1c330 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d em1,. const Mem
1c340 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 *pMem2,. const
1c350 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c CollSeq *pColl,
1c360 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 . u8 *prcErr
1c370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c380 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 /* If an OOM
1c390 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 occurs, set to S
1c3a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 QLITE_NOMEM */.)
1c3b0 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 {. if( pMem1->e
1c3c0 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 nc==pColl->enc )
1c3d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 {. /* The str
1c3e0 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 ings are already
1c3f0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 in the correct
1c400 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 encoding. Call
1c410 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 the. ** comp
1c420 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 arison function
1c430 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 directly */.
1c440 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 return pColl->xC
1c450 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c mp(pColl->pUser,
1c460 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e pMem1->n,pMem1->
1c470 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 z,pMem2->n,pMem2
1c480 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 ->z);. }else{.
1c490 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 int rc;. c
1c4a0 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a onst void *v1, *
1c4b0 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 v2;. int n1,
1c4c0 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a n2;. Mem c1;.
1c4d0 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 Mem c2;.
1c4e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e sqlite3VdbeMemIn
1c4f0 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 it(&c1, pMem1->d
1c500 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 b, MEM_Null);.
1c510 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d sqlite3VdbeMem
1c520 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d Init(&c2, pMem1-
1c530 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a >db, MEM_Null);.
1c540 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
1c550 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 emShallowCopy(&c
1c560 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 1, pMem1, MEM_Ep
1c570 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 hem);. sqlite
1c580 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 3VdbeMemShallowC
1c590 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 opy(&c2, pMem2,
1c5a0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 MEM_Ephem);.
1c5b0 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 v1 = sqlite3Valu
1c5c0 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 eText((sqlite3_v
1c5d0 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c alue*)&c1, pColl
1c5e0 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d ->enc);. n1 =
1c5f0 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e v1==0 ? 0 : c1.
1c600 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 n;. v2 = sqli
1c610 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 te3ValueText((sq
1c620 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 lite3_value*)&c2
1c630 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 , pColl->enc);.
1c640 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 n2 = v2==0 ?
1c650 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 0 : c2.n;. rc
1c660 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 = pColl->xCmp(p
1c670 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c Coll->pUser, n1,
1c680 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 v1, n2, v2);.
1c690 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 if( (v1==0 ||
1c6a0 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 v2==0) && prcErr
1c6b0 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c ) *prcErr = SQL
1c6c0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 73 ITE_NOMEM;. s
1c6d0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
1c6e0 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 ease(&c1);. s
1c6f0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c qlite3VdbeMemRel
1c700 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 ease(&c2);. r
1c710 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a eturn rc;. }.}.
1c720 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 ./*.** Compare t
1c730 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 wo blobs. Retur
1c740 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f n negative, zero
1c750 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 , or positive if
1c760 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 the first.** is
1c770 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 less than, equa
1c780 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 l to, or greater
1c790 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 than the second
1c7a0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a , respectively..
1c7b0 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 ** If one blob i
1c7c0 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 s a prefix of th
1c7d0 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 e other, then th
1c7e0 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 e shorter is the
1c7f0 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 lessor..*/.stat
1c800 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 ic SQLITE_NOINLI
1c810 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c NE int sqlite3Bl
1c820 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 obCompare(const
1c830 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 Mem *pB1, const
1c840 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 Mem *pB2){. int
1c850 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d c = memcmp(pB1-
1c860 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d >z, pB2->z, pB1-
1c870 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d >n>pB2->n ? pB2-
1c880 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 >n : pB1->n);.
1c890 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 if( c ) return c
1c8a0 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e ;. return pB1->
1c8b0 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f n - pB2->n;.}../
1c8c0 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 *.** Do a compar
1c8d0 69 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 ison between a 6
1c8e0 34 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 4-bit signed int
1c8f0 65 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 eger and a 64-bi
1c900 74 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 t floating-point
1c910 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 .** number. Ret
1c920 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 urn negative, ze
1c930 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 ro, or positive
1c940 69 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36 if the first (i6
1c950 34 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 4) is less than,
1c960 0a 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 .** equal to, or
1c970 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 greater than th
1c980 65 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 e second (double
1c990 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 )..*/.static int
1c9a0 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 sqlite3IntFloat
1c9b0 43 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 Compare(i64 i, d
1c9c0 6f 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 ouble r){. if(
1c9d0 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c sizeof(LONGDOUBL
1c9e0 45 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 E_TYPE)>8 ){.
1c9f0 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 LONGDOUBLE_TYPE
1ca00 20 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 x = (LONGDOUBLE
1ca10 5f 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 _TYPE)i;. if(
1ca20 20 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 x<r ) return -1
1ca30 3b 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 ;. if( x>r )
1ca40 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 return +1;. r
1ca50 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 eturn 0;. }else
1ca60 7b 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 {. i64 y;.
1ca70 20 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 double s;. i
1ca80 66 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 f( r<-9223372036
1ca90 38 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 854775808.0 ) re
1caa0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 turn +1;. if(
1cab0 20 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 r>9223372036854
1cac0 37 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 775807.0 ) retur
1cad0 6e 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 n -1;. y = (i
1cae0 36 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 64)r;. if( i<
1caf0 79 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 y ) return -1;.
1cb00 20 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 if( i>y ){.
1cb10 20 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c if( y==SMALL
1cb20 45 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 EST_INT64 && r>0
1cb30 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a .0 ) return -1;.
1cb40 20 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b return +1;
1cb50 0a 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 . }. s = (
1cb60 64 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 double)i;. if
1cb70 28 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d ( s<r ) return -
1cb80 31 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 1;. if( s>r )
1cb90 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 return +1;.
1cba0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a return 0;. }.}.
1cbb0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 ./*.** Compare t
1cbc0 68 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 he values contai
1cbd0 6e 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d ned by the two m
1cbe0 65 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 emory cells, ret
1cbf0 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 urning.** negati
1cc00 76 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 ve, zero or posi
1cc10 74 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 tive if pMem1 is
1cc20 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 less than, equa
1cc30 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 l to, or greater
1cc40 0a 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 .** than pMem2.
1cc50 53 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 Sorting order is
1cc60 20 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 NULL's first, f
1cc70 6f 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 ollowed by numbe
1cc80 72 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 rs (integers.**
1cc90 61 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 and reals) sorte
1cca0 64 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 d numerically, f
1ccb0 6f 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 ollowed by text
1ccc0 6f 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 ordered by the c
1ccd0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 ollating.** sequ
1cce0 65 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 ence pColl and f
1ccf0 69 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 inally blob's or
1cd00 64 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 dered by memcmp(
1cd10 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c )..**.** Two NUL
1cd20 4c 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e L values are con
1cd30 73 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 sidered equal by
1cd40 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a this function..
1cd50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 */.int sqlite3Me
1cd60 6d 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d mCompare(const M
1cd70 65 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 em *pMem1, const
1cd80 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e Mem *pMem2, con
1cd90 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c st CollSeq *pCol
1cda0 6c 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 l){. int f1, f2
1cdb0 3b 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 ;. int combined
1cdc0 5f 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 _flags;.. f1 =
1cdd0 70 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 pMem1->flags;.
1cde0 66 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 f2 = pMem2->flag
1cdf0 73 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c s;. combined_fl
1ce00 61 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 ags = f1|f2;. a
1ce10 73 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 ssert( (combined
1ce20 5f 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 _flags & MEM_Row
1ce30 53 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f Set)==0 );. . /
1ce40 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 * If one value i
1ce50 73 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 s NULL, it is le
1ce60 73 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 ss than the othe
1ce70 72 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 r. If both value
1ce80 73 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c s. ** are NULL,
1ce90 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a return 0.. */.
1cea0 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 if( combined_f
1ceb0 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b lags&MEM_Null ){
1cec0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 . return (f2&
1ced0 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 MEM_Null) - (f1&
1cee0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a MEM_Null);. }..
1cef0 20 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e /* At least on
1cf00 65 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c e of the two val
1cf10 75 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a ues is a number.
1cf20 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 */. if( combi
1cf30 6e 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 ned_flags&(MEM_I
1cf40 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a nt|MEM_Real) ){.
1cf50 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 if( (f1 & f2
1cf60 20 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 & MEM_Int)!=0 )
1cf70 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d {. if( pMem
1cf80 31 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 1->u.i < pMem2->
1cf90 75 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b u.i ) return -1;
1cfa0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 . if( pMem1
1cfb0 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 ->u.i > pMem2->u
1cfc0 2e 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a .i ) return +1;.
1cfd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a return 0;.
1cfe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 }. if( (f
1cff0 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 1 & f2 & MEM_Rea
1d000 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 l)!=0 ){. i
1d010 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 f( pMem1->u.r <
1d020 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 pMem2->u.r ) ret
1d030 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 urn -1;. if
1d040 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 ( pMem1->u.r > p
1d050 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 Mem2->u.r ) retu
1d060 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 rn +1;. ret
1d070 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 urn 0;. }.
1d080 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 if( (f1&MEM_Int
1d090 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 )!=0 ){. if
1d0a0 28 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 ( (f2&MEM_Real)!
1d0b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 =0 ){. re
1d0c0 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 turn sqlite3IntF
1d0d0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d loatCompare(pMem
1d0e0 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 1->u.i, pMem2->u
1d0f0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 .r);. }else
1d100 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
1d110 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 -1;. }.
1d120 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d }. if( (f1&M
1d130 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 EM_Real)!=0 ){.
1d140 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d if( (f2&MEM
1d150 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 _Int)!=0 ){.
1d160 20 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 return -sqli
1d170 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 te3IntFloatCompa
1d180 72 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 re(pMem2->u.i, p
1d190 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 Mem1->u.r);.
1d1a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
1d1b0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
1d1c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 }. }. re
1d1d0 74 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 turn +1;. }..
1d1e0 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 /* If one value
1d1f0 69 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 is a string and
1d200 74 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 the other is a b
1d210 6c 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 lob, the string
1d220 69 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 is less.. ** If
1d230 20 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 both are string
1d240 73 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 s, compare using
1d250 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 the collating f
1d260 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 unctions.. */.
1d270 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c if( combined_fl
1d280 61 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 ags&MEM_Str ){.
1d290 20 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d if( (f1 & MEM
1d2a0 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 _Str)==0 ){.
1d2b0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 return 1;.
1d2c0 7d 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 }. if( (f2 &
1d2d0 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 MEM_Str)==0 ){.
1d2e0 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a return -1;.
1d2f0 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 }.. asser
1d300 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 t( pMem1->enc==p
1d310 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 Mem2->enc || pMe
1d320 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 m1->db->mallocFa
1d330 69 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 iled );. asse
1d340 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d rt( pMem1->enc==
1d350 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a SQLITE_UTF8 || .
1d360 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d pMem
1d370 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 1->enc==SQLITE_U
1d380 54 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d TF16LE || pMem1-
1d390 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 >enc==SQLITE_UTF
1d3a0 31 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 16BE );.. /*
1d3b0 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 The collation se
1d3c0 71 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 quence must be d
1d3d0 65 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 efined at this p
1d3e0 6f 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 oint, even if.
1d3f0 20 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 ** the user de
1d400 6c 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 letes the collat
1d410 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 ion sequence aft
1d420 65 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 er the vdbe prog
1d430 72 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f ram is. ** co
1d440 6d 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 mpiled (this was
1d450 20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 not always the
1d460 63 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 case).. */.
1d470 20 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c assert( !pColl
1d480 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 || pColl->xCmp
1d490 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c );.. if( pCol
1d4a0 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 l ){. retur
1d4b0 6e 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d n vdbeCompareMem
1d4c0 53 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d String(pMem1, pM
1d4d0 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a em2, pColl, 0);.
1d4e0 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 }. /* If
1d4f0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 a NULL pointer w
1d500 61 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 as passed as the
1d510 20 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f collate functio
1d520 6e 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a n, fall through.
1d530 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c ** to the bl
1d540 6f 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 ob case and use
1d550 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 memcmp(). */.
1d560 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 }. . /* Both va
1d570 6c 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f lues must be blo
1d580 62 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 bs. Compare usi
1d590 6e 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f ng memcmp(). */
1d5a0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 . return sqlite
1d5b0 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 3BlobCompare(pMe
1d5c0 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a m1, pMem2);.}...
1d5d0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 /*.** The first
1d5e0 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 argument passed
1d5f0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e to this function
1d600 20 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 is a serial-typ
1d610 65 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 e that.** corres
1d620 70 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 ponds to an inte
1d630 67 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 ger - all values
1d640 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 between 1 and 9
1d650 20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 inclusive .** e
1d660 78 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 xcept 7. The sec
1d670 6f 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 ond points to a
1d680 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e buffer containin
1d690 67 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c g an integer val
1d6a0 75 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 ue.** serialized
1d6b0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 according to se
1d6c0 72 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 rial_type. This
1d6d0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 function deseria
1d6e0 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 lizes.** and ret
1d6f0 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a urns the value..
1d700 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 */.static i64 vd
1d710 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e beRecordDecodeIn
1d720 74 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 t(u32 serial_typ
1d730 65 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 e, const u8 *aKe
1d740 79 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 y){. u32 y;. a
1d750 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 ssert( CORRUPT_D
1d760 42 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 B || (serial_typ
1d770 65 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 e>=1 && serial_t
1d780 79 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c ype<=9 && serial
1d790 5f 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 _type!=7) );. s
1d7a0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 witch( serial_ty
1d7b0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 pe ){. case 0
1d7c0 3a 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 :. case 1:.
1d7d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b testcase( aK
1d7e0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 ey[0]&0x80 );.
1d7f0 20 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 return ONE_B
1d800 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 YTE_INT(aKey);.
1d810 20 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 case 2:.
1d820 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b testcase( aKey[
1d830 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 0]&0x80 );.
1d840 20 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 return TWO_BYTE
1d850 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 _INT(aKey);.
1d860 63 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 case 3:. te
1d870 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 stcase( aKey[0]&
1d880 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 0x80 );. re
1d890 74 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f turn THREE_BYTE_
1d8a0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 INT(aKey);. c
1d8b0 61 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 ase 4: {. t
1d8c0 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d estcase( aKey[0]
1d8d0 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 &0x80 );. y
1d8e0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e = FOUR_BYTE_UIN
1d8f0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 T(aKey);. r
1d900 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 eturn (i64)*(int
1d910 2a 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 *)&y;. }.
1d920 63 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 case 5: {.
1d930 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 testcase( aKey[0
1d940 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 ]&0x80 );.
1d950 72 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 return FOUR_BYTE
1d960 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 _UINT(aKey+2) +
1d970 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 (((i64)1)<<32)*T
1d980 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 WO_BYTE_INT(aKey
1d990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 );. }. cas
1d9a0 65 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 e 6: {. u64
1d9b0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 x = FOUR_BYTE_U
1d9c0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 INT(aKey);.
1d9d0 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b testcase( aKey[
1d9e0 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 0]&0x80 );.
1d9f0 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 x = (x<<32) | F
1da00 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b OUR_BYTE_UINT(aK
1da10 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 ey+4);. ret
1da20 75 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 urn (i64)*(i64*)
1da30 26 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 &x;. }. }..
1da40 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f return (serial_
1da50 74 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a type - 8);.}../*
1da60 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
1da70 6e 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 n compares the t
1da80 77 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 wo table rows or
1da90 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a index records.*
1daa0 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b * specified by {
1dab0 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e nKey1, pKey1} an
1dac0 64 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 d pPKey2. It re
1dad0 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 turns a negative
1dae0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 , zero.** or pos
1daf0 69 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 itive integer if
1db00 20 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 key1 is less th
1db10 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 an, equal to or
1db20 0a 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e .** greater than
1db30 20 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 key2. The {nKe
1db40 79 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d y1, pKey1} key m
1db50 75 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a ust be a blob.**
1db60 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 created by the
1db70 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 OP_MakeRecord op
1db80 63 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 code of the VDBE
1db90 2e 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a . The pPKey2.**
1dba0 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 key must be a p
1dbb0 61 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 arsed key such a
1dbc0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a s obtained from.
1dbd0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 ** sqlite3VdbePa
1dbe0 72 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a rseRecord..**.**
1dbf0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b If argument bSk
1dc00 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 ip is non-zero,
1dc10 69 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 it is assumed th
1dc20 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 at the caller ha
1dc30 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 s already.** det
1dc40 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 ermined that the
1dc50 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 first fields of
1dc60 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 the keys are eq
1dc70 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 ual..**.** Key1
1dc80 61 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 and Key2 do not
1dc90 68 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 have to contain
1dca0 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 the same number
1dcb0 6f 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c of fields. If al
1dcc0 6c 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 l .** fields tha
1dcd0 74 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 t appear in both
1dce0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c keys are equal,
1dcf0 20 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 then pPKey2->de
1dd00 66 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 fault_rc is .**
1dd10 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 returned..**.**
1dd20 49 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 If database corr
1dd30 75 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 uption is discov
1dd40 65 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 ered, set pPKey2
1dd50 2d 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a ->errCode to .**
1dd60 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 SQLITE_CORRUPT
1dd70 61 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 and return 0. If
1dd80 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 an OOM error is
1dd90 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a encountered, .*
1dda0 2a 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 * pPKey2->errCod
1ddb0 65 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 e is set to SQLI
1ddc0 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 TE_NOMEM and, if
1ddd0 20 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c it is not NULL,
1dde0 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 the.** malloc-f
1ddf0 61 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f ailed flag set o
1de00 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c n database handl
1de10 65 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 e (pPKey2->pKeyI
1de20 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 nfo->db)..*/.int
1de30 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
1de40 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 rdCompareWithSki
1de50 70 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 p(. int nKey1,
1de60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
1de70 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 1, /* Left key
1de80 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 */. UnpackedRe
1de90 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 cord *pPKey2,
1dea0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b /* Right k
1deb0 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 ey */. int bSki
1dec0 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 p
1ded0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 /* If tr
1dee0 75 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 ue, skip the fir
1def0 73 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 st field */.){.
1df00 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 u32 d1;
1df10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1df20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 /* Offset into
1df30 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 aKey[] of next d
1df40 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 ata element */.
1df50 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 int i;
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1df70 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 /* Index of nex
1df80 74 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 t field to compa
1df90 72 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 re */. u32 szHd
1dfa0 72 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 r1;
1dfb0 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 /* Size
1dfc0 6f 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 of record header
1dfd0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 in bytes */. u
1dfe0 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 32 idx1;
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1e000 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 * Offset of firs
1e010 74 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 t type in header
1e020 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 */. int rc = 0
1e030 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
1e040 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 /* Return
1e050 76 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a value */. Mem *
1e060 70 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 pRhs = pPKey2->a
1e070 4d 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 Mem; /* Ne
1e080 78 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 xt field of pPKe
1e090 79 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f y2 to compare */
1e0a0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 . KeyInfo *pKey
1e0b0 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 Info = pPKey2->p
1e0c0 4b 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 KeyInfo;. const
1e0d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1e0e0 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 aKey1 = (const u
1e0f0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 nsigned char *)p
1e100 4b 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 Key1;. Mem mem1
1e110 3b 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 ;.. /* If bSkip
1e120 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 is true, then t
1e130 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c he caller has al
1e140 72 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 ready determined
1e150 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a that the first.
1e160 20 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 ** two element
1e170 73 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 s in the keys ar
1e180 65 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 e equal. Fix the
1e190 20 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 various stack v
1e1a0 61 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a ariables so. **
1e1b0 20 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 that this routi
1e1c0 6e 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 ne begins compar
1e1d0 69 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e ing at the secon
1e1e0 64 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 d field. */. if
1e1f0 28 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 ( bSkip ){. u
1e200 33 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 32 s1;. idx1
1e210 3d 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 = 1 + getVarint3
1e220 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 2(&aKey1[1], s1)
1e230 3b 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 ;. szHdr1 = a
1e240 4b 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 Key1[0];. d1
1e250 3d 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 = szHdr1 + sqlit
1e260 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
1e270 4c 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d Len(s1);. i =
1e280 20 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 1;. pRhs++;.
1e290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 }else{. idx
1e2a0 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 1 = getVarint32(
1e2b0 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a aKey1, szHdr1);.
1e2c0 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b d1 = szHdr1;
1e2d0 0a 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 . if( d1>(uns
1e2e0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a igned)nKey1 ){ .
1e2f0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 pPKey2->er
1e300 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 rCode = (u8)SQLI
1e310 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b TE_CORRUPT_BKPT;
1e320 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b . return 0;
1e330 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 /* Corruption
1e340 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d */. }. i =
1e350 20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 0;. }.. VVA_O
1e360 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c NLY( mem1.szMall
1e370 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c oc = 0; ) /* Onl
1e380 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 y needed by asse
1e390 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 rt() statements
1e3a0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b */. assert( pPK
1e3b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e ey2->pKeyInfo->n
1e3c0 46 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b Field+pPKey2->pK
1e3d0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e eyInfo->nXField>
1e3e0 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 =pPKey2->nField
1e3f0 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 . || CORRU
1e400 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 PT_DB );. asser
1e410 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 t( pPKey2->pKeyI
1e420 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 nfo->aSortOrder!
1e430 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
1e440 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f pPKey2->pKeyInfo
1e450 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 ->nField>0 );.
1e460 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a assert( idx1<=sz
1e470 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f Hdr1 || CORRUPT_
1e480 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 DB );. do{.
1e490 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b u32 serial_type;
1e4a0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 .. /* RHS is
1e4b0 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 an integer */.
1e4c0 20 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 if( pRhs->flag
1e4d0 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 s & MEM_Int ){.
1e4e0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 serial_type
1e4f0 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a = aKey1[idx1];.
1e500 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1e510 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 serial_type==12
1e520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 );. if( ser
1e530 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a ial_type>=10 ){.
1e540 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b rc = +1;
1e550 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
1e560 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 serial_type==0
1e570 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
1e580 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 -1;. }else
1e590 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d if( serial_type=
1e5a0 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 =7 ){. sq
1e5b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 lite3VdbeSerialG
1e5c0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 et(&aKey1[d1], s
1e5d0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d erial_type, &mem
1e5e0 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 1);. rc =
1e5f0 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 -sqlite3IntFloa
1e600 74 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 tCompare(pRhs->u
1e610 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 .i, mem1.u.r);.
1e620 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
1e630 20 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 i64 lhs = vd
1e640 62 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e beRecordDecodeIn
1e650 74 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 t(serial_type, &
1e660 61 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 aKey1[d1]);.
1e670 20 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 i64 rhs = pR
1e680 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 hs->u.i;.
1e690 20 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a if( lhs<rhs ){.
1e6a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d rc = -
1e6b0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 1;. }else
1e6c0 20 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a if( lhs>rhs ){.
1e6d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b rc = +
1e6e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 1;. }.
1e6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }. }..
1e700 2f 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a /* RHS is real *
1e710 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 /. else if( p
1e720 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d Rhs->flags & MEM
1e730 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 _Real ){. s
1e740 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 erial_type = aKe
1e750 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 y1[idx1];.
1e760 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e if( serial_type>
1e770 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f =10 ){. /
1e780 2a 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 * Serial types 1
1e790 32 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 2 or greater are
1e7a0 20 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f strings and blo
1e7b0 62 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e bs (greater than
1e7c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 . ** numb
1e7d0 65 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 ers). Types 10 a
1e7e0 6e 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e nd 11 are curren
1e7f0 74 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f tly "reserved fo
1e800 72 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 r future .
1e810 20 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 ** use", so it
1e820 20 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 doesn't really
1e830 6d 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20 matter what the
1e840 72 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 results of compa
1e850 72 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 ring. **
1e860 74 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 them to numberic
1e870 20 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f values are. */
1e880 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 . rc = +1
1e890 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 ;. }else if
1e8a0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 ( serial_type==0
1e8b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d ){. rc =
1e8c0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 -1;. }else
1e8d0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
1e8e0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 3VdbeSerialGet(&
1e8f0 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 aKey1[d1], seria
1e900 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a l_type, &mem1);.
1e910 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 if( seri
1e920 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 al_type==7 ){.
1e930 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 if( mem1
1e940 2e 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 .u.r<pRhs->u.r )
1e950 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 {. rc
1e960 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 = -1;.
1e970 20 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e }else if( mem1.
1e980 75 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b u.r>pRhs->u.r ){
1e990 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 . rc
1e9a0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 = +1;.
1e9b0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }. }else{
1e9c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 . rc =
1e9d0 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 sqlite3IntFloatC
1e9e0 6f 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c ompare(mem1.u.i,
1e9f0 20 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 pRhs->u.r);.
1ea00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
1ea10 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 }.. /* RHS
1ea20 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a is a string */.
1ea30 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 else if( pRh
1ea40 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 s->flags & MEM_S
1ea50 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 tr ){. getV
1ea60 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 arint32(&aKey1[i
1ea70 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 dx1], serial_typ
1ea80 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 e);. testca
1ea90 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d se( serial_type=
1eaa0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 =12 );. if(
1eab0 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 serial_type<12
1eac0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
1ead0 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 -1;. }else
1eae0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 if( !(serial_typ
1eaf0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 e & 0x01) ){.
1eb00 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 rc = +1;.
1eb10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1eb20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 mem1.n = (ser
1eb30 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f ial_type - 12) /
1eb40 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 2;. test
1eb50 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e case( (d1+mem1.n
1eb60 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 )==(unsigned)nKe
1eb70 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 y1 );. te
1eb80 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 stcase( (d1+mem1
1eb90 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 .n+1)==(unsigned
1eba0 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 )nKey1 );.
1ebb0 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e if( (d1+mem1.n
1ebc0 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b ) > (unsigned)nK
1ebd0 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ey1 ){.
1ebe0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 pPKey2->errCode
1ebf0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f = (u8)SQLITE_CO
1ec00 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 RRUPT_BKPT;.
1ec10 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 return 0;
1ec20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1ec30 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a * Corruption */.
1ec40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 }else if
1ec50 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c ( pKeyInfo->aCol
1ec60 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 l[i] ){.
1ec70 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 mem1.enc = pKe
1ec80 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 yInfo->enc;.
1ec90 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 mem1.db =
1eca0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 pKeyInfo->db;.
1ecb0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 mem1.fla
1ecc0 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 gs = MEM_Str;.
1ecd0 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d mem1.z =
1ece0 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 (char*)&aKey1[d
1ecf0 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 1];. rc
1ed00 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 = vdbeCompareMe
1ed10 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 mString(.
1ed20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 &mem1, pR
1ed30 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 hs, pKeyInfo->aC
1ed40 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d oll[i], &pPKey2-
1ed50 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 >errCode.
1ed60 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 );. }e
1ed70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 lse{. i
1ed80 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 nt nCmp = MIN(me
1ed90 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a m1.n, pRhs->n);.
1eda0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d rc = m
1edb0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d emcmp(&aKey1[d1]
1edc0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 , pRhs->z, nCmp)
1edd0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 ;. if(
1ede0 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d rc==0 ) rc = mem
1edf0 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 1.n - pRhs->n; .
1ee00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
1ee10 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 }. }.. /*
1ee20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f RHS is a blob */
1ee30 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 . else if( pR
1ee40 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f hs->flags & MEM_
1ee50 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67 65 Blob ){. ge
1ee60 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 tVarint32(&aKey1
1ee70 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 [idx1], serial_t
1ee80 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 ype);. test
1ee90 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 case( serial_typ
1eea0 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 e==12 );. i
1eeb0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 f( serial_type<1
1eec0 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 2 || (serial_typ
1eed0 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 e & 0x01) ){.
1eee0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 rc = -1;.
1eef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1ef00 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28 73 int nStr = (s
1ef10 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 erial_type - 12)
1ef20 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 / 2;. te
1ef30 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 stcase( (d1+nStr
1ef40 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 )==(unsigned)nKe
1ef50 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 y1 );. te
1ef60 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74 72 stcase( (d1+nStr
1ef70 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e +1)==(unsigned)n
1ef80 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 Key1 );.
1ef90 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e 20 if( (d1+nStr) >
1efa0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 (unsigned)nKey1
1efb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b ){. pPK
1efc0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 ey2->errCode = (
1efd0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 u8)SQLITE_CORRUP
1efe0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 T_BKPT;.
1eff0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 return 0;
1f000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
1f010 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 rruption */.
1f020 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
1f030 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 int nCmp =
1f040 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e MIN(nStr, pRhs->
1f050 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 n);. rc
1f060 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 = memcmp(&aKey1
1f070 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e [d1], pRhs->z, n
1f080 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 Cmp);.
1f090 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d if( rc==0 ) rc =
1f0a0 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b nStr - pRhs->n;
1f0b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
1f0c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a }. }.. /*
1f0d0 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a RHS is null */.
1f0e0 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 else{.
1f0f0 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b serial_type = aK
1f100 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 ey1[idx1];.
1f110 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 rc = (serial_ty
1f120 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 pe!=0);. }..
1f130 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a if( rc!=0 ){.
1f140 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e if( pKeyIn
1f150 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 fo->aSortOrder[i
1f160 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 ] ){. rc
1f170 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 = -rc;. }.
1f180 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62 assert( vdb
1f190 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 eRecordCompareDe
1f1a0 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 bug(nKey1, pKey1
1f1b0 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b , pPKey2, rc) );
1f1c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d . assert( m
1f1d0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 em1.szMalloc==0
1f1e0 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 ); /* See comme
1f1f0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 nt below */.
1f200 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 return rc;.
1f210 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20 }.. i++;.
1f220 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20 pRhs++;. d1
1f230 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 += sqlite3VdbeSe
1f240 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 rialTypeLen(seri
1f250 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64 al_type);. id
1f260 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72 x1 += sqlite3Var
1f270 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 intLen(serial_ty
1f280 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 pe);. }while( i
1f290 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a dx1<(unsigned)sz
1f2a0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 Hdr1 && i<pPKey2
1f2b0 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d ->nField && d1<=
1f2c0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 (unsigned)nKey1
1f2d0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f );.. /* No memo
1f2e0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 ry allocation is
1f2f0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 ever used on me
1f300 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 m1. Prove this
1f310 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 using. ** the f
1f320 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 ollowing assert(
1f330 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72 ). If the asser
1f340 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e t() fails, it in
1f350 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d dicates a. ** m
1f360 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 emory leak and a
1f370 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 need to call sq
1f380 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
1f390 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a ase(&mem1). */.
1f3a0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 assert( mem1.s
1f3b0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 zMalloc==0 );..
1f3c0 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d /* rc==0 here m
1f3d0 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72 eans that one or
1f3e0 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79 both of the key
1f3f0 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 s ran out of fie
1f400 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c lds and. ** all
1f410 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 the fields up t
1f420 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 o that point wer
1f430 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 e equal. Return
1f440 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 the default_rc.
1f450 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 ** value. */.
1f460 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54 assert( CORRUPT
1f470 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76 _DB . || v
1f480 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1f490 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 Debug(nKey1, pKe
1f4a0 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65 y1, pPKey2, pPKe
1f4b0 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20 y2->default_rc)
1f4c0 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49 . || pKeyI
1f4d0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 nfo->db->mallocF
1f4e0 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b ailed. );. pPK
1f4f0 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b ey2->eqSeen = 1;
1f500 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32 . return pPKey2
1f510 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a ->default_rc;.}.
1f520 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 int sqlite3VdbeR
1f530 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20 ecordCompare(.
1f540 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 int nKey1, const
1f550 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 void *pKey1,
1f560 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 /* Left key */.
1f570 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
1f580 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20 *pPKey2
1f590 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f /* Right key */
1f5a0 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c .){. return sql
1f5b0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
1f5c0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b mpareWithSkip(nK
1f5d0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 ey1, pKey1, pPKe
1f5e0 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a y2, 0);.}.../*.*
1f5f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
1f600 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 is an optimized
1f610 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 version of sqlit
1f620 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e3VdbeRecordComp
1f630 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 are() .** that (
1f640 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 a) the first fie
1f650 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 ld of pPKey2 is
1f660 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20 an integer, and
1f670 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65 (b) the .** size
1f680 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e -of-header varin
1f690 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f t at the start o
1f6a0 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 f (pKey1/nKey1)
1f6b0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 fits in a single
1f6c0 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69 .** byte (i.e. i
1f6d0 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29 s less than 128)
1f6e0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 ..**.** To avoid
1f6f0 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20 concerns about
1f700 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 buffer overreads
1f710 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 , this routine i
1f720 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f s only used.** o
1f730 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20 n schemas where
1f740 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69 the maximum vali
1f750 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 d header size is
1f760 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73 63 bytes or les
1f770 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 s..*/.static int
1f780 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 vdbeRecordCompa
1f790 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65 reInt(. int nKe
1f7a0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a y1, const void *
1f7b0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b pKey1, /* Left k
1f7c0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 ey */. Unpacked
1f7d0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 Record *pPKey2
1f7e0 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b /* Right k
1f7f0 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 ey */.){. const
1f800 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63 u8 *aKey = &((c
1f810 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b onst u8*)pKey1)[
1f820 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 *(const u8*)pKey
1f830 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74 1 & 0x3F];. int
1f840 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28 serial_type = (
1f850 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 (const u8*)pKey1
1f860 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b )[1];. int res;
1f870 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20 . u32 y;. u64
1f880 78 3b 0a 20 20 69 36 34 20 76 20 3d 20 70 50 4b x;. i64 v = pPK
1f890 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 ey2->aMem[0].u.i
1f8a0 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a 20 20 ;. i64 lhs;..
1f8b0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 vdbeAssertFieldC
1f8c0 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 ountWithinLimits
1f8d0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 (nKey1, pKey1, p
1f8e0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 PKey2->pKeyInfo)
1f8f0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a 28 75 ;. assert( (*(u
1f900 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33 46 20 8*)pKey1)<=0x3F
1f910 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b || CORRUPT_DB );
1f920 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 . switch( seria
1f930 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 l_type ){. ca
1f940 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 se 1: { /* 1-byt
1f950 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 e signed integer
1f960 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 */. lhs =
1f970 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 ONE_BYTE_INT(aKe
1f980 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 y);. testca
1f990 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 se( lhs<0 );.
1f9a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
1f9b0 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a case 2: { /*
1f9c0 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 2-byte signed i
1f9d0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 nteger */.
1f9e0 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 lhs = TWO_BYTE_I
1f9f0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 NT(aKey);.
1fa00 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 testcase( lhs<0
1fa10 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a );. break;.
1fa20 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 }. case 3
1fa30 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 : { /* 3-byte si
1fa40 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a gned integer */.
1fa50 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48 52 45 lhs = THRE
1fa60 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 E_BYTE_INT(aKey)
1fa70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
1fa80 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 ( lhs<0 );.
1fa90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
1faa0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 case 4: { /* 4
1fab0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 -byte signed int
1fac0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 79 20 eger */. y
1fad0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 = FOUR_BYTE_UINT
1fae0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 6c 68 (aKey);. lh
1faf0 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 s = (i64)*(int*)
1fb00 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 &y;. testca
1fb10 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 se( lhs<0 );.
1fb20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
1fb30 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a case 5: { /*
1fb40 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6-byte signed i
1fb50 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 nteger */.
1fb60 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f lhs = FOUR_BYTE_
1fb70 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 UINT(aKey+2) + (
1fb80 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 ((i64)1)<<32)*TW
1fb90 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 O_BYTE_INT(aKey)
1fba0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
1fbb0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 ( lhs<0 );.
1fbc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
1fbd0 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a 20 38 case 6: { /* 8
1fbe0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 -byte signed int
1fbf0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 78 20 eger */. x
1fc00 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 = FOUR_BYTE_UINT
1fc10 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 78 20 (aKey);. x
1fc20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 = (x<<32) | FOUR
1fc30 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b _BYTE_UINT(aKey+
1fc40 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 4);. lhs =
1fc50 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 20 *(i64*)&x;.
1fc60 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 testcase( lhs<0
1fc70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b );. break;
1fc80 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
1fc90 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 8: . lhs =
1fca0 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0;. break;.
1fcb0 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 case 9:.
1fcc0 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20 20 20 lhs = 1;.
1fcd0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 break;.. /*
1fce0 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c 64 20 This case could
1fcf0 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74 68 6f be removed witho
1fd00 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 ut changing the
1fd10 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e 6e 69 results of runni
1fd20 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 63 ng. ** this c
1fd30 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67 20 69 ode. Including i
1fd40 74 20 63 61 75 73 65 73 20 67 63 63 20 74 6f 20 t causes gcc to
1fd50 67 65 6e 65 72 61 74 65 20 61 20 66 61 73 74 65 generate a faste
1fd60 72 20 73 77 69 74 63 68 20 0a 20 20 20 20 2a 2a r switch . **
1fd70 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69 6e 63 statement (sinc
1fd80 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 73 e the range of s
1fd90 77 69 74 63 68 20 74 61 72 67 65 74 73 20 6e 6f witch targets no
1fda0 77 20 73 74 61 72 74 73 20 61 74 20 7a 65 72 6f w starts at zero
1fdb0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73 20 63 and. ** is c
1fdc0 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74 20 64 ontiguous) but d
1fdd0 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e oes not cause an
1fde0 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f 64 65 y duplicate code
1fdf0 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 to be generated
1fe00 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63 63 20 . ** (as gcc
1fe10 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75 67 68 is clever enough
1fe20 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68 65 20 to combine the
1fe30 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73 29 2e two like cases).
1fe40 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a 20 63 Other . ** c
1fe50 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74 20 62 ompilers might b
1fe60 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a e similar. */ .
1fe70 20 20 20 20 63 61 73 65 20 30 3a 20 63 61 73 65 case 0: case
1fe80 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 7:. return
1fe90 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
1fea0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c rdCompare(nKey1,
1feb0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b pKey1, pPKey2);
1fec0 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 .. default:.
1fed0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 return sqli
1fee0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d te3VdbeRecordCom
1fef0 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 pare(nKey1, pKey
1ff00 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 1, pPKey2);. }.
1ff10 0a 20 20 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a . if( v>lhs ){.
1ff20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 res = pPKey2
1ff30 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 ->r1;. }else if
1ff40 28 20 76 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 ( v<lhs ){. r
1ff50 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b es = pPKey2->r2;
1ff60 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 4b . }else if( pPK
1ff70 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b ey2->nField>1 ){
1ff80 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 . /* The firs
1ff90 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 t fields of the
1ffa0 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 two keys are equ
1ffb0 61 6c 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 al. Compare the
1ffc0 74 72 61 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a trailing . **
1ffd0 20 66 69 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 fields. */.
1ffe0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 res = sqlite3Vd
1fff0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 beRecordCompareW
20000 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 ithSkip(nKey1, p
20010 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 Key1, pPKey2, 1)
20020 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f ;. }else{. /
20030 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c * The first fiel
20040 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 ds of the two ke
20050 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 ys are equal and
20060 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74 72 there are no tr
20070 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 ailing. ** fi
20080 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50 4b elds. Return pPK
20090 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 ey2->default_rc
200a0 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a 2f in this case. */
200b0 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 . res = pPKey
200c0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 2->default_rc;.
200d0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 pPKey2->eqSee
200e0 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 n = 1;. }.. as
200f0 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 sert( vdbeRecord
20100 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 CompareDebug(nKe
20110 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 y1, pKey1, pPKey
20120 32 2c 20 72 65 73 29 20 29 3b 0a 20 20 72 65 74 2, res) );. ret
20130 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a urn res;.}../*.*
20140 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
20150 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 is an optimized
20160 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 version of sqlit
20170 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e3VdbeRecordComp
20180 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 are() .** that (
20190 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 a) the first fie
201a0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20 ld of pPKey2 is
201b0 61 20 73 74 72 69 6e 67 2c 20 74 68 61 74 20 28 a string, that (
201c0 62 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65 b) the first fie
201d0 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 63 ld.** uses the c
201e0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 ollation sequenc
201f0 65 20 42 49 4e 41 52 59 20 61 6e 64 20 28 63 29 e BINARY and (c)
20200 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f that the size-o
20210 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 f-header varint
20220 0a 2a 2a 20 61 74 20 74 68 65 20 73 74 61 72 74 .** at the start
20230 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 of (pKey1/nKey1
20240 29 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 ) fits in a sing
20250 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 le byte..*/.stat
20260 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 ic int vdbeRecor
20270 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 0a dCompareString(.
20280 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e int nKey1, con
20290 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 st void *pKey1,
202a0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 /* Left key */.
202b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
202c0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f *pPKey2 /
202d0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 * Right key */.)
202e0 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b {. const u8 *aK
202f0 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a ey1 = (const u8*
20300 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 )pKey1;. int se
20310 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 rial_type;. int
20320 20 72 65 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 res;.. assert(
20330 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d pPKey2->aMem[0]
20340 2e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 .flags & MEM_Str
20350 20 29 3b 0a 20 20 76 64 62 65 41 73 73 65 72 74 );. vdbeAssert
20360 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e FieldCountWithin
20370 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b Limits(nKey1, pK
20380 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 ey1, pPKey2->pKe
20390 79 49 6e 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 yInfo);. getVar
203a0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c int32(&aKey1[1],
203b0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 serial_type);.
203c0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 if( serial_type
203d0 3c 31 32 20 29 7b 0a 20 20 20 20 72 65 73 20 3d <12 ){. res =
203e0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 pPKey2->r1;
203f0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 /* (pKey1/nKey
20400 31 29 20 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 1) is a number o
20410 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 r a null */. }e
20420 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c lse if( !(serial
20430 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b _type & 0x01) ){
20440 20 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 . res = pPKe
20450 79 32 2d 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 y2->r2; /*
20460 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 (pKey1/nKey1) is
20470 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c a blob */. }el
20480 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 se{. int nCmp
20490 3b 0a 20 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a ;. int nStr;.
204a0 20 20 20 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 int szHdr =
204b0 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e aKey1[0];.. n
204c0 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 Str = (serial_ty
204d0 70 65 2d 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 pe-12) / 2;.
204e0 69 66 28 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 if( (szHdr + nSt
204f0 72 29 20 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 r) > nKey1 ){.
20500 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 pPKey2->errC
20510 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 ode = (u8)SQLITE
20520 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 _CORRUPT_BKPT;.
20530 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 return 0;
20540 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 /* Corruption
20550 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d */. }. nCm
20560 70 20 3d 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d p = MIN( pPKey2-
20570 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 >aMem[0].n, nStr
20580 20 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 );. res = me
20590 6d 63 6d 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 mcmp(&aKey1[szHd
205a0 72 5d 2c 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d r], pPKey2->aMem
205b0 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 [0].z, nCmp);..
205c0 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b if( res==0 ){
205d0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 6e 53 74 . res = nSt
205e0 72 20 2d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d r - pPKey2->aMem
205f0 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 [0].n;. if(
20600 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 res==0 ){.
20610 20 20 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e if( pPKey2->n
20620 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 Field>1 ){.
20630 20 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74 res = sqlit
20640 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e3VdbeRecordComp
20650 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 areWithSkip(nKey
20660 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 1, pKey1, pPKey2
20670 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 , 1);. }e
20680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 lse{. r
20690 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 es = pPKey2->def
206a0 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 ault_rc;.
206b0 20 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 pPKey2->eqSee
206c0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d n = 1;. }
206d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
206e0 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 res>0 ){.
206f0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e res = pPKey2->
20700 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b r2;. }else{
20710 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 . res = p
20720 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 PKey2->r1;.
20730 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }. }else if(
20740 20 72 65 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 res>0 ){.
20750 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 res = pPKey2->r2
20760 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
20770 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d res = pPKey2-
20780 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a >r1;. }. }..
20790 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 assert( vdbeRe
207a0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 cordCompareDebug
207b0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 (nKey1, pKey1, p
207c0 50 4b 65 79 32 2c 20 72 65 73 29 0a 20 20 20 20 PKey2, res).
207d0 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 || CORRUPT_DB
207e0 0a 20 20 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 . || pPKey
207f0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 2->pKeyInfo->db-
20800 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 >mallocFailed.
20810 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b );. return res;
20820 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
20830 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e a pointer to an
20840 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f sqlite3VdbeReco
20850 72 64 43 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 rdCompare() comp
20860 61 74 69 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a atible function.
20870 2a 2a 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 ** suitable for
20880 63 6f 6d 70 61 72 69 6e 67 20 73 65 72 69 61 6c comparing serial
20890 69 7a 65 64 20 72 65 63 6f 72 64 73 20 74 6f 20 ized records to
208a0 74 68 65 20 75 6e 70 61 63 6b 65 64 20 72 65 63 the unpacked rec
208b0 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 ord passed.** as
208c0 20 74 68 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 the only argume
208d0 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d nt..*/.RecordCom
208e0 70 61 72 65 20 73 71 6c 69 74 65 33 56 64 62 65 pare sqlite3Vdbe
208f0 46 69 6e 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 FindCompare(Unpa
20900 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a ckedRecord *p){.
20910 20 20 2f 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 /* varintRecor
20920 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e dCompareInt() an
20930 64 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f d varintRecordCo
20940 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 62 6f mpareString() bo
20950 74 68 20 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 th assume. ** t
20960 68 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d hat the size-of-
20970 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 74 68 header varint th
20980 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 at occurs at the
20990 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 20 72 start of each r
209a0 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 ecord. ** fits
209b0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 in a single byte
209c0 20 28 69 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 (i.e. is 127 or
209d0 20 6c 65 73 73 29 2e 20 76 61 72 69 6e 74 52 65 less). varintRe
209e0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 cordCompareInt()
209f0 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d . ** also assum
20a00 65 73 20 74 68 61 74 20 69 74 20 69 73 20 73 61 es that it is sa
20a10 66 65 20 74 6f 20 6f 76 65 72 72 65 61 64 20 61 fe to overread a
20a20 20 62 75 66 66 65 72 20 62 79 20 61 74 20 6c 65 buffer by at le
20a30 61 73 74 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 ast the . ** ma
20a40 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c ximum possible l
20a50 65 67 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65 egal header size
20a60 20 70 6c 75 73 20 38 20 62 79 74 65 73 2e 20 42 plus 8 bytes. B
20a70 65 63 61 75 73 65 20 74 68 65 72 65 20 69 73 0a ecause there is.
20a80 20 20 2a 2a 20 67 75 61 72 61 6e 74 65 65 64 20 ** guaranteed
20a90 74 6f 20 62 65 20 61 74 20 6c 65 61 73 74 20 37 to be at least 7
20aa0 34 20 28 62 75 74 20 6e 6f 74 20 31 33 36 29 20 4 (but not 136)
20ab0 62 79 74 65 73 20 6f 66 20 70 61 64 64 69 6e 67 bytes of padding
20ac0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a following each.
20ad0 20 20 2a 2a 20 62 75 66 66 65 72 20 70 61 73 73 ** buffer pass
20ae0 65 64 20 74 6f 20 76 61 72 69 6e 74 52 65 63 6f ed to varintReco
20af0 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 rdCompareInt() t
20b00 68 69 73 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e his makes it con
20b10 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 venient to. **
20b20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a 65 20 6f limit the size o
20b30 66 20 74 68 65 20 68 65 61 64 65 72 20 74 6f 20 f the header to
20b40 36 34 20 62 79 74 65 73 20 69 6e 20 63 61 73 65 64 bytes in case
20b50 73 20 77 68 65 72 65 20 74 68 65 20 66 69 72 73 s where the firs
20b60 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 t field. ** is
20b70 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a an integer.. **
20b80 0a 20 20 2a 2a 20 54 68 65 20 65 61 73 69 65 73 . ** The easies
20b90 74 20 77 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 t way to enforce
20ba0 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20 74 this limit is t
20bb0 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 o consider only
20bc0 72 65 63 6f 72 64 73 20 77 69 74 68 0a 20 20 2a records with. *
20bd0 2a 20 31 33 20 66 69 65 6c 64 73 20 6f 72 20 6c * 13 fields or l
20be0 65 73 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 ess. If the firs
20bf0 74 20 66 69 65 6c 64 20 69 73 20 61 6e 20 69 6e t field is an in
20c00 74 65 67 65 72 2c 20 74 68 65 20 6d 61 78 69 6d teger, the maxim
20c10 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 um legal. ** he
20c20 61 64 65 72 20 73 69 7a 65 20 69 73 20 28 31 32 ader size is (12
20c30 2a 35 20 2b 20 31 20 2b 20 31 29 20 62 79 74 65 *5 + 1 + 1) byte
20c40 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d s. */. if( (p-
20c50 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c >pKeyInfo->nFiel
20c60 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d d + p->pKeyInfo-
20c70 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b >nXField)<=13 ){
20c80 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d . int flags =
20c90 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 p->aMem[0].flag
20ca0 73 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4b s;. if( p->pK
20cb0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 eyInfo->aSortOrd
20cc0 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 er[0] ){. p
20cd0 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 ->r1 = 1;.
20ce0 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 p->r2 = -1;.
20cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e }else{. p->
20d00 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 r1 = -1;. p
20d10 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a ->r2 = 1;. }.
20d20 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 if( (flags &
20d30 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 MEM_Int) ){.
20d40 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 return vdbeRe
20d50 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a cordCompareInt;.
20d60 20 20 20 20 7d 0a 20 20 20 20 74 65 73 74 63 61 }. testca
20d70 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f se( flags & MEM_
20d80 52 65 61 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 Real );. test
20d90 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 case( flags & ME
20da0 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 M_Null );. te
20db0 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 stcase( flags &
20dc0 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 MEM_Blob );.
20dd0 69 66 28 20 28 66 6c 61 67 73 20 26 20 28 4d 45 if( (flags & (ME
20de0 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c M_Real|MEM_Null|
20df0 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 MEM_Blob))==0 &&
20e00 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 p->pKeyInfo->aC
20e10 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 oll[0]==0 ){.
20e20 20 20 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 assert( flags
20e30 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 & MEM_Str );.
20e40 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 52 return vdbeR
20e50 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 ecordCompareStri
20e60 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 ng;. }. }..
20e70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
20e80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
20e90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 ;.}../*.** pCur
20ea0 70 6f 69 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 points at an ind
20eb0 65 78 20 65 6e 74 72 79 20 63 72 65 61 74 65 64 ex entry created
20ec0 20 75 73 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 using the OP_Ma
20ed0 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e keRecord opcode.
20ee0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 72 6f 77 .** Read the row
20ef0 69 64 20 28 74 68 65 20 6c 61 73 74 20 66 69 65 id (the last fie
20f00 6c 64 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 ld in the record
20f10 29 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20 69 ) and store it i
20f20 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 n *rowid..** Ret
20f30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 urn SQLITE_OK if
20f40 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b everything work
20f50 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 s, or an error c
20f60 6f 64 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a ode otherwise..*
20f70 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67 68 74 20 *.** pCur might
20f80 62 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 be pointing to t
20f90 65 78 74 20 6f 62 74 61 69 6e 65 64 20 66 72 6f ext obtained fro
20fa0 6d 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 m a corrupt data
20fb0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f base file..** So
20fc0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e the content can
20fd0 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 not be trusted.
20fe0 20 44 6f 20 61 70 70 72 6f 70 72 69 61 74 65 20 Do appropriate
20ff0 63 68 65 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f checks on the co
21000 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 ntent..*/.int sq
21010 6c 69 74 65 33 56 64 62 65 49 64 78 52 6f 77 69 lite3VdbeIdxRowi
21020 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 d(sqlite3 *db, B
21030 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 tCursor *pCur, i
21040 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 64 *rowid){. i6
21050 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 4 nCellKey = 0;.
21060 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 int rc;. u32
21070 73 7a 48 64 72 3b 20 20 20 20 20 20 20 20 2f 2a szHdr; /*
21080 20 53 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 Size of the hea
21090 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 der */. u32 typ
210a0 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 eRowid; /* Se
210b0 72 69 61 6c 20 74 79 70 65 20 6f 66 20 74 68 65 rial type of the
210c0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 rowid */. u32
210d0 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a lenRowid; /*
210e0 20 53 69 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 Size of the row
210f0 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 id */. Mem m, v
21100 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 ;.. /* Get the
21110 73 69 7a 65 20 6f 66 20 74 68 65 20 69 6e 64 65 size of the inde
21120 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 x entry. Only i
21130 6e 64 69 63 65 73 20 65 6e 74 72 69 65 73 20 6f ndices entries o
21140 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e f less. ** than
21150 20 32 47 69 42 20 61 72 65 20 73 75 70 70 6f 72 2GiB are suppor
21160 74 20 2d 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 t - anything lar
21170 67 65 20 6d 75 73 74 20 62 65 20 64 61 74 61 62 ge must be datab
21180 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a ase corruption..
21190 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 ** Any corrupt
211a0 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 ion is detected
211b0 69 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 in sqlite3BtreeP
211c0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 arseCellPtr(), t
211d0 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 hough, so. ** t
211e0 68 69 73 20 63 6f 64 65 20 63 61 6e 20 73 61 66 his code can saf
211f0 65 6c 79 20 61 73 73 75 6d 65 20 74 68 61 74 20 ely assume that
21200 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 nCellKey is 32-b
21210 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 its . */. ass
21220 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 ert( sqlite3Btre
21230 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 eCursorIsValid(p
21240 43 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e Cur) );. VVA_ON
21250 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 LY(rc =) sqlite3
21260 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 BtreeKeySize(pCu
21270 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 r, &nCellKey);.
21280 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c assert( rc==SQL
21290 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 20 2f 2a ITE_OK ); /*
212a0 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 pCur is always
212b0 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 valid so KeySize
212c0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a cannot fail */.
212d0 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c assert( (nCell
212e0 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 Key & SQLITE_MAX
212f0 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c _U32)==(u64)nCel
21300 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 lKey );.. /* Re
21310 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 ad in the comple
21320 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 te content of th
21330 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f e index entry */
21340 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 . sqlite3VdbeMe
21350 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 mInit(&m, db, 0)
21360 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 ;. rc = sqlite3
21370 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 VdbeMemFromBtree
21380 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e (pCur, 0, (u32)n
21390 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b CellKey, 1, &m);
213a0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 . if( rc ){.
213b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a return rc;. }.
213c0 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 . /* The index
213d0 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e entry must begin
213e0 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20 73 with a header s
213f0 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 ize */. (void)g
21400 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 etVarint32((u8*)
21410 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 m.z, szHdr);. t
21420 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d estcase( szHdr==
21430 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 3 );. testcase(
21440 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 szHdr==m.n );.
21450 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a if( unlikely(sz
21460 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a Hdr<3 || (int)sz
21470 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 Hdr>m.n) ){.
21480 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 goto idx_rowid_c
21490 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a orruption;. }..
214a0 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 /* The last fi
214b0 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 eld of the index
214c0 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e should be an in
214d0 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 teger - the ROWI
214e0 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 D.. ** Verify t
214f0 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 hat the last ent
21500 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 ry really is an
21510 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 integer. */. (v
21520 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 oid)getVarint32(
21530 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d (u8*)&m.z[szHdr-
21540 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 1], typeRowid);.
21550 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
21560 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 Rowid==1 );. te
21570 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
21580 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 d==2 );. testca
21590 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 se( typeRowid==3
215a0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
215b0 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a typeRowid==4 );.
215c0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
215d0 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 Rowid==5 );. te
215e0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
215f0 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 d==6 );. testca
21600 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 se( typeRowid==8
21610 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
21620 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a typeRowid==9 );.
21630 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 if( unlikely(t
21640 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 ypeRowid<1 || ty
21650 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 peRowid>9 || typ
21660 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 eRowid==7) ){.
21670 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 goto idx_rowid
21680 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d _corruption;. }
21690 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 . lenRowid = sq
216a0 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 lite3SmallTypeSi
216b0 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a zes[typeRowid];.
216c0 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33 32 testcase( (u32
216d0 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 )m.n==szHdr+lenR
216e0 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e owid );. if( un
216f0 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c likely((u32)m.n<
21700 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 szHdr+lenRowid)
21710 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f ){. goto idx_
21720 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e rowid_corruption
21730 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 ;. }.. /* Fetc
21740 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 h the integer of
21750 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 f the end of the
21760 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f index record */
21770 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 . sqlite3VdbeSe
21780 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e rialGet((u8*)&m.
21790 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c z[m.n-lenRowid],
217a0 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b typeRowid, &v);
217b0 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e . *rowid = v.u.
217c0 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 i;. sqlite3Vdbe
217d0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a MemRelease(&m);.
217e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f return SQLITE_
217f0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 OK;.. /* Jump h
21800 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65 20 ere if database
21810 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 corruption is de
21820 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 tected after m h
21830 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c as been. ** all
21840 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 ocated. Free th
21850 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 e m object and r
21860 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 eturn SQLITE_COR
21870 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 RUPT. */.idx_row
21880 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 id_corruption:.
21890 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d testcase( m.szM
218a0 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 alloc!=0 );. sq
218b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
218c0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 ase(&m);. retur
218d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 n SQLITE_CORRUPT
218e0 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 _BKPT;.}../*.**
218f0 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 Compare the key
21900 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 of the index ent
21910 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 ry that cursor p
21920 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f C is pointing to
21930 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 against.** the
21940 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 key string in pU
21950 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 npacked. Write
21960 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d into *pRes a num
21970 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e ber.** that is n
21980 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f egative, zero, o
21990 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 r positive if pC
219a0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 is less than, e
219b0 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 qual to,.** or g
219c0 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 reater than pUnp
219d0 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 acked. Return S
219e0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 QLITE_OK on succ
219f0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 ess..**.** pUnpa
21a00 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20 63 cked is either c
21a10 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 reated without a
21a20 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 rowid or is tru
21a30 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 ncated so that i
21a40 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 t.** omits the r
21a50 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e owid at the end.
21a60 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 The rowid at t
21a70 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e he end of the in
21a80 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 dex entry.** is
21a90 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e ignored as well.
21aa0 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f Hence, this ro
21ab0 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 utine only compa
21ac0 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65 73 res the prefixes
21ad0 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 .** of the keys
21ae0 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 prior to the fi
21af0 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 nal rowid, not t
21b00 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a he entire key..*
21b10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
21b20 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a eIdxKeyCompare(.
21b30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 sqlite3 *db,
21b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21b50 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 /* Database c
21b60 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 onnection */. V
21b70 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 dbeCursor *pC,
21b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21b90 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f /* The cursor to
21ba0 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 compare against
21bb0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 */. UnpackedRe
21bc0 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c cord *pUnpacked,
21bd0 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b /* Unpack
21be0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 ed version of ke
21bf0 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 y */. int *res
21c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21c10 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 /* Write
21c20 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 the comparison
21c30 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 result here */.)
21c40 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 {. i64 nCellKey
21c50 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a = 0;. int rc;.
21c60 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 BtCursor *pCur
21c70 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 ;. Mem m;.. as
21c80 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 sert( pC->eCurTy
21c90 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 pe==CURTYPE_BTRE
21ca0 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 E );. pCur = pC
21cb0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 ->uc.pCursor;.
21cc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 assert( sqlite3B
21cd0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 treeCursorIsVali
21ce0 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41 d(pCur) );. VVA
21cf0 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69 _ONLY(rc =) sqli
21d00 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 te3BtreeKeySize(
21d10 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 pCur, &nCellKey)
21d20 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d ;. assert( rc==
21d30 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20 SQLITE_OK );
21d40 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61 79 /* pCur is alway
21d50 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53 69 s valid so KeySi
21d60 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 2a ze cannot fail *
21d70 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 /. /* nCellKey
21d80 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 will always be b
21d90 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 etween 0 and 0xf
21da0 66 66 66 66 66 66 66 20 62 65 63 61 75 73 65 20 fffffff because
21db0 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 of the way. **
21dc0 74 68 61 74 20 62 74 72 65 65 50 61 72 73 65 43 that btreeParseC
21dd0 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c ellPtr() and sql
21de0 69 74 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 ite3GetVarint32(
21df0 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 ) are implemente
21e00 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c d */. if( nCell
21e10 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b Key<=0 || nCellK
21e20 65 79 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b ey>0x7fffffff ){
21e30 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 . *res = 0;.
21e40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
21e50 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 _CORRUPT_BKPT;.
21e60 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 }. sqlite3Vdbe
21e70 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 MemInit(&m, db,
21e80 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 0);. rc = sqlit
21e90 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 e3VdbeMemFromBtr
21ea0 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 ee(pCur, 0, (u32
21eb0 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d )nCellKey, 1, &m
21ec0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 );. if( rc ){.
21ed0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
21ee0 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 }. *res = sqlit
21ef0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 e3VdbeRecordComp
21f00 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 are(m.n, m.z, pU
21f10 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 npacked);. sqli
21f20 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 te3VdbeMemReleas
21f30 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 e(&m);. return
21f40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a SQLITE_OK;.}../*
21f50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
21f60 20 73 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 sets the value
21f70 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 to be returned b
21f80 79 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c y subsequent cal
21f90 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 ls to.** sqlite3
21fa0 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 _changes() on th
21fb0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c e database handl
21fc0 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 e 'db'. .*/.void
21fd0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 sqlite3VdbeSetC
21fe0 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a hanges(sqlite3 *
21ff0 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 db, int nChange)
22000 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 {. assert( sqli
22010 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 te3_mutex_held(d
22020 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 b->mutex) );. d
22030 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 b->nChange = nCh
22040 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 ange;. db->nTot
22050 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 alChange += nCha
22060 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 nge;.}../*.** Se
22070 74 20 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 t a flag in the
22080 76 64 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 vdbe to update t
22090 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 he change counte
220a0 72 20 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e r when it is fin
220b0 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 alised.** or res
220c0 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 et..*/.void sqli
220d0 74 65 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e te3VdbeCountChan
220e0 67 65 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 ges(Vdbe *v){.
220f0 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d v->changeCntOn =
22100 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 1;.}../*.** Mar
22110 6b 20 65 76 65 72 79 20 70 72 65 70 61 72 65 64 k every prepared
22120 20 73 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 statement assoc
22130 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 iated with a dat
22140 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e abase connection
22150 0a 2a 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a .** as expired..
22160 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 **.** An expired
22170 20 73 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 statement means
22180 20 74 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 that recompilat
22190 69 6f 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 ion of the state
221a0 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d ment is.** recom
221b0 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 mend. Statement
221c0 73 20 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 s expire when th
221d0 69 6e 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 ings happen that
221e0 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 make their.** p
221f0 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 rograms obsolete
22200 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 . Removing user
22210 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f -defined functio
22220 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a ns or collating.
22230 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 ** sequences, or
22240 20 63 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 changing an aut
22250 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 horization funct
22260 69 6f 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 ion are the type
22270 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 s of.** things t
22280 68 61 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 hat make prepare
22290 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 d statements obs
222a0 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 olete..*/.void s
222b0 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 qlite3ExpirePrep
222c0 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 aredStatements(s
222d0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 qlite3 *db){. V
222e0 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 dbe *p;. for(p
222f0 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 = db->pVdbe; p;
22300 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 p=p->pNext){.
22310 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b p->expired = 1;
22320 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 . }.}../*.** Re
22330 74 75 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 turn the databas
22340 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 e associated wit
22350 68 20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 h the Vdbe..*/.s
22360 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 qlite3 *sqlite3V
22370 64 62 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a dbeDb(Vdbe *v){.
22380 20 20 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a return v->db;.
22390 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 }../*.** Return
223a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 a pointer to an
223b0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 sqlite3_value st
223c0 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 ructure containi
223d0 6e 67 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 ng the value bou
223e0 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 nd.** parameter
223f0 69 56 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 iVar of VM v. Ex
22400 63 65 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c cept, if the val
22410 75 65 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c ue is an SQL NUL
22420 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 L, return .** 0
22430 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 instead. Unless
22440 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c it is NULL, appl
22450 79 20 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 y affinity aff (
22460 6f 6e 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 one of the SQLIT
22470 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 E_AFF_*.** const
22480 61 6e 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c ants) to the val
22490 75 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e ue before return
224a0 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 ing it..**.** Th
224b0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 e returned value
224c0 20 6d 75 73 74 20 62 65 20 66 72 65 65 64 20 62 must be freed b
224d0 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 y the caller usi
224e0 6e 67 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 ng sqlite3ValueF
224f0 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 ree()..*/.sqlite
22500 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 3_value *sqlite3
22510 56 64 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 VdbeGetBoundValu
22520 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 e(Vdbe *v, int i
22530 56 61 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 Var, u8 aff){.
22540 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 assert( iVar>0 )
22550 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 ;. if( v ){.
22560 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d Mem *pMem = &v-
22570 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 >aVar[iVar-1];.
22580 20 20 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d if( 0==(pMem-
22590 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c >flags & MEM_Nul
225a0 6c 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 l) ){. sqli
225b0 74 65 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 te3_value *pRet
225c0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 = sqlite3ValueNe
225d0 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 w(v->db);.
225e0 69 66 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 if( pRet ){.
225f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d sqlite3VdbeM
22600 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 emCopy((Mem *)pR
22610 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 et, pMem);.
22620 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 sqlite3ValueA
22630 70 70 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 pplyAffinity(pRe
22640 74 2c 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 t, aff, SQLITE_U
22650 54 46 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 TF8);. }.
22660 20 20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b return pRet;
22670 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 . }. }. ret
22680 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 urn 0;.}../*.**
22690 43 6f 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 Configure SQL va
226a0 72 69 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 riable iVar so t
226b0 68 61 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 hat binding a ne
226c0 77 20 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 w value to it si
226d0 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 gnals.** to sqli
226e0 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 te3_reoptimize()
226f0 20 74 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 that re-prepari
22700 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 ng the statement
22710 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 may result.** i
22720 6e 20 61 20 62 65 74 74 65 72 20 71 75 65 72 79 n a better query
22730 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 plan..*/.void s
22740 71 6c 69 74 65 33 56 64 62 65 53 65 74 56 61 72 qlite3VdbeSetVar
22750 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e mask(Vdbe *v, in
22760 74 20 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 t iVar){. asser
22770 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 t( iVar>0 );. i
22780 66 28 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 f( iVar>32 ){.
22790 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 v->expmask = 0
227a0 78 66 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c xffffffff;. }el
227b0 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 se{. v->expma
227c0 73 6b 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c sk |= ((u32)1 <<
227d0 20 28 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a (iVar-1));. }.
227e0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 }..#ifndef SQLIT
227f0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 E_OMIT_VIRTUALTA
22800 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 BLE./*.** Transf
22810 65 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 er error message
22820 20 74 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 text from an sq
22830 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d lite3_vtab.zErrM
22840 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a sg (text stored.
22850 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 ** in memory obt
22860 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 ained from sqlit
22870 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 e3_malloc) into
22880 61 20 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 a Vdbe.zErrMsg (
22890 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 text stored.** i
228a0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 n memory obtaine
228b0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 d from sqlite3Db
228c0 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 Malloc)..*/.void
228d0 20 73 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f sqlite3VtabImpo
228e0 72 74 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 rtErrmsg(Vdbe *p
228f0 2c 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a , sqlite3_vtab *
22900 70 56 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 pVtab){. if( pV
22910 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a tab->zErrMsg ){.
22920 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 sqlite3 *db
22930 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c = p->db;. sql
22940 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
22950 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 ->zErrMsg);.
22960 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c p->zErrMsg = sql
22970 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c ite3DbStrDup(db,
22980 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 pVtab->zErrMsg)
22990 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 ;. sqlite3_fr
229a0 65 65 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 ee(pVtab->zErrMs
229b0 67 29 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a g);. pVtab->z
229c0 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a ErrMsg = 0;. }.
229d0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 }.#endif /* SQLI
229e0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
229f0 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 ABLE */..#ifdef
22a00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 SQLITE_ENABLE_PR
22a10 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a EUPDATE_HOOK../*
22a20 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e .** If the secon
22a30 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f d argument is no
22a40 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 t NULL, release
22a50 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 any allocations
22a60 61 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 associated .** w
22a70 69 74 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 ith the memory c
22a80 65 6c 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 ells in the p->a
22a90 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 Mem[] array. Als
22aa0 6f 20 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 o free the Unpac
22ab0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 kedRecord.** str
22ac0 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 ucture itself, u
22ad0 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 sing sqlite3DbFr
22ae0 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 ee()..**.** This
22af0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 function is use
22b00 64 20 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b d to free Unpack
22b10 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 edRecord structu
22b20 72 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 res allocated by
22b30 0a 2a 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 .** the vdbeUnpa
22b40 63 6b 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 ckRecord() funct
22b50 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 ion found in vdb
22b60 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 eapi.c..*/.stati
22b70 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 c void vdbeFreeU
22b80 6e 70 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 npacked(sqlite3
22b90 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 *db, UnpackedRec
22ba0 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 ord *p){. if( p
22bb0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 ){. int i;.
22bc0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d for(i=0; i<p-
22bd0 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 >nField; i++){.
22be0 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d Mem *pMem =
22bf0 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 &p->aMem[i];.
22c00 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d if( pMem->zM
22c10 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 alloc ) sqlite3V
22c20 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d dbeMemRelease(pM
22c30 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 em);. }. s
22c40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
22c50 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a p);. }.}../*.*
22c60 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72 65 * Invoke the pre
22c70 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49 66 -update hook. If
22c80 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44 41 this is an UPDA
22c90 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72 65 TE or DELETE pre
22ca0 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a -update call,.**
22cb0 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61 73 then cursor pas
22cc0 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e sed as the secon
22cd0 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c d argument shoul
22ce0 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 72 d point to the r
22cf0 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 ow about.** to b
22d00 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c 65 e update or dele
22d10 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70 6c ted. If the appl
22d20 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73 71 ication calls sq
22d30 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65 5f lite3_preupdate_
22d40 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72 65 old(),.** the re
22d50 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69 6c quired value wil
22d60 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 l be read from t
22d70 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73 6f he row the curso
22d80 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a r points to..*/.
22d90 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
22da0 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a 20 PreUpdateHook(.
22db0 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20 20 Vdbe *v,
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22dd0 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70 64 /* Vdbe pre-upd
22de0 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76 6f ate hook is invo
22df0 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62 65 ked by */. Vdbe
22e00 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20 20 Cursor *pCsr,
22e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
22e20 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f 6c ursor to grab ol
22e30 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 d.* values from
22e40 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20 */. int op,
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22e60 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 /* SQLITE_I
22e70 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 NSERT, UPDATE or
22e80 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f 6e DELETE */. con
22e90 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 st char *zDb,
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
22eb0 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a 2f Database name */
22ec0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 . Table *pTab,
22ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22ee0 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20 74 /* Modified t
22ef0 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69 4b able */. i64 iK
22f00 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 ey1,
22f10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 /* Ini
22f20 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20 2a tial key value *
22f30 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20 20 /. int iReg
22f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22f50 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 /* Register
22f60 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72 64 for new.* record
22f70 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 */.){. sqlite3
22f80 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 *db = v->db;.
22f90 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72 65 i64 iKey2;. Pre
22fa0 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74 65 Update preupdate
22fb0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ;. const char *
22fc0 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 zTbl = pTab->zNa
22fd0 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e me;. static con
22fe0 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f 72 st u8 fakeSortOr
22ff0 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 der = 0;.. asse
23000 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64 61 rt( db->pPreUpda
23010 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 te==0 );. memse
23020 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30 2c t(&preupdate, 0,
23030 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61 74 sizeof(PreUpdat
23040 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 53 e));. if( op==S
23050 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b 0a QLITE_UPDATE ){.
23060 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e 61 iKey2 = v->a
23070 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 Mem[iReg].u.i;.
23080 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65 79 }else{. iKey
23090 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 2 = iKey1;. }..
230a0 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e assert( pCsr->
230b0 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 nField==pTab->nC
230c0 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28 70 ol . || (p
230d0 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 Csr->nField==pTa
230e0 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70 3d b->nCol+1 && op=
230f0 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20 26 =SQLITE_DELETE &
23100 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29 3b & iReg==-1). );
23110 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76 20 .. preupdate.v
23120 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74 65 = v;. preupdate
23130 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20 20 .pCsr = pCsr;.
23140 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20 6f preupdate.op = o
23150 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 p;. preupdate.i
23160 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 NewReg = iReg;.
23170 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e preupdate.keyin
23180 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70 72 fo.db = db;. pr
23190 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e eupdate.keyinfo.
231a0 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 enc = ENC(db);.
231b0 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e preupdate.keyin
231c0 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61 62 fo.nField = pTab
231d0 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70 64 ->nCol;. preupd
231e0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 ate.keyinfo.aSor
231f0 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26 66 tOrder = (u8*)&f
23200 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20 20 akeSortOrder;.
23210 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31 20 preupdate.iKey1
23220 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75 70 = iKey1;. preup
23230 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b 65 date.iKey2 = iKe
23240 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e y2;. preupdate.
23250 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69 50 iPKey = pTab->iP
23260 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72 65 Key;.. db->pPre
23270 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70 64 Update = &preupd
23280 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65 55 ate;. db->xPreU
23290 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64 62 pdateCallback(db
232a0 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67 2c ->pPreUpdateArg,
232b0 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 db, op, zDb, zT
232c0 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79 32 bl, iKey1, iKey2
232d0 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 );. db->pPreUpd
232e0 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 ate = 0;. sqlit
232f0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65 e3DbFree(db, pre
23300 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29 3b update.aRecord);
23310 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 . vdbeFreeUnpac
23320 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 ked(db, preupdat
23330 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 e.pUnpacked);.
23340 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 vdbeFreeUnpacked
23350 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 (db, preupdate.p
23360 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 NewUnpacked);.
23370 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61 4e if( preupdate.aN
23380 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b ew ){. int i;
23390 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c . for(i=0; i<
233a0 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b pCsr->nField; i+
233b0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 +){. sqlite
233c0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
233d0 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 5b &preupdate.aNew[
233e0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 i]);. }. s
233f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
23400 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 29 preupdate.aNew)
23410 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f ;. }.}.#endif /
23420 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f * SQLITE_ENABLE_
23430 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20 2a PREUPDATE_HOOK *
23440 2f 0a /.