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 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20 . tmp = *pA;.
0800: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42 *pA = *pB;. *pB
0810: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d = tmp;. pTmp =
0820: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41 pA->pNext;. pA
0830: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e ->pNext = pB->pN
0840: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74 ext;. pB->pNext
0850: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20 = pTmp;. pTmp
0860: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70 = pA->pPrev;. p
0870: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70 A->pPrev = pB->p
0880: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65 Prev;. pB->pPre
0890: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70 v = pTmp;. zTmp
08a0: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70 = pA->zSql;. p
08b0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53 A->zSql = pB->zS
08c0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d ql;. pB->zSql =
08d0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50 zTmp;. pB->isP
08e0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69 repareV2 = pA->i
08f0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f sPrepareV2;.}../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20 *.** Resize the
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73 Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20 o that it is at
0930: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e least nOp elemen
0940: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68 ts larger .** th
0950: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 an its current s
0960: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72 ize. nOp is guar
0970: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73 anteed to be les
0980: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a s than or equal.
0990: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f ** to 1024/sizeo
09a0: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 f(Op)..**.** If
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65 ile resizing the
09e0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a array, return.*
09f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 * SQLITE_NOMEM.
0a00: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62 In this case Vdb
0a10: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e e.aOp and Parse.
0a20: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20 nOpAlloc remain
0a30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74 .** unchanged (t
0a40: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61 his is so that a
0a50: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61 ny opcodes alrea
0a60: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e dy allocated can
0a70: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c be .** correctl
0a80: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c y deallocated al
0a90: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73 ong with the res
0aa0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a t of the Vdbe)..
0ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72 */.static int gr
0ac0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a owOpArray(Vdbe *
0ad0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56 v, int nOp){. V
0ae0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50 dbeOp *pNew;. P
0af0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 arse *p = v->pPa
0b00: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53 rse;.. /* The S
0b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c QLITE_TEST_REALL
0b20: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c OC_STRESS compil
0b30: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 e-time option is
0b40: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72 designed to for
0b50: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65 ce. ** more fre
0b60: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61 quent reallocs a
0b70: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65 nd hence provide
0b80: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74 more opportunit
0b90: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69 ies for . ** si
0ba0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c mulated OOM faul
0bb0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54 ts. SQLITE_TEST
0bc0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 _REALLOC_STRESS
0bd0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65 is generally use
0be0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65 d. ** during te
0bf0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74 sting only. Wit
0c00: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 h SQLITE_TEST_RE
0c10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f ALLOC_STRESS gro
0c20: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20 w the op array.
0c30: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d ** by the minim
0c40: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69 um* amount requi
0c50: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69 red until the si
0c60: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20 ze reaches 512.
0c70: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65 Normal. ** ope
0c80: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20 ration (without
0c90: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c SQLITE_TEST_REAL
0ca0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74 LOC_STRESS) is t
0cb0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72 o double the cur
0cc0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f rent. ** size o
0cd0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f f the op array o
0ce0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61 r add 1KB of spa
0cf0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73 ce, whichever is
0d00: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66 smaller. */.#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f def SQLITE_TEST_
0d20: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20 REALLOC_STRESS.
0d30: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e int nNew = (p->
0d40: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20 nOpAlloc>=512 ?
0d50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 p->nOpAlloc*2 :
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 p->nOpAlloc+nOp)
0d70: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e ;.#else. int nN
0d80: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f ew = (p->nOpAllo
0d90: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a c ? p->nOpAlloc*
0da0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73 2 : (int)(1024/s
0db0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55 izeof(Op)));. U
0dc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
0dd0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 nOp);.#endif..
0de0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30 assert( nOp<=(10
0df0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29 24/sizeof(Op)) )
0e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 ;. assert( nNew
0e10: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e >=(p->nOpAlloc+n
0e20: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20 Op) );. pNew =
0e30: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 sqlite3DbRealloc
0e40: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20 (p->db, v->aOp,
0e50: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29 nNew*sizeof(Op))
0e60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a ;. if( pNew ){.
0e70: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 p->szOpAlloc
0e80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c = sqlite3DbMall
0e90: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e ocSize(p->db, pN
0ea0: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41 ew);. p->nOpA
0eb0: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c lloc = p->szOpAl
0ec0: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a loc/sizeof(Op);.
0ed0: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 v->aOp = pNe
0ee0: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 w;. }. return
0ef0: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f (pNew ? SQLITE_O
0f00: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d K : SQLITE_NOMEM
0f10: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c );.}..#ifdef SQL
0f20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 ITE_DEBUG./* Thi
0f30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 s routine is jus
0f40: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 t a convenient p
0f50: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 lace to set a br
0f60: 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 eakpoint that wi
0f70: 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 ll.** fire after
0f80: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 each opcode is
0f90: 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 inserted and dis
0fa0: 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 played using.**
0fb0: 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 "PRAGMA vdbe_add
0fc0: 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a optrace=on"..*/.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 static void test
0fe0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e _addop_breakpoin
0ff0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 t(void){. stati
1000: 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e c int n = 0;. n
1010: 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a ++;.}.#endif../*
1020: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e .** Add a new in
1030: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 struction to the
1040: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 list of instruc
1050: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e tions current in
1060: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 the.** VDBE. R
1070: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 eturn the addres
1080: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 s of the new ins
1090: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 truction..**.**
10a0: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a Parameters:.**.*
10b0: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 * p
10c0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 Pointer to
10d0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 the VDBE.**.**
10e0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 op
10f0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 The opcode for
1100: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f this instructio
1110: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 n.**.** p1, p
1120: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 2, p3 Opera
1130: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 nds.**.** Use th
1140: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 e sqlite3VdbeRes
1150: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 olveLabel() func
1160: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 tion to fix an a
1170: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 ddress and.** th
1180: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 e sqlite3VdbeCha
1190: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e ngeP4() function
11a0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 to change the v
11b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a alue of the P4.*
11c0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 * operand..*/.st
11d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e atic SQLITE_NOIN
11e0: 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 LINE int growOp3
11f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 (Vdbe *p, int op
1200: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 , int p1, int p2
1210: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 , int p3){. ass
1220: 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e ert( p->pParse->
1230: 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 nOpAlloc<=p->nOp
1240: 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 );. if( growOp
1250: 41 72 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 Array(p, 1) ) re
1260: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 turn 1;. assert
1270: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 ( p->pParse->nOp
1280: 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a Alloc>p->nOp );.
1290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
12a0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 VdbeAddOp3(p, op
12b0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d , p1, p2, p3);.}
12c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
12d0: 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 AddOp3(Vdbe *p,
12e0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 int op, int p1,
12f0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b int p2, int p3){
1300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 . int i;. Vdbe
1310: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 Op *pOp;.. i =
1320: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 p->nOp;. assert
1330: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 ( p->magic==VDBE
1340: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 _MAGIC_INIT );.
1350: 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26 assert( op>0 &&
1360: 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 op<0xff );. if
1370: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 ( p->pParse->nOp
1380: 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 Alloc<=i ){.
1390: 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 return growOp3(p
13a0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 , op, p1, p2, p3
13b0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b );. }. p->nOp+
13c0: 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 +;. pOp = &p->a
13d0: 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 Op[i];. pOp->op
13e0: 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 code = (u8)op;.
13f0: 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 pOp->p5 = 0;.
1400: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 pOp->p1 = p1;.
1410: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 pOp->p2 = p2;.
1420: 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 pOp->p3 = p3;.
1430: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 pOp->p4.p = 0;.
1440: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 pOp->p4type = P
1450: 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 4_NOTUSED;.#ifde
1460: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
1470: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 EXPLAIN_COMMENTS
1480: 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 . pOp->zComment
1490: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
14a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 def SQLITE_DEBUG
14b0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c . if( p->db->fl
14c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 ags & SQLITE_Vdb
14d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 eAddopTrace ){.
14e0: 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 int jj, kk;.
14f0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 Parse *pParse
1500: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 = p->pParse;.
1510: 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a for(jj=kk=0; j
1520: 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 j<SQLITE_N_COLCA
1530: 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 CHE; jj++){.
1540: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 struct yColCac
1550: 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e he *x = pParse->
1560: 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a aColCache + jj;.
1570: 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 if( x->iLe
1580: 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 vel>pParse->iCac
1590: 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 heLevel || x->iR
15a0: 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 eg==0 ) continue
15b0: 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 ;. printf("
15c0: 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c r[%d]={%d:%d}",
15d0: 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 x->iReg, x->iTa
15e0: 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 ble, x->iColumn)
15f0: 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 ;. kk++;.
1600: 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 }. if( kk )
1610: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 printf("\n");.
1620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 sqlite3VdbePr
1630: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e intOp(0, i, &p->
1640: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 aOp[i]);. tes
1650: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 t_addop_breakpoi
1660: 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 nt();. }.#endif
1670: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f .#ifdef VDBE_PRO
1680: 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c FILE. pOp->cycl
1690: 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 es = 0;. pOp->c
16a0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 nt = 0;.#endif.#
16b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 ifdef SQLITE_VDB
16c0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 E_COVERAGE. pOp
16d0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a ->iSrcLine = 0;.
16e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 #endif. return
16f0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 i;.}.int sqlite3
1700: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 VdbeAddOp0(Vdbe
1710: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 *p, int op){. r
1720: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 eturn sqlite3Vdb
1730: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 eAddOp3(p, op, 0
1740: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 , 0, 0);.}.int s
1750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 qlite3VdbeAddOp1
1760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 (Vdbe *p, int op
1770: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 , int p1){. ret
1780: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 urn sqlite3VdbeA
1790: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c ddOp3(p, op, p1,
17a0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 0, 0);.}.int sq
17b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 lite3VdbeAddOp2(
17c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c Vdbe *p, int op,
17d0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 int p1, int p2)
17e0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 {. return sqlit
17f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 e3VdbeAddOp3(p,
1800: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a op, p1, p2, 0);.
1810: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 }../* Generate c
1820: 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e ode for an uncon
1830: 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f ditional jump to
1840: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 instruction iDe
1850: 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 st.*/.int sqlite
1860: 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 3VdbeGoto(Vdbe *
1870: 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 p, int iDest){.
1880: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
1890: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f dbeAddOp3(p, OP_
18a0: 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 Goto, 0, iDest,
18b0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 0);.}../* Genera
18c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 te code to cause
18d0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 the string zStr
18e0: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e to be loaded in
18f0: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 to.** register i
1900: 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 Dest.*/.int sqli
1910: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e te3VdbeLoadStrin
1920: 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 g(Vdbe *p, int i
1930: 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 Dest, const char
1940: 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 *zStr){. retur
1950: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 n sqlite3VdbeAdd
1960: 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 Op4(p, OP_String
1970: 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 8, 0, iDest, 0,
1980: 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a zStr, 0);.}../*.
1990: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 ** Generate code
19a0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 that initialize
19b0: 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 s multiple regis
19c0: 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f ters to string o
19d0: 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e r integer.** con
19e0: 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 stants. The reg
19f0: 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 isters begin wit
1a00: 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 h iDest and incr
1a10: 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 ease consecutive
1a20: 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 ly..** One regis
1a30: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a ter is initializ
1a40: 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 ed for each char
1a50: 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 acgter in zTypes
1a60: 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a []. For each.**
1a70: 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69 "s" character i
1a80: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 n zTypes[], the
1a90: 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74 register is a st
1aa0: 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 ring if the argu
1ab0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e ment is.** not N
1ac0: 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 ULL, or OP_Null
1ad0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 if the value is
1ae0: 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 a null pointer.
1af0: 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 For each "i" ch
1b00: 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 aracter.** in zT
1b10: 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 ypes[], the regi
1b20: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 ster is initiali
1b30: 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 zed to an intege
1b40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 r..*/.void sqlit
1b50: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 e3VdbeMultiLoad(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 Vdbe *p, int iDe
1b70: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a st, const char *
1b80: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 zTypes, ...){.
1b90: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e va_list ap;. in
1ba0: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 t i;. char c;.
1bb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 va_start(ap, zT
1bc0: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 ypes);. for(i=0
1bd0: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d ; (c = zTypes[i]
1be0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 )!=0; i++){.
1bf0: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 if( c=='s' ){.
1c00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
1c10: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 z = va_arg(ap, c
1c20: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 onst char*);.
1c30: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 int addr = sq
1c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 lite3VdbeAddOp2(
1c50: 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c p, z==0 ? OP_Nul
1c60: 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 l : OP_String8,
1c70: 30 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 0, iDest++);.
1c80: 20 20 20 69 66 28 20 7a 20 29 20 73 71 6c 69 74 if( z ) sqlit
1c90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 e3VdbeChangeP4(p
1ca0: 2c 20 61 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20 , addr, z, 0);.
1cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
1cc0: 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29 assert( c=='i' )
1cd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 ;. sqlite3V
1ce0: 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f dbeAddOp2(p, OP_
1cf0: 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28 Integer, va_arg(
1d00: 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b ap, int), iDest+
1d10: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 +);. }. }.
1d20: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f va_end(ap);.}../
1d30: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f *.** Add an opco
1d40: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 de that includes
1d50: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 the p4 value as
1d60: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 a pointer..*/.i
1d70: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 nt sqlite3VdbeAd
1d80: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c dOp4(. Vdbe *p,
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
1da0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f dd the opcode to
1db0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e this VM */. in
1dc0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 t op,
1dd0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 /* The new opc
1de0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c ode */. int p1,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1e00: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a The P1 operand *
1e10: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 /. int p2,
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 /* The P
1e30: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 2 operand */. i
1e40: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 nt p3,
1e50: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 /* The P3 ope
1e60: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 rand */. const
1e70: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a char *zP4, /*
1e80: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 The P4 operand
1e90: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 */. int p4type
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f /* P4 o
1eb0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 perand type */.)
1ec0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 {. int addr = s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 qlite3VdbeAddOp3
1ee0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 (p, op, p1, p2,
1ef0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 p3);. sqlite3Vd
1f00: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 beChangeP4(p, ad
1f10: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29 dr, zP4, p4type)
1f20: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b ;. return addr;
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
1f40: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 opcode that inc
1f50: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c ludes the p4 val
1f60: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54 ue with a P4_INT
1f70: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 64 or.** P4_REAL
1f80: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 type..*/.int sq
1f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44 lite3VdbeAddOp4D
1fa0: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 up8(. Vdbe *p,
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 /* Ad
1fc0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 d the opcode to
1fd0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 this VM */. int
1fe0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 op,
1ff0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f /* The new opco
2000: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 de */. int p1,
2010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
2020: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f he P1 operand */
2030: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 . int p2,
2040: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 /* The P2
2050: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e operand */. in
2060: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 t p3,
2070: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 /* The P3 oper
2080: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 and */. const u
2090: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20 8 *zP4, /*
20a0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a The P4 operand *
20b0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 /. int p4type
20c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 /* P4 op
20d0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b erand type */.){
20e0: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20 . char *p4copy
20f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f = sqlite3DbMallo
2100: 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65 cRaw(sqlite3Vdbe
2110: 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 Db(p), 8);. if(
2120: 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 p4copy ) memcpy
2130: 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 (p4copy, zP4, 8)
2140: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 ;. return sqlit
2150: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 e3VdbeAddOp4(p,
2160: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 op, p1, p2, p3,
2170: 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b p4copy, p4type);
2180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e .}../*.** Add an
2190: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20 OP_ParseSchema
21a0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f opcode. This ro
21b0: 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 utine is broken
21c0: 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 out from.** sqli
21d0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20 te3VdbeAddOp4()
21e0: 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74 since it needs t
21f0: 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 o also needs to
2200: 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a mark all btrees.
2210: 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65 ** as having bee
2220: 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 n used..**.** Th
2230: 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20 e zWhere string
2240: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f must have been o
2250: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c btained from sql
2260: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a ite3_malloc()..*
2270: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 * This routine w
2280: 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 ill take ownersh
2290: 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 ip of the alloca
22a0: 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 ted memory..*/.v
22b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41 oid sqlite3VdbeA
22c0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28 ddParseSchemaOp(
22d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 Vdbe *p, int iDb
22e0: 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b , char *zWhere){
22f0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 . int j;. int
2300: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 addr = sqlite3Vd
2310: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 beAddOp3(p, OP_P
2320: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c arseSchema, iDb,
2330: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 0, 0);. sqlite
2340: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 3VdbeChangeP4(p,
2350: 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 addr, zWhere, P
2360: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 4_DYNAMIC);. fo
2370: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e r(j=0; j<p->db->
2380: 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 nDb; j++) sqlite
2390: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 3VdbeUsesBtree(p
23a0: 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 , j);.}../*.** A
23b0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 dd an opcode tha
23c0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 t includes the p
23d0: 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 4 value as an in
23e0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 teger..*/.int sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 lite3VdbeAddOp4I
2400: 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 nt(. Vdbe *p,
2410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 /* Add
2420: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 the opcode to t
2430: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 his VM */. int
2440: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 op,
2450: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 /* The new opcod
2460: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 e */. int p1,
2470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 /* Th
2480: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a e P1 operand */.
2490: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 int p2,
24a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 /* The P2
24b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 operand */. int
24c0: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 p3,
24d0: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 /* The P3 opera
24e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 nd */. int p4
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
2500: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 he P4 operand as
2510: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 an integer */.)
2520: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 {. int addr = s
2530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 qlite3VdbeAddOp3
2540: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 (p, op, p1, p2,
2550: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 p3);. sqlite3Vd
2560: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 beChangeP4(p, ad
2570: 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 dr, SQLITE_INT_T
2580: 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e O_PTR(p4), P4_IN
2590: 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 T32);. return a
25a0: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 ddr;.}../*.** Cr
25b0: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f eate a new symbo
25c0: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e lic label for an
25d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 instruction tha
25e0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a t has yet to be.
25f0: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 ** coded. The s
2600: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 ymbolic label is
2610: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e really just a n
2620: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 egative number.
2630: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 The.** label ca
2640: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65 n be used as the
2650: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 P2 value of an
2660: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 operation. Late
2670: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c r, when.** the l
2680: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 abel is resolved
2690: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 to a specific a
26a0: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 ddress, the VDBE
26b0: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 will scan.** th
26c0: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 rough its operat
26d0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 ion list and cha
26e0: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f nge all values o
26f0: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 f P2 which match
2700: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e .** the label in
2710: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 to the resolved
2720: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 address..**.** T
2730: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 he VDBE knows th
2740: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 at a P2 value is
2750: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 a label because
2760: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 labels are.** a
2770: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 lways negative a
2780: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 nd P2 values are
2790: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e suppose to be n
27a0: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 on-negative..**
27b0: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 Hence, a negativ
27c0: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 e P2 value is a
27d0: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 label that has y
27e0: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 et to be resolve
27f0: 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 d..**.** Zero is
2800: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d returned if a m
2810: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a alloc() fails..*
2820: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
2830: 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 eMakeLabel(Vdbe
2840: 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 *v){. Parse *p
2850: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 = v->pParse;. i
2860: 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c nt i = p->nLabel
2870: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d ++;. assert( v-
2880: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 >magic==VDBE_MAG
2890: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 IC_INIT );. if(
28a0: 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 (i & (i-1))==0
28b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c ){. p->aLabel
28c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c = sqlite3DbReal
28d0: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c locOrFree(p->db,
28e0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 p->aLabel, .
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2910: 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 (i*2+1)*size
2920: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 of(p->aLabel[0])
2930: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e );. }. if( p->
2940: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d aLabel ){. p-
2950: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b >aLabel[i] = -1;
2960: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 . }. return AD
2970: 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 DR(i);.}../*.**
2980: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 Resolve label "x
2990: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 " to be the addr
29a0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 ess of the next
29b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a instruction to.*
29c0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 * be inserted.
29d0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 The parameter "x
29e0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e " must have been
29f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a obtained from.*
2a00: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 * a prior call t
2a10: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b o sqlite3VdbeMak
2a20: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 eLabel()..*/.voi
2a30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 d sqlite3VdbeRes
2a40: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a olveLabel(Vdbe *
2a50: 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 v, int x){. Par
2a60: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 se *p = v->pPars
2a70: 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 e;. int j = ADD
2a80: 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 R(x);. assert(
2a90: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d v->magic==VDBE_M
2aa0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 AGIC_INIT );. a
2ab0: 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 ssert( j<p->nLab
2ac0: 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 el );. assert(
2ad0: 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d j>=0 );. if( p-
2ae0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 >aLabel ){. p
2af0: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d ->aLabel[j] = v-
2b00: 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 >nOp;. }. p->i
2b10: 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 FixedOp = v->nOp
2b20: 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d - 1;.}../*.** M
2b30: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 ark the VDBE as
2b40: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c one that can onl
2b50: 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d y be run one tim
2b60: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 e..*/.void sqlit
2b70: 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 e3VdbeRunOnlyOnc
2b80: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d e(Vdbe *p){. p-
2b90: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 >runOnlyOnce = 1
2ba0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 ;.}..#ifdef SQLI
2bb0: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 TE_DEBUG /* sqli
2bc0: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 te3AssertMayAbor
2bd0: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a t() logic */../*
2be0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e .** The followin
2bf0: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74 g type and funct
2c00: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20 ion are used to
2c10: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 iterate through
2c20: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 all opcodes.** i
2c30: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72 n a Vdbe main pr
2c40: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f ogram and each o
2c50: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61 f the sub-progra
2c60: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74 ms (triggers) it
2c70: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 may .** invoke
2c80: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 directly or indi
2c90: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c rectly. It shoul
2ca0: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c d be used as fol
2cb0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 lows:.**.** Op
2cc0: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 *pOp;.** Vdbe
2cd0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a OpIter sIter;.**
2ce0: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49 .** memset(&sI
2cf0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 ter, 0, sizeof(s
2d00: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 Iter));.** sIt
2d10: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20 er.v = v;
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2d30: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 // v is of
2d40: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 type Vdbe* .**
2d50: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f while( (pOp = o
2d60: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 pIterNext(&sIter
2d70: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 )) ){.** //
2d80: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 Do something wit
2d90: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 h pOp.** }.**
2da0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
2db0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 v->db, sIter.apS
2dc0: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 ub);.** .*/.type
2dd0: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f def struct VdbeO
2de0: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72 pIter VdbeOpIter
2df0: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 ;.struct VdbeOpI
2e00: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b ter {. Vdbe *v;
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e20: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 /* Vdbe to it
2e30: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68 erate through th
2e40: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a e opcodes of */.
2e50: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 SubProgram **a
2e60: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 pSub; /*
2e70: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 Array of subprog
2e80: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 rams */. int nS
2e90: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ub;
2ea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /* Number o
2eb0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53 f entries in apS
2ec0: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 ub */. int iAdd
2ed0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 r;
2ee0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 /* Address of
2ef0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f next instructio
2f00: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 n to return */.
2f10: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20 int iSub;
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 /* 0
2f30: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c = main program,
2f40: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70 1 = first sub-p
2f50: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d rogram etc. */.}
2f60: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 ;.static Op *opI
2f70: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74 terNext(VdbeOpIt
2f80: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a er *p){. Vdbe *
2f90: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a v = p->v;. Op *
2fa0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a pRet = 0;. Op *
2fb0: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a aOp;. int nOp;.
2fc0: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d . if( p->iSub<=
2fd0: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 p->nSub ){..
2fe0: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 if( p->iSub==0 )
2ff0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d {. aOp = v-
3000: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 >aOp;. nOp
3010: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 = v->nOp;. }e
3020: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d lse{. aOp =
3030: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 p->apSub[p->iSu
3040: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 b-1]->aOp;.
3050: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b nOp = p->apSub[
3060: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b p->iSub-1]->nOp;
3070: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 . }. asser
3080: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 t( p->iAddr<nOp
3090: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26 );.. pRet = &
30a0: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 aOp[p->iAddr];.
30b0: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 p->iAddr++;.
30c0: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d if( p->iAddr=
30d0: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d =nOp ){. p-
30e0: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 >iSub++;. p
30f0: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 ->iAddr = 0;.
3100: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52 }. . if( pR
3110: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 et->p4type==P4_S
3120: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 UBPROGRAM ){.
3130: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 int nByte = (
3140: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f p->nSub+1)*sizeo
3150: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a f(SubProgram*);.
3160: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 int j;.
3170: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d for(j=0; j<p-
3180: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 >nSub; j++){.
3190: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75 if( p->apSu
31a0: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 b[j]==pRet->p4.p
31b0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b Program ) break;
31c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 . }. i
31d0: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b f( j==p->nSub ){
31e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 . p->apSu
31f0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 b = sqlite3DbRea
3200: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 llocOrFree(v->db
3210: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 , p->apSub, nByt
3220: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 e);. if(
3230: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 !p->apSub ){.
3240: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b pRet = 0;
3250: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a . }else{.
3260: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 p->apS
3270: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 ub[p->nSub++] =
3280: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 pRet->p4.pProgra
3290: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 m;. }.
32a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a }. }. }..
32b0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d return pRet;.}
32c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 ../*.** Check if
32d0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f the program sto
32e0: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73 red in the VM as
32f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 sociated with pP
3300: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f arse may.** thro
3310: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70 w an ABORT excep
3320: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68 tion (causing th
3330: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 e statement, but
3340: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e not entire tran
3350: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 saction.** to be
3360: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 rolled back). T
3370: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 his condition is
3380: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69 true if the mai
3390: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 n program or any
33a0: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 .** sub-programs
33b0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 contains any of
33c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a the following:.
33d0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 **.** * OP_Ha
33e0: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 lt with P1=SQLIT
33f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 E_CONSTRAINT and
3400: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a P2=OE_Abort..**
3410: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e * OP_HaltIfN
3420: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49 ull with P1=SQLI
3430: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e TE_CONSTRAINT an
3440: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a d P2=OE_Abort..*
3450: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f * * OP_Destro
3460: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 y.** * OP_VUp
3470: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f date.** * OP_
3480: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 VRename.** *
3490: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 OP_FkCounter wit
34a0: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 h P2==0 (immedia
34b0: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 te foreign key c
34c0: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 onstraint).**
34d0: 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c * OP_CreateTabl
34e0: 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 e and OP_InitCor
34f0: 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41 outine (for CREA
3500: 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45 TE TABLE AS SELE
3510: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 CT ...).**.** Th
3520: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 en check that th
3530: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65 e value of Parse
3540: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75 .mayAbort is tru
3550: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 e if an.** ABORT
3560: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 may be thrown,
3570: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 or false otherwi
3580: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 se. Return true
3590: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 if it does.** ma
35a0: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 tch, or false ot
35b0: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75 herwise. This fu
35c0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 nction is intend
35d0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73 ed to be used as
35e0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61 .** part of an a
35f0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20 ssert statement
3600: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e in the compiler.
3610: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a Similar to:.**.
3620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c ** assert( sql
3630: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61 ite3VdbeAssertMa
3640: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 yAbort(pParse->p
3650: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 Vdbe, pParse->ma
3660: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e yAbort) );.*/.in
3670: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 t sqlite3VdbeAss
3680: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65 ertMayAbort(Vdbe
3690: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 *v, int mayAbor
36a0: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f t){. int hasAbo
36b0: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 rt = 0;. int ha
36c0: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a sFkCounter = 0;.
36d0: 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54 int hasCreateT
36e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 able = 0;. int
36f0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 hasInitCoroutine
3700: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b = 0;. Op *pOp;
3710: 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 . VdbeOpIter sI
3720: 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 ter;. memset(&s
3730: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 Iter, 0, sizeof(
3740: 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72 sIter));. sIter
3750: 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 .v = v;.. while
3760: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e ( (pOp = opIterN
3770: 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20 ext(&sIter))!=0
3780: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 ){. int opcod
3790: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b e = pOp->opcode;
37a0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d . if( opcode=
37b0: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f =OP_Destroy || o
37c0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 pcode==OP_VUpdat
37d0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f e || opcode==OP_
37e0: 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c VRename . ||
37f0: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 ((opcode==OP_Ha
3800: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 lt || opcode==OP
3810: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 _HaltIfNull) .
3820: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 && ((pOp->p1
3830: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 &0xff)==SQLITE_C
3840: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70 ONSTRAINT && pOp
3850: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 ->p2==OE_Abort))
3860: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61 . ){. ha
3870: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 sAbort = 1;.
3880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
3890: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f if( opcode==O
38a0: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20 P_CreateTable )
38b0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d hasCreateTable =
38c0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 1;. if( opco
38d0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 de==OP_InitCorou
38e0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f tine ) hasInitCo
38f0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 routine = 1;.#if
3900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
3910: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 _FOREIGN_KEY.
3920: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f if( opcode==OP_
3930: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 FkCounter && pOp
3940: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e ->p1==0 && pOp->
3950: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 p2==1 ){. h
3960: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b asFkCounter = 1;
3970: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 . }.#endif.
3980: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 }. sqlite3DbFre
3990: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 e(v->db, sIter.a
39a0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 pSub);.. /* Ret
39b0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 urn true if hasA
39c0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 bort==mayAbort.
39d0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 Or if a malloc f
39e0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e ailure occurred.
39f0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 . ** If malloc
3a00: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 failed, then the
3a10: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 while() loop ab
3a20: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 ove may not have
3a30: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 iterated. ** t
3a40: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 hrough all opcod
3a50: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 es and hasAbort
3a60: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 may be set incor
3a70: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 rectly. Return.
3a80: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 ** true for thi
3a90: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e s case to preven
3aa0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69 t the assert() i
3ab0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 n the callers fr
3ac0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 ame. ** from fa
3ad0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 iling. */. ret
3ae0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c urn ( v->db->mal
3af0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 locFailed || has
3b00: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 Abort==mayAbort
3b10: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a || hasFkCounter.
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c ||
3b30: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 (hasCreateTable
3b40: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 && hasInitCorou
3b50: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 tine) );.}.#endi
3b60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 f /* SQLITE_DEBU
3b70: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 G - the sqlite3A
3b80: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 ssertMayAbort()
3b90: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a function */../*.
3ba0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 ** This routine
3bb0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 is called after
3bc0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65 all opcodes have
3bd0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 been inserted.
3be0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 It loops.** thr
3bf0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 ough all the opc
3c00: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75 odes and fixes u
3c10: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a p some details..
3c20: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 **.** (1) For ea
3c30: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 ch jump instruct
3c40: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74 ion with a negat
3c50: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20 ive P2 value (a
3c60: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 label).** re
3c70: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c solve the P2 val
3c80: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 ue to an actual
3c90: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 address..**.** (
3ca0: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 2) Compute the m
3cb0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 aximum number of
3cc0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20 arguments used
3cd0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 by any SQL funct
3ce0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 ion.** and s
3cf0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20 tore that value
3d00: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 in *pMaxFuncArgs
3d10: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 ..**.** (3) Upda
3d20: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64 te the Vdbe.read
3d30: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49 Only and Vdbe.bI
3d40: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f sReader flags to
3d50: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 accurately.**
3d60: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74 indicate what
3d70: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 the prepared st
3d80: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 atement actually
3d90: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 does..**.** (4)
3da0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 Initialize the
3db0: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e p4.xAdvance poin
3dc0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 ter on opcodes t
3dd0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a hat use it..**.*
3de0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68 * (5) Reclaim th
3df0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 e memory allocat
3e00: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c ed for storing l
3e10: 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 abels..*/.static
3e20: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56 void resolveP2V
3e30: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69 alues(Vdbe *p, i
3e40: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 nt *pMaxFuncArgs
3e50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e ){. int i;. in
3e60: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d t nMaxArgs = *pM
3e70: 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 axFuncArgs;. Op
3e80: 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a *pOp;. Parse *
3e90: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 pParse = p->pPar
3ea0: 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 se;. int *aLabe
3eb0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 l = pParse->aLab
3ec0: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c el;. p->readOnl
3ed0: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 y = 1;. p->bIsR
3ee0: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72 eader = 0;. for
3ef0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70 (pOp=p->aOp, i=p
3f00: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69 ->nOp-1; i>=0; i
3f10: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 --, pOp++){.
3f20: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d u8 opcode = pOp-
3f30: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a >opcode;.. /*
3f40: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74 NOTE: Be sure t
3f50: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 o update mkopcod
3f60: 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 69 eh.awk when addi
3f70: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 ng or removing.
3f80: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d ** cases from
3f90: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f this switch! */
3fa0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63 . switch( opc
3fb0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73 ode ){. cas
3fc0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e e OP_Transaction
3fd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 : {. if(
3fe0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e pOp->p2!=0 ) p->
3ff0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 readOnly = 0;.
4000: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 /* fall th
4010: 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 ru */. }.
4020: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f case OP_Auto
4030: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61 Commit:. ca
4040: 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a se OP_Savepoint:
4050: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 {. p->bI
4060: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 sReader = 1;.
4070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
4080: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 }.#ifndef SQLI
4090: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 TE_OMIT_WAL.
40a0: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 case OP_Checkp
40b0: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 oint:.#endif.
40c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 case OP_Vacuu
40d0: 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 m:. case OP
40e0: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a _JournalMode: {.
40f0: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f p->readO
4100: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 nly = 0;.
4110: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 p->bIsReader =
4120: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 1;. break
4130: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 ;. }.#ifnde
4140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 f SQLITE_OMIT_VI
4150: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 RTUALTABLE.
4160: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 case OP_VUpdate
4170: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 : {. if(
4180: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 pOp->p2>nMaxArgs
4190: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f ) nMaxArgs = pO
41a0: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62 p->p2;. b
41b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
41c0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c case OP_VFil
41d0: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 ter: {. i
41e0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 nt n;. as
41f0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 sert( p->nOp - i
4200: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 >= 3 );.
4210: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d assert( pOp[-1]
4220: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 .opcode==OP_Inte
4230: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e ger );. n
4240: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 = pOp[-1].p1;.
4250: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 if( n>nMa
4260: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 xArgs ) nMaxArgs
4270: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 = n;. br
4280: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e eak;. }.#en
4290: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f dif. case O
42a0: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61 P_Next:. ca
42b0: 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e se OP_NextIfOpen
42c0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f :. case OP_
42d0: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 SorterNext: {.
42e0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 pOp->p4.xA
42f0: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 dvance = sqlite3
4300: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 BtreeNext;.
4310: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d pOp->p4type =
4320: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 P4_ADVANCE;.
4330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
4340: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f }. case O
4350: 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61 P_Prev:. ca
4360: 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e se OP_PrevIfOpen
4370: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d : {. pOp-
4380: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 >p4.xAdvance = s
4390: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69 qlite3BtreePrevi
43a0: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 ous;. pOp
43b0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 ->p4type = P4_AD
43c0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 VANCE;. b
43d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
43e0: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 }.. pOp->op
43f0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f flags = sqlite3O
4400: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70 pcodeProperty[op
4410: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28 code];. if( (
4420: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f pOp->opflags & O
4430: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 PFLG_JUMP)!=0 &&
4440: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 pOp->p2<0 ){.
4450: 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52 assert( ADDR
4460: 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65 (pOp->p2)<pParse
4470: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 ->nLabel );.
4480: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 pOp->p2 = aLab
4490: 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 el[ADDR(pOp->p2)
44a0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 ];. }. }. s
44b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e qlite3DbFree(p->
44c0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 db, pParse->aLab
44d0: 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 el);. pParse->a
44e0: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 Label = 0;. pPa
44f0: 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b rse->nLabel = 0;
4500: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 . *pMaxFuncArgs
4510: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 = nMaxArgs;. a
4520: 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 ssert( p->bIsRea
4530: 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b der!=0 || DbMask
4540: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 AllZero(p->btree
4550: 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a Mask) );.}../*.*
4560: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 * Return the add
4570: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 ress of the next
4580: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 instruction to
4590: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a be inserted..*/.
45a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 int sqlite3VdbeC
45b0: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 urrentAddr(Vdbe
45c0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 *p){. assert( p
45d0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
45e0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 GIC_INIT );. re
45f0: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a turn p->nOp;.}..
4600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 /*.** This funct
4610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f ion returns a po
4620: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 inter to the arr
4630: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 ay of opcodes as
4640: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a sociated with.**
4650: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 the Vdbe passed
4660: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 as the first ar
4670: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 gument. It is th
4680: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e e callers respon
4690: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 sibility.** to a
46a0: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 rrange for the r
46b0: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f eturned array to
46c0: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 be eventually f
46d0: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a reed using the .
46e0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 ** vdbeFreeOpArr
46f0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a ay() function..*
4700: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 *.** Before retu
4710: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 rning, *pnOp is
4720: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 set to the numbe
4730: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 r of entries in
4740: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 the returned.**
4750: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e array. Also, *pn
4760: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f MaxArg is set to
4770: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 the larger of i
4780: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 ts current value
4790: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d and .** the num
47a0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 ber of entries i
47b0: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 n the Vdbe.apArg
47c0: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 [] array require
47d0: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 d to execute the
47e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 .** returned pr
47f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 ogram..*/.VdbeOp
4800: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b *sqlite3VdbeTak
4810: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 eOpArray(Vdbe *p
4820: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 , int *pnOp, int
4830: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 *pnMaxArg){. V
4840: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e dbeOp *aOp = p->
4850: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 aOp;. assert( a
4860: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 Op && !p->db->ma
4870: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 llocFailed );..
4880: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 /* Check that s
4890: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 qlite3VdbeUsesBt
48a0: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 ree() was not ca
48b0: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 lled on this VM
48c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d */. assert( DbM
48d0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 askAllZero(p->bt
48e0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 reeMask) );.. r
48f0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 esolveP2Values(p
4900: 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a , pnMaxArg);. *
4910: 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 pnOp = p->nOp;.
4920: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 p->aOp = 0;. r
4930: 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a eturn aOp;.}../*
4940: 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 .** Add a whole
4950: 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f list of operatio
4960: 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 ns to the operat
4970: 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 ion stack. Retu
4980: 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73 rn the.** addres
4990: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f s of the first o
49a0: 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a peration added..
49b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 */.int sqlite3Vd
49c0: 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65 beAddOpList(Vdbe
49d0: 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64 *p, int nOp, Vd
49e0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a beOpList const *
49f0: 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f aOp, int iLineno
4a00: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 69 ){. int addr, i
4a10: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 ;. VdbeOp *pOut
4a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e ;. assert( nOp>
4a30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 0 );. assert( p
4a40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
4a50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 GIC_INIT );. if
4a60: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e ( p->nOp + nOp >
4a70: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 p->pParse->nOpA
4a80: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 lloc && growOpAr
4a90: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 ray(p, nOp) ){.
4aa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
4ab0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 . addr = p->nOp
4ac0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 ;. pOut = &p->a
4ad0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72 28 Op[addr];. for(
4ae0: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c i=0; i<nOp; i++,
4af0: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b aOp++, pOut++){
4b00: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 . pOut->opcod
4b10: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b e = aOp->opcode;
4b20: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 . pOut->p1 =
4b30: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75 aOp->p1;. pOu
4b40: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b t->p2 = aOp->p2;
4b50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70 . assert( aOp
4b60: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 70 ->p2>=0 );. p
4b70: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 Out->p3 = aOp->p
4b80: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 3;. pOut->p4t
4b90: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 ype = P4_NOTUSED
4ba0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 ;. pOut->p4.p
4bb0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e = 0;. pOut->
4bc0: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 p5 = 0;.#ifdef S
4bd0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 QLITE_ENABLE_EXP
4be0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 LAIN_COMMENTS.
4bf0: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 pOut->zComment
4c00: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 = 0;.#endif.#if
4c10: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f def SQLITE_VDBE_
4c20: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 COVERAGE. pOu
4c30: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c t->iSrcLine = iL
4c40: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 ineno+i;.#else.
4c50: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f (void)iLineno
4c60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 ;.#endif.#ifdef
4c70: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 SQLITE_DEBUG.
4c80: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 if( p->db->flag
4c90: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 s & SQLITE_VdbeA
4ca0: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 ddopTrace ){.
4cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 sqlite3VdbePr
4cc0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c intOp(0, i+addr,
4cd0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d &p->aOp[i+addr]
4ce0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a );. }.#endif.
4cf0: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 }. p->nOp +=
4d00: 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 nOp;. return ad
4d10: 64 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e dr;.}..#if defin
4d20: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ed(SQLITE_ENABLE
4d30: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 _STMT_SCANSTATUS
4d40: 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 )./*.** Add an e
4d50: 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 ntry to the arra
4d60: 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 y of counters ma
4d70: 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 naged by sqlite3
4d80: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 _stmt_scanstatus
4d90: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 ()..*/.void sqli
4da0: 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 te3VdbeScanStatu
4db0: 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 s(. Vdbe *p,
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4dd0: 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 /* VM to ad
4de0: 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 d scanstatus() t
4df0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 o */. int addrE
4e00: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 xplain,
4e10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 /* Addres
4e20: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 s of OP_Explain
4e30: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 (or 0) */. int
4e40: 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 addrLoop,
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 /* A
4e60: 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 ddress of loop c
4e70: 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 ounter */ . int
4e80: 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 addrVisit,
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
4ea0: 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 Address of rows
4eb0: 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 visited counter
4ec0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 */. LogEst nEst
4ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
4ee0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 /* Estimate
4ef0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 d number of outp
4f00: 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e ut rows */. con
4f10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 st char *zName
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
4f30: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 Name of table or
4f40: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 index being sca
4f50: 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 nned */.){. int
4f60: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 nByte = (p->nSc
4f70: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 an+1) * sizeof(S
4f80: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 canStatus);. Sc
4f90: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a anStatus *aNew;.
4fa0: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 aNew = (ScanSt
4fb0: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 atus*)sqlite3DbR
4fc0: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d ealloc(p->db, p-
4fd0: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a >aScan, nByte);.
4fe0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 if( aNew ){.
4ff0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e ScanStatus *pN
5000: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 ew = &aNew[p->nS
5010: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 can++];. pNew
5020: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 ->addrExplain =
5030: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 addrExplain;.
5040: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 pNew->addrLoop
5050: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 = addrLoop;.
5060: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 pNew->addrVisit
5070: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 = addrVisit;.
5080: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 pNew->nEst = nE
5090: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e st;. pNew->zN
50a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 ame = sqlite3DbS
50b0: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 trDup(p->db, zNa
50c0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 me);. p->aSca
50d0: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a n = aNew;. }.}.
50e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 #endif.../*.** C
50f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 hange the value
5100: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f of the opcode, o
5110: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 r P1, P2, P3, or
5120: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 P5 operands.**
5130: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 for a specific i
5140: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 nstruction..*/.v
5150: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 oid sqlite3VdbeC
5160: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 hangeOpcode(Vdbe
5170: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 *p, u32 addr, u
5180: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 8 iNewOpcode){.
5190: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f sqlite3VdbeGetO
51a0: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 p(p,addr)->opcod
51b0: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a e = iNewOpcode;.
51c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 }.void sqlite3Vd
51d0: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 beChangeP1(Vdbe
51e0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e *p, u32 addr, in
51f0: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 t val){. sqlite
5200: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 3VdbeGetOp(p,add
5210: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a r)->p1 = val;.}.
5220: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
5230: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 ChangeP2(Vdbe *p
5240: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 , u32 addr, int
5250: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 val){. sqlite3V
5260: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 dbeGetOp(p,addr)
5270: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f ->p2 = val;.}.vo
5280: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 id sqlite3VdbeCh
5290: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 angeP3(Vdbe *p,
52a0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 u32 addr, int va
52b0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 l){. sqlite3Vdb
52c0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e eGetOp(p,addr)->
52d0: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 p3 = val;.}.void
52e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e sqlite3VdbeChan
52f0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 geP5(Vdbe *p, u8
5300: 20 70 35 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 p5){. sqlite3V
5310: 64 62 65 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e dbeGetOp(p,-1)->
5320: 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a p5 = p5;.}../*.*
5330: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 * Change the P2
5340: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 operand of instr
5350: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 uction addr so t
5360: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f hat it points to
5370: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 .** the address
5380: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 of the next inst
5390: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f ruction to be co
53a0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c ded..*/.void sql
53b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 ite3VdbeJumpHere
53c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 (Vdbe *p, int ad
53d0: 64 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65 dr){. p->pParse
53e0: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e ->iFixedOp = p->
53f0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 nOp - 1;. sqlit
5400: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 e3VdbeChangeP2(p
5410: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b , addr, p->nOp);
5420: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 .}.../*.** If th
5430: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 e input FuncDef
5440: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 structure is eph
5450: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 emeral, then fre
5460: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 e it. If.** the
5470: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 FuncDef is not
5480: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 ephermal, then d
5490: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 o nothing..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 atic void freeEp
54b0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 hemeralFunction(
54c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e sqlite3 *db, Fun
54d0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 cDef *pDef){. i
54e0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 f( ALWAYS(pDef)
54f0: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c && (pDef->funcFl
5500: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e ags & SQLITE_FUN
5510: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 C_EPHEM)!=0 ){.
5520: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
5530: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a (db, pDef);. }.
5540: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 }..static void v
5550: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 dbeFreeOpArray(s
5560: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 qlite3 *, Op *,
5570: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c int);../*.** Del
5580: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 ete a P4 value i
5590: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a f necessary..*/.
55a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 static void free
55b0: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 P4(sqlite3 *db,
55c0: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 int p4type, void
55d0: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 *p4){. if( p4
55e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 ){. assert( d
55f0: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 b );. switch(
5600: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 p4type ){.
5610: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 case P4_FUNCCTX
5620: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 : {. free
5630: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f EphemeralFunctio
5640: 6e 28 64 62 2c 20 28 28 73 71 6c 69 74 65 33 5f n(db, ((sqlite3_
5650: 63 6f 6e 74 65 78 74 2a 29 70 34 29 2d 3e 70 46 context*)p4)->pF
5660: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a unc);. /*
5670: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e Fall through in
5680: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65 to the next case
5690: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 */. }.
56a0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a case P4_REAL:.
56b0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e case P4_IN
56c0: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 T64:. case
56d0: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 P4_DYNAMIC:.
56e0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 case P4_INTARR
56f0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 AY: {. sq
5700: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
5710: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 p4);. bre
5720: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
5730: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 case P4_KEYINF
5740: 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 O: {. if(
5750: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 db->pnBytesFree
5760: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 d==0 ) sqlite3Ke
5770: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 yInfoUnref((KeyI
5780: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 nfo*)p4);.
5790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d break;. }
57a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 .#ifdef SQLITE_E
57b0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e NABLE_CURSOR_HIN
57c0: 54 53 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 TS. case P4
57d0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 20 _EXPR: {.
57e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 sqlite3ExprDele
57f0: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34 te(db, (Expr*)p4
5800: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b );. break
5810: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 ;. }.#endif
5820: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d . case P4_M
5830: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 PRINTF: {.
5840: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 if( db->pnByte
5850: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 sFreed==0 ) sqli
5860: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 te3_free(p4);.
5870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
5880: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 }. case
5890: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 P4_FUNCDEF: {.
58a0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 freeEpheme
58b0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 ralFunction(db,
58c0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 (FuncDef*)p4);.
58d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
58e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
58f0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 P4_MEM: {.
5900: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 if( db->pnByt
5910: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 esFreed==0 ){.
5920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
5930: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 alueFree((sqlite
5940: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 3_value*)p4);.
5950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
5960: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 Mem *p =
5970: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 (Mem*)p4;.
5980: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c if( p->szMal
5990: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 loc ) sqlite3DbF
59a0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c ree(db, p->zMall
59b0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 oc);. s
59c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c qlite3DbFree(db,
59d0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 p);. }.
59e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
59f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 }. case
5a00: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 P4_VTAB : {.
5a10: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 if( db->pnB
5a20: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 ytesFreed==0 ) s
5a30: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b qlite3VtabUnlock
5a40: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a ((VTable *)p4);.
5a50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
5a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d }. }. }
5a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 .}../*.** Free t
5a80: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 he space allocat
5a90: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 ed for aOp and a
5aa0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c ny p4 values all
5ab0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a ocated for the.*
5ac0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 * opcodes contai
5ad0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 ned within. If a
5ae0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 Op is not NULL i
5af0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 t is assumed to
5b00: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 contain .** nOp
5b10: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 entries. .*/.sta
5b20: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 tic void vdbeFre
5b30: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 eOpArray(sqlite3
5b40: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 *db, Op *aOp, i
5b50: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 nt nOp){. if( a
5b60: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f Op ){. Op *pO
5b70: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 p;. for(pOp=a
5b80: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 Op; pOp<&aOp[nOp
5b90: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 ]; pOp++){.
5ba0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d freeP4(db, pOp-
5bb0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 >p4type, pOp->p4
5bc0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 .p);.#ifdef SQLI
5bd0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 TE_ENABLE_EXPLAI
5be0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 N_COMMENTS.
5bf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
5c00: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 b, pOp->zComment
5c10: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 );.#endif .
5c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 }. }. sqlit
5c30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 e3DbFree(db, aOp
5c40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b );.}../*.** Link
5c50: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 the SubProgram
5c60: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 object passed as
5c70: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 the second argu
5c80: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 ment into the li
5c90: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 nked.** list at
5ca0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d Vdbe.pSubProgram
5cb0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 . This list is u
5cc0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c sed to delete al
5cd0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a l sub-program.**
5ce0: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 objects when th
5cf0: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 e VM is no longe
5d00: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 r required..*/.v
5d10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c oid sqlite3VdbeL
5d20: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 inkSubProgram(Vd
5d30: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 be *pVdbe, SubPr
5d40: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e ogram *p){. p->
5d50: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 pNext = pVdbe->p
5d60: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 Program;. pVdbe
5d70: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a ->pProgram = p;.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 }../*.** Change
5d90: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 the opcode at ad
5da0: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a dr into OP_Noop.
5db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
5dc0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 dbeChangeToNoop(
5dd0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 Vdbe *p, int add
5de0: 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70 r){. if( addr<p
5df0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 ->nOp ){. Vdb
5e00: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 eOp *pOp = &p->a
5e10: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 Op[addr];. sq
5e20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
5e30: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 b;. freeP4(db
5e40: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 , pOp->p4type, p
5e50: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d Op->p4.p);. m
5e60: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 emset(pOp, 0, si
5e70: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 zeof(pOp[0]));.
5e80: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d pOp->opcode =
5e90: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a OP_Noop;. }.}.
5ea0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 ./*.** If the la
5eb0: 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 st opcode is "op
5ec0: 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 " and it is not
5ed0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 a jump destinati
5ee0: 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f on,.** then remo
5ef0: 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 ve it. Return t
5f00: 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 rue if and only
5f10: 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 if an opcode was
5f20: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 removed..*/.int
5f30: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 sqlite3VdbeDele
5f40: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 tePriorOpcode(Vd
5f50: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 be *p, u8 op){.
5f60: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e if( (p->nOp-1)>
5f70: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 (p->pParse->iFix
5f80: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b edOp) && p->aOp[
5f90: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 p->nOp-1].opcode
5fa0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 ==op ){. sqli
5fb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e te3VdbeChangeToN
5fc0: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 oop(p, p->nOp-1)
5fd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a ;. return 1;.
5fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 }else{. ret
5ff0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a urn 0;. }.}../*
6000: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 .** Change the v
6010: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f alue of the P4 o
6020: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 perand for a spe
6030: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f cific instructio
6040: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 n..** This routi
6050: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 ne is useful whe
6060: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 n a large progra
6070: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d m is loaded from
6080: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 a.** static arr
6090: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 ay using sqlite3
60a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 VdbeAddOpList bu
60b0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b t we want to mak
60c0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 e a.** few minor
60d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 changes to the
60e0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 program..**.** I
60f0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 f n>=0 then the
6100: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 P4 operand is dy
6110: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 namic, meaning t
6120: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a hat a copy of.**
6130: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d the string is m
6140: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 ade into memory
6150: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 obtained from sq
6160: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a lite3_malloc()..
6170: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d ** A value of n=
6180: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 =0 means copy by
6190: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f tes of zP4 up to
61a0: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 and including t
61b0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c he.** first null
61c0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 byte. If n>0 t
61d0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 hen copy n+1 byt
61e0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a es of zP4..** .*
61f0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f * Other values o
6200: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 f n (P4_STATIC,
6210: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 P4_COLLSEQ etc.)
6220: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a indicate that z
6230: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 P4 points.** to
6240: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 a string or stru
6250: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 cture that is gu
6260: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 aranteed to exis
6270: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 t for the lifeti
6280: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 me of.** the Vdb
6290: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 e. In these case
62a0: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f s we can just co
62b0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a py the pointer..
62c0: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 **.** If addr<0
62d0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f then change P4 o
62e0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e n the most recen
62f0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 tly inserted ins
6300: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 truction..*/.voi
6310: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 d sqlite3VdbeCha
6320: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 ngeP4(Vdbe *p, i
6330: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 nt addr, const c
6340: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 har *zP4, int n)
6350: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 {. Op *pOp;. s
6360: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 qlite3 *db;. as
6370: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 sert( p!=0 );.
6380: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 db = p->db;. as
6390: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d sert( p->magic==
63a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 VDBE_MAGIC_INIT
63b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d );. if( p->aOp=
63c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 =0 || db->malloc
63d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 Failed ){. if
63e0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a ( n!=P4_VTAB ){.
63f0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c freeP4(db,
6400: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61 n, (void*)*(cha
6410: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d r**)&zP4);. }
6420: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d . return;. }
6430: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f . assert( p->nO
6440: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 p>0 );. assert(
6450: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a addr<p->nOp );.
6460: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a if( addr<0 ){.
6470: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f addr = p->nO
6480: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 p - 1;. }. pOp
6490: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d = &p->aOp[addr]
64a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d ;. assert( pOp-
64b0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55 >p4type==P4_NOTU
64c0: 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f SED. || pO
64d0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e p->p4type==P4_IN
64e0: 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f T32. || pO
64f0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45 p->p4type==P4_KE
6500: 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50 YINFO );. freeP
6510: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 4(db, pOp->p4typ
6520: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 e, pOp->p4.p);.
6530: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a pOp->p4.p = 0;.
6540: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33 if( n==P4_INT3
6550: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65 2 ){. /* Note
6560: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73 : this cast is s
6570: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65 afe, because the
6580: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69 origin data poi
6590: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20 nt was an int.
65a0: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61 ** that was ca
65b0: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63 st to a (const c
65c0: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70 har *). */. p
65d0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54 Op->p4.i = SQLIT
65e0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34 E_PTR_TO_INT(zP4
65f0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 );. pOp->p4ty
6600: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20 pe = P4_INT32;.
6610: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d }else if( zP4==
6620: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 0 ){. pOp->p4
6630: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d .p = 0;. pOp-
6640: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 >p4type = P4_NOT
6650: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 USED;. }else if
6660: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 ( n==P4_KEYINFO
6670: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 ){. pOp->p4.p
6680: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 = (void*)zP4;.
6690: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d pOp->p4type =
66a0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 23 69 66 P4_KEYINFO;.#if
66b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c def SQLITE_ENABL
66c0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20 E_CURSOR_HINTS.
66d0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 }else if( n==P4
66e0: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 2f 2a 20 _EXPR ){. /*
66f0: 52 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 66 Responsibility f
6700: 6f 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 or deleting the
6710: 45 78 70 72 20 74 72 65 65 20 69 73 20 68 61 6e Expr tree is han
6720: 64 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a ded over to the.
6730: 20 20 20 20 2a 2a 20 56 44 42 45 20 62 79 20 74 ** VDBE by t
6740: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 his operation.
6750: 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c The caller shoul
6760: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 69 d have already i
6770: 6e 76 6f 6b 65 64 0a 20 20 20 20 2a 2a 20 73 71 nvoked. ** sq
6780: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 20 6f lite3ExprDup() o
6790: 72 20 77 68 61 74 65 76 65 72 20 6f 74 68 65 72 r whatever other
67a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 65 64 routine is need
67b0: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 0a 20 20 ed to make a .
67c0: 20 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 70 ** private cop
67d0: 79 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a y of the tree. *
67e0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 45 /. pOp->p4.pE
67f0: 78 70 72 20 3d 20 28 45 78 70 72 2a 29 7a 50 34 xpr = (Expr*)zP4
6800: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 ;. pOp->p4typ
6810: 65 20 3d 20 50 34 5f 45 58 50 52 3b 0a 23 65 6e e = P4_EXPR;.#en
6820: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 dif. }else if(
6830: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20 n==P4_VTAB ){.
6840: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 pOp->p4.p = (v
6850: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f oid*)zP4;. pO
6860: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56 p->p4type = P4_V
6870: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 TAB;. sqlite3
6880: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65 VtabLock((VTable
6890: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73 *)zP4);. ass
68a0: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29 ert( ((VTable *)
68b0: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20 zP4)->db==p->db
68c0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e );. }else if( n
68d0: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 <0 ){. pOp->p
68e0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 4.p = (void*)zP4
68f0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 ;. pOp->p4typ
6900: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72 e = (signed char
6910: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 )n;. }else{.
6920: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 if( n==0 ) n =
6930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
6940: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 zP4);. pOp->p
6950: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53 4.z = sqlite3DbS
6960: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50 trNDup(p->db, zP
6970: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 4, n);. pOp->
6980: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41 p4type = P4_DYNA
6990: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a MIC;. }.}../*.*
69a0: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 * Set the P4 on
69b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c the most recentl
69c0: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 y added opcode t
69d0: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f o the KeyInfo fo
69e0: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 r the.** index g
69f0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 iven..*/.void sq
6a00: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 lite3VdbeSetP4Ke
6a10: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 yInfo(Parse *pPa
6a20: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 rse, Index *pIdx
6a30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 ){. Vdbe *v = p
6a40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 Parse->pVdbe;.
6a50: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a assert( v!=0 );.
6a60: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d assert( pIdx!=
6a70: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 0 );. sqlite3Vd
6a80: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 beChangeP4(v, -1
6a90: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 , (char*)sqlite3
6aa0: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 KeyInfoOfIndex(p
6ab0: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 Parse, pIdx),.
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6ad0: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b P4_KEYINFO);
6ae0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 .}..#ifdef SQLIT
6af0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e E_ENABLE_EXPLAIN
6b00: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 _COMMENTS./*.**
6b10: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 Change the comme
6b20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 nt on the most r
6b30: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e ecently coded in
6b40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a struction. Or.*
6b50: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 * insert a No-op
6b60: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d and add the com
6b70: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 ment to that new
6b80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 instruction. T
6b90: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 his.** makes the
6ba0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 code easier to
6bb0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 read during debu
6bc0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 gging. None of
6bd0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 this happens.**
6be0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 in a production
6bf0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 build..*/.static
6c00: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 void vdbeVComme
6c10: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 nt(Vdbe *p, cons
6c20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
6c30: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 va_list ap){.
6c40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 assert( p->nOp>0
6c50: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b || p->aOp==0 );
6c60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f . assert( p->aO
6c70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 p==0 || p->aOp[p
6c80: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e ->nOp-1].zCommen
6c90: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d t==0 || p->db->m
6ca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 allocFailed );.
6cb0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 if( p->nOp ){.
6cc0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f assert( p->aO
6cd0: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 p );. sqlite3
6ce0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d DbFree(p->db, p-
6cf0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a >aOp[p->nOp-1].z
6d00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d Comment);. p-
6d10: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a >aOp[p->nOp-1].z
6d20: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 Comment = sqlite
6d30: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 3VMPrintf(p->db,
6d40: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 zFormat, ap);.
6d50: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 }.}.void sqlite
6d60: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 3VdbeComment(Vdb
6d70: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 e *p, const char
6d80: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
6d90: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
6da0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 if( p ){. va
6db0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d _start(ap, zForm
6dc0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f at);. vdbeVCo
6dd0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 mment(p, zFormat
6de0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e , ap);. va_en
6df0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 d(ap);. }.}.voi
6e00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f d sqlite3VdbeNoo
6e10: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 pComment(Vdbe *p
6e20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 , const char *zF
6e30: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 ormat, ...){. v
6e40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 a_list ap;. if(
6e50: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 p ){. sqlite
6e60: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 3VdbeAddOp0(p, O
6e70: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f P_Noop);. va_
6e80: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 start(ap, zForma
6e90: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d t);. vdbeVCom
6ea0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c ment(p, zFormat,
6eb0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 ap);. va_end
6ec0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 (ap);. }.}.#end
6ed0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f if /* NDEBUG */
6ee0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f ..#ifdef SQLITE_
6ef0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a VDBE_COVERAGE./*
6f00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 .** Set the valu
6f10: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e e if the iSrcLin
6f20: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 e field for the
6f30: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 previously coded
6f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f instruction..*/
6f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 .void sqlite3Vdb
6f60: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 eSetLineNumber(V
6f70: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e dbe *v, int iLin
6f80: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 e){. sqlite3Vdb
6f90: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 eGetOp(v,-1)->iS
6fa0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a rcLine = iLine;.
6fb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 }.#endif /* SQLI
6fc0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 TE_VDBE_COVERAGE
6fd0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 */../*.** Retur
6fe0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 n the opcode for
6ff0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 a given address
7000: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73 . If the addres
7010: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a s is -1, then.**
7020: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 return the most
7030: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 recently insert
7040: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a ed opcode..**.**
7050: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c If a memory all
7060: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 ocation error ha
7070: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 s occurred prior
7080: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 to the calling
7090: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 of this.** routi
70a0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 ne, then a point
70b0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 er to a dummy Vd
70c0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 beOp will be ret
70d0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 urned. That opc
70e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 ode.** is readab
70f0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 le but not writa
7100: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 ble, though it i
7110: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 s cast to a writ
7120: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 able value..** T
7130: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 he return of a d
7140: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f ummy opcode allo
7150: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 ws the call to c
7160: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e ontinue function
7170: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 ing.** after an
7180: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 OOM fault withou
7190: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 t having to chec
71a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 k to see if the
71b0: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 return from .**
71c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 this routine is
71d0: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e a valid pointer.
71e0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 But because th
71f0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 e dummy.opcode i
7200: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 s 0,.** dummy wi
7210: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 ll never be writ
7220: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 ten to. This is
7230: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 verified by cod
7240: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 e inspection and
7250: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 .** by running w
7260: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f ith Valgrind..*/
7270: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 .VdbeOp *sqlite3
7280: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a VdbeGetOp(Vdbe *
7290: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 p, int addr){.
72a0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73 /* C89 specifies
72b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 that the consta
72c0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 nt "dummy" will
72d0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 be initialized t
72e0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 o all. ** zeros
72f0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 , which is corre
7300: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 ct. MSVC genera
7310: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e tes a warning, n
7320: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a evertheless. */.
7330: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 static VdbeOp
7340: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 dummy; /* Ignor
7350: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 e the MSVC warni
7360: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 ng about no init
7370: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 ializer */. ass
7380: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 ert( p->magic==V
7390: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 DBE_MAGIC_INIT )
73a0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 ;. if( addr<0 )
73b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e {. addr = p->
73c0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 nOp - 1;. }. a
73d0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 ssert( (addr>=0
73e0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 && addr<p->nOp)
73f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 || p->db->malloc
7400: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 Failed );. if(
7410: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 p->db->mallocFai
7420: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 led ){. retur
7430: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d n (VdbeOp*)&dumm
7440: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 y;. }else{.
7450: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 return &p->aOp[a
7460: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 ddr];. }.}..#if
7470: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f defined(SQLITE_
7480: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 ENABLE_EXPLAIN_C
7490: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 OMMENTS)./*.** R
74a0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 eturn an integer
74b0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f value for one o
74c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 f the parameters
74d0: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 to the opcode p
74e0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 Op.** determined
74f0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e by character c.
7500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 .*/.static int t
7510: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 ranslateP(char c
7520: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 , const Op *pOp)
7530: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 {. if( c=='1' )
7540: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b return pOp->p1;
7550: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 . if( c=='2' )
7560: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a return pOp->p2;.
7570: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 if( c=='3' ) r
7580: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 eturn pOp->p3;.
7590: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 if( c=='4' ) re
75a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a turn pOp->p4.i;.
75b0: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 return pOp->p5
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 ;.}../*.** Compu
75d0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 te a string for
75e0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 the "comment" fi
75f0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 eld of a VDBE op
7600: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a code listing..**
7610: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 .** The Synopsis
7620: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 : field in comme
7630: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e nts in the vdbe.
7640: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 c source file ge
7650: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 ts converted.**
7660: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 to an extra stri
7670: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e ng that is appen
7680: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 ded to the sqlit
7690: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 e3OpcodeName().
76a0: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e In the.** absen
76b0: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d ce of other comm
76c0: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 ents, this synop
76d0: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 sis becomes the
76e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f comment on the o
76f0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 pcode..** Some t
7700: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 ranslation occur
7710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 s:.**.** "
7720: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b PX" -> "r[
7730: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 X]".** "PX
7740: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e @PY" -> "r[X.
7750: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b .X+Y-1]" or "r[
7760: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 x]" if y is 0 or
7770: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 1.** "PX@
7780: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e PY+1" -> "r[X..
7790: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 X+Y]" or "r[x
77a0: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 ]" if y is 0.**
77b0: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 "PY..PY"
77c0: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 -> "r[X..Y]"
77d0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 or "r[x]" if
77e0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 y<=x.*/.static i
77f0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e nt displayCommen
7800: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 t(. const Op *p
7810: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f Op, /* The o
7820: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d pcode to be comm
7830: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 ented */. const
7840: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a char *zP4, /*
7850: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 Previously obta
7860: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 ined value for P
7870: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 4 */. char *zTe
7880: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 mp, /* Wri
7890: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a te result here *
78a0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 /. int nTemp
78b0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 /* Space
78c0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 available in zTe
78d0: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e mp[] */.){. con
78e0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 st char *zOpName
78f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ;. const char *
7900: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 zSynopsis;. int
7910: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 nOpName;. int
7920: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d ii, jj;. zOpNam
7930: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 e = sqlite3Opcod
7940: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 eName(pOp->opcod
7950: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 e);. nOpName =
7960: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
7970: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 zOpName);. if(
7980: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b zOpName[nOpName+
7990: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 1] ){. int se
79a0: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 enCom = 0;. c
79b0: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f har c;. zSyno
79c0: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b psis = zOpName +
79d0: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 = nOpName + 1;.
79e0: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 for(ii=jj=0;
79f0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 jj<nTemp-1 && (c
7a00: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d = zSynopsis[ii]
7a10: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 )!=0; ii++){.
7a20: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b if( c=='P' ){
7a30: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 . c = zSy
7a40: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 nopsis[++ii];.
7a50: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 if( c=='4'
7a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 ){. sq
7a70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e lite3_snprintf(n
7a80: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a Temp-jj, zTemp+j
7a90: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 j, "%s", zP4);.
7aa0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
7ab0: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 c=='X' ){.
7ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
7ad0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 rintf(nTemp-jj,
7ae0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 zTemp+jj, "%s",
7af0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a pOp->zComment);.
7b00: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f seenCo
7b10: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d m = 1;. }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 else{.
7b30: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 int v1 = transla
7b40: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 teP(c, pOp);.
7b50: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 int v2;.
7b60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
7b70: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d _snprintf(nTemp-
7b80: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 jj, zTemp+jj, "%
7b90: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 d", v1);.
7ba0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a if( strncmp(z
7bb0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 Synopsis+ii+1, "
7bc0: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 @P", 2)==0 ){.
7bd0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 ii +=
7be0: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 3;. j
7bf0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c j += sqlite3Strl
7c00: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a en30(zTemp+jj);.
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d v2 =
7c20: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e translateP(zSyn
7c30: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b opsis[ii], pOp);
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 . if(
7c50: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 strncmp(zSynops
7c60: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d is+ii+1,"+1",2)=
7c70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 =0 ){.
7c80: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 ii += 2;.
7c90: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b v2++;
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
7cb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 if( v
7cc0: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 2>1 ){.
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
7ce0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 rintf(nTemp-jj,
7cf0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 zTemp+jj, "..%d"
7d00: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 , v1+v2-1);.
7d10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
7d20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 }else if( st
7d30: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b rncmp(zSynopsis+
7d40: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 ii+1, "..P3", 4)
7d50: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d ==0 && pOp->p3==
7d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 0 ){.
7d70: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 ii += 4;.
7d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a }. }.
7d90: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 jj += sq
7da0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 lite3Strlen30(zT
7db0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d emp+jj);. }
7dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 else{. zT
7dd0: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 emp[jj++] = c;.
7de0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 }. }.
7df0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 if( !seenCom &&
7e00: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 jj<nTemp-5 && p
7e10: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a Op->zComment ){.
7e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
7e30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c printf(nTemp-jj,
7e40: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 zTemp+jj, "; %s
7e50: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 ", pOp->zComment
7e60: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 );. jj += s
7e70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
7e80: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a Temp+jj);. }.
7e90: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 if( jj<nTemp
7ea0: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 ) zTemp[jj] = 0
7eb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f ;. }else if( pO
7ec0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 p->zComment ){.
7ed0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
7ee0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
7ef0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f , "%s", pOp->zCo
7f00: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d mment);. jj =
7f10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 sqlite3Strlen30
7f20: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 (zTemp);. }else
7f30: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d {. zTemp[0] =
7f40: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 0;. jj = 0;.
7f50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b }. return jj;
7f60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c .}.#endif /* SQL
7f70: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 ITE_DEBUG */..#i
7f80: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 f VDBE_DISPLAY_P
7f90: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 4 && defined(SQL
7fa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f ITE_ENABLE_CURSO
7fb0: 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 R_HINTS)./*.** T
7fc0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e ranslate the P4.
7fd0: 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 pExpr value for
7fe0: 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 an OP_CursorHint
7ff0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 opcode into tex
8000: 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 t.** that can be
8010: 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 displayed in th
8020: 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 e P4 column of E
8030: 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a XPLAIN output..*
8040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 /.static int dis
8050: 70 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e playP4Expr(int n
8060: 54 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d Temp, char *zTem
8070: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b p, Expr *pExpr){
8080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
8090: 4f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b Op = 0;. int n;
80a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 . switch( pExpr
80b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 ->op ){. case
80c0: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 TK_STRING:.
80d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
80e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
80f0: 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e "%Q", pExpr->u.
8100: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 zToken);. b
8110: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
8120: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 K_INTEGER:.
8130: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
8140: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 f(nTemp, zTemp,
8150: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 "%d", pExpr->u.i
8160: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72 Value);. br
8170: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b eak;. case TK
8180: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c _NULL:. sql
8190: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
81a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c emp, zTemp, "NUL
81b0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b L");. break
81c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 ;. case TK_RE
81d0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 GISTER: {.
81e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
81f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 (nTemp, zTemp, "
8200: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 r[%d]", pExpr->i
8210: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 Table);. br
8220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 eak;. }. c
8230: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b ase TK_COLUMN: {
8240: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 . if( pExpr
8250: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 ->iColumn<0 ){.
8260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
8270: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
8280: 54 65 6d 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a Temp, "rowid");.
8290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
82a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
82b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 rintf(nTemp, zTe
82c0: 6d 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 mp, "c%d", (int)
82d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b pExpr->iColumn);
82e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 . }. b
82f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
8300: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 case TK_LT:
8310: 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 zOp = "LT";
8320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
8330: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f e TK_LE: zO
8340: 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 p = "LE"; b
8350: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
8360: 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d K_GT: zOp =
8370: 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 "GT"; brea
8380: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 k;. case TK_G
8390: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 E: zOp = "G
83a0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a E"; break;.
83b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 case TK_NE:
83c0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b zOp = "NE";
83d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
83e0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 case TK_EQ:
83f0: 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 zOp = "EQ";
8400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
8410: 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a se TK_IS: z
8420: 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 Op = "IS";
8430: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
8440: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 TK_ISNOT: zOp
8450: 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 = "ISNOT"; bre
8460: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f ak;. case TK_
8470: 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 AND: zOp = "
8480: 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b AND"; break;
8490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a . case TK_OR:
84a0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 zOp = "OR"
84b0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 ; break;.
84c0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 case TK_PLUS:
84d0: 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 zOp = "ADD";
84e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 break;. c
84f0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 ase TK_STAR:
8500: 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 zOp = "MUL";
8510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 break;. case
8520: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 TK_MINUS: zOp
8530: 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 = "SUB"; br
8540: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b eak;. case TK
8550: 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 _REM: zOp =
8560: 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b "REM"; break
8570: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 ;. case TK_BI
8580: 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 TAND: zOp = "BI
8590: 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 TAND"; break;.
85a0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 case TK_BITOR
85b0: 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 : zOp = "BITOR
85c0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 "; break;.
85d0: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 case TK_SLASH:
85e0: 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 zOp = "DIV";
85f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 break;. cas
8600: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f e TK_LSHIFT: zO
8610: 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 p = "LSHIFT"; b
8620: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
8630: 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d K_RSHIFT: zOp =
8640: 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 "RSHIFT"; brea
8650: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 k;. case TK_C
8660: 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 ONCAT: zOp = "C
8670: 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a ONCAT"; break;.
8680: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e case TK_UMIN
8690: 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 US: zOp = "MINU
86a0: 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 S"; break;.
86b0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 case TK_UPLUS:
86c0: 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 zOp = "PLUS";
86d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 break;. ca
86e0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a se TK_BITNOT: z
86f0: 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 Op = "BITNOT";
8700: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
8710: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 TK_NOT: zOp
8720: 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 = "NOT"; bre
8730: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f ak;. case TK_
8740: 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 ISNULL: zOp = "
8750: 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b ISNULL"; break;
8760: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 . case TK_NOT
8770: 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 NULL: zOp = "NOT
8780: 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 NULL"; break;..
8790: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 default:.
87a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
87b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
87c0: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a "%s", "expr");.
87d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d break;. }
87e0: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 .. if( zOp ){.
87f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
8800: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
8810: 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 , "%s(", zOp);.
8820: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 n = sqlite3St
8830: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 rlen30(zTemp);.
8840: 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 n += displayP
8850: 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 4Expr(nTemp-n, z
8860: 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 Temp+n, pExpr->p
8870: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 6e Left);. if( n
8880: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 70 45 78 70 <nTemp-1 && pExp
8890: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 r->pRight ){.
88a0: 20 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 zTemp[n++] =
88b0: 27 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 ',';. n +=
88c0: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54 displayP4Expr(nT
88d0: 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 emp-n, zTemp+n,
88e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a pExpr->pRight);.
88f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
8900: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 3_snprintf(nTemp
8910: 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22 -n, zTemp+n, ")"
8920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 );. }. return
8930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 sqlite3Strlen30(
8940: 7a 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 zTemp);.}.#endif
8950: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 /* VDBE_DISPLAY
8960: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 _P4 && defined(S
8970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 QLITE_ENABLE_CUR
8980: 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a SOR_HINTS) */...
8990: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 #if VDBE_DISPLAY
89a0: 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 _P4./*.** Comput
89b0: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 e a string that
89c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 describes the P4
89d0: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 parameter for a
89e0: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 n opcode..** Use
89f0: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 zTemp for any r
8a00: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 equired temporar
8a10: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a y buffer space..
8a20: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a */.static char *
8a30: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f displayP4(Op *pO
8a40: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 p, char *zTemp,
8a50: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 int nTemp){. ch
8a60: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b ar *zP4 = zTemp;
8a70: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 . assert( nTemp
8a80: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68 >=20 );. switch
8a90: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b ( pOp->p4type ){
8aa0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 . case P4_KEY
8ab0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e INFO: {. in
8ac0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 t i, j;. Ke
8ad0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 yInfo *pKeyInfo
8ae0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e = pOp->p4.pKeyIn
8af0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 fo;. assert
8b00: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 ( pKeyInfo->aSor
8b10: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 tOrder!=0 );.
8b20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 sqlite3_snpri
8b30: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 ntf(nTemp, zTemp
8b40: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e , "k(%d", pKeyIn
8b50: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 fo->nField);.
8b60: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74 i = sqlite3St
8b70: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 rlen30(zTemp);.
8b80: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c for(j=0; j<
8b90: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 pKeyInfo->nField
8ba0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 ; j++){.
8bb0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d CollSeq *pColl =
8bc0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c pKeyInfo->aColl
8bd0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e [j];. con
8be0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d st char *zColl =
8bf0: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e pColl ? pColl->
8c00: 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 zName : "nil";.
8c10: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 int n = s
8c20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a qlite3Strlen30(z
8c30: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 Coll);. i
8c40: 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d f( n==6 && memcm
8c50: 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 p(zColl,"BINARY"
8c60: 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 ,6)==0 ){.
8c70: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b zColl = "B";
8c80: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31 . n = 1
8c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
8ca0: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d if( i+n>nTem
8cb0: 70 2d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 p-7 ){.
8cc0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 memcpy(&zTemp[i
8cd0: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 ],",...",4);.
8ce0: 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 i += 4;.
8cf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a break;.
8d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
8d10: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 zTemp[i++] = '
8d20: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ,';. if(
8d30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f pKeyInfo->aSortO
8d40: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 rder[j] ){.
8d50: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 zTemp[i++]
8d60: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d = '-';. }
8d70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 . memcpy(
8d80: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c &zTemp[i], zColl
8d90: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 , n+1);.
8da0: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a i += n;. }.
8db0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d zTemp[i++]
8dc0: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 = ')';. zT
8dd0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 emp[i] = 0;.
8de0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d assert( i<nTem
8df0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b p );. break
8e00: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 ;. }.#ifdef S
8e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 QLITE_ENABLE_CUR
8e20: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 SOR_HINTS. ca
8e30: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 se P4_EXPR: {.
8e40: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 displayP4Exp
8e50: 72 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 r(nTemp, zTemp,
8e60: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a pOp->p4.pExpr);.
8e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
8e80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 }.#endif. ca
8e90: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b se P4_COLLSEQ: {
8ea0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a . CollSeq *
8eb0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e pColl = pOp->p4.
8ec0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c pColl;. sql
8ed0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
8ee0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e emp, zTemp, "(%.
8ef0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 20s)", pColl->zN
8f00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 ame);. brea
8f10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 k;. }. cas
8f20: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a e P4_FUNCDEF: {.
8f30: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 FuncDef *p
8f40: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 Def = pOp->p4.pF
8f50: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 unc;. sqlit
8f60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d e3_snprintf(nTem
8f70: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 p, zTemp, "%s(%d
8f80: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c )", pDef->zName,
8f90: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 pDef->nArg);.
8fa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
8fb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 .#ifdef SQLITE_D
8fc0: 45 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34 EBUG. case P4
8fd0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 _FUNCCTX: {.
8fe0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 FuncDef *pDef
8ff0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e = pOp->p4.pCtx->
9000: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c pFunc;. sql
9010: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
9020: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 emp, zTemp, "%s(
9030: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d %d)", pDef->zNam
9040: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a e, pDef->nArg);.
9050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
9060: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 }.#endif. ca
9070: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 se P4_INT64: {.
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
9090: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 rintf(nTemp, zTe
90a0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 mp, "%lld", *pOp
90b0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 ->p4.pI64);.
90c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 break;. }.
90d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 case P4_INT32
90e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 : {. sqlite
90f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 3_snprintf(nTemp
9100: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 , zTemp, "%d", p
9110: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 Op->p4.i);.
9120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 break;. }.
9130: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 case P4_REAL:
9140: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
9150: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 snprintf(nTemp,
9160: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 zTemp, "%.16g",
9170: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b *pOp->p4.pReal);
9180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
9190: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f }. case P4_
91a0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d MEM: {. Mem
91b0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 *pMem = pOp->p4
91c0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 .pMem;. if(
91d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d pMem->flags & M
91e0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 EM_Str ){.
91f0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b zP4 = pMem->z;
9200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 . }else if(
9210: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d pMem->flags & M
9220: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 EM_Int ){.
9230: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
9240: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c tf(nTemp, zTemp,
9250: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 "%lld", pMem->u
9260: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 .i);. }else
9270: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 if( pMem->flags
9280: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 & MEM_Real ){.
9290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 sqlite3_s
92a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a nprintf(nTemp, z
92b0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 Temp, "%.16g", p
92c0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 Mem->u.r);.
92d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d }else if( pMem-
92e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c >flags & MEM_Nul
92f0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c l ){. sql
9300: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 ite3_snprintf(nT
9310: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c emp, zTemp, "NUL
9320: 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 L");. }else
9330: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 {. assert
9340: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 ( pMem->flags &
9350: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 MEM_Blob );.
9360: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 zP4 = "(blob
9370: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 )";. }.
9380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 break;. }.#
9390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
93a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
93b0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42 case P4_VTAB
93c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 : {. sqlite
93d0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20 3_vtab *pVtab =
93e0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 pOp->p4.pVtab->p
93f0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 Vtab;. sqli
9400: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 te3_snprintf(nTe
9410: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 mp, zTemp, "vtab
9420: 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 :%p", pVtab);.
9430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
9440: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 .#endif. case
9450: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a P4_INTARRAY: {.
9460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e sqlite3_sn
9470: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 printf(nTemp, zT
9480: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29 emp, "intarray")
9490: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 ;. break;.
94a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 }. case P4
94b0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 _SUBPROGRAM: {.
94c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 sqlite3_snp
94d0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 rintf(nTemp, zTe
94e0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a mp, "program");.
94f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
9500: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 }. case P4_A
9510: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 DVANCE: {.
9520: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 zTemp[0] = 0;.
9530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
9540: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a . default: {.
9550: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d zP4 = pOp-
9560: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 >p4.z;. if(
9570: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 zP4==0 ){.
9580: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a zP4 = zTemp;.
9590: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d zTemp[0]
95a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 = 0;. }.
95b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 }. }. assert
95c0: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 ( zP4!=0 );. re
95d0: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 turn zP4;.}.#end
95e0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c if /* VDBE_DISPL
95f0: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 AY_P4 */../*.**
9600: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 Declare to the V
9610: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72 dbe that the BTr
9620: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d ee object at db-
9630: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e >aDb[i] is used.
9640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 .**.** The prepa
9650: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e red statements n
9660: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 eed to know in a
9670: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c dvance the compl
9680: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 ete set of.** at
9690: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 tached databases
96a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 that will be us
96b0: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 e. A mask of th
96c0: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a ese databases.**
96d0: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 is maintained i
96e0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 n p->btreeMask.
96f0: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b The p->lockMask
9700: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 value is the su
9710: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 bset of.** p->bt
9720: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 reeMask of datab
9730: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 ases that will r
9740: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a equire a lock..*
9750: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
9760: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65 beUsesBtree(Vdbe
9770: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 *p, int i){. a
9780: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 ssert( i>=0 && i
9790: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 <p->db->nDb && i
97a0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 <(int)sizeof(yDb
97b0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 Mask)*8 );. ass
97c0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 ert( i<(int)size
97d0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 of(p->btreeMask)
97e0: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 *8 );. DbMaskSe
97f0: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 t(p->btreeMask,
9800: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 i);. if( i!=1 &
9810: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 & sqlite3BtreeSh
9820: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 arable(p->db->aD
9830: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 b[i].pBt) ){.
9840: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f DbMaskSet(p->lo
9850: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a ckMask, i);. }.
9860: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 }..#if !defined(
9870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 SQLITE_OMIT_SHAR
9880: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c ED_CACHE) && SQL
9890: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 ITE_THREADSAFE>0
98a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 ./*.** If SQLite
98b0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20 is compiled to
98c0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 support shared-c
98d0: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f ache mode and to
98e0: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a be threadsafe,.
98f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 ** this routine
9900: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65 obtains the mute
9910: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 x associated wit
9920: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20 h each BtShared
9930: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61 structure.** tha
9940: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65 t may be accesse
9950: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 d by the VM pass
9960: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e ed as an argumen
9970: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69 t. In doing so i
9980: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74 t also.** sets t
9990: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d he BtShared.db m
99a0: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66 ember of each of
99b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74 the BtShared st
99c0: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69 ructures, ensuri
99d0: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 ng.** that the c
99e0: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64 orrect busy-hand
99f0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 ler callback is
9a00: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69 invoked if requi
9a10: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 red..**.** If SQ
9a20: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 Lite is not thre
9a30: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20 adsafe but does
9a40: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 support shared-c
9a50: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a ache mode, then.
9a60: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 ** sqlite3BtreeE
9a70: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65 nter() is invoke
9a80: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53 d to set the BtS
9a90: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c hared.db variabl
9aa0: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 es.** of all of
9ab0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 BtShared structu
9ac0: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76 res accessible v
9ad0: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20 ia the database
9ae0: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 handle .** assoc
9af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 iated with the V
9b00: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 M..**.** If SQLi
9b10: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 te is not thread
9b20: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f safe and does no
9b30: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 t support shared
9b40: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69 -cache mode, thi
9b50: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 s.** function is
9b60: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 a no-op..**.**
9b70: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b The p->btreeMask
9b80: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d field is a bitm
9b90: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65 ask of all btree
9ba0: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61 s that the prepa
9bb0: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e red .** statemen
9bc0: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73 t p will ever us
9bd0: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65 e. Let N be the
9be0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 number of bits
9bf0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a in p->btreeMask.
9c00: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 ** corresponding
9c10: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20 to btrees that
9c20: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65 use shared cache
9c30: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74 . Then the runt
9c40: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72 ime of.** this r
9c50: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 outine is N*N.
9c60: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65 But as N is rare
9c70: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20 ly more than 1,
9c80: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a this should not.
9c90: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e ** be a problem.
9ca0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
9cb0: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a VdbeEnter(Vdbe *
9cc0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 p){. int i;. s
9cd0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 qlite3 *db;. Db
9ce0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 *aDb;. int nDb
9cf0: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c ;. if( DbMaskAl
9d00: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 lZero(p->lockMas
9d10: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a k) ) return; /*
9d20: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 The common case
9d30: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 */. db = p->db
9d40: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 ;. aDb = db->aD
9d50: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e b;. nDb = db->n
9d60: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 Db;. for(i=0; i
9d70: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 <nDb; i++){.
9d80: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 if( i!=1 && DbMa
9d90: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 skTest(p->lockMa
9da0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 sk,i) && ALWAYS(
9db0: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 aDb[i].pBt!=0) )
9dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 {. sqlite3B
9dd0: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d treeEnter(aDb[i]
9de0: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d .pBt);. }. }
9df0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 .}.#endif..#if !
9e00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f defined(SQLITE_O
9e10: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 MIT_SHARED_CACHE
9e20: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 ) && SQLITE_THRE
9e30: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 ADSAFE>0./*.** U
9e40: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65 nlock all of the
9e50: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73 btrees previous
9e60: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63 ly locked by a c
9e70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 all to sqlite3Vd
9e80: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 beEnter()..*/.st
9e90: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e atic SQLITE_NOIN
9ea0: 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65 LINE void vdbeLe
9eb0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ave(Vdbe *p){.
9ec0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 int i;. sqlite3
9ed0: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b *db;. Db *aDb;
9ee0: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62 . int nDb;. db
9ef0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 = p->db;. aDb
9f00: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 = db->aDb;. nDb
9f10: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f = db->nDb;. fo
9f20: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b r(i=0; i<nDb; i+
9f30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 +){. if( i!=1
9f40: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 && DbMaskTest(p
9f50: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 ->lockMask,i) &&
9f60: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 ALWAYS(aDb[i].p
9f70: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 Bt!=0) ){.
9f80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 sqlite3BtreeLeav
9f90: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 e(aDb[i].pBt);.
9fa0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 }. }.}.void
9fb0: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 sqlite3VdbeLeave
9fc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 (Vdbe *p){. if(
9fd0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 DbMaskAllZero(p
9fe0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 ->lockMask) ) re
9ff0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f turn; /* The co
a000: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76 mmon case */. v
a010: 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23 dbeLeave(p);.}.#
a020: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e endif..#if defin
a030: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 ed(VDBE_PROFILE)
a040: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 || defined(SQLI
a050: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 TE_DEBUG)./*.**
a060: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f Print a single o
a070: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 pcode. This rou
a080: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 tine is used for
a090: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e debugging only.
a0a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
a0b0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45 VdbePrintOp(FILE
a0c0: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20 *pOut, int pc,
a0d0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72 Op *pOp){. char
a0e0: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50 *zP4;. char zP
a0f0: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a tr[50];. char z
a100: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74 Com[100];. stat
a110: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a ic const char *z
a120: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25 Format1 = "%4d %
a130: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64 -13s %4d %4d %4d
a140: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e %-13s %.2X %s\n
a150: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30 ";. if( pOut==0
a160: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74 ) pOut = stdout
a170: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 ;. zP4 = displa
a180: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73 yP4(pOp, zPtr, s
a190: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69 izeof(zPtr));.#i
a1a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 fdef SQLITE_ENAB
a1b0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 LE_EXPLAIN_COMME
a1c0: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d NTS. displayCom
a1d0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a ment(pOp, zP4, z
a1e0: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d Com, sizeof(zCom
a1f0: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d ));.#else. zCom
a200: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a [0] = 0;.#endif.
a210: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71 /* NB: The sq
a220: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 lite3OpcodeName(
a230: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d ) function is im
a240: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64 plemented by cod
a250: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62 e created. ** b
a260: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e y the mkopcodeh.
a270: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 awk and mkopcode
a280: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68 c.awk scripts wh
a290: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a ich extract the.
a2a0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ** information
a2b0: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63 from the vdbe.c
a2c0: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a source text */.
a2d0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 fprintf(pOut,
a2e0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20 zFormat1, pc, .
a2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f sqlite3Opco
a300: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f deName(pOp->opco
a310: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f de), pOp->p1, pO
a320: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 p->p2, pOp->p3,
a330: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 zP4, pOp->p5,.
a340: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 zCom. );.
a350: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a fflush(pOut);.}.
a360: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 #endif../*.** Re
a370: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f lease an array o
a380: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 f N Mem elements
a390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 .*/.static void
a3a0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 releaseMemArray(
a3b0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a Mem *p, int N){.
a3c0: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a if( p && N ){.
a3d0: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 Mem *pEnd =
a3e0: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74 &p[N];. sqlit
a3f0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a e3 *db = p->db;.
a400: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61 u8 malloc_fa
a410: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f iled = db->mallo
a420: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28 cFailed;. if(
a430: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 db->pnBytesFree
a440: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 d ){. do{.
a450: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a if( p->sz
a460: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 Malloc ) sqlite3
a470: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d DbFree(db, p->zM
a480: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 alloc);. }w
a490: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 hile( (++p)<pEnd
a4a0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e );. return
a4b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a ;. }. do{.
a4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26 assert( (&
a4d0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 p[1])==pEnd || p
a4e0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 [0].db==p[1].db
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 );. assert(
a500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 sqlite3VdbeChec
a510: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 kMemInvariants(p
a520: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 ) );.. /* T
a530: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 his block is rea
a540: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 lly an inlined v
a550: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 ersion of sqlite
a560: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
a570: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 ). ** that
a580: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 takes advantage
a590: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74 of the fact that
a5a0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c the memory cell
a5b0: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 value is .
a5c0: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f ** being set to
a5d0: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 NULL after rele
a5e0: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 asing any dynami
a5f0: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 c resources..
a600: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 **. ** T
a610: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e he justification
a620: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 for duplicating
a630: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 code is that ac
a640: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 cording to .
a650: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 ** callgrind,
a660: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65 this causes a ce
a670: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 rtain test case
a680: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34 to hit the CPU 4
a690: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 .7 . ** per
a6a0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c cent less (x86 l
a6b0: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f inux, gcc versio
a6c0: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 n 4.1.2, -O6) th
a6d0: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 an if . **
a6e0: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 sqlite3MemReleas
a6f0: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 e() were called
a700: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 from here. With
a710: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a -O2, this jumps.
a720: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 ** to 6.6
a730: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 percent. The tes
a740: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 t case is insert
a750: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e ing 1000 rows in
a760: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 to a table .
a770: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 ** with no ind
a780: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e exes using a sin
a790: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 gle prepared INS
a7a0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 ERT statement, b
a7b0: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 ind() . **
a7c0: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 and reset(). Ins
a7d0: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 erts are grouped
a7e0: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 into a transact
a7f0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 ion.. */.
a800: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d testcase( p-
a810: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 >flags & MEM_Agg
a820: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 );. testca
a830: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d se( p->flags & M
a840: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 EM_Dyn );.
a850: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 testcase( p->fla
a860: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 gs & MEM_Frame )
a870: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
a880: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d ( p->flags & MEM
a890: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 _RowSet );.
a8a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d if( p->flags&(M
a8b0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d EM_Agg|MEM_Dyn|M
a8c0: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 EM_Frame|MEM_Row
a8d0: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 Set) ){.
a8e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 sqlite3VdbeMemRe
a8f0: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 lease(p);.
a900: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d }else if( p->szM
a910: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 alloc ){.
a920: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 sqlite3DbFree(d
a930: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a b, p->zMalloc);.
a940: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c p->szMal
a950: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d loc = 0;. }
a960: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 .. p->flags
a970: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 = MEM_Undefined
a980: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b ;. }while( (+
a990: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 +p)<pEnd );.
a9a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
a9b0: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 = malloc_failed
a9c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 ;. }.}../*.** D
a9d0: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d elete a VdbeFram
a9e0: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 e object and its
a9f0: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 contents. VdbeF
aa00: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 rame objects are
aa10: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 .** allocated by
aa20: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 the OP_Program
aa30: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 opcode in sqlite
aa40: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 3VdbeExec()..*/.
aa50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 void sqlite3Vdbe
aa60: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 FrameDelete(Vdbe
aa70: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 Frame *p){. int
aa80: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 i;. Mem *aMem
aa90: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 = VdbeFrameMem(p
aaa0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 );. VdbeCursor
aab0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 **apCsr = (VdbeC
aac0: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 ursor **)&aMem[p
aad0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 ->nChildMem];.
aae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 for(i=0; i<p->nC
aaf0: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 hildCsr; i++){.
ab00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 sqlite3VdbeFr
ab10: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 eeCursor(p->v, a
ab20: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 pCsr[i]);. }.
ab30: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 releaseMemArray(
ab40: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d aMem, p->nChildM
ab50: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 em);. sqlite3Db
ab60: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 Free(p->v->db, p
ab70: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 );.}..#ifndef SQ
ab80: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 LITE_OMIT_EXPLAI
ab90: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c N./*.** Give a l
aba0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 isting of the pr
abb0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 ogram in the vir
abc0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a tual machine..**
abd0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 .** The interfac
abe0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 e is the same as
abf0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 sqlite3VdbeExec
ac00: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 (). But instead
ac10: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 of.** running t
ac20: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f he code, it invo
ac30: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b kes the callback
ac40: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 once for each i
ac50: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 nstruction..** T
ac60: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75 his feature is u
ac70: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 sed to implement
ac80: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a "EXPLAIN"..**.*
ac90: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 * When p->explai
aca0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 n==1, each instr
acb0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 uction is listed
acc0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 . When.** p->ex
acd0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f plain==2, only O
ace0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 P_Explain instru
acf0: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 ctions are liste
ad00: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 d and these.** a
ad10: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 re shown in a di
ad20: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 fferent format.
ad30: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 p->explain==2 i
ad40: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d s used to implem
ad50: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 ent.** EXPLAIN Q
ad60: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a UERY PLAN..**.**
ad70: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e When p->explain
ad80: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d ==1, first the m
ad90: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c ain program is l
ada0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 isted, then each
adb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 of.** the trigg
adc0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 er subprograms a
add0: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 re listed one by
ade0: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c one..*/.int sql
adf0: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 ite3VdbeList(.
ae00: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 Vdbe *p
ae10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 /* The
ae20: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e VDBE */.){. in
ae30: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 t nRow;
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ae50: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 /* Stop when
ae60: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 row count reache
ae70: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 s this */. int
ae80: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 nSub = 0;
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
aea0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 /* Number of su
aeb0: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 b-vdbes seen so
aec0: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 far */. SubProg
aed0: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b ram **apSub = 0;
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
aef0: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 Array of sub-vd
af00: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 bes */. Mem *pS
af10: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 ub = 0;
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
af30: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c Memory cell hol
af40: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 d array of subpr
af50: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 ogs */. sqlite3
af60: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 *db = p->db;
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
af80: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f The database co
af90: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e nnection */. in
afa0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 t i;
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
afc0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 /* Loop count
afd0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d er */. int rc =
afe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 SQLITE_OK;
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
b000: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 Return code */.
b010: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d Mem *pMem = &p-
b020: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 >aMem[1];
b030: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d /* First M
b040: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 em of result set
b050: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 */.. assert( p
b060: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 ->explain );. a
b070: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d ssert( p->magic=
b080: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 =VDBE_MAGIC_RUN
b090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
b0a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c rc==SQLITE_OK ||
b0b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 p->rc==SQLITE_B
b0c0: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 USY || p->rc==SQ
b0d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 LITE_NOMEM );..
b0e0: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 /* Even though
b0f0: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 this opcode does
b100: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 not use dynamic
b110: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a strings for. *
b120: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 * the result, re
b130: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 sult columns may
b140: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 become dynamic
b150: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c if the user call
b160: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 s. ** sqlite3_c
b170: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 olumn_text16(),
b180: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c causing a transl
b190: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 ation to UTF-16
b1a0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 encoding.. */.
b1b0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 releaseMemArray
b1c0: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e (pMem, 8);. p->
b1d0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a pResultSet = 0;.
b1e0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 . if( p->rc==SQ
b1f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 LITE_NOMEM ){.
b200: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e /* This happen
b210: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 s if a malloc()
b220: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f inside a call to
b230: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
b240: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a text() or. **
b250: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
b260: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e text16() failed.
b270: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c */. db->mal
b280: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 locFailed = 1;.
b290: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 return SQLITE
b2a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f _ERROR;. }.. /
b2b0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 * When the numbe
b2c0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 r of output rows
b2d0: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74 reaches nRow, t
b2e0: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20 hat means the.
b2f0: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66 ** listing has f
b300: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69 inished and sqli
b310: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c te3_step() shoul
b320: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f d return SQLITE_
b330: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 DONE.. ** nRow
b340: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 is the sum of th
b350: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 e number of rows
b360: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f in the main pro
b370: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 gram, plus. **
b380: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e the sum of the n
b390: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e umber of rows in
b3a0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62 all trigger sub
b3b0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74 programs encount
b3c0: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72 ered. ** so far
b3d0: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75 . The nRow valu
b3e0: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20 e will increase
b3f0: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73 as new trigger s
b400: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20 ubprograms are.
b410: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c ** encountered,
b420: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20 but p->pc will
b430: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68 eventually catch
b440: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a up to nRow.. *
b450: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f /. nRow = p->nO
b460: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c p;. if( p->expl
b470: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a ain==1 ){. /*
b480: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d The first 8 mem
b490: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73 ory cells are us
b4a0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c ed for the resul
b4b0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69 t set. So we wi
b4c0: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e ll. ** comman
b4d0: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c deer the 9th cel
b4e0: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72 l to use as stor
b4f0: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79 age for an array
b500: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20 of pointers.
b510: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73 ** to trigger s
b520: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65 ubprograms. The
b530: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74 VDBE is guarant
b540: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c eed to have at l
b550: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65 east 9. ** ce
b560: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73 lls. */. ass
b570: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 ert( p->nMem>9 )
b580: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d ;. pSub = &p-
b590: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 >aMem[9];. if
b5a0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45 ( pSub->flags&ME
b5b0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 M_Blob ){.
b5c0: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 /* On the first
b5d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f call to sqlite3_
b5e0: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c step(), pSub wil
b5f0: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 l hold a NULL.
b600: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 It is. ** i
b610: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 nitialized to a
b620: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53 BLOB by the P4_S
b630: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73 UBPROGRAM proces
b640: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77 sing logic below
b650: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d */. nSub =
b660: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 pSub->n/sizeof(
b670: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70 Vdbe*);. ap
b680: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 Sub = (SubProgra
b690: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 m **)pSub->z;.
b6a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b }. for(i=0;
b6b0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 i<nSub; i++){.
b6c0: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53 nRow += apS
b6d0: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 ub[i]->nOp;.
b6e0: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 }. }.. do{.
b6f0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 i = p->pc++;.
b700: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26 }while( i<nRow &
b710: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 & p->explain==2
b720: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 && p->aOp[i].opc
b730: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 ode!=OP_Explain
b740: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77 );. if( i>=nRow
b750: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 ){. p->rc =
b760: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 SQLITE_OK;. r
b770: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b c = SQLITE_DONE;
b780: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d . }else if( db-
b790: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 >u1.isInterrupte
b7a0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d d ){. p->rc =
b7b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 SQLITE_INTERRUP
b7c0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 T;. rc = SQLI
b7d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 TE_ERROR;. sq
b7e0: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 lite3VdbeError(p
b7f0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 , sqlite3ErrStr(
b800: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65 p->rc));. }else
b810: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b {. char *zP4;
b820: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 . Op *pOp;.
b830: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 if( i<p->nOp )
b840: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f {. /* The o
b850: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65 utput line numbe
b860: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 r is small enoug
b870: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74 h that we are st
b880: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20 ill in the.
b890: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d ** main program
b8a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d . */. pOp =
b8b0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 &p->aOp[i];.
b8c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a }else{. /*
b8d0: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c We are currentl
b8e0: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f y listing subpro
b8f0: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f grams. Figure o
b900: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64 ut which one and
b910: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75 . ** pick u
b920: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 p the appropriat
b930: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 e opcode. */.
b940: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 int j;.
b950: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 i -= p->nOp;.
b960: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 for(j=0; i>=a
b970: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b pSub[j]->nOp; j+
b980: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d +){. i -=
b990: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a apSub[j]->nOp;.
b9a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f }. pO
b9b0: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 p = &apSub[j]->a
b9c0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 Op[i];. }.
b9d0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d if( p->explain=
b9e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d =1 ){. pMem
b9f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e ->flags = MEM_In
ba00: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 t;. pMem->u
ba10: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20 .i = i;
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
ba30: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61 /* Progra
ba40: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 m counter */.
ba50: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 pMem++;. .
ba60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
ba70: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d = MEM_Static|MEM
ba80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 _Str|MEM_Term;.
ba90: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 pMem->z = (
baa0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63 char*)sqlite3Opc
bab0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 odeName(pOp->opc
bac0: 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 ode); /* Opcode
bad0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 */. assert(
bae0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 pMem->z!=0 );.
baf0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 pMem->n = s
bb00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 qlite3Strlen30(p
bb10: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 Mem->z);. p
bb20: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 Mem->enc = SQLIT
bb30: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d E_UTF8;. pM
bb40: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 em++;.. /*
bb50: 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72 When an OP_Progr
bb60: 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63 am opcode is enc
bb70: 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79 ounter (the only
bb80: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73 opcode that has
bb90: 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53 . ** a P4_S
bba0: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65 UBPROGRAM argume
bbb0: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20 nt), expand the
bbc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 size of the arra
bbd0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73 y of subprograms
bbe0: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69 . ** kept i
bbf0: 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 n p->aMem[9].z t
bc00: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70 o hold the new p
bc10: 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e rogram - assumin
bc20: 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61 g this subprogra
bc30: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e m. ** has n
bc40: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 ot already been
bc50: 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 seen.. */.
bc60: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 if( pOp->p4
bc70: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 type==P4_SUBPROG
bc80: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 RAM ){. i
bc90: 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62 nt nByte = (nSub
bca0: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 +1)*sizeof(SubPr
bcb0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 ogram*);.
bcc0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 int j;.
bcd0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b for(j=0; j<nSub;
bce0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 j++){.
bcf0: 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 if( apSub[j]==p
bd00: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 Op->p4.pProgram
bd10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 ) break;.
bd20: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a }. if( j
bd30: 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45 ==nSub && SQLITE
bd40: 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65 _OK==sqlite3Vdbe
bd50: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42 MemGrow(pSub, nB
bd60: 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b yte, nSub!=0) ){
bd70: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 . apSub
bd80: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a = (SubProgram *
bd90: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 *)pSub->z;.
bda0: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b apSub[nSub+
bdb0: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72 +] = pOp->p4.pPr
bdc0: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20 ogram;.
bdd0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 pSub->flags |=
bde0: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20 MEM_Blob;.
bdf0: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 pSub->n = nS
be00: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f ub*sizeof(SubPro
be10: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 gram*);.
be20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a }. }. }.
be30: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 . pMem->flags
be40: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 = MEM_Int;.
be50: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d pMem->u.i = pOp-
be60: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 >p1;
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
be80: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b P1 */. pMem+
be90: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c +;.. pMem->fl
bea0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 ags = MEM_Int;.
beb0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 pMem->u.i = p
bec0: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20 Op->p2;
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bee0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d /* P2 */. pM
bef0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d em++;.. pMem-
bf00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 >flags = MEM_Int
bf10: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 ;. pMem->u.i
bf20: 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20 = pOp->p3;
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
bf40: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 /* P3 */.
bf50: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 pMem++;.. if
bf60: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d ( sqlite3VdbeMem
bf70: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 ClearAndResize(p
bf80: 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20 Mem, 100) ){ /*
bf90: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 P4 */. asse
bfa0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f rt( p->db->mallo
bfb0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 cFailed );.
bfc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 return SQLITE_E
bfd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
bfe0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 pMem->flags = ME
bff0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a M_Str|MEM_Term;.
c000: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61 zP4 = displa
c010: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a yP4(pOp, pMem->z
c020: 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 , pMem->szMalloc
c030: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d );. if( zP4!=
c040: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 pMem->z ){.
c050: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 sqlite3VdbeMemS
c060: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c etStr(pMem, zP4,
c070: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 -1, SQLITE_UTF8
c080: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b , 0);. }else{
c090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 . assert( p
c0a0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 Mem->z!=0 );.
c0b0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c pMem->n = sql
c0c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 ite3Strlen30(pMe
c0d0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 m->z);. pMe
c0e0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f m->enc = SQLITE_
c0f0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20 UTF8;. }.
c100: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 pMem++;.. if(
c110: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 p->explain==1 )
c120: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 {. if( sqli
c130: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 te3VdbeMemClearA
c140: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34 ndResize(pMem, 4
c150: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 ) ){. ass
c160: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c ert( p->db->mall
c170: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 ocFailed );.
c180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
c190: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d E_ERROR;. }
c1a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
c1b0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d gs = MEM_Str|MEM
c1c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 _Term;. pMe
c1d0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20 m->n = 2;.
c1e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 sqlite3_snprintf
c1f0: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e (3, pMem->z, "%.
c200: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20 2x", pOp->p5);
c210: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20 /* P5 */.
c220: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 pMem->enc = SQLI
c230: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 TE_UTF8;. p
c240: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66 Mem++;. .#ifdef
c250: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 SQLITE_ENABLE_E
c260: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a XPLAIN_COMMENTS.
c270: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 if( sqlite
c280: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 3VdbeMemClearAnd
c290: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30 Resize(pMem, 500
c2a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 ) ){. ass
c2b0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c ert( p->db->mall
c2c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 ocFailed );.
c2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 return SQLIT
c2e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d E_ERROR;. }
c2f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 . pMem->fla
c300: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d gs = MEM_Str|MEM
c310: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 _Term;. pMe
c320: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f m->n = displayCo
c330: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 mment(pOp, zP4,
c340: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 pMem->z, 500);.
c350: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d pMem->enc =
c360: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65 SQLITE_UTF8;.#e
c370: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e lse. pMem->
c380: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c flags = MEM_Null
c390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
c3a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 /* Comme
c3b0: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 nt */.#endif.
c3c0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43 }.. p->nResC
c3d0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70 olumn = 8 - 4*(p
c3e0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 ->explain-1);.
c3f0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 p->pResultSet
c400: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 = &p->aMem[1];.
c410: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 p->rc = SQLIT
c420: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 E_OK;. rc = S
c430: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 QLITE_ROW;. }.
c440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 return rc;.}.#e
c450: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f ndif /* SQLITE_O
c460: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a MIT_EXPLAIN */..
c470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 #ifdef SQLITE_DE
c480: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 BUG./*.** Print
c490: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73 the SQL that was
c4a0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 used to generat
c4b0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d e a VDBE program
c4c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
c4d0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64 3VdbePrintSql(Vd
c4e0: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20 be *p){. const
c4f0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 char *z = 0;. i
c500: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 f( p->zSql ){.
c510: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 z = p->zSql;.
c520: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f }else if( p->nO
c530: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 p>=1 ){. cons
c540: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 t VdbeOp *pOp =
c550: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 &p->aOp[0];.
c560: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d if( pOp->opcode=
c570: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d =OP_Init && pOp-
c580: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 >p4.z!=0 ){.
c590: 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b z = pOp->p4.z;
c5a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 . while( sq
c5b0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29 lite3Isspace(*z)
c5c0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 ) z++;. }.
c5d0: 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e }. if( z ) prin
c5e0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 tf("SQL: [%s]\n"
c5f0: 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a , z);.}.#endif..
c600: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c #if !defined(SQL
c610: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 ITE_OMIT_TRACE)
c620: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 && defined(SQLIT
c630: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 E_ENABLE_IOTRACE
c640: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e )./*.** Print an
c650: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65 IOTRACE message
c660: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e showing SQL con
c670: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 tent..*/.void sq
c680: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65 lite3VdbeIOTrace
c690: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 Sql(Vdbe *p){.
c6a0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 int nOp = p->nOp
c6b0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b ;. VdbeOp *pOp;
c6c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f . if( sqlite3Io
c6d0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72 Trace==0 ) retur
c6e0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29 n;. if( nOp<1 )
c6f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d return;. pOp =
c700: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 &p->aOp[0];. i
c710: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d f( pOp->opcode==
c720: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e OP_Init && pOp->
c730: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69 p4.z!=0 ){. i
c740: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61 nt i, j;. cha
c750: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73 r z[1000];. s
c760: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
c770: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 sizeof(z), z, "%
c780: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a s", pOp->p4.z);.
c790: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c for(i=0; sql
c7a0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d ite3Isspace(z[i]
c7b0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f ); i++){}. fo
c7c0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b r(j=0; z[i]; i++
c7d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c ){. if( sql
c7e0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d ite3Isspace(z[i]
c7f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 ) ){. if(
c800: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a z[i-1]!=' ' ){.
c810: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d z[j++]
c820: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20 = ' ';.
c830: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }. }else{.
c840: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 z[j++] =
c850: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 z[i];. }.
c860: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 }. z[j] = 0
c870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 ;. sqlite3IoT
c880: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c race("SQL %s\n",
c890: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 z);. }.}.#endi
c8a0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 f /* !SQLITE_OMI
c8b0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54 T_TRACE && SQLIT
c8c0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 E_ENABLE_IOTRACE
c8d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 */../*.** Alloc
c8e0: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61 ate space from a
c8f0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66 fixed size buff
c900: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 er and return a
c910: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68 pointer to.** th
c920: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e at space. If in
c930: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 sufficient space
c940: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 is available, r
c950: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a eturn NULL..**.*
c960: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d * The pBuf param
c970: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74 eter is the init
c980: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70 ial value of a p
c990: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c ointer which wil
c9a0: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65 l.** receive the
c9b0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42 new memory. pB
c9c0: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e uf is normally N
c9d0: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73 ULL. If pBuf is
c9e0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 not.** NULL, it
c9f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f means that memo
ca00: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72 ry space has alr
ca10: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 eady been alloca
ca20: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20 ted and that.**
ca30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f this routine sho
ca40: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 uld not allocate
ca50: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e any new memory.
ca60: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e When pBuf is n
ca70: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c ot.** NULL simpl
ca80: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20 y return pBuf.
ca90: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65 Only allocate ne
caa0: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77 w memory space w
cab0: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e hen pBuf.** is N
cac0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 ULL..**.** nByte
cad0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f is the number o
cae0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 f bytes of space
caf0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 70 needed..**.** p
cb00: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 2a From points to *
cb10: 70 6e 46 72 6f 6d 20 62 79 74 65 73 20 6f 66 20 pnFrom bytes of
cb20: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e available space.
cb30: 20 20 4e 65 77 20 73 70 61 63 65 20 69 73 20 61 New space is a
cb40: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 72 6f 6d llocated.** from
cb50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 the end of the
cb60: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 61 6e 64 pFrom buffer and
cb70: 20 2a 70 6e 46 72 6f 6d 20 69 73 20 64 65 63 72 *pnFrom is decr
cb80: 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a emented..**.** *
cb90: 70 6e 4e 65 65 64 65 64 20 69 73 20 61 20 63 6f pnNeeded is a co
cba0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d unter of the num
cbb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 ber of bytes of
cbc0: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20 space that have
cbd0: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c failed.** to all
cbe0: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 ocate. If there
cbf0: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 is insufficient
cc00: 20 73 70 61 63 65 20 69 6e 20 70 46 72 6f 6d 20 space in pFrom
cc10: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a to satisfy the.*
cc20: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20 * request, then
cc30: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 4e 65 65 increment *pnNee
cc40: 64 65 64 20 62 79 20 74 68 65 20 61 6d 6f 75 6e ded by the amoun
cc50: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 t of the request
cc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
cc70: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 *allocSpace(.
cc80: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 void *pBuf,
cc90: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 /* Where re
cca0: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c turn pointer wil
ccb0: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 l be stored */.
ccc0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 int nByte,
ccd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 /* Number
cce0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f of bytes to allo
ccf0: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 70 46 cate */. u8 *pF
cd00: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f rom, /
cd10: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 * Memory availab
cd20: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f le for allocatio
cd30: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 46 72 n */. int *pnFr
cd40: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 om, /* I
cd50: 4e 2f 4f 55 54 3a 20 53 70 61 63 65 20 61 76 61 N/OUT: Space ava
cd60: 69 6c 61 62 6c 65 20 61 74 20 70 46 72 6f 6d 20 ilable at pFrom
cd70: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4e 65 65 64 */. int *pnNeed
cd80: 65 64 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 ed /* If
cd90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f allocation canno
cda0: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65 t be made, incre
cdb0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a ment *pnByte */.
cdc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 ){. assert( EIG
cdd0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e HT_BYTE_ALIGNMEN
cde0: 54 28 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 T(pFrom) );. if
cdf0: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 ( pBuf==0 ){.
ce00: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 nByte = ROUND8(
ce10: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 nByte);. if(
ce20: 6e 42 79 74 65 20 3c 3d 20 2a 70 6e 46 72 6f 6d nByte <= *pnFrom
ce30: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 46 72 6f ){. *pnFro
ce40: 6d 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 m -= nByte;.
ce50: 20 20 70 42 75 66 20 3d 20 26 70 46 72 6f 6d 5b pBuf = &pFrom[
ce60: 2a 70 6e 46 72 6f 6d 5d 3b 0a 20 20 20 20 7d 65 *pnFrom];. }e
ce70: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 4e 65 lse{. *pnNe
ce80: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 eded += nByte;.
ce90: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 }. }. asser
cea0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c t( EIGHT_BYTE_AL
ceb0: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b IGNMENT(pBuf) );
cec0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a . return pBuf;.
ced0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20 }../*.** Rewind
cee0: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f the VDBE back to
cef0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69 the beginning i
cf00: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f n preparation fo
cf10: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e r.** running it.
cf20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
cf30: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20 VdbeRewind(Vdbe
cf40: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 *p){.#if defined
cf50: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c (SQLITE_DEBUG) |
cf60: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 | defined(VDBE_P
cf70: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b ROFILE). int i;
cf80: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 .#endif. assert
cf90: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 ( p!=0 );. asse
cfa0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 rt( p->magic==VD
cfb0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b BE_MAGIC_INIT );
cfc0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f .. /* There sho
cfd0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20 uld be at least
cfe0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f one opcode.. */
cff0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f . assert( p->nO
d000: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 p>0 );.. /* Set
d010: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44 the magic to VD
d020: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f BE_MAGIC_RUN soo
d030: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20 ner rather than
d040: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d later. */. p->m
d050: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 agic = VDBE_MAGI
d060: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53 C_RUN;..#ifdef S
d070: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f QLITE_DEBUG. fo
d080: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d r(i=1; i<p->nMem
d090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 ; i++){. asse
d0a0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 rt( p->aMem[i].d
d0b0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a b==p->db );. }.
d0c0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d #endif. p->pc =
d0d0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 -1;. p->rc = S
d0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 QLITE_OK;. p->e
d0f0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f rrorAction = OE_
d100: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69 Abort;. p->magi
d110: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 c = VDBE_MAGIC_R
d120: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 UN;. p->nChange
d130: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 = 0;. p->cache
d140: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 Ctr = 1;. p->mi
d150: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 nWriteFileFormat
d160: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 = 255;. p->iSt
d170: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 atement = 0;. p
d180: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 ->nFkConstraint
d190: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 = 0;.#ifdef VDBE
d1a0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 _PROFILE. for(i
d1b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b =0; i<p->nOp; i+
d1c0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 +){. p->aOp[i
d1d0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 ].cnt = 0;. p
d1e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 ->aOp[i].cycles
d1f0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a = 0;. }.#endif.
d200: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 }../*.** Prepare
d210: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 a virtual machi
d220: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e ne for execution
d230: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 for the first t
d240: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 ime after.** cre
d250: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 ating the virtua
d260: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 l machine. This
d270: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 involves things
d280: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f such.** as allo
d290: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 cating registers
d2a0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e and initializin
d2b0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f g the program co
d2c0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 unter..** After
d2d0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20 the VDBE has be
d2e0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 prepped, it can
d2f0: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f be executed by o
d300: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 ne or more.** ca
d310: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 lls to sqlite3Vd
d320: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a beExec(). .**.*
d330: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 * This function
d340: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 may be called ex
d350: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 actly once on ea
d360: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 ch virtual machi
d370: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 ne..** After thi
d380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c s routine is cal
d390: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 led the VM has b
d3a0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 een "packaged" a
d3b0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 nd is ready.** t
d3c0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 o run. After th
d3d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 is routine is ca
d3e0: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 lled, further ca
d3f0: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 lls to .** sqlit
d400: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 e3VdbeAddOp() fu
d410: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 nctions are proh
d420: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f ibited. This ro
d430: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 utine disconnect
d440: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 s.** the Vdbe fr
d450: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a om the Parse obj
d460: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 ect that helped
d470: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 generate it so t
d480: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 hat the.** the V
d490: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 dbe becomes an i
d4a0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 ndependent entit
d4b0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 y and the Parse
d4c0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a object can be.**
d4d0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a destroyed..**.*
d4e0: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 * Use the sqlite
d4f0: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 3VdbeRewind() pr
d500: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f ocedure to resto
d510: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 re a virtual mac
d520: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 hine back.** to
d530: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 its initial stat
d540: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62 e after it has b
d550: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 een run..*/.void
d560: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 sqlite3VdbeMake
d570: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 Ready(. Vdbe *p
d580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
d590: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 /* The V
d5a0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a DBE */. Parse *
d5b0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20 pParse
d5c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 /* Parsi
d5d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b ng context */.){
d5e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 . sqlite3 *db;
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d600: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 /* The databas
d610: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a e connection */.
d620: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 int nVar;
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d640: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 /* Number of pa
d650: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e rameters */. in
d660: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 t nMem;
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
d680: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d Number of VM mem
d690: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f ory registers */
d6a0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 . int nCursor;
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d6c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 /* Number of c
d6d0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 ursors required
d6e0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 */. int nArg;
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d700: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
d710: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 arguments in su
d720: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 bprograms */. i
d730: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 nt nOnce;
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
d750: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e Number of OP_On
d760: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 ce instructions
d770: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 */. int n;
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d790: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e /* Loop coun
d7a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 ter */. int nFr
d7b0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 ee;
d7c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c /* Avail
d7d0: 61 62 6c 65 20 66 72 65 65 20 73 70 61 63 65 20 able free space
d7e0: 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20 */. u8 *zCsr;
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
d800: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 /* Memory av
d810: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f ailable for allo
d820: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 cation */. int
d830: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 nByte;
d840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f /* Ho
d850: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d w much extra mem
d860: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f ory is needed */
d870: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 .. assert( p!=0
d880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d );. assert( p-
d890: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 >nOp>0 );. asse
d8a0: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b rt( pParse!=0 );
d8b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 . assert( p->ma
d8c0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f gic==VDBE_MAGIC_
d8d0: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 INIT );. assert
d8e0: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 ( pParse==p->pPa
d8f0: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d rse );. db = p-
d900: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 >db;. assert( d
d910: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d b->mallocFailed=
d920: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 =0 );. nVar = p
d930: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e Parse->nVar;. n
d940: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d Mem = pParse->nM
d950: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 em;. nCursor =
d960: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 pParse->nTab;.
d970: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e nArg = pParse->n
d980: 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 MaxArg;. nOnce
d990: 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b = pParse->nOnce;
d9a0: 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 . if( nOnce==0
d9b0: 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 ) nOnce = 1; /*
d9c0: 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 Ensure at least
d9d0: 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 one byte in p->a
d9e0: 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 OnceFlag[] */.
d9f0: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 . /* For each c
da00: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 ursor required,
da10: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 also allocate a
da20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d memory cell. Mem
da30: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 ory. ** cells (
da40: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e nMem+1-nCursor).
da50: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 .nMem, inclusive
da60: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 , will never be
da70: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 used by. ** the
da80: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 vdbe program. I
da90: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 nstead they are
daa0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 used to allocate
dab0: 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 space for. **
dac0: 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 VdbeCursor/BtCur
dad0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 sor structures.
dae0: 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f The blob of memo
daf0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 ry associated wi
db00: 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 th . ** cursor
db10: 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 0 is stored in m
db20: 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e emory cell nMem.
db30: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d Memory cell (nM
db40: 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 em-1). ** store
db50: 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 s the blob of me
db60: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 mory associated
db70: 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 with cursor 1, e
db80: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 tc.. **. ** Se
db90: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 e also: allocate
dba0: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 Cursor().. */.
dbb0: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 nMem += nCursor
dbc0: 3b 0a 0a 20 20 2f 2a 20 7a 43 73 72 20 77 69 6c ;.. /* zCsr wil
dbd0: 6c 20 69 6e 69 74 69 61 6c 6c 79 20 70 6f 69 6e l initially poin
dbe0: 74 20 74 6f 20 6e 46 72 65 65 20 62 79 74 65 73 t to nFree bytes
dbf0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 of unused space
dc00: 20 61 74 20 74 68 65 0a 20 20 2a 2a 20 65 6e 64 at the. ** end
dc10: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 of the opcode a
dc20: 72 72 61 79 2c 20 70 2d 3e 61 4f 70 2e 20 20 54 rray, p->aOp. T
dc30: 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20 6f he computation o
dc40: 66 20 6e 46 72 65 65 20 69 73 0a 20 20 2a 2a 20 f nFree is. **
dc50: 63 6f 6e 73 65 72 76 61 74 69 76 65 20 2d 20 69 conservative - i
dc60: 74 20 6d 69 67 68 74 20 62 65 20 73 6d 61 6c 6c t might be small
dc70: 65 72 20 74 68 61 6e 20 74 68 65 20 74 72 75 65 er than the true
dc80: 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 0a number of free.
dc90: 20 20 2a 2a 20 62 79 74 65 73 2c 20 62 75 74 20 ** bytes, but
dca0: 6e 65 76 65 72 20 6c 61 72 67 65 72 2e 20 20 6e never larger. n
dcb0: 46 72 65 65 20 6d 75 73 74 20 62 65 20 61 20 6d Free must be a m
dcc0: 75 6c 74 69 70 6c 65 20 6f 66 20 38 20 2d 20 69 ultiple of 8 - i
dcd0: 74 20 69 73 0a 20 20 2a 2a 20 72 6f 75 6e 64 65 t is. ** rounde
dce0: 64 20 64 6f 77 6e 20 69 66 20 69 73 20 6e 6f 74 d down if is not
dcf0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 .. */. n = ROU
dd00: 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70 ND8(sizeof(Op)*p
dd10: 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20 ->nOp);
dd20: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 /* Bytes of
dd30: 20 6f 70 63 6f 64 65 20 73 70 61 63 65 20 75 73 opcode space us
dd40: 65 64 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 26 ed */. zCsr = &
dd50: 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d ((u8*)p->aOp)[n]
dd60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ;
dd70: 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 /* Unused op
dd80: 63 6f 64 65 20 73 70 61 63 65 20 2a 2f 0a 20 20 code space */.
dd90: 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 assert( EIGHT_BY
dda0: 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 TE_ALIGNMENT(zCs
ddb0: 72 29 20 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 r) );. nFree =
ddc0: 52 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 ROUNDDOWN8(pPars
ddd0: 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e e->szOpAlloc - n
dde0: 29 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 ); /* Bytes of
ddf0: 75 6e 75 73 65 64 20 73 70 61 63 65 20 2a 2f 0a unused space */.
de00: 20 20 61 73 73 65 72 74 28 20 6e 46 72 65 65 3e assert( nFree>
de10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 6e 46 72 65 =0 );. if( nFre
de20: 65 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 e>0 ){. memse
de30: 74 28 7a 43 73 72 2c 20 30 2c 20 6e 46 72 65 65 t(zCsr, 0, nFree
de40: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 );. assert( E
de50: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d IGHT_BYTE_ALIGNM
de60: 45 4e 54 28 26 7a 43 73 72 5b 6e 46 72 65 65 5d ENT(&zCsr[nFree]
de70: 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 6f ) );. }.. reso
de80: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 lveP2Values(p, &
de90: 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 nArg);. p->uses
dea0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 StmtJournal = (u
deb0: 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 8)(pParse->isMul
dec0: 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73 tiWrite && pPars
ded0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 e->mayAbort);.
dee0: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c if( pParse->expl
def0: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 ain && nMem<10 )
df00: 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b {. nMem = 10;
df10: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 . }. p->expire
df20: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d d = 0;.. /* Mem
df30: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 ory for register
df40: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 s, parameters, c
df50: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 ursor, etc, is a
df60: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a llocated in two.
df70: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e ** passes. On
df80: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c the first pass,
df90: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65 we try to reuse
dfa0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74 unused space at
dfb0: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f the . ** end o
dfc0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 f the opcode arr
dfd0: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75 ay. If we are u
dfe0: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79 nable to satisfy
dff0: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a all memory. **
e000: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79 requirements by
e010: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63 reusing the opc
e020: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20 ode array tail,
e030: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a then the second.
e040: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 ** pass will f
e050: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20 ill in the rest
e060: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c using a fresh al
e070: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a location. . **
e080: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 . ** This two-p
e090: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 ass approach tha
e0a0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 t reuses as much
e0b0: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 memory as possi
e0c0: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 ble from. ** th
e0d0: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65 e leftover space
e0e0: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 at the end of t
e0f0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 he opcode array
e100: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c can significantl
e110: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68 y. ** reduce th
e120: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f e amount of memo
e130: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65 ry held by a pre
e140: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e pared statement.
e150: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 . */. do {.
e160: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 nByte = 0;.
e170: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 p->aMem = allocS
e180: 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d pace(p->aMem, nM
e190: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 em*sizeof(Mem),
e1a0: 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e zCsr, &nFree, &n
e1b0: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 Byte);. p->aV
e1c0: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 ar = allocSpace(
e1d0: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 p->aVar, nVar*si
e1e0: 7a 65 6f 66 28 4d 65 6d 29 2c 20 7a 43 73 72 2c zeof(Mem), zCsr,
e1f0: 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 &nFree, &nByte)
e200: 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d ;. p->apArg =
e210: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 allocSpace(p->a
e220: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f pArg, nArg*sizeo
e230: 66 28 4d 65 6d 2a 29 2c 20 7a 43 73 72 2c 20 26 f(Mem*), zCsr, &
e240: 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a nFree, &nByte);.
e250: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 p->azVar = a
e260: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 llocSpace(p->azV
e270: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 ar, nVar*sizeof(
e280: 63 68 61 72 2a 29 2c 20 7a 43 73 72 2c 20 26 6e char*), zCsr, &n
e290: 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20 Free, &nByte);.
e2a0: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c p->apCsr = al
e2b0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 locSpace(p->apCs
e2c0: 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f r, nCursor*sizeo
e2d0: 66 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a f(VdbeCursor*),.
e2e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e2f0: 20 20 20 20 20 20 20 20 20 20 7a 43 73 72 2c 20 zCsr,
e300: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b &nFree, &nByte);
e310: 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 . p->aOnceFla
e320: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 g = allocSpace(p
e330: 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e ->aOnceFlag, nOn
e340: 63 65 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 ce, zCsr, &nFree
e350: 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69 66 64 65 , &nByte);.#ifde
e360: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f f SQLITE_ENABLE_
e370: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a STMT_SCANSTATUS.
e380: 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 p->anExec =
e390: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e allocSpace(p->an
e3a0: 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a Exec, p->nOp*siz
e3b0: 65 6f 66 28 69 36 34 29 2c 20 7a 43 73 72 2c 20 eof(i64), zCsr,
e3c0: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b &nFree, &nByte);
e3d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 .#endif. if(
e3e0: 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20 70 nByte ){. p
e3f0: 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 ->pFree = sqlite
e400: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 3DbMallocZero(db
e410: 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 7d 0a , nByte);. }.
e420: 20 20 20 20 7a 43 73 72 20 3d 20 70 2d 3e 70 46 zCsr = p->pF
e430: 72 65 65 3b 0a 20 20 20 20 6e 46 72 65 65 20 3d ree;. nFree =
e440: 20 6e 42 79 74 65 3b 0a 20 20 7d 77 68 69 6c 65 nByte;. }while
e450: 28 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e ( nByte && !db->
e460: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a mallocFailed );.
e470: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 . p->nCursor =
e480: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f nCursor;. p->nO
e490: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b nceFlag = nOnce;
e4a0: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 . if( p->aVar )
e4b0: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 {. p->nVar =
e4c0: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 (ynVar)nVar;.
e4d0: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 for(n=0; n<nVar
e4e0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d ; n++){. p-
e4f0: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d >aVar[n].flags =
e500: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 MEM_Null;.
e510: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d p->aVar[n].db =
e520: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 db;. }. }.
e530: 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 26 26 if( p->azVar &&
e540: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3e 30 pParse->nzVar>0
e550: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56 61 72 ){. p->nzVar
e560: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 = pParse->nzVar
e570: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e ;. memcpy(p->
e580: 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d 3e 61 azVar, pParse->a
e590: 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 zVar, p->nzVar*s
e5a0: 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72 5b 30 izeof(p->azVar[0
e5b0: 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 ]));. memset(
e5c0: 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c 20 30 pParse->azVar, 0
e5d0: 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 2a , pParse->nzVar*
e5e0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 sizeof(pParse->a
e5f0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 zVar[0]));. }.
e600: 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a if( p->aMem ){.
e610: 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 p->aMem--;
e620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
e630: 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f /* aMem[] go
e640: 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 es from 1..nMem
e650: 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d */. p->nMem =
e660: 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 nMem;
e670: 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20 20 20 /*
e680: 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d not from 0..nMem
e690: 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6e 3d -1 */. for(n=
e6a0: 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 1; n<=nMem; n++)
e6b0: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b {. p->aMem[
e6c0: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 n].flags = MEM_U
e6d0: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20 ndefined;.
e6e0: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 p->aMem[n].db =
e6f0: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 db;. }. }.
e700: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61 p->explain = pPa
e710: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 rse->explain;.
e720: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e sqlite3VdbeRewin
e730: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 d(p);.}../*.** C
e740: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73 lose a VDBE curs
e750: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 or and release a
e760: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73 ll the resources
e770: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a that cursor .**
e780: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64 happens to hold
e790: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 ..*/.void sqlite
e7a0: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 3VdbeFreeCursor(
e7b0: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72 Vdbe *p, VdbeCur
e7c0: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28 sor *pCx){. if(
e7d0: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 pCx==0 ){. r
e7e0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 eturn;. }. ass
e7f0: 65 72 74 28 20 70 43 78 2d 3e 70 42 74 3d 3d 30 ert( pCx->pBt==0
e800: 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70 || pCx->eCurTyp
e810: 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 e==CURTYPE_BTREE
e820: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43 );. switch( pC
e830: 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20 x->eCurType ){.
e840: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f case CURTYPE_
e850: 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 SORTER: {.
e860: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 sqlite3VdbeSorte
e870: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 rClose(p->db, pC
e880: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b x);. break;
e890: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
e8a0: 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b CURTYPE_BTREE: {
e8b0: 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e . if( pCx->
e8c0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 pBt ){. s
e8d0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 qlite3BtreeClose
e8e0: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20 (pCx->pBt);.
e8f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e /* The pCx->
e900: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20 pCursor will be
e910: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61 close automatica
e920: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74 lly, if it exist
e930: 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a s, by. **
e940: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e the call above.
e950: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b */. }else{
e960: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 . assert(
e970: 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72 pCx->uc.pCursor
e980: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 !=0 );. s
e990: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 qlite3BtreeClose
e9a0: 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70 Cursor(pCx->uc.p
e9b0: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d Cursor);. }
e9c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 . break;.
e9d0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 }.#ifndef SQLI
e9e0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 TE_OMIT_VIRTUALT
e9f0: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55 ABLE. case CU
ea00: 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20 RTYPE_VTAB: {.
ea10: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 sqlite3_vtab
ea20: 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d _cursor *pVCur =
ea30: 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a pCx->uc.pVCur;.
ea40: 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 const sqli
ea50: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 te3_module *pMod
ea60: 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74 ule = pVCur->pVt
ea70: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 ab->pModule;.
ea80: 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72 assert( pVCur
ea90: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20 ->pVtab->nRef>0
eaa0: 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e );. pVCur->
eab0: 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 pVtab->nRef--;.
eac0: 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 pModule->xC
ead0: 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20 lose(pVCur);.
eae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
eaf0: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a #endif. }.}../*
eb00: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 .** Close all cu
eb10: 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72 rsors in the cur
eb20: 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 rent frame..*/.s
eb30: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 tatic void close
eb40: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56 CursorsInFrame(V
eb50: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 dbe *p){. if( p
eb60: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69 ->apCsr ){. i
eb70: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d nt i;. for(i=
eb80: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 0; i<p->nCursor;
eb90: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62 i++){. Vdb
eba0: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d eCursor *pC = p-
ebb0: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20 >apCsr[i];.
ebc0: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20 if( pC ){.
ebd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 sqlite3VdbeFr
ebe0: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b eeCursor(p, pC);
ebf0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73 . p->apCs
ec00: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 r[i] = 0;.
ec10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f }. }. }.}../
ec20: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61 *.** Copy the va
ec30: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 lues stored in t
ec40: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72 he VdbeFrame str
ec50: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64 ucture to its Vd
ec60: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 be. This.** is u
ec70: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 sed, for example
ec80: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72 , when a trigger
ec90: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20 sub-program is
eca0: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72 halted to restor
ecb0: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 e.** control to
ecc0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d the main program
ecd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
ece0: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65 VdbeFrameRestore
ecf0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 (VdbeFrame *pFra
ed00: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d me){. Vdbe *v =
ed10: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c pFrame->v;. cl
ed20: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d oseCursorsInFram
ed30: 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c e(v);.#ifdef SQL
ed40: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f ITE_ENABLE_STMT_
ed50: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e SCANSTATUS. v->
ed60: 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d anExec = pFrame-
ed70: 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a >anExec;.#endif.
ed80: 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d v->aOnceFlag =
ed90: 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c pFrame->aOnceFl
eda0: 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c ag;. v->nOnceFl
edb0: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e ag = pFrame->nOn
edc0: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 ceFlag;. v->aOp
edd0: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a = pFrame->aOp;.
ede0: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d v->nOp = pFram
edf0: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 e->nOp;. v->aMe
ee00: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d m = pFrame->aMem
ee10: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 ;. v->nMem = pF
ee20: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d rame->nMem;. v-
ee30: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d >apCsr = pFrame-
ee40: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 >apCsr;. v->nCu
ee50: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e rsor = pFrame->n
ee60: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d Cursor;. v->db-
ee70: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 >lastRowid = pFr
ee80: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a ame->lastRowid;.
ee90: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 v->nChange = p
eea0: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a Frame->nChange;.
eeb0: 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 v->db->nChange
eec0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 = pFrame->nDbCh
eed0: 61 6e 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 ange;. return p
eee0: 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a Frame->pc;.}../*
eef0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 .** Close all cu
ef00: 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 rsors..**.** Als
ef10: 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 o release any dy
ef20: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c namic memory hel
ef30: 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 d by the VM in t
ef40: 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d he Vdbe.aMem mem
ef50: 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 ory .** cell arr
ef60: 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 ay. This is nece
ef70: 73 73 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d ssary as the mem
ef80: 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d ory cell array m
ef90: 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f ay contain.** po
efa0: 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 inters to VdbeFr
efb0: 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 ame objects, whi
efc0: 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 ch may in turn c
efd0: 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 ontain pointers
efe0: 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f to.** open curso
eff0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f rs..*/.static vo
f000: 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f id closeAllCurso
f010: 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 rs(Vdbe *p){. i
f020: 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a f( p->pFrame ){.
f030: 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 VdbeFrame *p
f040: 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 Frame;. for(p
f050: 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b Frame=p->pFrame;
f060: 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 pFrame->pParent
f070: 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d ; pFrame=pFrame-
f080: 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 >pParent);. s
f090: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 qlite3VdbeFrameR
f0a0: 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a estore(pFrame);.
f0b0: 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 p->pFrame =
f0c0: 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 0;. p->nFrame
f0d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 = 0;. }. asse
f0e0: 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 rt( p->nFrame==0
f0f0: 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f );. closeCurso
f100: 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 rsInFrame(p);.
f110: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 if( p->aMem ){.
f120: 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 releaseMemArr
f130: 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 ay(&p->aMem[1],
f140: 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 p->nMem);. }.
f150: 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 while( p->pDelFr
f160: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 ame ){. VdbeF
f170: 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e rame *pDel = p->
f180: 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 pDelFrame;. p
f190: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 ->pDelFrame = pD
f1a0: 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 el->pParent;.
f1b0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d sqlite3VdbeFram
f1c0: 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 eDelete(pDel);.
f1d0: 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 }.. /* Delete
f1e0: 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f any auxdata allo
f1f0: 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 cations made by
f200: 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 the VM */. if(
f210: 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 p->pAuxData ) sq
f220: 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 lite3VdbeDeleteA
f230: 75 78 44 61 74 61 28 70 2c 20 2d 31 2c 20 30 29 uxData(p, -1, 0)
f240: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 ;. assert( p->p
f250: 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a AuxData==0 );.}.
f260: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 ./*.** Clean up
f270: 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 the VM after a s
f280: 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 ingle run..*/.st
f290: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 atic void Cleanu
f2a0: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 p(Vdbe *p){. sq
f2b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
f2c0: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 b;..#ifdef SQLIT
f2d0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 E_DEBUG. /* Exe
f2e0: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74 cute assert() st
f2f0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 atements to ensu
f300: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65 re that the Vdbe
f310: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 .apCsr[] and .
f320: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 ** Vdbe.aMem[] a
f330: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 rrays have alrea
f340: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 dy been cleaned
f350: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b up. */. int i;
f360: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 . if( p->apCsr
f370: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e ) for(i=0; i<p->
f380: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 nCursor; i++) as
f390: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 sert( p->apCsr[i
f3a0: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d ]==0 );. if( p-
f3b0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 >aMem ){. for
f3c0: 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d (i=1; i<=p->nMem
f3d0: 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 ; i++) assert( p
f3e0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d ->aMem[i].flags=
f3f0: 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 =MEM_Undefined )
f400: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 ;. }.#endif..
f410: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 sqlite3DbFree(db
f420: 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 , p->zErrMsg);.
f430: 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b p->zErrMsg = 0;
f440: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 . p->pResultSet
f450: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 = 0;.}../*.** S
f460: 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 et the number of
f470: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 result columns
f480: 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 that will be ret
f490: 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 urned by this SQ
f4a0: 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 L.** statement.
f4b0: 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 This is now set
f4c0: 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c at compile time,
f4d0: 20 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 rather than dur
f4e0: 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e ing.** execution
f4f0: 20 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f of the vdbe pro
f500: 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c gram so that sql
f510: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e ite3_column_coun
f520: 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 t() can.** be ca
f530: 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 lled on an SQL s
f540: 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 tatement before
f550: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a sqlite3_step()..
f560: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
f570: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 dbeSetNumCols(Vd
f580: 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 be *p, int nResC
f590: 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 olumn){. Mem *p
f5a0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e ColName;. int n
f5b0: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 ;. sqlite3 *db
f5c0: 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 = p->db;.. rele
f5d0: 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 aseMemArray(p->a
f5e0: 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 ColName, p->nRes
f5f0: 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e Column*COLNAME_N
f600: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 );. sqlite3DbFr
f610: 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 ee(db, p->aColNa
f620: 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 me);. n = nResC
f630: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b olumn*COLNAME_N;
f640: 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e . p->nResColumn
f650: 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 = (u16)nResColu
f660: 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d mn;. p->aColNam
f670: 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 e = pColName = (
f680: 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 Mem*)sqlite3DbMa
f690: 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a llocZero(db, siz
f6a0: 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 eof(Mem)*n );.
f6b0: 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d if( p->aColName=
f6c0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 =0 ) return;. w
f6d0: 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b hile( n-- > 0 ){
f6e0: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 . pColName->f
f6f0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b lags = MEM_Null;
f700: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 . pColName->d
f710: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 b = p->db;. p
f720: 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d ColName++;. }.}
f730: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 ../*.** Set the
f740: 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 name of the idx'
f750: 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 th column to be
f760: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 returned by the
f770: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a SQL statement..*
f780: 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 * zName must be
f790: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e a pointer to a n
f7a0: 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 ul terminated st
f7b0: 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 ring..**.** This
f7c0: 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 call must be ma
f7d0: 64 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 de after a call
f7e0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 to sqlite3VdbeSe
f7f0: 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a tNumCols()..**.*
f800: 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 * The final para
f810: 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 meter, xDel, mus
f820: 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 t be one of SQLI
f830: 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 TE_DYNAMIC, SQLI
f840: 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 TE_STATIC.** or
f850: 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 SQLITE_TRANSIENT
f860: 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 . If it is SQLIT
f870: 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 E_DYNAMIC, then
f880: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 the buffer point
f890: 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d ed.** to by zNam
f8a0: 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 e will be freed
f8b0: 62 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 by sqlite3DbFree
f8c0: 28 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 () when the vdbe
f8d0: 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a is destroyed..*
f8e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 /.int sqlite3Vdb
f8f0: 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 eSetColName(. V
f900: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 dbe *p,
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f920: 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f /* Vdbe being co
f930: 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e nfigured */. in
f940: 74 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 t idx,
f950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
f960: 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d * Index of colum
f970: 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 n zName applies
f980: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c to */. int var,
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
f9a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 /* One
f9b0: 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a of the COLNAME_*
f9c0: 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 constants */.
f9d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d const char *zNam
f9e0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
f9f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 /* Pointer to b
fa00: 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 uffer containing
fa10: 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 name */. void
fa20: 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 (*xDel)(void*)
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d /* M
fa40: 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 emory management
fa50: 20 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e strategy for zN
fa60: 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 ame */.){. int
fa70: 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e rc;. Mem *pColN
fa80: 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 ame;. assert( i
fa90: 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e dx<p->nResColumn
faa0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 );. assert( va
fab0: 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 r<COLNAME_N );.
fac0: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c if( p->db->mall
fad0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 ocFailed ){.
fae0: 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c assert( !zName |
faf0: 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 | xDel!=SQLITE_D
fb00: 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 YNAMIC );. re
fb10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 turn SQLITE_NOME
fb20: 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 M;. }. assert(
fb30: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20 p->aColName!=0
fb40: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 );. pColName =
fb50: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64 &(p->aColName[id
fb60: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c x+var*p->nResCol
fb70: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 umn]);. rc = sq
fb80: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 lite3VdbeMemSetS
fb90: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61 tr(pColName, zNa
fba0: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 me, -1, SQLITE_U
fbb0: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73 TF8, xDel);. as
fbc0: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21 sert( rc!=0 || !
fbd0: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61 zName || (pColNa
fbe0: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65 me->flags&MEM_Te
fbf0: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 rm)!=0 );. retu
fc00: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 rn rc;.}../*.**
fc10: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 A read or write
fc20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 transaction may
fc30: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63 or may not be ac
fc40: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65 tive on database
fc50: 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49 handle.** db. I
fc60: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 f a transaction
fc70: 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69 is active, commi
fc80: 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69 t it. If there i
fc90: 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 s a.** write-tra
fca0: 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e nsaction spannin
fcb0: 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 g more than one
fcc0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 database file, t
fcd0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74 his routine.** t
fce0: 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65 akes care of the
fcf0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 master journal
fd00: 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61 trickery..*/.sta
fd10: 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d tic int vdbeComm
fd20: 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 it(sqlite3 *db,
fd30: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 Vdbe *p){. int
fd40: 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20 i;. int nTrans
fd50: 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 = 0; /* Number
fd60: 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74 of databases wit
fd70: 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74 h an active writ
fd80: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f e-transaction */
fd90: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 . int rc = SQLI
fda0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 TE_OK;. int nee
fdb0: 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 dXcommit = 0;..#
fdc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 ifdef SQLITE_OMI
fdd0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 T_VIRTUALTABLE.
fde0: 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 /* With this op
fdf0: 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 tion, sqlite3Vta
fe00: 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e bSync() is defin
fe10: 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 ed to be simply
fe20: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 . ** SQLITE_OK
fe30: 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 so p is not used
fe40: 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 . . */. UNUSED
fe50: 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 _PARAMETER(p);.#
fe60: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f endif.. /* Befo
fe70: 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e re doing anythin
fe80: 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 g else, call the
fe90: 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 xSync() callbac
fea0: 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 k for any. ** v
feb0: 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 irtual module ta
fec0: 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 bles written in
fed0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e this transaction
fee0: 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 . This has to.
fef0: 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 ** be done befor
ff00: 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 e determining wh
ff10: 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a ether a master j
ff20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a ournal file is .
ff30: 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 ** required, a
ff40: 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c s an xSync() cal
ff50: 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e lback may add an
ff60: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61 attached databa
ff70: 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 se. ** to the t
ff80: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f ransaction.. */
ff90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 . rc = sqlite3V
ffa0: 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a tabSync(db, p);.
ffb0: 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 . /* This loop
ffc0: 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 determines (a) i
ffd0: 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f f the commit hoo
ffe0: 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f k should be invo
fff0: 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 ked and. ** (b)
10000 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 how many databa
10010 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 se files have op
10020 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 en write transac
10030 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a tions, not . **
10040 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 including the t
10050 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 emp database. (b
10060 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 ) is important b
10070 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 ecause if more t
10080 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 han . ** one da
10090 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 tabase file has
100a0 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 an open write tr
100b0 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 ansaction, a mas
100c0 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a ter journal. **
100d0 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 file is require
100e0 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 d for an atomic
100f0 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 commit.. */ .
10100 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c for(i=0; rc==SQL
10110 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e ITE_OK && i<db->
10120 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 nDb; i++){ .
10130 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d Btree *pBt = db-
10140 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 >aDb[i].pBt;.
10150 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 if( sqlite3Btre
10160 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 eIsInTrans(pBt)
10170 29 7b 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f ){. needXco
10180 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 mmit = 1;.
10190 69 66 28 20 69 21 3d 31 20 29 20 6e 54 72 61 6e if( i!=1 ) nTran
101a0 73 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 s++;. rc =
101b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 78 63 6c sqlite3BtreeExcl
101c0 75 73 69 76 65 4c 6f 63 6b 28 70 42 74 29 3b 0a usiveLock(pBt);.
101d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e 64 }. }..#ifnd
101e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 ef SQLITE_OMIT_C
101f0 4f 4e 43 55 52 52 45 4e 54 0a 20 20 69 66 28 20 ONCURRENT. if(
10200 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 db->bConcurrent
10210 26 26 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d && (rc & 0xFF)==
10220 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 SQLITE_BUSY ){.
10230 20 20 20 2f 2a 20 41 6e 20 53 51 4c 49 54 45 5f /* An SQLITE_
10240 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45 5f 42 BUSY or SQLITE_B
10250 55 53 59 5f 53 4e 41 50 53 48 4f 54 20 77 61 73 USY_SNAPSHOT was
10260 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 77 68 69 encountered whi
10270 6c 65 20 0a 20 20 20 20 2a 2a 20 61 74 74 65 6d le . ** attem
10280 70 74 69 6e 67 20 74 6f 20 74 61 6b 65 20 74 68 pting to take th
10290 65 20 57 52 49 54 45 52 20 6c 6f 63 6b 20 6f 6e e WRITER lock on
102a0 20 61 20 77 61 6c 20 66 69 6c 65 2e 20 52 65 6c a wal file. Rel
102b0 65 61 73 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 ease the. **
102c0 57 52 49 54 45 52 20 6c 6f 63 6b 73 20 6f 6e 20 WRITER locks on
102d0 61 6c 6c 20 77 61 6c 20 66 69 6c 65 73 20 61 6e all wal files an
102e0 64 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 d return early.
102f0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b */. for(i=0;
10300 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 i<db->nDb; i++)
10310 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 {. Btree *p
10320 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e Bt = db->aDb[i].
10330 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 pBt;. if( s
10340 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 qlite3BtreeIsInT
10350 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 rans(pBt) ){.
10360 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 sqlite3Btre
10370 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 eEnter(pBt);.
10380 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 sqlite3Page
10390 72 44 72 6f 70 45 78 63 6c 75 73 69 76 65 4c 6f rDropExclusiveLo
103a0 63 6b 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 ck(sqlite3BtreeP
103b0 61 67 65 72 28 70 42 74 29 29 3b 0a 20 20 20 20 ager(pBt));.
103c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 sqlite3Btree
103d0 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 Leave(pBt);.
103e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 }. }. }.#e
103f0 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 21 3d ndif.. if( rc!=
10400 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
10410 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a return rc;. }.
10420 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 . /* If there a
10430 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 re any write-tra
10440 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c nsactions at all
10450 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d , invoke the com
10460 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 mit hook */. if
10470 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 ( needXcommit &&
10480 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c db->xCommitCall
10490 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d back ){. rc =
104a0 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c db->xCommitCall
104b0 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 back(db->pCommit
104c0 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 Arg);. if( rc
104d0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){. return
104e0 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 SQLITE_CONSTRAI
104f0 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 NT_COMMITHOOK;.
10500 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 }. }.. /* T
10510 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d he simple case -
10520 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e no more than on
10530 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 e database file
10540 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 (not counting th
10550 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 e. ** TEMP data
10560 62 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e base) has a tran
10570 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 saction active.
10580 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 There is no ne
10590 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 ed for the. **
105a0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a master-journal..
105b0 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 **. ** If the
105c0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 return value of
105d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 sqlite3BtreeGet
105e0 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 Filename() is a
105f0 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a zero length. **
10600 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e string, it mean
10610 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 s the main datab
10620 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 ase is :memory:
10630 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 or a temp file.
10640 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 In . ** that c
10650 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 ase we do not su
10660 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c pport atomic mul
10670 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c ti-file commits,
10680 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a so use the . *
10690 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 * simple case th
106a0 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 en too.. */. i
106b0 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 f( 0==sqlite3Str
106c0 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 len30(sqlite3Btr
106d0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 eeGetFilename(db
106e0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 ->aDb[0].pBt)).
106f0 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 || nTrans<=1.
10700 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b ){. for(i=0;
10710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 rc==SQLITE_OK &
10720 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b & i<db->nDb; i++
10730 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a ){. Btree *
10740 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d pBt = db->aDb[i]
10750 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 .pBt;. if(
10760 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 pBt ){. r
10770 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 c = sqlite3Btree
10780 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 CommitPhaseOne(p
10790 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a Bt, 0);. }.
107a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f }.. /* Do
107b0 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 the commit only
107c0 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 if all database
107d0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 s successfully c
107e0 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e omplete phase 1.
107f0 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 . ** If one
10800 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d of the BtreeComm
10810 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c itPhaseOne() cal
10820 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 ls fails, this i
10830 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 ndicates an.
10840 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c ** IO error whil
10850 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 e deleting or tr
10860 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e uncating a journ
10870 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 al file. It is u
10880 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 nlikely,. **
10890 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e but could happen
108a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 . In this case a
108b0 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e bandon processin
108c0 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 g and return the
108d0 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 error.. */.
108e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d for(i=0; rc==
108f0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 SQLITE_OK && i<d
10900 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 b->nDb; i++){.
10910 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d Btree *pBt =
10920 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b db->aDb[i].pBt;
10930 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 . if( pBt )
10940 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 {. rc = s
10950 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 qlite3BtreeCommi
10960 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 tPhaseTwo(pBt, 0
10970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
10980 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c . if( rc==SQL
10990 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
109a0 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 sqlite3VtabCommi
109b0 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d t(db);. }. }
109c0 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c .. /* The compl
109d0 65 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 ex case - There
109e0 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 is a multi-file
109f0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f write-transactio
10a00 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 n active.. ** T
10a10 68 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d his requires a m
10a20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
10a30 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 le to ensure the
10a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a transaction is.
10a50 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 ** committed a
10a60 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a tomically.. */.
10a70 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f #ifndef SQLITE_O
10a80 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 MIT_DISKIO. els
10a90 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 e{. sqlite3_v
10aa0 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 fs *pVfs = db->p
10ab0 56 66 73 3b 0a 20 20 20 20 69 6e 74 20 6e 65 65 Vfs;. int nee
10ac0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 63 dSync = 0;. c
10ad0 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 har *zMaster = 0
10ae0 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 ; /* File-name
10af0 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 for the master
10b00 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 journal */. c
10b10 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e har const *zMain
10b20 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 File = sqlite3Bt
10b30 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 reeGetFilename(d
10b40 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a b->aDb[0].pBt);.
10b50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 sqlite3_file
10b60 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 *pMaster = 0;.
10b70 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 i64 offset =
10b80 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0;. int res;.
10b90 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 int retryCou
10ba0 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 nt = 0;. int
10bb0 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 nMainFile;..
10bc0 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 /* Select a mast
10bd0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 er journal file
10be0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 name */. nMai
10bf0 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 nFile = sqlite3S
10c00 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c trlen30(zMainFil
10c10 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 e);. zMaster
10c20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 = sqlite3MPrintf
10c30 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 (db, "%s-mjXXXXX
10c40 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c X9XXz", zMainFil
10c50 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 e);. if( zMas
10c60 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 ter==0 ) return
10c70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 SQLITE_NOMEM;.
10c80 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 do {. u32
10c90 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 iRandom;.
10ca0 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 if( retryCount )
10cb0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 {. if( re
10cc0 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a tryCount>100 ){.
10cd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
10ce0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 3_log(SQLITE_FUL
10cf0 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 L, "MJ delete: %
10d00 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 s", zMaster);.
10d10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f sqlite3O
10d20 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d sDelete(pVfs, zM
10d30 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 aster, 0);.
10d40 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
10d50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 }else if( re
10d60 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 tryCount==1 ){.
10d70 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
10d80 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c _log(SQLITE_FULL
10d90 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 , "MJ collide: %
10da0 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 s", zMaster);.
10db0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
10dc0 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 retryCount
10dd0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 ++;. sqlite
10de0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 3_randomness(siz
10df0 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 eof(iRandom), &i
10e00 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 Random);. s
10e10 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 qlite3_snprintf(
10e20 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 13, &zMaster[nMa
10e30 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 inFile], "-mj%06
10e40 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 X9%02X",.
10e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10e60 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d (iRandom
10e70 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 >>8)&0xffffff, i
10e80 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 Random&0xff);.
10e90 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 /* The antip
10ea0 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 enultimate chara
10eb0 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 cter of the mast
10ec0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 er journal name
10ed0 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 must. ** be
10ee0 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 "9" to avoid na
10ef0 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 me collisions wh
10f00 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c en using 8+3 fil
10f10 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 enames. */.
10f20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 assert( zMaster
10f30 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 [sqlite3Strlen30
10f40 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 (zMaster)-3]=='9
10f50 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 ' );. sqlit
10f60 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d e3FileSuffix3(zM
10f70 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 ainFile, zMaster
10f80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 );. rc = sq
10f90 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 lite3OsAccess(pV
10fa0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c fs, zMaster, SQL
10fb0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 ITE_ACCESS_EXIST
10fc0 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 S, &res);. }w
10fd0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 hile( rc==SQLITE
10fe0 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 _OK && res );.
10ff0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 if( rc==SQLITE
11000 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 _OK ){. /*
11010 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 Open the master
11020 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 journal. */.
11030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 rc = sqlite3Os
11040 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c OpenMalloc(pVfs,
11050 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 zMaster, &pMast
11060 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 er, . S
11070 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 QLITE_OPEN_READW
11080 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e RITE|SQLITE_OPEN
11090 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 _CREATE|.
110a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 SQLITE_OPEN_E
110b0 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f XCLUSIVE|SQLITE_
110c0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 OPEN_MASTER_JOUR
110d0 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a NAL, 0. );.
110e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 }. if( rc
110f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
11100 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
11110 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b ee(db, zMaster);
11120 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 . return rc
11130 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a ;. }. . /*
11140 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 Write the name
11150 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73 65 of each database
11160 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 file in the tra
11170 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 nsaction into th
11180 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 e new. ** mas
11190 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 ter journal file
111a0 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 . If an error oc
111b0 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 curs at this poi
111c0 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 nt close. **
111d0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d and delete the m
111e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 aster journal fi
111f0 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 le. All the indi
11200 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 vidual journal f
11210 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c iles. ** stil
11220 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 l have 'null' as
11230 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 the master jour
11240 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 nal pointer, so
11250 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 they will roll.
11260 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 ** back indep
11270 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 endently if a fa
11280 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 ilure occurs..
11290 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 */. for(i=0
112a0 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b ; i<db->nDb; i++
112b0 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a ){. Btree *
112c0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d pBt = db->aDb[i]
112d0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 .pBt;. if(
112e0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e sqlite3BtreeIsIn
112f0 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 Trans(pBt) ){.
11300 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 char const
11310 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 *zFile = sqlite
11320 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 3BtreeGetJournal
11330 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 name(pBt);.
11340 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 if( zFile==0
11350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e ){. con
11360 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 tinue; /* Ignor
11370 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f e TEMP and :memo
11380 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f ry: databases */
11390 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
113a0 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 assert( zFile
113b0 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 [0]!=0 );.
113c0 20 20 69 66 28 20 21 6e 65 65 64 53 79 6e 63 20 if( !needSync
113d0 26 26 20 21 73 71 6c 69 74 65 33 42 74 72 65 65 && !sqlite3Btree
113e0 53 79 6e 63 44 69 73 61 62 6c 65 64 28 70 42 74 SyncDisabled(pBt
113f0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e ) ){. n
11400 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 eedSync = 1;.
11410 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 }. r
11420 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 c = sqlite3OsWri
11430 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c te(pMaster, zFil
11440 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e e, sqlite3Strlen
11450 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 30(zFile)+1, off
11460 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 set);. of
11470 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 fset += sqlite3S
11480 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 trlen30(zFile)+1
11490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 ;. if( rc
114a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
114b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
114c0 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 OsCloseFree(pMas
114d0 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 ter);.
114e0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 sqlite3OsDelete(
114f0 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 pVfs, zMaster, 0
11500 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c );. sql
11510 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a ite3DbFree(db, z
11520 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 Master);.
11530 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 return rc;.
11540 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a }. }.
11550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 }.. /* Sy
11560 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f nc the master jo
11570 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 urnal file. If t
11580 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 he IOCAP_SEQUENT
11590 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a IAL device. *
115a0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68 * flag is set th
115b0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 is is not requir
115c0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 ed.. */. i
115d0 66 28 20 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 f( needSync .
115e0 20 20 26 26 20 30 3d 3d 28 73 71 6c 69 74 65 33 && 0==(sqlite3
115f0 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 OsDeviceCharacte
11600 72 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 ristics(pMaster)
11610 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 &SQLITE_IOCAP_SE
11620 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 QUENTIAL). &
11630 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 & SQLITE_OK!=(rc
11640 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 = sqlite3OsSync
11650 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 (pMaster, SQLITE
11660 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 _SYNC_NORMAL)).
11670 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 ){. sqli
11680 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 te3OsCloseFree(p
11690 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 Master);. s
116a0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 qlite3OsDelete(p
116b0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 Vfs, zMaster, 0)
116c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 ;. sqlite3D
116d0 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 bFree(db, zMaste
116e0 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e r);. return
116f0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 rc;. }..
11700 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 /* Sync all the
11710 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 db files involve
11720 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 d in the transac
11730 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 tion. The same c
11740 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 all. ** sets
11750 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e the master journ
11760 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 al pointer in ea
11770 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f ch individual jo
11780 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a urnal. If. **
11790 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 an error occurs
117a0 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 here, do not de
117b0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 lete the master
117c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 journal file..
117d0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 **. ** If t
117e0 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 he error occurs
117f0 64 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 during the first
11800 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 call to. **
11810 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d sqlite3BtreeComm
11820 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 itPhaseOne(), th
11830 65 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 en there is a ch
11840 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 ance that the.
11850 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 ** master jour
11860 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 nal file will be
11870 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 orphaned. But w
11880 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 e cannot delete
11890 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 it,. ** in ca
118a0 73 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f se the master jo
118b0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 urnal file name
118c0 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f was written into
118d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 the journal.
118e0 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 ** file before
118f0 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 the failure occu
11900 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 rred.. */.
11910 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 for(i=0; rc==SQ
11920 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d LITE_OK && i<db-
11930 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 >nDb; i++){ .
11940 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 Btree *pBt =
11950 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a db->aDb[i].pBt;.
11960 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b if( pBt ){
11970 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 . rc = sq
11980 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 lite3BtreeCommit
11990 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d PhaseOne(pBt, zM
119a0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a aster);. }.
119b0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
119c0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 3OsCloseFree(pMa
119d0 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 ster);. asser
119e0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 t( rc!=SQLITE_BU
119f0 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 SY );. if( rc
11a00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 !=SQLITE_OK ){.
11a10 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 sqlite3DbFr
11a20 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b ee(db, zMaster);
11a30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 . return rc
11a40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11a50 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 Delete the maste
11a60 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 r journal file.
11a70 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 This commits the
11a80 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 transaction. Af
11a90 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 ter. ** doing
11aa0 20 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 this the direct
11ab0 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 ory is synced ag
11ac0 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 ain before any i
11ad0 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a ndividual. **
11ae0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c transaction fil
11af0 65 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a es are deleted..
11b00 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 */. rc =
11b10 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 sqlite3OsDelete(
11b20 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 6e pVfs, zMaster, n
11b30 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 73 71 eedSync);. sq
11b40 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
11b50 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d zMaster);. zM
11b60 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 aster = 0;. i
11b70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 f( rc ){. r
11b80 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a eturn rc;. }.
11b90 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 . /* All file
11ba0 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65 s and directorie
11bb0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 s have already b
11bc0 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 een synced, so t
11bd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 he following.
11be0 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c ** calls to sql
11bf0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 ite3BtreeCommitP
11c00 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e haseTwo() are on
11c10 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 ly closing files
11c20 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 and. ** dele
11c30 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 ting or truncati
11c40 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 ng journals. If
11c50 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 something goes w
11c60 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a rong while. *
11c70 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e * this is happen
11c80 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61 ing we don't rea
11c90 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e lly care. The in
11ca0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20 tegrity of the.
11cb0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f ** transactio
11cc0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61 n is already gua
11cd0 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d ranteed, but som
11ce0 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a e stray 'cold' j
11cf0 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d ournals. ** m
11d00 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 ay be lying arou
11d10 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e nd. Returning an
11d20 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 error code won'
11d30 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a t help matters..
11d40 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 */. disab
11d50 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f le_simulated_io_
11d60 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 errors();. sq
11d70 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e lite3BeginBenign
11d80 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f Malloc();. fo
11d90 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 r(i=0; i<db->nDb
11da0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 ; i++){ . B
11db0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e tree *pBt = db->
11dc0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 aDb[i].pBt;.
11dd0 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 if( pBt ){.
11de0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 sqlite3Btre
11df0 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 eCommitPhaseTwo(
11e00 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d pBt, 1);. }
11e10 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 . }. sqlit
11e20 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f e3EndBenignMallo
11e30 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f c();. enable_
11e40 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 simulated_io_err
11e50 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 ors();.. sqli
11e60 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 te3VtabCommit(db
11e70 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 );. }.#endif..
11e80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
11e90 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 * .** This routi
11ea0 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74 ne checks that t
11eb0 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 he sqlite3.nVdbe
11ec0 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72 Active count var
11ed0 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 iable.** matches
11ee0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 the number of v
11ef0 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73 dbe's in the lis
11f00 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20 t sqlite3.pVdbe
11f10 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 that are.** curr
11f20 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e ently active. An
11f30 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 assertion fails
11f40 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e if the two coun
11f50 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e ts do not match.
11f60 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69 .** This is an i
11f70 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 nternal self-che
11f80 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 ck only - it is
11f90 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c not an essential
11fa0 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 processing.** s
11fb0 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 tep..**.** This
11fc0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 is a no-op if ND
11fd0 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e EBUG is defined.
11fe0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 .*/.#ifndef NDEB
11ff0 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 UG.static void c
12000 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e heckActiveVdbeCn
12010 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a t(sqlite3 *db){.
12020 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 Vdbe *p;. int
12030 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 cnt = 0;. int
12040 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e nWrite = 0;. in
12050 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 t nRead = 0;. p
12060 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 = db->pVdbe;.
12070 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 while( p ){.
12080 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 if( sqlite3_stmt
12090 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73 _busy((sqlite3_s
120a0 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 tmt*)p) ){.
120b0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 cnt++;. if
120c0 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 ( p->readOnly==0
120d0 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 ) nWrite++;.
120e0 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 if( p->bIsRea
120f0 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 der ) nRead++;.
12100 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e }. p = p->
12110 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 pNext;. }. ass
12120 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 ert( cnt==db->nV
12130 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61 dbeActive );. a
12140 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 ssert( nWrite==d
12150 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b b->nVdbeWrite );
12160 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64 . assert( nRead
12170 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 ==db->nVdbeRead
12180 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 );.}.#else.#defi
12190 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 ne checkActiveVd
121a0 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a beCnt(x).#endif.
121b0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 ./*.** If the Vd
121c0 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 be passed as the
121d0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 first argument
121e0 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65 opened a stateme
121f0 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a nt-transaction,.
12200 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e ** close it now.
12210 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 Argument eOp mu
12220 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56 st be either SAV
12230 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 EPOINT_ROLLBACK
12240 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f or.** SAVEPOINT_
12250 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69 RELEASE. If it i
12260 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c s SAVEPOINT_ROLL
12270 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 BACK, then the s
12280 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e tatement.** tran
12290 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 saction is rolle
122a0 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 d back. If eOp i
122b0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 s SAVEPOINT_RELE
122c0 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a ASE, then the .*
122d0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e * statement tran
122e0 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 saction is commi
122f0 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 tted..**.** If a
12300 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 n IO error occur
12310 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 s, an SQLITE_IOE
12320 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64 RR_XXX error cod
12330 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a e is returned. .
12340 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c ** Otherwise SQL
12350 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 ITE_OK..*/.int s
12360 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 qlite3VdbeCloseS
12370 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 tatement(Vdbe *p
12380 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 , int eOp){. sq
12390 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 lite3 *const db
123a0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 = p->db;. int r
123b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a c = SQLITE_OK;..
123c0 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 /* If p->iStat
123d0 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72 ement is greater
123e0 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e than zero, then
123f0 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65 this Vdbe opene
12400 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d d a . ** statem
12410 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ent transaction
12420 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63 that should be c
12430 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20 losed here. The
12440 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 only exception.
12450 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49 ** is that an I
12460 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65 O error may have
12470 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69 occurred, causi
12480 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 ng an emergency
12490 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 rollback.. ** I
124a0 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d n this case (db-
124b0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c >nStatement==0),
124c0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f and there is no
124d0 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a thing to do.. *
124e0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 /. if( db->nSta
124f0 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 tement && p->iSt
12500 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 atement ){. i
12510 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 nt i;. const
12520 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d int iSavepoint =
12530 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 p->iStatement-1
12540 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 ;.. assert( e
12550 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f Op==SAVEPOINT_RO
12560 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 LLBACK || eOp==S
12570 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 AVEPOINT_RELEASE
12580 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 );. assert( d
12590 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 b->nStatement>0
125a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 );. assert( p
125b0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 ->iStatement==(d
125c0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 b->nStatement+db
125d0 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b ->nSavepoint) );
125e0 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 .. for(i=0; i
125f0 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 <db->nDb; i++){
12600 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d . int rc2 =
12610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 SQLITE_OK;.
12620 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 Btree *pBt = d
12630 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 b->aDb[i].pBt;.
12640 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a if( pBt ){.
12650 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d if( eOp=
12660 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 =SAVEPOINT_ROLLB
12670 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ACK ){.
12680 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 rc2 = sqlite3Bt
12690 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 reeSavepoint(pBt
126a0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c , SAVEPOINT_ROLL
126b0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 BACK, iSavepoint
126c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
126d0 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51 if( rc2==SQ
126e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 LITE_OK ){.
126f0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 rc2 = sqlit
12700 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 e3BtreeSavepoint
12710 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f (pBt, SAVEPOINT_
12720 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f RELEASE, iSavepo
12730 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a int);. }.
12740 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
12750 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 SQLITE_OK ){.
12760 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b rc = rc2;
12770 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
12780 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d }. }. db-
12790 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 >nStatement--;.
127a0 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 p->iStatement
127b0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 = 0;.. if( r
127c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a c==SQLITE_OK ){.
127d0 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 if( eOp==S
127e0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 AVEPOINT_ROLLBAC
127f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 K ){. rc
12800 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 = sqlite3VtabSav
12810 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 epoint(db, SAVEP
12820 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 OINT_ROLLBACK, i
12830 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 Savepoint);.
12840 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 }. if( rc
12850 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 ==SQLITE_OK ){.
12860 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
12870 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 te3VtabSavepoint
12880 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 (db, SAVEPOINT_R
12890 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 ELEASE, iSavepoi
128a0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 nt);. }.
128b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 }.. /* If th
128c0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e e statement tran
128d0 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 saction is being
128e0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c rolled back, al
128f0 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a so restore the .
12900 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 ** database
12910 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64 handles deferred
12920 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e constraint coun
12930 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65 ter to the value
12940 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20 it had when .
12950 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 ** the stateme
12960 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 nt transaction w
12970 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 as opened. */.
12980 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 if( eOp==SAVE
12990 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 POINT_ROLLBACK )
129a0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 {. db->nDef
129b0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e erredCons = p->n
129c0 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 StmtDefCons;.
129d0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 db->nDeferred
129e0 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 ImmCons = p->nSt
129f0 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 mtDefImmCons;.
12a00 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e }. }. return
12a10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 rc;.}../*.** Th
12a20 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 is function is c
12a30 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61 alled when a tra
12a40 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 nsaction opened
12a50 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20 by the database
12a60 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 .** handle assoc
12a70 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56 iated with the V
12a80 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 M passed as an a
12a90 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 rgument is about
12aa0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 to be .** commi
12ab0 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61 tted. If there a
12ac0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 re outstanding d
12ad0 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20 eferred foreign
12ae0 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a key constraint.*
12af0 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 * violations, re
12b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f turn SQLITE_ERRO
12b10 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 R. Otherwise, SQ
12b20 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 LITE_OK..**.** I
12b30 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 f there are outs
12b40 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 tanding FK viola
12b50 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66 tions and this f
12b60 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 unction returns
12b70 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 .** SQLITE_ERROR
12b80 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74 , set the result
12b90 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51 of the VM to SQ
12ba0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f LITE_CONSTRAINT_
12bb0 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e FOREIGNKEY.** an
12bc0 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72 d write an error
12bd0 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20 message to it.
12be0 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 Then return SQLI
12bf0 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 TE_ERROR..*/.#if
12c00 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 ndef SQLITE_OMIT
12c10 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 _FOREIGN_KEY.int
12c20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 sqlite3VdbeChec
12c30 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 kFk(Vdbe *p, int
12c40 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71 deferred){. sq
12c50 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
12c60 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72 b;. if( (deferr
12c70 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 ed && (db->nDefe
12c80 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 rredCons+db->nDe
12c90 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 ferredImmCons)>0
12ca0 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72 ) . || (!defer
12cb0 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e red && p->nFkCon
12cc0 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b straint>0) . ){
12cd0 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c . p->rc = SQL
12ce0 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 ITE_CONSTRAINT_F
12cf0 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 OREIGNKEY;. p
12d00 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 ->errorAction =
12d10 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 OE_Abort;. sq
12d20 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70 lite3VdbeError(p
12d30 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 , "FOREIGN KEY c
12d40 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 onstraint failed
12d50 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 ");. return S
12d60 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d QLITE_ERROR;. }
12d70 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 . return SQLITE
12d80 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f _OK;.}.#endif../
12d90 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e *.** This routin
12da0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 e is called the
12db0 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65 when a VDBE trie
12dc0 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 s to halt. If t
12dd0 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d he VDBE.** has m
12de0 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20 ade changes and
12df0 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 is in autocommit
12e00 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d mode, then comm
12e10 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e it those.** chan
12e20 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 ges. If a rollb
12e30 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74 ack is needed, t
12e40 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 hen do the rollb
12e50 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 ack..**.** This
12e60 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f routine is the o
12e70 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 nly way to move
12e80 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56 the state of a V
12e90 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 M from.** SQLITE
12ea0 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 _MAGIC_RUN to SQ
12eb0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e LITE_MAGIC_HALT.
12ec0 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73 It is harmless
12ed0 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 to.** call this
12ee0 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73 on a VM that is
12ef0 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d in the SQLITE_M
12f00 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e AGIC_HALT state.
12f10 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e .**.** Return an
12f20 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 error code. If
12f30 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c the commit coul
12f40 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 d not complete b
12f50 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 ecause of.** loc
12f60 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 k contention, re
12f70 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 turn SQLITE_BUSY
12f80 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53 . If SQLITE_BUS
12f90 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69 Y is returned, i
12fa0 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 t.** means the c
12fb0 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70 lose did not hap
12fc0 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f pen and needs to
12fd0 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f be repeated..*/
12fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 .int sqlite3Vdbe
12ff0 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 Halt(Vdbe *p){.
13000 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 int rc;
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13020 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72 /* Used to stor
13030 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75 e transient retu
13040 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 rn codes */. sq
13050 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 lite3 *db = p->d
13060 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 b;.. /* This fu
13070 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 nction contains
13080 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64 the logic that d
13090 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 etermines if a s
130a0 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a tatement or. **
130b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c transaction wil
130c0 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f l be committed o
130d0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 r rolled back as
130e0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 a result of the
130f0 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 . ** execution
13100 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20 of this virtual
13110 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 machine. . **.
13120 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 ** If any of th
13130 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f e following erro
13140 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 rs occur:. **.
13150 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e ** SQLITE_N
13160 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 OMEM. ** SQ
13170 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 LITE_IOERR. **
13180 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a SQLITE_FULL.
13190 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f ** SQLITE_
131a0 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 INTERRUPT. **.
131b0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74 ** Then the int
131c0 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68 ernal cache migh
131d0 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74 t have been left
131e0 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 in an inconsist
131f0 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 ent. ** state.
13200 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c We need to roll
13210 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 back the stateme
13220 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 nt transaction,
13230 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a if there is. **
13240 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d one, or the com
13250 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f plete transactio
13260 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f n if there is no
13270 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 statement trans
13280 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 action.. */..
13290 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f if( p->db->mallo
132a0 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 cFailed ){. p
132b0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f ->rc = SQLITE_NO
132c0 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 MEM;. }. if( p
132d0 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 ->aOnceFlag ) me
132e0 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 mset(p->aOnceFla
132f0 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c g, 0, p->nOnceFl
13300 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 ag);. closeAllC
13310 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 ursors(p);. if(
13320 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f p->magic!=VDBE_
13330 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 MAGIC_RUN ){.
13340 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f return SQLITE_O
13350 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 K;. }. checkAc
13360 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b tiveVdbeCnt(db);
13370 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 .. /* No commit
13380 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 or rollback nee
13390 64 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 ded if the progr
133a0 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 am never started
133b0 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 or if the. **
133c0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f SQL statement do
133d0 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 es not read or w
133e0 72 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20 rite a database
133f0 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 file. */. if(
13400 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 p->pc>=0 && p->b
13410 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 IsReader ){.
13420 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 int mrc; /* Pr
13430 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 imary error code
13440 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 from p->rc */.
13450 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e int eStatemen
13460 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 tOp = 0;. int
13470 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b isSpecialError;
13480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
13490 65 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 et to true if a
134a0 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 'special' error
134b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 */.. /* Lock
134c0 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 all btrees used
134d0 62 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 by the statement
134e0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 */. sqlite3V
134f0 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 dbeEnter(p);..
13500 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f /* Check for o
13510 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 ne of the specia
13520 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 l errors */.
13530 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 mrc = p->rc & 0x
13540 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 ff;. isSpecia
13550 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 lError = mrc==SQ
13560 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 LITE_NOMEM || mr
13570 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a c==SQLITE_IOERR.
13580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13590 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c || mrc==SQL
135a0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c ITE_INTERRUPT ||
135b0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c mrc==SQLITE_FUL
135c0 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 L;. if( isSpe
135d0 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 cialError ){.
135e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 /* If the que
135f0 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 ry was read-only
13600 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 and the error c
13610 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e ode is SQLITE_IN
13620 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 TERRUPT, .
13630 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 ** no rollback i
13640 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 s necessary. Oth
13650 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 erwise, at least
13660 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 a savepoint .
13670 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 ** transacti
13680 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 on must be rolle
13690 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 d back to restor
136a0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 e the database t
136b0 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f o a . ** co
136c0 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a nsistent state..
136d0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a **. *
136e0 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 * Even if the st
136f0 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d atement is read-
13700 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f only, it is impo
13710 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d rtant to perform
13720 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 . ** a stat
13730 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 ement or transac
13740 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 tion rollback op
13750 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 eration. If the
13760 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 error . **
13770 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 occurred while w
13780 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f riting to the jo
13790 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e urnal, sub-journ
137a0 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 al or database.
137b0 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 ** file as
137c0 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 part of an effor
137d0 74 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 t to free up cac
137e0 68 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 he space (see fu
137f0 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 nction. **
13800 70 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e pagerStress() in
13810 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 pager.c), the r
13820 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 ollback is requi
13830 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a red to restore .
13840 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 ** the pag
13850 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 er to a consiste
13860 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 nt state..
13870 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d */. if( !p-
13880 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 >readOnly || mrc
13890 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 !=SQLITE_INTERRU
138a0 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 PT ){. if
138b0 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e ( (mrc==SQLITE_N
138c0 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c OMEM || mrc==SQL
138d0 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e ITE_FULL) && p->
138e0 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 usesStmtJournal
138f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 ){. eSt
13900 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 atementOp = SAVE
13910 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a POINT_ROLLBACK;.
13920 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 }else{.
13930 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 /* We a
13940 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c re forced to rol
13950 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 l back the activ
13960 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 e transaction. B
13970 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 efore doing.
13980 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f ** so, abo
13990 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 rt any other sta
139a0 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e tements this han
139b0 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 dle currently ha
139c0 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 s active..
139d0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 */.
139e0 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b sqlite3Rollback
139f0 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 All(db, SQLITE_A
13a00 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a BORT_ROLLBACK);.
13a10 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 sqlite
13a20 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 3CloseSavepoints
13a30 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 (db);.
13a40 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d db->autoCommit =
13a50 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 1;. db
13a60 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 ->bConcurrent =
13a70 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 0;. p->
13a80 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 nChange = 0;.
13a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
13aa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 }.. /* Che
13ab0 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 ck for immediate
13ac0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f foreign key vio
13ad0 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 lations. */.
13ae0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 if( p->rc==SQLIT
13af0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 E_OK ){. sq
13b00 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b lite3VdbeCheckFk
13b10 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 (p, 0);. }.
13b20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 . /* If the a
13b30 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 uto-commit flag
13b40 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 is set and this
13b50 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 is the only acti
13b60 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a ve writer . *
13b70 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f * VM, then we do
13b80 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 either a commit
13b90 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 or rollback of
13ba0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e the current tran
13bb0 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a saction. . **
13bc0 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 . ** Note: Th
13bd0 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 is block also ru
13be0 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 ns if one of the
13bf0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 special errors
13c00 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 handled . **
13c10 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 above has occurr
13c20 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ed. . */.
13c30 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 if( !sqlite3Vtab
13c40 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 InSync(db) .
13c50 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d && db->autoComm
13c60 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e it . && db->
13c70 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e nVdbeWrite==(p->
13c80 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 readOnly==0) .
13c90 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 ){. if( p
13ca0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 ->rc==SQLITE_OK
13cb0 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 || (p->errorActi
13cc0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 on==OE_Fail && !
13cd0 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 isSpecialError)
13ce0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 ){. rc =
13cf0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b sqlite3VdbeCheck
13d00 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 Fk(p, 1);.
13d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 if( rc!=SQLITE
13d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 _OK ){.
13d30 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 if( NEVER(p->re
13d40 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 adOnly) ){.
13d50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
13d60 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 beLeave(p);.
13d70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 return S
13d80 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 QLITE_ERROR;.
13d90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
13da0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 rc = SQLITE_C
13db0 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 ONSTRAINT_FOREIG
13dc0 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 NKEY;. }e
13dd0 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 lse{ .
13de0 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d /* The auto-comm
13df0 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c it flag is true,
13e00 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 the vdbe progra
13e10 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c m was successful
13e20 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f . ** o
13e30 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 r hit an 'OR FAI
13e40 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e L' constraint an
13e50 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 d there are no d
13e60 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a eferred foreign.
13e70 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 ** key
13e80 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 constraints to
13e90 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e hold up the tran
13ea0 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 saction. This me
13eb0 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 ans a commit .
13ec0 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 ** is re
13ed0 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 quired. */.
13ee0 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f rc = vdbeCo
13ef0 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 mmit(db, p);.
13f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 }. i
13f10 66 28 20 28 72 63 20 26 20 30 78 46 46 29 3d 3d f( (rc & 0xFF)==
13f20 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 SQLITE_BUSY && p
13f30 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 ->readOnly ){.
13f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 sqlite3V
13f50 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 dbeLeave(p);.
13f60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 return rc
13f70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 ;. }else
13f80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f if( rc!=SQLITE_O
13f90 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 K ){. p
13fa0 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 ->rc = rc;.
13fb0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c sqlite3Roll
13fc0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 backAll(db, SQLI
13fd0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 TE_OK);.
13fe0 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 p->nChange = 0
13ff0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
14000 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e . db->n
14010 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 DeferredCons = 0
14020 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e ;. db->
14030 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 nDeferredImmCons
14040 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 = 0;.
14050 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 db->flags &= ~SQ
14060 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 LITE_DeferFKs;.
14070 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 sqlite3
14080 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 CommitInternalCh
14090 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 anges(db);.
140a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 }. }else
140b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
140c0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 3RollbackAll(db,
140d0 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 SQLITE_OK);.
140e0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 p->nChange
140f0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 = 0;. }.
14100 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e db->nStatemen
14110 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 t = 0;. }else
14120 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f if( eStatementO
14130 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 p==0 ){. if
14140 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f ( p->rc==SQLITE_
14150 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 OK || p->errorAc
14160 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b tion==OE_Fail ){
14170 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d . eStatem
14180 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e entOp = SAVEPOIN
14190 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 T_RELEASE;.
141a0 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 }else if( p->er
141b0 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 rorAction==OE_Ab
141c0 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 ort ){. e
141d0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 StatementOp = SA
141e0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b VEPOINT_ROLLBACK
141f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
14200 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f sqlite3Ro
14210 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 llbackAll(db, SQ
14220 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 LITE_ABORT_ROLLB
14230 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 ACK);. sq
14240 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f lite3CloseSavepo
14250 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 ints(db);.
14260 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 db->autoCommit
14270 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 64 62 = 1;. db
14280 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 3d 20 ->bConcurrent =
14290 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 0;. p->nC
142a0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 hange = 0;.
142b0 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 }. }. .
142c0 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 /* If eStatement
142d0 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 Op is non-zero,
142e0 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 then a statement
142f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 transaction nee
14300 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 ds to. ** be
14310 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c committed or rol
14320 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 led back. Call s
14330 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 qlite3VdbeCloseS
14340 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 tatement() to.
14350 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 ** do so. If t
14360 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 his operation re
14370 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 turns an error,
14380 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 and the current
14390 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a statement. **
143a0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 error code is S
143b0 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 QLITE_OK or SQLI
143c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 TE_CONSTRAINT, t
143d0 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a hen promote the.
143e0 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 ** current s
143f0 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 tatement error c
14400 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ode.. */.
14410 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 if( eStatementOp
14420 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 ){. rc = s
14430 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 qlite3VdbeCloseS
14440 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 tatement(p, eSta
14450 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 tementOp);.
14460 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 if( rc ){.
14470 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 if( p->rc==SQ
14480 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 LITE_OK || (p->r
14490 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f c&0xff)==SQLITE_
144a0 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 CONSTRAINT ){.
144b0 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 p->rc =
144c0 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 rc;. sq
144d0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
144e0 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 p->zErrMsg);.
144f0 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 p->zErrMs
14500 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d g = 0;. }
14510 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 . sqlite3
14520 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 RollbackAll(db,
14530 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c SQLITE_ABORT_ROL
14540 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 LBACK);.
14550 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 sqlite3CloseSave
14560 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 points(db);.
14570 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d db->autoComm
14580 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 it = 1;.
14590 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20 db->bConcurrent
145a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e = 0;. p->
145b0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 nChange = 0;.
145c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 }. }. .
145d0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 /* If this was
145e0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 an INSERT, UPDA
145f0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 TE or DELETE and
14600 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 no statement tr
14610 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a ansaction. **
14620 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 has been rolled
14630 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 back, update th
14640 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 e database conne
14650 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 ction change-cou
14660 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 nter. . */.
14670 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 if( p->changeC
14680 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 ntOn ){. if
14690 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d ( eStatementOp!=
146a0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 SAVEPOINT_ROLLBA
146b0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 CK ){. sq
146c0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e lite3VdbeSetChan
146d0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e ges(db, p->nChan
146e0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 ge);. }else
146f0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
14700 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 3VdbeSetChanges(
14710 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a db, 0);. }.
14720 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 p->nChange
14730 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 = 0;. }..
14740 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 /* Release the
14750 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c locks */. sql
14760 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 ite3VdbeLeave(p)
14770 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 ;. }.. /* We h
14780 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 ave successfully
14790 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 halted and clos
147a0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f ed the VM. Reco
147b0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f rd this fact. */
147c0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 . if( p->pc>=0
147d0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 ){. db->nVdbe
147e0 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 Active--;. if
147f0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 ( !p->readOnly )
14800 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d db->nVdbeWrite-
14810 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 -;. if( p->bI
14820 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 sReader ) db->nV
14830 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 dbeRead--;. a
14840 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 ssert( db->nVdbe
14850 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 Active>=db->nVdb
14860 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 eRead );. ass
14870 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 ert( db->nVdbeRe
14880 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 ad>=db->nVdbeWri
14890 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 te );. assert
148a0 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 ( db->nVdbeWrite
148b0 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e >=0 );. }. p->
148c0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 magic = VDBE_MAG
148d0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b IC_HALT;. check
148e0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 ActiveVdbeCnt(db
148f0 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e );. if( p->db->
14900 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a mallocFailed ){.
14910 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 p->rc = SQLI
14920 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 TE_NOMEM;. }..
14930 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d /* If the auto-
14940 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 commit flag is s
14950 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e et to true, then
14960 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 any locks that
14970 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 were held. ** b
14980 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 y connection db
14990 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 have now been re
149a0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c leased. Call sql
149b0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e ite3ConnectionUn
149c0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 locked() . ** t
149d0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 o invoke any req
149e0 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 uired unlock-not
149f0 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 ify callbacks..
14a00 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 */. if( db->au
14a10 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 toCommit ){.
14a20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f sqlite3Connectio
14a30 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 nUnlocked(db);.
14a40 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 }.. assert( db
14a50 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 ->nVdbeActive>0
14a60 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 || db->autoCommi
14a70 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 t==0 || db->nSta
14a80 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 tement==0 );. r
14a90 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 eturn (p->rc==SQ
14aa0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 LITE_BUSY ? SQLI
14ab0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 TE_BUSY : SQLITE
14ac0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 _OK);.}.../*.**
14ad0 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 Each VDBE holds
14ae0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 the result of th
14af0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 e most recent sq
14b00 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c lite3_step() cal
14b10 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 l.** in p->rc.
14b20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 This routine set
14b30 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 s that result ba
14b40 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e ck to SQLITE_OK.
14b50 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 .*/.void sqlite3
14b60 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73 VdbeResetStepRes
14b70 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ult(Vdbe *p){.
14b80 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f p->rc = SQLITE_O
14b90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 K;.}../*.** Copy
14ba0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 the error code
14bb0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 and error messag
14bc0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 e belonging to t
14bd0 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a he VDBE passed.*
14be0 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 * as the first a
14bf0 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 rgument to its d
14c00 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 atabase handle (
14c10 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c so that they wil
14c20 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 l be .** returne
14c30 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 d by calls to sq
14c40 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 lite3_errcode()
14c50 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d and sqlite3_errm
14c60 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 sg())..**.** Thi
14c70 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 s function does
14c80 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 not clear the VD
14c90 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 BE error code or
14ca0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a message, just.*
14cb0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f * copies them to
14cc0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 the database ha
14cd0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c ndle..*/.int sql
14ce0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 ite3VdbeTransfer
14cf0 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a Error(Vdbe *p){.
14d00 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 sqlite3 *db =
14d10 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 p->db;. int rc
14d20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 = p->rc;. if( p
14d30 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 ->zErrMsg ){.
14d40 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 u8 mallocFailed
14d50 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 = db->mallocFai
14d60 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 led;. sqlite3
14d70 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f BeginBenignMallo
14d80 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d c();. if( db-
14d90 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 >pErr==0 ) db->p
14da0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c Err = sqlite3Val
14db0 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 ueNew(db);. s
14dc0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 qlite3ValueSetSt
14dd0 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 r(db->pErr, -1,
14de0 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 p->zErrMsg, SQLI
14df0 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f TE_UTF8, SQLITE_
14e00 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 TRANSIENT);.
14e10 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e sqlite3EndBenign
14e20 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 Malloc();. db
14e30 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d ->mallocFailed =
14e40 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 mallocFailed;.
14e50 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d db->errCode =
14e60 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 rc;. }else{.
14e70 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 sqlite3Error(d
14e80 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 b, rc);. }. re
14e90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 turn rc;.}..#ifd
14ea0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 ef SQLITE_ENABLE
14eb0 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 _SQLLOG./*.** If
14ec0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 an SQLITE_CONFI
14ed0 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 G_SQLLOG hook is
14ee0 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 registered and
14ef0 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 the VM has been
14f00 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 run, .** invoke
14f10 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f it..*/.static vo
14f20 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c id vdbeInvokeSql
14f30 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 log(Vdbe *v){.
14f40 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 if( sqlite3Globa
14f50 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 lConfig.xSqllog
14f60 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 && v->rc==SQLITE
14f70 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 _OK && v->zSql &
14f80 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 & v->pc>=0 ){.
14f90 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 char *zExpande
14fa0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 d = sqlite3VdbeE
14fb0 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a xpandSql(v, v->z
14fc0 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 Sql);. assert
14fd0 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 ( v->db->init.bu
14fe0 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 sy==0 );. if(
14ff0 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 zExpanded ){.
15000 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 sqlite3Globa
15010 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 lConfig.xSqllog(
15020 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 . sqlit
15030 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 e3GlobalConfig.p
15040 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 SqllogArg, v->db
15050 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 , zExpanded, 1.
15060 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 );. sq
15070 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 lite3DbFree(v->d
15080 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 b, zExpanded);.
15090 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 }. }.}.#else
150a0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e .# define vdbeIn
150b0 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 vokeSqllog(x).#e
150c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 ndif../*.** Clea
150d0 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65 n up a VDBE afte
150e0 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 r execution but
150f0 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 do not delete th
15100 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e e VDBE just yet.
15110 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 .** Write any er
15120 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 ror messages int
15130 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 o *pzErrMsg. Re
15140 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 turn the result
15150 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 code..**.** Afte
15160 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 r this routine i
15170 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 s run, the VDBE
15180 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 should be ready
15190 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a to be executed.*
151a0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 * again..**.** T
151b0 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f o look at it ano
151c0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 ther way, this r
151d0 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 outine resets th
151e0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a e state of the.*
151f0 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e * virtual machin
15200 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 e from VDBE_MAGI
15210 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 C_RUN or VDBE_MA
15220 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f GIC_HALT back to
15230 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 .** VDBE_MAGIC_I
15240 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 NIT..*/.int sqli
15250 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62 te3VdbeReset(Vdb
15260 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 e *p){. sqlite3
15270 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e *db;. db = p->
15280 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 db;.. /* If the
15290 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 VM did not run
152a0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 to completion or
152b0 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 if it encounter
152c0 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 ed an. ** error
152d0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 , then it might
152e0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 not have been ha
152f0 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 lted properly.
15300 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 So halt. ** it
15310 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 now.. */. sqli
15320 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a te3VdbeHalt(p);.
15330 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 . /* If the VDB
15340 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 E has be run eve
15350 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 n partially, the
15360 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 n transfer the e
15370 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 rror code. ** a
15380 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 nd error message
15390 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 from the VDBE i
153a0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 nto the main dat
153b0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e abase structure.
153c0 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 But. ** if th
153d0 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 e VDBE has just
153e0 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 been set to run
153f0 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 but has not actu
15400 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e ally executed an
15410 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 y. ** instructi
15420 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 ons yet, leave t
15430 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 he main database
15440 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 error informati
15450 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 on unchanged..
15460 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d */. if( p->pc>=
15470 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 0 ){. vdbeInv
15480 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 okeSqllog(p);.
15490 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 sqlite3VdbeTra
154a0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 nsferError(p);.
154b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 sqlite3DbFree
154c0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 (db, p->zErrMsg)
154d0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 ;. p->zErrMsg
154e0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d = 0;. if( p-
154f0 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 >runOnlyOnce ) p
15500 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 ->expired = 1;.
15510 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 }else if( p->rc
15520 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 && p->expired )
15530 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 {. /* The exp
15540 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 ired flag was se
15550 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 t on the VDBE be
15560 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63 fore the first c
15570 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 all. ** to sq
15580 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f lite3_step(). Fo
15590 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 r consistency (s
155a0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 ince sqlite3_ste
155b0 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 p() was. ** c
155c0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 alled), set the
155d0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 database error i
155e0 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77 n this case as w
155f0 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 ell.. */.
15600 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 sqlite3ErrorWith
15610 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 Msg(db, p->rc, p
15620 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 ->zErrMsg ? "%s"
15630 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 : 0, p->zErrMsg
15640 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 );. sqlite3Db
15650 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 Free(db, p->zErr
15660 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 Msg);. p->zEr
15670 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 rMsg = 0;. }..
15680 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 /* Reclaim all
15690 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 memory used by t
156a0 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 he VDBE. */. C
156b0 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a leanup(p);.. /*
156c0 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 Save profiling
156d0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d information from
156e0 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a this VDBE run..
156f0 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 */.#ifdef VDBE
15700 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 _PROFILE. {.
15710 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 FILE *out = fop
15720 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 en("vdbe_profile
15730 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 .out", "a");.
15740 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 if( out ){.
15750 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 int i;. f
15760 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d printf(out, "---
15770 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 - ");. for(
15780 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 i=0; i<p->nOp; i
15790 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 ++){. fpr
157a0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 intf(out, "%02x"
157b0 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f , p->aOp[i].opco
157c0 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 de);. }.
157d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 fprintf(out,
157e0 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 "\n");. if(
157f0 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 p->zSql ){.
15800 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d char c, pc =
15810 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 0;. fpri
15820 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b ntf(out, "-- ");
15830 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 . for(i=0
15840 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 ; (c = p->zSql[i
15850 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 ])!=0; i++){.
15860 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 if( pc=='
15870 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 \n' ) fprintf(ou
15880 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 t, "-- ");.
15890 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 putc(c, out
158a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 );. pc
158b0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 = c;. }.
158c0 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 if( pc!='
158d0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 \n' ) fprintf(ou
158e0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 t, "\n");.
158f0 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b }. for(i=0;
15900 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b i<p->nOp; i++){
15910 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 . char zH
15920 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 dr[100];.
15930 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 sqlite3_snprint
15940 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 f(sizeof(zHdr),
15950 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c zHdr, "%6u %12ll
15960 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 u %8llu ",.
15970 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e p->aOp[i].
15980 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 cnt,.
15990 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 p->aOp[i].cycles
159a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e ,. p->
159b0 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 aOp[i].cnt>0 ? p
159c0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f ->aOp[i].cycles/
159d0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 p->aOp[i].cnt :
159e0 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 0. );.
159f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 fprintf(out
15a00 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 , "%s", zHdr);.
15a10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 sqlite3Vd
15a20 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 bePrintOp(out, i
15a30 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 , &p->aOp[i]);.
15a40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c }. fcl
15a50 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a ose(out);. }.
15a60 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e }.#endif. p->
15a70 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 iCurrentTime = 0
15a80 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 ;. p->magic = V
15a90 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a DBE_MAGIC_INIT;.
15aa0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 return p->rc &
15ab0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a db->errMask;.}.
15ac0 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 ./*.** Clean up
15ad0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 and delete a VD
15ae0 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69 BE after executi
15af0 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 on. Return an i
15b00 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a nteger which is.
15b10 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f ** the result co
15b20 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 de. Write any e
15b30 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 rror message tex
15b40 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 t into *pzErrMsg
15b50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 ..*/.int sqlite3
15b60 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 VdbeFinalize(Vdb
15b70 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 e *p){. int rc
15b80 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 = SQLITE_OK;. i
15b90 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 f( p->magic==VDB
15ba0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 E_MAGIC_RUN || p
15bb0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 ->magic==VDBE_MA
15bc0 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 GIC_HALT ){.
15bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 rc = sqlite3Vdbe
15be0 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 Reset(p);. as
15bf0 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 sert( (rc & p->d
15c00 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 b->errMask)==rc
15c10 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 );. }. sqlite3
15c20 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 VdbeDelete(p);.
15c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f return rc;.}../
15c40 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 *.** If paramete
15c50 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 r iOp is less th
15c60 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e an zero, then in
15c70 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 voke the destruc
15c80 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 tor for.** all a
15c90 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f uxiliary data po
15ca0 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 inters currently
15cb0 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56 cached by the V
15cc0 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 M passed as.** t
15cd0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e he first argumen
15ce0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 t..**.** Or, if
15cf0 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74 iOp is greater t
15d00 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 han or equal to
15d10 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 zero, then the d
15d20 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 estructor is.**
15d30 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 only invoked for
15d40 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 those auxiliary
15d50 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 data pointers c
15d60 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73 reated by the us
15d70 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 er .** function
15d80 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f invoked by the O
15d90 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 P_Function opcod
15da0 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e e at instruction
15db0 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 iOp of .** VM p
15dc0 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 Vdbe, and only t
15dd0 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 hen if:.**.**
15de0 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 * the associate
15df0 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d d function param
15e00 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 eter is the 32nd
15e10 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 or later (count
15e20 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d ing.** from
15e30 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c left to right),
15e40 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 or.**.** * t
15e50 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 he corresponding
15e60 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 bit in argument
15e70 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 mask is clear (
15e80 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a where the first.
15e90 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e ** function
15ea0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 parameter corre
15eb0 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 sponds to bit 0
15ec0 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 etc.)..*/.void s
15ed0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 qlite3VdbeDelete
15ee0 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 AuxData(Vdbe *pV
15ef0 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e dbe, int iOp, in
15f00 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 t mask){. AuxDa
15f10 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 ta **pp = &pVdbe
15f20 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 ->pAuxData;. wh
15f30 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 ile( *pp ){.
15f40 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 AuxData *pAux =
15f50 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f *pp;. if( (iO
15f60 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 p<0). || (pA
15f70 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 ux->iOp==iOp &&
15f80 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c (pAux->iArg>31 |
15f90 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 | !(mask & MASKB
15fa0 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 IT32(pAux->iArg)
15fb0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 ))). ){.
15fc0 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d testcase( pAux-
15fd0 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 >iArg==31 );.
15fe0 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 if( pAux->xDe
15ff0 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 lete ){.
16000 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 pAux->xDelete(pA
16010 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 ux->pAux);.
16020 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 }. *pp = p
16030 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 Aux->pNext;.
16040 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
16050 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 pVdbe->db, pAux)
16060 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 ;. }else{.
16070 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e pp= &pAux->pN
16080 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d ext;. }. }.}
16090 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c ../*.** Free all
160a0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 memory associat
160b0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 ed with the Vdbe
160c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 passed as the s
160d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a econd argument,.
160e0 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 ** except for ob
160f0 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 ject itself, whi
16100 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e ch is preserved.
16110 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 .**.** The diffe
16120 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 rence between th
16130 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 is function and
16140 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 sqlite3VdbeDelet
16150 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 e() is that.** V
16160 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f dbeDelete() also
16170 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 unlinks the Vdb
16180 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 e from the list
16190 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 of VMs associate
161a0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 d with.** the da
161b0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f tabase connectio
161c0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 n and frees the
161d0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a object itself..*
161e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 /.void sqlite3Vd
161f0 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 beClearObject(sq
16200 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 lite3 *db, Vdbe
16210 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 *p){. SubProgra
16220 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b m *pSub, *pNext;
16230 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 . int i;. asse
16240 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 rt( p->db==0 ||
16250 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 p->db==db );. r
16260 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 eleaseMemArray(p
16270 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 ->aVar, p->nVar)
16280 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 ;. releaseMemAr
16290 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c ray(p->aColName,
162a0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 p->nResColumn*C
162b0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 OLNAME_N);. for
162c0 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 (pSub=p->pProgra
162d0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e m; pSub; pSub=pN
162e0 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 ext){. pNext
162f0 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 = pSub->pNext;.
16300 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 vdbeFreeOpArr
16310 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 ay(db, pSub->aOp
16320 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 , pSub->nOp);.
16330 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 sqlite3DbFree(
16340 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 db, pSub);. }.
16350 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d for(i=p->nzVar-
16360 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 1; i>=0; i--) sq
16370 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 lite3DbFree(db,
16380 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 p->azVar[i]);.
16390 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 vdbeFreeOpArray(
163a0 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e db, p->aOp, p->n
163b0 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 Op);. sqlite3Db
163c0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c Free(db, p->aCol
163d0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 Name);. sqlite3
163e0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 DbFree(db, p->zS
163f0 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 ql);. sqlite3Db
16400 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 Free(db, p->pFre
16410 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 e);.#ifdef SQLIT
16420 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 E_ENABLE_STMT_SC
16430 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69 ANSTATUS. for(i
16440 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 =0; i<p->nScan;
16450 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 i++){. sqlite
16460 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 3DbFree(db, p->a
16470 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a Scan[i].zName);.
16480 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 }. sqlite3DbF
16490 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e ree(db, p->aScan
164a0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a );.#endif.}../*.
164b0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 ** Delete an ent
164c0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 ire VDBE..*/.voi
164d0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c d sqlite3VdbeDel
164e0 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 ete(Vdbe *p){.
164f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 sqlite3 *db;..
16500 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 if( NEVER(p==0)
16510 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d ) return;. db =
16520 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 p->db;. assert
16530 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f ( sqlite3_mutex_
16540 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 held(db->mutex)
16550 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 );. sqlite3Vdbe
16560 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 ClearObject(db,
16570 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 p);. if( p->pPr
16580 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 ev ){. p->pPr
16590 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 ev->pNext = p->p
165a0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 Next;. }else{.
165b0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 assert( db->p
165c0 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 Vdbe==p );. d
165d0 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e b->pVdbe = p->pN
165e0 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 ext;. }. if( p
165f0 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 ->pNext ){. p
16600 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d ->pNext->pPrev =
16610 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 p->pPrev;. }.
16620 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 p->magic = VDBE
16630 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 _MAGIC_DEAD;. p
16640 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 ->db = 0;. sqli
16650 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 te3DbFree(db, p)
16660 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 ;.}../*.** The c
16670 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 ursor "p" has a
16680 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 pending seek ope
16690 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 ration that has
166a0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 not yet been.**
166b0 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 carried out. Se
166c0 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f ek the cursor no
166d0 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 w. If an error
166e0 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a occurs, return.*
166f0 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 * the appropriat
16700 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f e error code..*/
16710 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 .static int SQLI
16720 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 TE_NOINLINE hand
16730 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f leDeferredMoveto
16740 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b (VdbeCursor *p){
16750 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a . int res, rc;.
16760 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 #ifdef SQLITE_TE
16770 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 ST. extern int
16780 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 sqlite3_search_c
16790 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 ount;.#endif. a
167a0 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 ssert( p->deferr
167b0 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 edMoveto );. as
167c0 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 sert( p->isTable
167d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d );. assert( p-
167e0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 >eCurType==CURTY
167f0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 PE_BTREE );. rc
16800 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d = sqlite3BtreeM
16810 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d ovetoUnpacked(p-
16820 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 >uc.pCursor, 0,
16830 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c p->movetoTarget,
16840 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 0, &res);. if(
16850 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b rc ) return rc;
16860 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 . if( res!=0 )
16870 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f return SQLITE_CO
16880 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 RRUPT_BKPT;.#ifd
16890 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 ef SQLITE_TEST.
168a0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f sqlite3_search_
168b0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a count++;.#endif.
168c0 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 p->deferredMov
168d0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 eto = 0;. p->ca
168e0 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 cheStatus = CACH
168f0 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 E_STALE;. retur
16900 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a n SQLITE_OK;.}..
16910 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 /*.** Something
16920 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 has moved cursor
16930 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 "p" out of plac
16940 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f e. Maybe the ro
16950 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e w it was.** poin
16960 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 ted to was delet
16970 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 ed out from unde
16980 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 r it. Or maybe
16990 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a the btree was.**
169a0 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 rebalanced. Wh
169b0 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65 atever the cause
169c0 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 , try to restore
169d0 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 "p" to the plac
169e0 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f e it.** is suppo
169f0 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 sed to be pointi
16a00 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 ng. If the row
16a10 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 was deleted out
16a20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a from under the.*
16a30 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 * cursor, set th
16a40 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e e cursor to poin
16a50 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e t to a NULL row.
16a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 .*/.static int S
16a70 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 QLITE_NOINLINE h
16a80 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 andleMovedCursor
16a90 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b (VdbeCursor *p){
16aa0 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 . int isDiffere
16ab0 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 ntRow, rc;. ass
16ac0 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 ert( p->eCurType
16ad0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 ==CURTYPE_BTREE
16ae0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e );. assert( p->
16af0 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b uc.pCursor!=0 );
16b00 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 . assert( sqlit
16b10 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 e3BtreeCursorHas
16b20 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 Moved(p->uc.pCur
16b30 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 sor) );. rc = s
16b40 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f qlite3BtreeCurso
16b50 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 rRestore(p->uc.p
16b60 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 Cursor, &isDiffe
16b70 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 rentRow);. p->c
16b80 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 acheStatus = CAC
16b90 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 HE_STALE;. if(
16ba0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 isDifferentRow )
16bb0 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b p->nullRow = 1;
16bc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a . return rc;.}.
16bd0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 ./*.** Check to
16be0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 ensure that the
16bf0 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e cursor is valid.
16c00 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 Restore the cu
16c10 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 rsor.** if need
16c20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 be. Return any
16c30 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 I/O error from t
16c40 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 he restore opera
16c50 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c tion..*/.int sql
16c60 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 ite3VdbeCursorRe
16c70 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 store(VdbeCursor
16c80 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 *p){. assert(
16c90 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 p->eCurType==CUR
16ca0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 TYPE_BTREE );.
16cb0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 if( sqlite3Btree
16cc0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 CursorHasMoved(p
16cd0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b ->uc.pCursor) ){
16ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 . return hand
16cf0 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 leMovedCursor(p)
16d00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 ;. }. return S
16d10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a QLITE_OK;.}../*.
16d20 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 ** Make sure the
16d30 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 cursor p is rea
16d40 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 dy to read or wr
16d50 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 ite the row to w
16d60 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c hich it.** was l
16d70 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 ast positioned.
16d80 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 Return an error
16d90 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 code if an OOM
16da0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 fault or I/O err
16db0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 or.** prevents u
16dc0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 s from positioni
16dd0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f ng the cursor to
16de0 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 its correct pos
16df0 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ition..**.** If
16e00 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 a MoveTo operati
16e10 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e on is pending on
16e20 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f the given curso
16e30 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a r, then do that.
16e40 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 ** MoveTo now.
16e50 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 If no move is pe
16e60 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 nding, check to
16e70 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 see if the row h
16e80 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 as been.** delet
16e90 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 ed out from unde
16ea0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 r the cursor and
16eb0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b if it has, mark
16ec0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 the row as.** a
16ed0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a NULL row..**.**
16ee0 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 If the cursor i
16ef0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 s already pointi
16f00 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 ng to the correc
16f10 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 t row and that r
16f20 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 ow has.** not be
16f30 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 en deleted out f
16f40 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 rom under the cu
16f50 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 rsor, then this
16f60 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d routine is a no-
16f70 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 op..*/.int sqlit
16f80 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 e3VdbeCursorMove
16f90 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 to(VdbeCursor *p
16fa0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 ){. if( p->eCur
16fb0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 Type==CURTYPE_BT
16fc0 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 REE ){. if( p
16fd0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f ->deferredMoveto
16fe0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e ){. return
16ff0 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d handleDeferredM
17000 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a oveto(p);. }.
17010 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 if( sqlite3B
17020 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 treeCursorHasMov
17030 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 ed(p->uc.pCursor
17040 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 ) ){. retur
17050 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 n handleMovedCur
17060 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 sor(p);. }.
17070 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 }. return SQLIT
17080 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 E_OK;.}../*.** T
17090 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e he following fun
170a0 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 ctions:.**.** sq
170b0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
170c0 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 ype().** sqlite3
170d0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 VdbeSerialTypeLe
170e0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 n().** sqlite3Vd
170f0 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a beSerialLen().**
17100 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
17110 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 alPut().** sqlit
17120 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 e3VdbeSerialGet(
17130 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c ).**.** encapsul
17140 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 ate the code tha
17150 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c t serializes val
17160 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 ues for storage
17170 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 in SQLite.** dat
17180 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f a and index reco
17190 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c rds. Each serial
171a0 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 ized value consi
171b0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 sts of a.** 'ser
171c0 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 ial-type' and a
171d0 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 blob of data. Th
171e0 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 e serial type is
171f0 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 an 8-byte unsig
17200 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 ned.** integer,
17210 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 stored as a vari
17220 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 nt..**.** In an
17230 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 SQLite index rec
17240 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 ord, the serial
17250 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 type is stored d
17260 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a irectly before.*
17270 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 * the blob of da
17280 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 ta that it corre
17290 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 sponds to. In a
172a0 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c table record, al
172b0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 l serial.** type
172c0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 s are stored at
172d0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 the start of the
172e0 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 record, and the
172f0 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 blobs of data a
17300 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 t.** the end. He
17310 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 nce these functi
17320 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 ons allow the ca
17330 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 ller to handle t
17340 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 he.** serial-typ
17350 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 e and data blob
17360 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a separately..**.*
17370 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 * The following
17380 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 table describes
17390 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 the various stor
173a0 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 age classes for
173b0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 data:.**.** se
173c0 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 rial type
173d0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 bytes of data
173e0 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d type.** --
173f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 ------------
17400 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
17410 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ------------
17420 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 ---.** 0
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17440 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 0 N
17450 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 ULL.** 1
17460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17470 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73 1 s
17480 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a igned integer.**
17490 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 2
174a0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 2
174b0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 signed
174c0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 integer.**
174d0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3
174e0 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 3
174f0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 signed intege
17500 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 r.** 4
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17520 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 4 sig
17530 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 ned integer.**
17540 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20 5
17550 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20 6
17560 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e signed in
17570 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 teger.** 6
17580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17590 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 8
175a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a signed integer.
175b0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20 ** 7
175c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 8
175d0 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20 IEEE
175e0 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 float.** 8
175f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17600 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 0
17610 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e Integer constan
17620 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 t 0.** 9
17630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17640 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 0 I
17650 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 nteger constant
17660 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 1.** 10,11
17670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 res
17690 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 erved for expans
176a0 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 ion.** N>=12
176b0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 and even (
176c0 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 N-12)/2 B
176d0 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 LOB.** N>=13
176e0 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 and odd (
176f0 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 N-13)/2 t
17700 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 ext.**.** The 8
17710 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65 and 9 types were
17720 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c added in 3.3.0,
17730 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 file format 4.
17740 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a Prior versions.
17750 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c ** of SQLite wil
17760 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 l not understand
17770 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 those serial ty
17780 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 pes..*/../*.** R
17790 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c eturn the serial
177a0 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 -type for the va
177b0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d lue stored in pM
177c0 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 em..*/.u32 sqlit
177d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 e3VdbeSerialType
177e0 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 (Mem *pMem, int
177f0 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 file_format, u32
17800 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 *pLen){. int f
17810 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 lags = pMem->fla
17820 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 gs;. u32 n;..
17830 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 assert( pLen!=0
17840 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d );. if( flags&M
17850 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a EM_Null ){. *
17860 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 pLen = 0;. re
17870 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 turn 0;. }. if
17880 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 ( flags&MEM_Int
17890 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 ){. /* Figure
178a0 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 out whether to
178b0 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f use 1, 2, 4, 6 o
178c0 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 r 8 bytes. */.#
178d0 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 define MAX_6BY
178e0 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 TE ((((i64)0x000
178f0 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 08000)<<32)-1).
17900 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d i64 i = pMem-
17910 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b >u.i;. u64 u;
17920 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a . if( i<0 ){.
17930 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 u = ~i;.
17940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 }else{. u
17950 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 = i;. }.
17960 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 if( u<=127 ){.
17970 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 if( (i&1)==i
17980 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e && file_format>
17990 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 =4 ){. *p
179a0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 Len = 0;.
179b0 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 return 8+(u32)u
179c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 ;. }else{.
179d0 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 *pLen = 1
179e0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e ;. return
179f0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 1;. }.
17a00 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 }. if( u<=327
17a10 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 67 ){ *pLen = 2;
17a20 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 return 2; }.
17a30 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 if( u<=8388607
17a40 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 ){ *pLen = 3; re
17a50 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 turn 3; }. if
17a60 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 ( u<=2147483647
17a70 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 ){ *pLen = 4; re
17a80 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 turn 4; }. if
17a90 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 ( u<=MAX_6BYTE )
17aa0 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 { *pLen = 6; ret
17ab0 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c urn 5; }. *pL
17ac0 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 en = 8;. retu
17ad0 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 rn 6;. }. if(
17ae0 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 flags&MEM_Real )
17af0 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b {. *pLen = 8;
17b00 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 . return 7;.
17b10 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 }. assert( pMe
17b20 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 m->db->mallocFai
17b30 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 led || flags&(ME
17b40 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 M_Str|MEM_Blob)
17b50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 );. assert( pMe
17b60 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d m->n>=0 );. n =
17b70 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 (u32)pMem->n;.
17b80 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d if( flags & MEM
17b90 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b _Zero ){. n +
17ba0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b = pMem->u.nZero;
17bb0 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e . }. *pLen = n
17bc0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 ;. return ((n*2
17bd0 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 ) + 12 + ((flags
17be0 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a &MEM_Str)!=0));.
17bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a }../*.** The siz
17c00 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 es for serial ty
17c10 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 pes less than 12
17c20 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 8.*/.static cons
17c30 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c t u8 sqlite3Smal
17c40 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b lTypeSizes[] = {
17c50 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 . /* 0
17c60 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20 1 2 3 4
17c70 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20 5 6 7 8
17c80 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 9 */ ./* 0
17c90 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 */ 0, 1, 2,
17ca0 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 3, 4, 6, 8,
17cb0 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 8, 0, 0,./*
17cc0 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 10 */ 0, 0,
17cd0 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 0, 0, 1, 1,
17ce0 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2, 2, 3, 3,./
17cf0 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 * 20 */ 4, 4
17d00 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 , 5, 5, 6, 6
17d10 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 , 7, 7, 8, 8
17d20 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c ,./* 30 */ 9,
17d30 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 9, 10, 10, 11,
17d40 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 11, 12, 12, 13,
17d50 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 13,./* 40 */
17d60 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 14, 14, 15, 15,
17d70 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 16, 16, 17, 17,
17d80 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 18, 18,./* 50 *
17d90 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 / 19, 19, 20, 2
17da0 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 0, 21, 21, 22, 2
17db0 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 2, 23, 23,./* 6
17dc0 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 0 */ 24, 24, 25
17dd0 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 , 25, 26, 26, 27
17de0 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a , 27, 28, 28,./*
17df0 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 70 */ 29, 29,
17e00 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 30, 30, 31, 31,
17e10 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 32, 32, 33, 33,
17e20 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 ./* 80 */ 34,
17e30 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 34, 35, 35, 36,
17e40 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 36, 37, 37, 38,
17e50 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 38,./* 90 */ 3
17e60 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 9, 39, 40, 40, 4
17e70 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 1, 41, 42, 42, 4
17e80 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 3, 43,./* 100 */
17e90 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 44, 44, 45, 45
17ea0 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 , 46, 46, 47, 47
17eb0 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 , 48, 48,./* 110
17ec0 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c */ 49, 49, 50,
17ed0 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 50, 51, 51, 52,
17ee0 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 52, 53, 53,./*
17ef0 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 120 */ 54, 54,
17f00 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 55, 55, 56, 56,
17f10 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 57, 57.};../*.**
17f20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 Return the leng
17f30 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 th of the data c
17f40 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 orresponding to
17f50 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 the supplied ser
17f60 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 ial-type..*/.u32
17f70 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 sqlite3VdbeSeri
17f80 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 alTypeLen(u32 se
17f90 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 rial_type){. if
17fa0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 ( serial_type>=1
17fb0 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 28 ){. return
17fc0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 (serial_type-12
17fd0 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 )/2;. }else{.
17fe0 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c assert( serial
17ff0 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 _type<12 .
18000 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 || sqlite3
18010 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 SmallTypeSizes[s
18020 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 erial_type]==(se
18030 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f rial_type - 12)/
18040 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2 );. return
18050 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 sqlite3SmallType
18060 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 Sizes[serial_typ
18070 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c e];. }.}.u8 sql
18080 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 ite3VdbeOneByteS
18090 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 erialTypeLen(u8
180a0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 serial_type){.
180b0 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 assert( serial_t
180c0 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 ype<128 );. ret
180d0 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c urn sqlite3Small
180e0 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c TypeSizes[serial
180f0 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a _type]; .}../*.
18100 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 ** If we are on
18110 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20 an architecture
18120 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 with mixed-endia
18130 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 n floating .** p
18140 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 oints (ex: ARM7)
18150 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c then swap the l
18160 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74 ower 4 bytes wit
18170 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 h the .** upper
18180 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 4 bytes. Return
18190 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a the result..**.
181a0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 ** For most arch
181b0 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 itectures, this
181c0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a is a no-op..**.*
181d0 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 * (later): It i
181e0 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 s reported to me
181f0 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d that the mixed-
18200 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a endian problem.*
18210 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 * on ARM7 is an
18220 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 issue with GCC,
18230 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d not with the ARM
18240 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 7 chip. It seem
18250 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 s.** that early
18260 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 versions of GCC
18270 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 stored the two w
18280 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 ords of a 64-bit
18290 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 .** float in the
182a0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 wrong order. A
182b0 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 nd that error ha
182c0 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 s been propagate
182d0 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e d.** ever since.
182e0 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e The blame is n
182f0 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 ot necessarily w
18300 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e ith GCC, though.
18310 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 .** GCC might ha
18320 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 ve just copying
18330 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d the problem from
18340 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 a prior compile
18350 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 r..** I am also
18360 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 told that newer
18370 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 versions of GCC
18380 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 that follow a di
18390 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 fferent.** ABI g
183a0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 et the byte orde
183b0 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 r right..**.** D
183c0 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 evelopers using
183d0 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d SQLite on an ARM
183e0 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 7 should compile
183f0 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a and run their.*
18400 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 * application us
18410 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 ing -DSQLITE_DEB
18420 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e UG=1 at least on
18430 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a ce. With DEBUG.
18440 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 ** enabled, some
18450 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 asserts below w
18460 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 ill ensure that
18470 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f the byte order o
18480 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f f.** floating po
18490 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f int values is co
184a0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 rrect..**.** (20
184b0 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 07-08-30) Frank
184c0 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 van Vugt has st
184d0 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c udied this probl
184e0 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e em closely.** an
184f0 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 d has send his f
18500 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 indings to the S
18510 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 QLite developers
18520 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 . Frank.** writ
18530 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e es that some Lin
18540 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 ux kernels offer
18550 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 floating point
18560 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c hardware.** emul
18570 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 ation that uses
18580 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 only 32-bit mant
18590 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 issas instead of
185a0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 a full .** 48-b
185b0 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20 its as required
185c0 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e by the IEEE stan
185d0 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 dard. (This is
185e0 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 the.** CONFIG_FP
185f0 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e E_FASTFPE option
18600 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 .) On such syst
18610 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f ems, floating po
18620 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 int.** byte swap
18630 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 ping becomes ver
18640 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 y complicated.
18650 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d To avoid problem
18660 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 s,.** the necess
18670 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e ary byte swappin
18680 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 g is carried out
18690 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 using a 64-bit
186a0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 integer.** rathe
186b0 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 r than a 64-bit
186c0 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 float. Frank as
186d0 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68 sures us that th
186e0 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 e code here.** w
186f0 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 orks for him. W
18700 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 e, the developer
18710 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 s, have no way t
18720 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a o independently.
18730 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 ** verify this,
18740 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 but Frank seems
18750 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 to know what he
18760 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 is talking about
18770 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 .** so we trust
18780 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 him..*/.#ifdef S
18790 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 QLITE_MIXED_ENDI
187a0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 AN_64BIT_FLOAT.s
187b0 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 tatic u64 floatS
187c0 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 wap(u64 in){. u
187d0 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 nion {. u64 r
187e0 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a ;. u32 i[2];.
187f0 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a } u;. u32 t;.
18800 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 . u.r = in;. t
18810 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 = u.i[0];. u.i
18820 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 [0] = u.i[1];.
18830 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 u.i[1] = t;. re
18840 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 turn u.r;.}.# de
18850 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e fine swapMixedEn
18860 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 dianFloat(X) X
18870 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 = floatSwap(X).#
18880 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 else.# define sw
18890 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f apMixedEndianFlo
188a0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a at(X).#endif../*
188b0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 .** Write the se
188c0 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c rialized data bl
188d0 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 ob for the value
188e0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 stored in pMem
188f0 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 into .** buf. It
18900 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 is assumed that
18910 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 the caller has
18920 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 allocated suffic
18930 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 ient space..** R
18940 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 eturn the number
18950 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65 of bytes writte
18960 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 n..**.** nBuf is
18970 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 the amount of s
18980 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 pace left in buf
18990 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 []. The caller
189a0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a is responsible.*
189b0 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 * for allocating
189c0 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f enough space to
189d0 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 buf[] to hold t
189e0 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c he entire field,
189f0 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 exclusive.** of
18a00 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 the pMem->u.nZe
18a10 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d ro bytes for a M
18a20 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a EM_Zero value..*
18a30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
18a40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 number of bytes
18a50 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e actually written
18a60 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 into buf[]. Th
18a70 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 e number.** of b
18a80 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f ytes in the zero
18a90 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 -filled tail is
18aa0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 included in the
18ab0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c return value onl
18ac0 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 y.** if those by
18ad0 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 tes were zeroed
18ae0 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 in buf[]..*/ .u3
18af0 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 2 sqlite3VdbeSer
18b00 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 ialPut(u8 *buf,
18b10 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 Mem *pMem, u32 s
18b20 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 erial_type){. u
18b30 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 32 len;.. /* In
18b40 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a teger and Real *
18b50 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 /. if( serial_t
18b60 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c ype<=7 && serial
18b70 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 _type>0 ){. u
18b80 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 64 v;. u32 i;
18b90 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f . if( serial_
18ba0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 type==7 ){.
18bb0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 assert( sizeof(
18bc0 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d v)==sizeof(pMem-
18bd0 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d >u.r) );. m
18be0 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d emcpy(&v, &pMem-
18bf0 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 >u.r, sizeof(v))
18c00 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 ;. swapMixe
18c10 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b dEndianFloat(v);
18c20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 . }else{.
18c30 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b v = pMem->u.i;
18c40 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d . }. len =
18c50 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c i = sqlite3Smal
18c60 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 lTypeSizes[seria
18c70 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 l_type];. ass
18c80 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 ert( i>0 );.
18c90 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d do{. buf[--
18ca0 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 i] = (u8)(v&0xFF
18cb0 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 );. v >>= 8
18cc0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 ;. }while( i
18cd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 );. return le
18ce0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 n;. }.. /* Str
18cf0 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 ing or blob */.
18d00 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 if( serial_type
18d10 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 >=12 ){. asse
18d20 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 rt( pMem->n + ((
18d30 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 pMem->flags & ME
18d40 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e M_Zero)?pMem->u.
18d50 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 nZero:0).
18d60 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 == (int)sq
18d70 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 lite3VdbeSerialT
18d80 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 ypeLen(serial_ty
18d90 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d pe) );. len =
18da0 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 pMem->n;. if
18db0 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 ( len>0 ) memcpy
18dc0 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c (buf, pMem->z, l
18dd0 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 en);. return
18de0 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e len;. }.. /* N
18df0 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 ULL or constants
18e00 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 0 or 1 */. ret
18e10 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 urn 0;.}../* Inp
18e20 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75 ut "x" is a sequ
18e30 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 ence of unsigned
18e40 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 characters that
18e50 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 represent a.**
18e60 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 big-endian integ
18e70 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 er. Return the
18e80 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 equivalent nativ
18e90 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 e integer.*/.#de
18ea0 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e fine ONE_BYTE_IN
18eb0 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29 T(x) ((i8)(x)
18ec0 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f [0]).#define TWO
18ed0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 _BYTE_INT(x)
18ee0 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d (256*(i8)((x)[0]
18ef0 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e )|(x)[1]).#defin
18f00 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 e THREE_BYTE_INT
18f10 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 (x) (65536*(i8)
18f20 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d ((x)[0])|((x)[1]
18f30 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 <<8)|(x)[2]).#de
18f40 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 fine FOUR_BYTE_U
18f50 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28 INT(x) (((u32)(
18f60 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b x)[0]<<24)|((x)[
18f70 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 1]<<16)|((x)[2]<
18f80 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 <8)|(x)[3]).#def
18f90 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e ine FOUR_BYTE_IN
18fa0 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 T(x) (16777216*(
18fb0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 i8)((x)[0])|((x)
18fc0 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d [1]<<16)|((x)[2]
18fd0 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a <<8)|(x)[3])../*
18fe0 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 .** Deserialize
18ff0 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f the data blob po
19000 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 inted to by buf
19010 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 as serial type s
19020 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e erial_type.** an
19030 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 d store the resu
19040 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 lt in pMem. Ret
19050 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f urn the number o
19060 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a f bytes read..**
19070 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
19080 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 n is implemented
19090 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 as two separate
190a0 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 routines for pe
190b0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 rformance..** Th
190c0 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74 e few cases that
190d0 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 require local v
190e0 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f ariables are bro
190f0 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 ken out into a s
19100 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 eparate.** routi
19110 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f ne so that in mo
19120 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 st cases the ove
19130 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 rhead of moving
19140 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 the stack pointe
19150 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e r.** is avoided.
19160 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 .*/ .static u32
19170 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 SQLITE_NOINLINE
19180 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e serialGet(. con
19190 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 st unsigned char
191a0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 *buf, /* Bu
191b0 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c ffer to deserial
191c0 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 ize from */. u3
191d0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 2 serial_type,
191e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 /* S
191f0 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 erial type to de
19200 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d serialize */. M
19210 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 em *pMem
19220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
19230 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 Memory cell to w
19240 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 rite value into
19250 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 */.){. u64 x =
19260 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 FOUR_BYTE_UINT(b
19270 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 uf);. u32 y = F
19280 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 OUR_BYTE_UINT(bu
19290 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c f+4);. x = (x<<
192a0 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 32) + y;. if( s
192b0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b erial_type==6 ){
192c0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 . /* EVIDENCE
192d0 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 -OF: R-29851-522
192e0 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 72 Value is a bi
192f0 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a g-endian 64-bit.
19300 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 ** twos-comp
19310 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 lement integer.
19320 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 */. pMem->u.i
19330 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 = *(i64*)&x;.
19340 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 pMem->flags =
19350 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 MEM_Int;. tes
19360 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 tcase( pMem->u.i
19370 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 <0 );. }else{.
19380 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f /* EVIDENCE-O
19390 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 F: R-57343-49114
193a0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d Value is a big-
193b0 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d endian IEEE 754-
193c0 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2008 64-bit.
193d0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e ** floating poin
193e0 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 t number. */.#if
193f0 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 !defined(NDEBUG
19400 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 ) && !defined(SQ
19410 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 LITE_OMIT_FLOATI
19420 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a NG_POINT). /*
19430 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 Verify that int
19440 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 egers and floati
19450 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 ng point values
19460 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 use the same.
19470 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 ** byte order.
19480 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c Or, that if SQL
19490 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e ITE_MIXED_ENDIAN
194a0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a _64BIT_FLOAT is.
194b0 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 ** defined t
194c0 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 hat 64-bit float
194d0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 ing point values
194e0 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 really are mixe
194f0 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e d. ** endian.
19500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 . */. stat
19510 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 ic const u64 t1
19520 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30 = ((u64)0x3ff000
19530 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 00)<<32;. sta
19540 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 tic const double
19550 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 r1 = 1.0;. u
19560 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 64 t2 = t1;.
19570 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 swapMixedEndianF
19580 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 loat(t2);. as
19590 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 sert( sizeof(r1)
195a0 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 ==sizeof(t2) &&
195b0 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c memcmp(&r1, &t2,
195c0 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 sizeof(r1))==0
195d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 );.#endif. as
195e0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d sert( sizeof(x)=
195f0 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 =8 && sizeof(pMe
19600 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 m->u.r)==8 );.
19610 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 swapMixedEndia
19620 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d nFloat(x);. m
19630 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 emcpy(&pMem->u.r
19640 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 , &x, sizeof(x))
19650 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 ;. pMem->flag
19660 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e s = sqlite3IsNaN
19670 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 (pMem->u.r) ? ME
19680 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 M_Null : MEM_Rea
19690 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 l;. }. return
196a0 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 8;.}.u32 sqlite3
196b0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 VdbeSerialGet(.
196c0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
196d0 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f char *buf, /
196e0 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 * Buffer to dese
196f0 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a rialize from */.
19700 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 u32 serial_typ
19710 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e,
19720 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 /* Serial type t
19730 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f o deserialize */
19740 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 . Mem *pMem
19750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19760 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 /* Memory cell
19770 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 to write value i
19780 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 nto */.){. swit
19790 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 ch( serial_type
197a0 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 ){. case 10:
197b0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f /* Reserved fo
197c0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a r future use */.
197d0 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f case 11: /
197e0 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 * Reserved for f
197f0 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 uture use */.
19800 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e case 0: { /* N
19810 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 ull */. /*
19820 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 EVIDENCE-OF: R-2
19830 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 4078-09375 Value
19840 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 is a NULL. */.
19850 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 pMem->flags
19860 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 = MEM_Null;.
19870 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
19880 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 case 1: {.
19890 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d /* EVIDENCE-
198a0 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 OF: R-44885-2519
198b0 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 6 Value is an 8-
198c0 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d bit twos-complem
198d0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 ent. ** int
198e0 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 eger. */. p
198f0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 Mem->u.i = ONE_B
19900 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 YTE_INT(buf);.
19910 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
19920 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 = MEM_Int;.
19930 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d testcase( pMem-
19940 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 >u.i<0 );.
19950 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a return 1;. }.
19960 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a case 2: { /*
19970 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 2-byte signed i
19980 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 nteger */.
19990 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 /* EVIDENCE-OF:
199a0 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 R-49794-35026 Va
199b0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 lue is a big-end
199c0 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 ian 16-bit.
199d0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d ** twos-complem
199e0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a ent integer. */.
199f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 pMem->u.i
19a00 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 = TWO_BYTE_INT(b
19a10 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d uf);. pMem-
19a20 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 >flags = MEM_Int
19a30 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
19a40 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b ( pMem->u.i<0 );
19a50 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b . return 2;
19a60 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 . }. case
19a70 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 3: { /* 3-byte s
19a80 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f igned integer */
19a90 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e . /* EVIDEN
19aa0 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 CE-OF: R-37839-5
19ab0 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 4301 Value is a
19ac0 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 big-endian 24-bi
19ad0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d t. ** twos-
19ae0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 complement integ
19af0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 er. */. pMe
19b00 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 m->u.i = THREE_B
19b10 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 YTE_INT(buf);.
19b20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 pMem->flags
19b30 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 = MEM_Int;.
19b40 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d testcase( pMem-
19b50 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 >u.i<0 );.
19b60 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a return 3;. }.
19b70 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a case 4: { /*
19b80 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 4-byte signed i
19b90 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 nteger */.
19ba0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 /* EVIDENCE-OF:
19bb0 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 R-01849-26079 Va
19bc0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 lue is a big-end
19bd0 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 ian 32-bit.
19be0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d ** twos-complem
19bf0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a ent integer. */.
19c00 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 pMem->u.i
19c10 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 = FOUR_BYTE_INT(
19c20 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 buf);.#ifdef __H
19c30 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 P_cc . /* W
19c40 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 ork around a sig
19c50 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 n-extension bug
19c60 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c in the HP compil
19c70 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a er for HP/UX */.
19c80 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d if( buf[0]
19c90 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e &0x80 ) pMem->u.
19ca0 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 i |= 0xffffffff8
19cb0 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 0000000LL;.#endi
19cc0 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c f. pMem->fl
19cd0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 ags = MEM_Int;.
19ce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 testcase( p
19cf0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 Mem->u.i<0 );.
19d00 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 return 4;.
19d10 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 }. case 5:
19d20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e { /* 6-byte sign
19d30 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 ed integer */.
19d40 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d /* EVIDENCE-
19d50 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 OF: R-50385-0967
19d60 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 4 Value is a big
19d70 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 -endian 48-bit.
19d80 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d ** twos-com
19d90 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e plement integer.
19da0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e */. pMem->
19db0 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f u.i = FOUR_BYTE_
19dc0 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 UINT(buf+2) + ((
19dd0 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f (i64)1)<<32)*TWO
19de0 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a _BYTE_INT(buf);.
19df0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 pMem->flag
19e00 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 s = MEM_Int;.
19e10 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 testcase( pMe
19e20 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 m->u.i<0 );.
19e30 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 return 6;.
19e40 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 }. case 6:
19e50 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 /* 8-byte signed
19e60 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 integer */.
19e70 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 case 7: { /* IEE
19e80 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 E floating point
19e90 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 */. /* The
19ea0 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 se use local var
19eb0 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 iables, so do th
19ec0 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 em in a separate
19ed0 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a routine. *
19ee0 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e * to avoid havin
19ef0 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 g to move the fr
19f00 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 ame pointer in t
19f10 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a he common case *
19f20 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 /. return s
19f30 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 erialGet(buf,ser
19f40 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a ial_type,pMem);.
19f50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 }. case 8
19f60 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 : /* Integer
19f70 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 0 */. case 9:
19f80 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 { /* Integer 1
19f90 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 */. /* EVI
19fa0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 DENCE-OF: R-1297
19fb0 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 6-22893 Value is
19fc0 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 the integer 0.
19fd0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 */. /* EVID
19fe0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 ENCE-OF: R-18143
19ff0 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 -12121 Value is
1a000 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a the integer 1. *
1a010 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e /. pMem->u.
1a020 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d i = serial_type-
1a030 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 8;. pMem->f
1a040 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a lags = MEM_Int;.
1a050 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a return 0;.
1a060 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c }. defaul
1a070 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 t: {. /* EV
1a080 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 IDENCE-OF: R-146
1a090 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 06-31564 Value i
1a0a0 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 s a BLOB that is
1a0b0 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 (N-12)/2 bytes
1a0c0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 in. ** leng
1a0d0 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 th.. ** EVI
1a0e0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 DENCE-OF: R-2840
1a0f0 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 1-00140 Value is
1a100 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 a string in the
1a110 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 text encoding a
1a120 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 nd. ** (N-1
1a130 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 3)/2 bytes in le
1a140 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 ngth. */. s
1a150 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 tatic const u16
1a160 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f aFlag[] = { MEM_
1a170 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 Blob|MEM_Ephem,
1a180 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 MEM_Str|MEM_Ephe
1a190 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d m };. pMem-
1a1a0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 >z = (char *)buf
1a1b0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 ;. pMem->n
1a1c0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 = (serial_type-1
1a1d0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2)/2;. pMem
1a1e0 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b ->flags = aFlag[
1a1f0 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a serial_type&1];.
1a200 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 return pMe
1a210 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a m->n;. }. }.
1a220 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a return 0;.}./*
1a230 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 .** This routine
1a240 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f is used to allo
1a250 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 cate sufficient
1a260 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 space for an Unp
1a270 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 ackedRecord.** s
1a280 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 tructure large e
1a290 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 nough to be used
1a2a0 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 with sqlite3Vdb
1a2b0 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 eRecordUnpack()
1a2c0 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 if.** the first
1a2d0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f argument is a po
1a2e0 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f inter to KeyInfo
1a2f0 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 structure pKeyI
1a300 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 nfo..**.** The s
1a310 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61 pace is either a
1a320 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 llocated using s
1a330 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 qlite3DbMallocRa
1a340 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 w() or from with
1a350 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 in.** the unalig
1a360 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65 ned buffer passe
1a370 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 d via the second
1a380 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d and third argum
1a390 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 ents (presumably
1a3a0 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 .** stack space)
1a3b0 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c . If the former,
1a3c0 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 then *ppFree is
1a3d0 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 set to a pointe
1a3e0 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a r that should.**
1a3f0 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 be eventually f
1a400 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c reed by the call
1a410 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 er using sqlite3
1a420 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 DbFree(). Or, if
1a430 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 the .** allocat
1a440 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 ion comes from t
1a450 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 he pSpace/szSpac
1a460 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 e buffer, *ppFre
1a470 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c e is set to NULL
1a480 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 .** before retur
1a490 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 ning..**.** If a
1a4a0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 n OOM error occu
1a4b0 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 rs, NULL is retu
1a4c0 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 rned..*/.Unpacke
1a4d0 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 dRecord *sqlite3
1a4e0 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 VdbeAllocUnpacke
1a4f0 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e dRecord(. KeyIn
1a500 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 fo *pKeyInfo,
1a510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 /* De
1a520 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 scription of the
1a530 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 record */. cha
1a540 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 r *pSpace,
1a550 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1a560 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 Unaligned space
1a570 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 available */. i
1a580 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 nt szSpace,
1a590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1a5a0 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 * Size of pSpace
1a5b0 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 [] in bytes */.
1a5c0 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 char **ppFree
1a5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a5e0 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 /* OUT: Caller
1a5f0 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 should free this
1a600 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 pointer */.){.
1a610 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 UnpackedRecord
1a620 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 *p;
1a630 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 /* Unpacked rec
1a640 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f ord to return */
1a650 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 . int nOff;
1a660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a670 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 /* Increment
1a680 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 pSpace by nOff t
1a690 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 o align it */.
1a6a0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 int nByte;
1a6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a6c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 /* Number of byt
1a6d0 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 es required for
1a6e0 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 *p */.. /* We w
1a6f0 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 ant to shift the
1a700 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 pointer pSpace
1a710 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20 up such that it
1a720 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 is 8-byte aligne
1a730 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 d.. ** Thus, we
1a740 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 need to calcula
1a750 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 te a value, nOff
1a760 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 , between 0 and
1a770 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 7, to shift . *
1a780 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 * it by. If pSp
1a790 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 ace is already 8
1a7a0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e -byte aligned, n
1a7b0 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 Off should be ze
1a7c0 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 ro.. */. nOff
1a7d0 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 = (8 - (SQLITE_P
1a7e0 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 TR_TO_INT(pSpace
1a7f0 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e ) & 7)) & 7;. n
1a800 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 Byte = ROUND8(si
1a810 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 zeof(UnpackedRec
1a820 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d ord)) + sizeof(M
1a830 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e em)*(pKeyInfo->n
1a840 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 Field+1);. if(
1a850 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f nByte>szSpace+nO
1a860 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 ff ){. p = (U
1a870 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 npackedRecord *)
1a880 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 sqlite3DbMallocR
1a890 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c aw(pKeyInfo->db,
1a8a0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 nByte);. *pp
1a8b0 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 Free = (char *)p
1a8c0 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72 ;. if( !p ) r
1a8d0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 eturn 0;. }else
1a8e0 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 {. p = (Unpac
1a8f0 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 kedRecord*)&pSpa
1a900 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 ce[nOff];. *p
1a910 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a pFree = 0;. }..
1a920 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d p->aMem = (Mem
1a930 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f *)&((char*)p)[RO
1a940 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 UND8(sizeof(Unpa
1a950 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 ckedRecord))];.
1a960 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 assert( pKeyInf
1a970 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 o->aSortOrder!=0
1a980 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 );. p->pKeyInf
1a990 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 o = pKeyInfo;.
1a9a0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 p->nField = pKey
1a9b0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 Info->nField + 1
1a9c0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a ;. return p;.}.
1a9d0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 ./*.** Given the
1a9e0 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 nKey-byte encod
1a9f0 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 ing of a record
1aa00 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c in pKey[], popul
1aa10 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 ate the .** Unpa
1aa20 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 ckedRecord struc
1aa30 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 ture indicated b
1aa40 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 y the fourth arg
1aa50 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a ument with the.*
1aa60 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 * contents of th
1aa70 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 e decoded record
1aa80 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 ..*/ .void sqlit
1aa90 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 e3VdbeRecordUnpa
1aaa0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 ck(. KeyInfo *p
1aab0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 KeyInfo, /*
1aac0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 Information abou
1aad0 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 t the record for
1aae0 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 mat */. int nKe
1aaf0 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 y,
1ab00 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 /* Size of the b
1ab10 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a inary record */.
1ab20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b const void *pK
1ab30 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 ey, /* The
1ab40 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f binary record */
1ab50 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 . UnpackedRecor
1ab60 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 d *p /* Pop
1ab70 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63 ulate this struc
1ab80 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 ture before retu
1ab90 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 rning. */.){. c
1aba0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
1abb0 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 ar *aKey = (cons
1abc0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 t unsigned char
1abd0 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b *)pKey;. int d;
1abe0 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 . u32 idx;
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac00 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e /* Offset in
1ac10 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 aKey[] to read
1ac20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b from */. u16 u;
1ac30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 /* Uns
1ac50 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 igned loop count
1ac60 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 er */. u32 szHd
1ac70 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d r;. Mem *pMem =
1ac80 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e p->aMem;.. p->
1ac90 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a default_rc = 0;.
1aca0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f assert( EIGHT_
1acb0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 BYTE_ALIGNMENT(p
1acc0 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 Mem) );. idx =
1acd0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 getVarint32(aKey
1ace0 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 , szHdr);. d =
1acf0 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a szHdr;. u = 0;.
1ad00 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 while( idx<szH
1ad10 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b dr && d<=nKey ){
1ad20 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f . u32 serial_
1ad30 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b type;.. idx +
1ad40 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 = getVarint32(&a
1ad50 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c Key[idx], serial
1ad60 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d _type);. pMem
1ad70 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f ->enc = pKeyInfo
1ad80 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d ->enc;. pMem-
1ad90 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e >db = pKeyInfo->
1ada0 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d db;. /* pMem-
1adb0 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 >flags = 0; // s
1adc0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
1add0 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 Get() will set t
1ade0 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 his for us */.
1adf0 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 pMem->szMalloc
1ae00 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 = 0;. d += s
1ae10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
1ae20 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 Get(&aKey[d], se
1ae30 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 rial_type, pMem)
1ae40 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 ;. pMem++;.
1ae50 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e if( (++u)>=p->
1ae60 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a nField ) break;.
1ae70 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c }. assert( u<
1ae80 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c =pKeyInfo->nFiel
1ae90 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 d + 1 );. p->nF
1aea0 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 ield = u;.}..#if
1aeb0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a SQLITE_DEBUG./*
1aec0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f .** This functio
1aed0 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 n compares two i
1aee0 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 ndex or table re
1aef0 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 cord keys in the
1af00 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 same way.** as
1af10 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 the sqlite3VdbeR
1af20 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 ecordCompare() r
1af30 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 outine. Unlike V
1af40 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1af50 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 (),.** this func
1af60 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 tion deserialize
1af70 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 s and compares v
1af80 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a alues using the.
1af90 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 ** sqlite3VdbeSe
1afa0 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 rialGet() and sq
1afb0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 lite3MemCompare(
1afc0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 ) functions. It
1afd0 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 is used.** in as
1afe0 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 sert() statement
1aff0 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 s to ensure that
1b000 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 the optimized c
1b010 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 ode in.** sqlite
1b020 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 3VdbeRecordCompa
1b030 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 re() returns res
1b040 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 ults with these
1b050 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a two primitives..
1b060 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 **.** Return tru
1b070 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 e if the result
1b080 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 of comparison is
1b090 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 equivalent to d
1b0a0 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a esiredResult..**
1b0b0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 Return false if
1b0c0 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 there is a disa
1b0d0 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 greement..*/.sta
1b0e0 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f tic int vdbeReco
1b0f0 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a rdCompareDebug(.
1b100 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e int nKey1, con
1b110 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 st void *pKey1,
1b120 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 /* Left key */.
1b130 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 const UnpackedR
1b140 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f ecord *pPKey2, /
1b150 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 * Right key */.
1b160 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 int desiredResu
1b170 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f lt /
1b180 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 * Correct answer
1b190 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b */.){. u32 d1;
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f /* O
1b1b0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b ffset into aKey[
1b1c0 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 ] of next data e
1b1d0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 lement */. u32
1b1e0 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f idx1; /
1b1f0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b * Offset into aK
1b200 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 ey[] of next hea
1b210 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 der element */.
1b220 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 u32 szHdr1;
1b230 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 /* Number of
1b240 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 bytes in header
1b250 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b */. int i = 0;
1b260 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 . int rc = 0;.
1b270 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 const unsigned
1b280 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 char *aKey1 = (c
1b290 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 onst unsigned ch
1b2a0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 ar *)pKey1;. Ke
1b2b0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b yInfo *pKeyInfo;
1b2c0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 . Mem mem1;..
1b2d0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 pKeyInfo = pPKey
1b2e0 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 2->pKeyInfo;. i
1b2f0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d f( pKeyInfo->db=
1b300 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 =0 ) return 1;.
1b310 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 mem1.enc = pKey
1b320 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d Info->enc;. mem
1b330 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 1.db = pKeyInfo-
1b340 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 >db;. /* mem1.f
1b350 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 lags = 0; // Wi
1b360 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 ll be initialize
1b370 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 d by sqlite3Vdbe
1b380 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 SerialGet() */.
1b390 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e VVA_ONLY( mem1.
1b3a0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 szMalloc = 0; )
1b3b0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 /* Only needed b
1b3c0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 y assert() state
1b3d0 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 ments */.. /* C
1b3e0 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d ompilers may com
1b3f0 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e plain that mem1.
1b400 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c u.i is potential
1b410 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 ly uninitialized
1b420 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 .. ** We could
1b430 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 initialize it, a
1b440 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f s shown here, to
1b450 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 silence those c
1b460 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 omplaints.. **
1b470 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d But in fact, mem
1b480 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 1.u.i will never
1b490 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 actually be use
1b4a0 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c d uninitialized,
1b4b0 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a and doing . **
1b4c0 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 the unnecessary
1b4d0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 initialization
1b4e0 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 has a measurable
1b4f0 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 negative perfor
1b500 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 mance. ** impac
1b510 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f t, since this ro
1b520 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 utine is a very
1b530 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e high runner. An
1b540 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a d so, we choose.
1b550 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 ** to ignore t
1b560 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e he compiler warn
1b570 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 ings and leave t
1b580 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 his variable uni
1b590 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f nitialized.. */
1b5a0 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 . /* mem1.u.i
1b5b0 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 = 0; // not nee
1b5c0 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c ded, here to sil
1b5d0 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 ence compiler wa
1b5e0 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 rning */. . id
1b5f0 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 x1 = getVarint32
1b600 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b (aKey1, szHdr1);
1b610 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 . if( szHdr1>98
1b620 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 307 ) return SQL
1b630 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 ITE_CORRUPT;. d
1b640 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 1 = szHdr1;. as
1b650 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e sert( pKeyInfo->
1b660 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d nField+pKeyInfo-
1b670 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 >nXField>=pPKey2
1b680 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 ->nField || CORR
1b690 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 UPT_DB );. asse
1b6a0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 rt( pKeyInfo->aS
1b6b0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 ortOrder!=0 );.
1b6c0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 assert( pKeyInf
1b6d0 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 o->nField>0 );.
1b6e0 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 assert( idx1<=s
1b6f0 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 zHdr1 || CORRUPT
1b700 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 _DB );. do{.
1b710 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 u32 serial_type
1b720 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 1;.. /* Read
1b730 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 the serial types
1b740 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c for the next el
1b750 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 ement in each ke
1b760 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b y. */. idx1 +
1b770 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 = getVarint32( a
1b780 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 Key1+idx1, seria
1b790 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 l_type1 );..
1b7a0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 /* Verify that t
1b7b0 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b here is enough k
1b7c0 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 ey space remaini
1b7d0 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 ng to avoid.
1b7e0 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 ** a buffer over
1b7f0 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 read. The "d1+s
1b800 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 erial_type1+2" s
1b810 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c ubexpression wil
1b820 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 l. ** always
1b830 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 be greater than
1b840 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 or equal to the
1b850 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 amount of requir
1b860 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 ed key space..
1b870 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 ** Use that ap
1b880 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 proximation to a
1b890 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 void the more ex
1b8a0 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a pensive call to.
1b8b0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 ** sqlite3Vd
1b8c0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
1b8d0 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 ) in the common
1b8e0 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 case.. */.
1b8f0 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 if( d1+serial_t
1b900 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 ype1+2>(u32)nKey
1b910 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 1. && d1+sql
1b920 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 ite3VdbeSerialTy
1b930 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 peLen(serial_typ
1b940 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a e1)>(u32)nKey1 .
1b950 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 ){. bre
1b960 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ak;. }.. /
1b970 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 * Extract the va
1b980 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 lues to be compa
1b990 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 red.. */.
1b9a0 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 d1 += sqlite3Vdb
1b9b0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 eSerialGet(&aKey
1b9c0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 1[d1], serial_ty
1b9d0 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 pe1, &mem1);..
1b9e0 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 /* Do the comp
1b9f0 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 arison. */.
1ba00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 rc = sqlite3Me
1ba10 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 mCompare(&mem1,
1ba20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d &pPKey2->aMem[i]
1ba30 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c , pKeyInfo->aCol
1ba40 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 l[i]);. if( r
1ba50 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 c!=0 ){. as
1ba60 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c sert( mem1.szMal
1ba70 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 loc==0 ); /* Se
1ba80 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 e comment below
1ba90 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 */. if( pKe
1baa0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 yInfo->aSortOrde
1bab0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 r[i] ){.
1bac0 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e rc = -rc; /* In
1bad0 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 vert the result
1bae0 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 for DESC sort or
1baf0 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a der. */. }.
1bb00 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 goto debug
1bb10 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 CompareEnd;.
1bb20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 }. i++;. }wh
1bb30 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 ile( idx1<szHdr1
1bb40 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 && i<pPKey2->nF
1bb50 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f ield );.. /* No
1bb60 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 memory allocati
1bb70 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 on is ever used
1bb80 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 on mem1. Prove
1bb90 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 this using. **
1bba0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 the following as
1bbb0 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 sert(). If the
1bbc0 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 assert() fails,
1bbd0 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 it indicates a.
1bbe0 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 ** memory leak
1bbf0 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 and a need to ca
1bc00 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 ll sqlite3VdbeMe
1bc10 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e mRelease(&mem1).
1bc20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 . */. assert(
1bc30 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 mem1.szMalloc==0
1bc40 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 );.. /* rc==0
1bc50 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 here means that
1bc60 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 one of the keys
1bc70 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 ran out of field
1bc80 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 s and. ** all t
1bc90 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 he fields up to
1bca0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 that point were
1bcb0 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 equal. Return th
1bcc0 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a e default_rc. *
1bcd0 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 * value. */. r
1bce0 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 c = pPKey2->defa
1bcf0 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f ult_rc;..debugCo
1bd00 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 mpareEnd:. if(
1bd10 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 desiredResult==0
1bd20 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 && rc==0 ) retu
1bd30 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 rn 1;. if( desi
1bd40 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 redResult<0 && r
1bd50 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a c<0 ) return 1;.
1bd60 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 if( desiredRes
1bd70 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 ult>0 && rc>0 )
1bd80 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 return 1;. if(
1bd90 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 CORRUPT_DB ) ret
1bda0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 urn 1;. if( pKe
1bdb0 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f yInfo->db->mallo
1bdc0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e cFailed ) return
1bdd0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 1;. return 0;.
1bde0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 }.#endif..#if SQ
1bdf0 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a LITE_DEBUG./*.**
1be00 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 Count the numbe
1be10 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b r of fields (a.k
1be20 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 .a. columns) in
1be30 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e the record given
1be40 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 by.** pKey,nKey
1be50 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68 . The verify th
1be60 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 at this count is
1be70 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 less than or eq
1be80 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 ual to the.** li
1be90 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 mit given by pKe
1bea0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 yInfo->nField +
1beb0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c pKeyInfo->nXFiel
1bec0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 d..**.** If this
1bed0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e constraint is n
1bee0 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 ot satisfied, it
1bef0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 means that the
1bf00 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 high-speed.** vd
1bf10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 beRecordCompareI
1bf20 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 nt() and vdbeRec
1bf30 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 ordCompareString
1bf40 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c () routines will
1bf50 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 .** not work cor
1bf60 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 rectly. If this
1bf70 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 assert() ever f
1bf80 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c ires, it probabl
1bf90 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 y means.** that
1bfa0 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 the KeyInfo.nFie
1bfb0 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 ld or KeyInfo.nX
1bfc0 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 Field values wer
1bfd0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e e computed.** in
1bfe0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 correctly..*/.st
1bff0 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 atic void vdbeAs
1c000 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 sertFieldCountWi
1c010 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e thinLimits(. in
1c020 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f t nKey, const vo
1c030 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 id *pKey, /* T
1c040 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 he record to ver
1c050 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 ify */ . const
1c060 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 KeyInfo *pKeyInf
1c070 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 o /* Compa
1c080 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 re size with thi
1c090 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a s KeyInfo */.){.
1c0a0 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 int nField = 0
1c0b0 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 ;. u32 szHdr;.
1c0c0 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 u32 idx;. u32
1c0d0 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 notUsed;. const
1c0e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1c0f0 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e aKey = (const un
1c100 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 signed char*)pKe
1c110 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 y;.. if( CORRUP
1c120 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 T_DB ) return;.
1c130 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 idx = getVarint
1c140 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 32(aKey, szHdr);
1c150 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e . assert( nKey>
1c160 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 =0 );. assert(
1c170 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 szHdr<=(u32)nKey
1c180 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 );. while( idx
1c190 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 <szHdr ){. id
1c1a0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 x += getVarint32
1c1b0 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 (aKey+idx, notUs
1c1c0 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b ed);. nField+
1c1d0 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 +;. }. assert(
1c1e0 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 nField <= pKeyI
1c1f0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 nfo->nField+pKey
1c200 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b Info->nXField );
1c210 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e .}.#else.# defin
1c220 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c e vdbeAssertFiel
1c230 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 dCountWithinLimi
1c240 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 ts(A,B,C).#endif
1c250 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d ../*.** Both *pM
1c260 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 em1 and *pMem2 c
1c270 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 ontain string va
1c280 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 lues. Compare th
1c290 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 e two values.**
1c2a0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 using the collat
1c2b0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f ion sequence pCo
1c2c0 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 ll. As usual, re
1c2d0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 turn a negative
1c2e0 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 , zero.** or pos
1c2f0 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a itive value if *
1c300 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 pMem1 is less th
1c310 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 an, equal to or
1c320 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a greater than .**
1c330 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 *pMem2, respect
1c340 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 ively. Similar i
1c350 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 n spirit to "rc
1c360 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 = (*pMem1) - (*p
1c370 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 Mem2);"..*/.stat
1c380 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 ic int vdbeCompa
1c390 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 reMemString(. c
1c3a0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c onst Mem *pMem1,
1c3b0 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d . const Mem *pM
1c3c0 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c em2,. const Col
1c3d0 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 lSeq *pColl,. u
1c3e0 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 8 *prcErr
1c3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
1c400 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 * If an OOM occu
1c410 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 rs, set to SQLIT
1c420 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 E_NOMEM */.){.
1c430 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d if( pMem1->enc==
1c440 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 pColl->enc ){.
1c450 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 /* The strings
1c460 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 are already in
1c470 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f the correct enco
1c480 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a ding. Call the.
1c490 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 ** comparis
1c4a0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 on function dire
1c4b0 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 ctly */. retu
1c4c0 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 rn pColl->xCmp(p
1c4d0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d Coll->pUser,pMem
1c4e0 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 1->n,pMem1->z,pM
1c4f0 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 em2->n,pMem2->z)
1c500 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 ;. }else{. i
1c510 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 nt rc;. const
1c520 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a void *v1, *v2;.
1c530 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a int n1, n2;.
1c540 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 Mem c1;.
1c550 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 Mem c2;. sqli
1c560 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 te3VdbeMemInit(&
1c570 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d c1, pMem1->db, M
1c580 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 EM_Null);. sq
1c590 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 lite3VdbeMemInit
1c5a0 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c (&c2, pMem1->db,
1c5b0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 MEM_Null);.
1c5c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 sqlite3VdbeMemSh
1c5d0 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 allowCopy(&c1, p
1c5e0 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 Mem1, MEM_Ephem)
1c5f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 ;. sqlite3Vdb
1c600 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 eMemShallowCopy(
1c610 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f &c2, pMem2, MEM_
1c620 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d Ephem);. v1 =
1c630 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 sqlite3ValueTex
1c640 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 t((sqlite3_value
1c650 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e *)&c1, pColl->en
1c660 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d c);. n1 = v1=
1c670 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 =0 ? 0 : c1.n;.
1c680 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 v2 = sqlite3V
1c690 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 alueText((sqlite
1c6a0 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 3_value*)&c2, pC
1c6b0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e oll->enc);. n
1c6c0 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 2 = v2==0 ? 0 :
1c6d0 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 c2.n;. rc = p
1c6e0 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c Coll->xCmp(pColl
1c6f0 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c ->pUser, n1, v1,
1c700 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 n2, v2);. sq
1c710 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
1c720 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71 ase(&c1);. sq
1c730 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 lite3VdbeMemRele
1c740 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66 ase(&c2);. if
1c750 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d ( (v1==0 || v2==
1c760 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 0) && prcErr ) *
1c770 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f prcErr = SQLITE_
1c780 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 NOMEM;. retur
1c790 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a n rc;. }.}../*.
1c7a0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 ** Compare two b
1c7b0 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 lobs. Return ne
1c7c0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 gative, zero, or
1c7d0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 positive if the
1c7e0 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 first.** is les
1c7f0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f s than, equal to
1c800 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 , or greater tha
1c810 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 n the second, re
1c820 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 spectively..** I
1c830 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 f one blob is a
1c840 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 prefix of the ot
1c850 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 her, then the sh
1c860 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 orter is the les
1c870 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 sor..*/.static S
1c880 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 QLITE_NOINLINE i
1c890 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f nt sqlite3BlobCo
1c8a0 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 mpare(const Mem
1c8b0 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 *pB1, const Mem
1c8c0 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d *pB2){. int c =
1c8d0 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 memcmp(pB1->z,
1c8e0 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 pB2->z, pB1->n>p
1c8f0 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a B2->n ? pB2->n :
1c900 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 pB1->n);. if(
1c910 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 c ) return c;.
1c920 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 return pB1->n -
1c930 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a pB2->n;.}../*.**
1c940 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e Do a comparison
1c950 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 between a 64-bi
1c960 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 t signed integer
1c970 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c and a 64-bit fl
1c980 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 oating-point.**
1c990 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 number. Return
1c9a0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 negative, zero,
1c9b0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 or positive if t
1c9c0 68 65 20 66 69 72 73 74 20 28 69 36 34 29 20 69 he first (i64) i
1c9d0 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 s less than,.**
1c9e0 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 equal to, or gre
1c9f0 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 ater than the se
1ca00 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a cond (double)..*
1ca10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c /.static int sql
1ca20 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 ite3IntFloatComp
1ca30 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c are(i64 i, doubl
1ca40 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 e r){. if( size
1ca50 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 of(LONGDOUBLE_TY
1ca60 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e PE)>8 ){. LON
1ca70 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d GDOUBLE_TYPE x =
1ca80 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 (LONGDOUBLE_TYP
1ca90 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 E)i;. if( x<r
1caa0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 ) return -1;.
1cab0 20 20 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 if( x>r ) retu
1cac0 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 rn +1;. retur
1cad0 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 n 0;. }else{.
1cae0 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 i64 y;. dou
1caf0 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 ble s;. if( r
1cb00 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37 <-92233720368547
1cb10 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 75808.0 ) return
1cb20 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 +1;. if( r>9
1cb30 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 2233720368547758
1cb40 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 07.0 ) return -1
1cb50 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 ;. y = (i64)r
1cb60 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 ;. if( i<y )
1cb70 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 return -1;. i
1cb80 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 f( i>y ){.
1cb90 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f if( y==SMALLEST_
1cba0 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 INT64 && r>0.0 )
1cbb0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
1cbc0 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 return +1;.
1cbd0 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 }. s = (doub
1cbe0 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c le)i;. if( s<
1cbf0 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 r ) return -1;.
1cc00 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 if( s>r ) ret
1cc10 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 urn +1;. retu
1cc20 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a rn 0;. }.}../*.
1cc30 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 ** Compare the v
1cc40 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 alues contained
1cc50 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 by the two memor
1cc60 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 y cells, returni
1cc70 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 ng.** negative,
1cc80 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 zero or positive
1cc90 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 if pMem1 is les
1cca0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f s than, equal to
1ccb0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 , or greater.**
1ccc0 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 than pMem2. Sort
1ccd0 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c ing order is NUL
1cce0 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f L's first, follo
1ccf0 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 wed by numbers (
1cd00 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 integers.** and
1cd10 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 reals) sorted nu
1cd20 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f merically, follo
1cd30 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 wed by text orde
1cd40 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 red by the colla
1cd50 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 ting.** sequence
1cd60 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c pColl and final
1cd70 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 ly blob's ordere
1cd80 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a d by memcmp()..*
1cd90 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 *.** Two NULL va
1cda0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 lues are conside
1cdb0 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 red equal by thi
1cdc0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 s function..*/.i
1cdd0 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d nt sqlite3MemCom
1cde0 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a pare(const Mem *
1cdf0 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d pMem1, const Mem
1ce00 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 *pMem2, const C
1ce10 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a ollSeq *pColl){.
1ce20 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 int f1, f2;.
1ce30 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 int combined_fla
1ce40 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d gs;.. f1 = pMem
1ce50 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 1->flags;. f2 =
1ce60 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 pMem2->flags;.
1ce70 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 combined_flags
1ce80 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 = f1|f2;. asser
1ce90 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 t( (combined_fla
1cea0 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 gs & MEM_RowSet)
1ceb0 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 ==0 );. . /* If
1cec0 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 one value is NU
1ced0 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 LL, it is less t
1cee0 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 han the other. I
1cef0 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 f both values.
1cf00 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 ** are NULL, ret
1cf10 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 urn 0.. */. if
1cf20 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 ( combined_flags
1cf30 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 &MEM_Null ){.
1cf40 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f return (f2&MEM_
1cf50 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f Null) - (f1&MEM_
1cf60 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a Null);. }.. /*
1cf70 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 At least one of
1cf80 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 the two values
1cf90 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f is a number. */
1cfa0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f . if( combined_
1cfb0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d flags&(MEM_Int|M
1cfc0 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 EM_Real) ){.
1cfd0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d if( (f1 & f2 & M
1cfe0 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 EM_Int)!=0 ){.
1cff0 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 if( pMem1->u
1d000 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 .i < pMem2->u.i
1d010 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 ) return -1;.
1d020 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e if( pMem1->u.
1d030 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 i > pMem2->u.i )
1d040 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 return +1;.
1d050 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 return 0;.
1d060 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20 }. if( (f1 &
1d070 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d f2 & MEM_Real)!=
1d080 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 0 ){. if( p
1d090 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d Mem1->u.r < pMem
1d0a0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2->u.r ) return
1d0b0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d -1;. if( pM
1d0c0 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 em1->u.r > pMem2
1d0d0 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b ->u.r ) return +
1d0e0 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 1;. return
1d0f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 0;. }. if(
1d100 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 (f1&MEM_Int)!=0
1d110 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 ){. if( (f
1d120 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 2&MEM_Real)!=0 )
1d130 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e {. return
1d140 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 sqlite3IntFloat
1d150 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 Compare(pMem1->u
1d160 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b .i, pMem2->u.r);
1d170 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
1d180 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b return -1;
1d190 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 . }. }.
1d1a0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 if( (f1&MEM_R
1d1b0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 eal)!=0 ){.
1d1c0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 if( (f2&MEM_Int
1d1d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 )!=0 ){.
1d1e0 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 return -sqlite3I
1d1f0 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 ntFloatCompare(p
1d200 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 Mem2->u.i, pMem1
1d210 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 ->u.r);. }e
1d220 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 lse{. ret
1d230 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a urn -1;. }.
1d240 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
1d250 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 +1;. }.. /* I
1d260 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 f one value is a
1d270 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 string and the
1d280 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c other is a blob,
1d290 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c the string is l
1d2a0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 ess.. ** If bot
1d2b0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 h are strings, c
1d2c0 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 ompare using the
1d2d0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 collating funct
1d2e0 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 ions.. */. if(
1d2f0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 combined_flags&
1d300 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 MEM_Str ){. i
1d310 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 f( (f1 & MEM_Str
1d320 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 )==0 ){. re
1d330 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 turn 1;. }.
1d340 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f if( (f2 & MEM_
1d350 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 Str)==0 ){.
1d360 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 return -1;.
1d370 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 }.. assert( p
1d380 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 Mem1->enc==pMem2
1d390 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e ->enc || pMem1->
1d3a0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 db->mallocFailed
1d3b0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 );. assert(
1d3c0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 pMem1->enc==SQLI
1d3d0 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 TE_UTF8 || .
1d3e0 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 pMem1->e
1d3f0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 nc==SQLITE_UTF16
1d400 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 LE || pMem1->enc
1d410 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 ==SQLITE_UTF16BE
1d420 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 );.. /* The
1d430 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e collation sequen
1d440 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e ce must be defin
1d450 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 ed at this point
1d460 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a , even if. **
1d470 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 the user delete
1d480 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 s the collation
1d490 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 sequence after t
1d4a0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 he vdbe program
1d4b0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c is. ** compil
1d4c0 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 ed (this was not
1d4d0 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 always the case
1d4e0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 ).. */. as
1d4f0 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 sert( !pColl ||
1d500 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a pColl->xCmp );..
1d510 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b if( pColl ){
1d520 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 . return vd
1d530 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 beCompareMemStri
1d540 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c ng(pMem1, pMem2,
1d550 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 pColl, 0);.
1d560 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 }. /* If a NU
1d570 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 LL pointer was p
1d580 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c assed as the col
1d590 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 late function, f
1d5a0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 all through.
1d5b0 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 ** to the blob c
1d5c0 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 ase and use memc
1d5d0 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a mp(). */. }. .
1d5e0 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 /* Both values
1d5f0 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 must be blobs.
1d600 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d Compare using m
1d610 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 emcmp(). */. r
1d620 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f eturn sqlite3Blo
1d630 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 bCompare(pMem1,
1d640 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a pMem2);.}.../*.*
1d650 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 * The first argu
1d660 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 ment passed to t
1d670 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
1d680 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 a serial-type th
1d690 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 at.** correspond
1d6a0 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 s to an integer
1d6b0 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 - all values bet
1d6c0 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 ween 1 and 9 inc
1d6d0 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 lusive .** excep
1d6e0 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 t 7. The second
1d6f0 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 points to a buff
1d700 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e er containing an
1d710 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a integer value.*
1d720 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 * serialized acc
1d730 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c ording to serial
1d740 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 _type. This func
1d750 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 tion deserialize
1d760 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 s.** and returns
1d770 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 the value..*/.s
1d780 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65 tatic i64 vdbeRe
1d790 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 cordDecodeInt(u3
1d7a0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 2 serial_type, c
1d7b0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a onst u8 *aKey){.
1d7c0 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 u32 y;. asser
1d7d0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c t( CORRUPT_DB ||
1d7e0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 (serial_type>=1
1d7f0 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c && serial_type<
1d800 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 =9 && serial_typ
1d810 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 e!=7) );. switc
1d820 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 h( serial_type )
1d830 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 {. case 0:.
1d840 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 case 1:.
1d850 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 testcase( aKey[0
1d860 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 ]&0x80 );.
1d870 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f return ONE_BYTE_
1d880 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 INT(aKey);. c
1d890 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 ase 2:. tes
1d8a0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 tcase( aKey[0]&0
1d8b0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 x80 );. ret
1d8c0 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 urn TWO_BYTE_INT
1d8d0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 (aKey);. case
1d8e0 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 3:. testca
1d8f0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 se( aKey[0]&0x80
1d900 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e );. return
1d910 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 THREE_BYTE_INT(
1d920 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 aKey);. case
1d930 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 4: {. testc
1d940 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 ase( aKey[0]&0x8
1d950 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 0 );. y = F
1d960 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b OUR_BYTE_UINT(aK
1d970 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 ey);. retur
1d980 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 n (i64)*(int*)&y
1d990 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 ;. }. case
1d9a0 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 5: {. test
1d9b0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 case( aKey[0]&0x
1d9c0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 80 );. retu
1d9d0 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e rn FOUR_BYTE_UIN
1d9e0 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 T(aKey+2) + (((i
1d9f0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 64)1)<<32)*TWO_B
1da00 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 YTE_INT(aKey);.
1da10 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a }. case 6:
1da20 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d {. u64 x =
1da30 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 FOUR_BYTE_UINT(
1da40 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 aKey);. tes
1da50 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 tcase( aKey[0]&0
1da60 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d x80 );. x =
1da70 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f (x<<32) | FOUR_
1da80 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 BYTE_UINT(aKey+4
1da90 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
1daa0 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a (i64)*(i64*)&x;.
1dab0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
1dac0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 urn (serial_type
1dad0 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 - 8);.}../*.**
1dae0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f This function co
1daf0 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 mpares the two t
1db00 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 able rows or ind
1db10 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 ex records.** sp
1db20 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 ecified by {nKey
1db30 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 1, pKey1} and pP
1db40 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e Key2. It return
1db50 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 s a negative, ze
1db60 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 ro.** or positiv
1db70 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 e integer if key
1db80 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 1 is less than,
1db90 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 equal to or .**
1dba0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 greater than key
1dbb0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 2. The {nKey1,
1dbc0 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 pKey1} key must
1dbd0 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 be a blob.** cre
1dbe0 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d ated by the OP_M
1dbf0 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 akeRecord opcode
1dc00 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 of the VDBE. T
1dc10 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 he pPKey2.** key
1dc20 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65 must be a parse
1dc30 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 d key such as ob
1dc40 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 tained from.** s
1dc50 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52 qlite3VdbeParseR
1dc60 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 ecord..**.** If
1dc70 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 argument bSkip i
1dc80 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 s non-zero, it i
1dc90 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 s assumed that t
1dca0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c he caller has al
1dcb0 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 ready.** determi
1dcc0 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72 ned that the fir
1dcd0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 st fields of the
1dce0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e keys are equal.
1dcf0 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 .**.** Key1 and
1dd00 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 Key2 do not have
1dd10 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 to contain the
1dd20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 same number of f
1dd30 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a ields. If all .*
1dd40 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 * fields that ap
1dd50 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 pear in both key
1dd60 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 s are equal, the
1dd70 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c n pPKey2->defaul
1dd80 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 t_rc is .** retu
1dd90 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 rned..**.** If d
1dda0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 atabase corrupti
1ddb0 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 on is discovered
1ddc0 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 , set pPKey2->er
1ddd0 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c rCode to .** SQL
1dde0 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 ITE_CORRUPT and
1ddf0 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 return 0. If an
1de00 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 OOM error is enc
1de10 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 ountered, .** pP
1de20 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 Key2->errCode is
1de30 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e set to SQLITE_N
1de40 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 OMEM and, if it
1de50 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 is not NULL, the
1de60 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 .** malloc-faile
1de70 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 d flag set on da
1de80 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 tabase handle (p
1de90 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1dea0 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c >db)..*/.int sql
1deb0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
1dec0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 mpareWithSkip(.
1ded0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 int nKey1, cons
1dee0 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 t void *pKey1,
1def0 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a /* Left key */.
1df00 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 UnpackedRecord
1df10 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 *pPKey2,
1df20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a /* Right key *
1df30 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 /. int bSkip
1df40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1df50 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 /* If true,
1df60 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66 skip the first f
1df70 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 ield */.){. u32
1df80 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 d1;
1df90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1dfa0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 Offset into aKey
1dfb0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 [] of next data
1dfc0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 element */. int
1dfd0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 i;
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
1dff0 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 Index of next fi
1e000 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a eld to compare *
1e010 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 /. u32 szHdr1;
1e020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e030 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 /* Size of r
1e040 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 ecord header in
1e050 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 bytes */. u32 i
1e060 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 dx1;
1e070 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 /* Of
1e080 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 fset of first ty
1e090 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a pe in header */.
1e0a0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 int rc = 0;
1e0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e0c0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 /* Return valu
1e0d0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 e */. Mem *pRhs
1e0e0 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b = pPKey2->aMem;
1e0f0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 /* Next f
1e100 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 ield of pPKey2 t
1e110 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b o compare */. K
1e120 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f eyInfo *pKeyInfo
1e130 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 = pPKey2->pKeyI
1e140 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 nfo;. const uns
1e150 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 igned char *aKey
1e160 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 1 = (const unsig
1e170 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 ned char *)pKey1
1e180 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 ;. Mem mem1;..
1e190 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 /* If bSkip is
1e1a0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 true, then the c
1e1b0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 aller has alread
1e1c0 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 y determined tha
1e1d0 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a t the first. **
1e1e0 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e two elements in
1e1f0 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 the keys are eq
1e200 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 ual. Fix the var
1e210 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 ious stack varia
1e220 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 bles so. ** tha
1e230 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 t this routine b
1e240 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 egins comparing
1e250 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 at the second fi
1e260 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 eld. */. if( bS
1e270 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 kip ){. u32 s
1e280 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 1;. idx1 = 1
1e290 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 + getVarint32(&a
1e2a0 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 Key1[1], s1);.
1e2b0 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 szHdr1 = aKey1
1e2c0 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a [0];. d1 = sz
1e2d0 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 Hdr1 + sqlite3Vd
1e2e0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 beSerialTypeLen(
1e2f0 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a s1);. i = 1;.
1e300 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 pRhs++;. }e
1e310 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 lse{. idx1 =
1e320 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 getVarint32(aKey
1e330 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 1, szHdr1);.
1e340 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 d1 = szHdr1;.
1e350 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 if( d1>(unsigne
1e360 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 d)nKey1 ){ .
1e370 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 pPKey2->errCod
1e380 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 e = (u8)SQLITE_C
1e390 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 ORRUPT_BKPT;.
1e3a0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a return 0; /*
1e3b0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 Corruption */.
1e3c0 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a }. i = 0;.
1e3d0 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 }.. VVA_ONLY(
1e3e0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d mem1.szMalloc =
1e3f0 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 0; ) /* Only ne
1e400 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29 eded by assert()
1e410 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 statements */.
1e420 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d assert( pPKey2-
1e430 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c >pKeyInfo->nFiel
1e440 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e d+pPKey2->pKeyIn
1e450 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b fo->nXField>=pPK
1e460 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 ey2->nField .
1e470 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 || CORRUPT_D
1e480 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 B );. assert( p
1e490 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d PKey2->pKeyInfo-
1e4a0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 >aSortOrder!=0 )
1e4b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 ;. assert( pPKe
1e4c0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 y2->pKeyInfo->nF
1e4d0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 ield>0 );. asse
1e4e0 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 rt( idx1<=szHdr1
1e4f0 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 || CORRUPT_DB )
1e500 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 ;. do{. u32
1e510 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 serial_type;..
1e520 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 /* RHS is an i
1e530 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 nteger */. if
1e540 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 ( pRhs->flags &
1e550 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 MEM_Int ){.
1e560 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 serial_type = a
1e570 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 Key1[idx1];.
1e580 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 testcase( seri
1e590 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 al_type==12 );.
1e5a0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f if( serial_
1e5b0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 type>=10 ){.
1e5c0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 rc = +1;.
1e5d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 }else if( ser
1e5e0 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 ial_type==0 ){.
1e5f0 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a rc = -1;.
1e600 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
1e610 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 serial_type==7 )
1e620 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 {. sqlite
1e630 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 3VdbeSerialGet(&
1e640 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 aKey1[d1], seria
1e650 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a l_type, &mem1);.
1e660 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 rc = -sq
1e670 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d lite3IntFloatCom
1e680 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 pare(pRhs->u.i,
1e690 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 mem1.u.r);.
1e6a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
1e6b0 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 i64 lhs = vdbeRe
1e6c0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 cordDecodeInt(se
1e6d0 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 rial_type, &aKey
1e6e0 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 1[d1]);.
1e6f0 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e i64 rhs = pRhs->
1e700 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 u.i;. if(
1e710 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 lhs<rhs ){.
1e720 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 rc = -1;.
1e730 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 }else if(
1e740 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 lhs>rhs ){.
1e750 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 rc = +1;.
1e760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d }. }
1e770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 . }.. /* R
1e780 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 HS is real */.
1e790 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d else if( pRhs-
1e7a0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 >flags & MEM_Rea
1e7b0 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 l ){. seria
1e7c0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 l_type = aKey1[i
1e7d0 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 dx1];. if(
1e7e0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 serial_type>=10
1e7f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 ){. /* Se
1e800 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 rial types 12 or
1e810 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72 greater are str
1e820 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 ings and blobs (
1e830 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 greater than.
1e840 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 ** numbers)
1e850 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 . Types 10 and 1
1e860 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 1 are currently
1e870 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 "reserved for fu
1e880 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a ture . **
1e890 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 use", so it doe
1e8a0 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 sn't really matt
1e8b0 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75 er what the resu
1e8c0 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 lts of comparing
1e8d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d . ** them
1e8e0 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c to numberic val
1e8f0 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 ues are. */.
1e900 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 rc = +1;.
1e910 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 }else if( se
1e920 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a rial_type==0 ){.
1e930 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b rc = -1;
1e940 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
1e950 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 sqlite3Vdb
1e960 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 eSerialGet(&aKey
1e970 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 1[d1], serial_ty
1e980 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 pe, &mem1);.
1e990 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 if( serial_t
1e9a0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 ype==7 ){.
1e9b0 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 if( mem1.u.r
1e9c0 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 <pRhs->u.r ){.
1e9d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d rc = -
1e9e0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 1;. }el
1e9f0 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e se if( mem1.u.r>
1ea00 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 pRhs->u.r ){.
1ea10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 rc = +1
1ea20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
1ea30 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
1ea40 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 rc = sqli
1ea50 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 te3IntFloatCompa
1ea60 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 re(mem1.u.i, pRh
1ea70 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 s->u.r);.
1ea80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
1ea90 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 .. /* RHS is
1eaa0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 a string */.
1eab0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 else if( pRhs->f
1eac0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 lags & MEM_Str )
1ead0 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e {. getVarin
1eae0 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d t32(&aKey1[idx1]
1eaf0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a , serial_type);.
1eb00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1eb10 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 serial_type==12
1eb20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 );. if( ser
1eb30 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 ial_type<12 ){.
1eb40 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a rc = -1;.
1eb50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 }else if(
1eb60 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 !(serial_type &
1eb70 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 0x01) ){.
1eb80 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 rc = +1;.
1eb90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d }else{. m
1eba0 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f em1.n = (serial_
1ebb0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a type - 12) / 2;.
1ebc0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 testcase
1ebd0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 ( (d1+mem1.n)==(
1ebe0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 unsigned)nKey1 )
1ebf0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1ec00 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 se( (d1+mem1.n+1
1ec10 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 )==(unsigned)nKe
1ec20 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 y1 );. if
1ec30 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 ( (d1+mem1.n) >
1ec40 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 (unsigned)nKey1
1ec50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b ){. pPK
1ec60 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 ey2->errCode = (
1ec70 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 u8)SQLITE_CORRUP
1ec80 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 T_BKPT;.
1ec90 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 return 0;
1eca0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f /* Co
1ecb0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 rruption */.
1ecc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b }else if( pK
1ecd0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d eyInfo->aColl[i]
1ece0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 ){. me
1ecf0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 m1.enc = pKeyInf
1ed00 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 o->enc;.
1ed10 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 mem1.db = pKey
1ed20 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 Info->db;.
1ed30 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d mem1.flags =
1ed40 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 MEM_Str;.
1ed50 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 mem1.z = (ch
1ed60 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a ar*)&aKey1[d1];.
1ed70 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 rc = v
1ed80 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 dbeCompareMemStr
1ed90 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 ing(.
1eda0 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 &mem1, pRhs,
1edb0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b pKeyInfo->aColl[
1edc0 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 i], &pPKey2->err
1edd0 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 Code. )
1ede0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
1edf0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e . int n
1ee00 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e Cmp = MIN(mem1.n
1ee10 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 , pRhs->n);.
1ee20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d rc = memcm
1ee30 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 p(&aKey1[d1], pR
1ee40 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 hs->z, nCmp);.
1ee50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d if( rc==
1ee60 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 0 ) rc = mem1.n
1ee70 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 - pRhs->n; .
1ee80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 }. }.
1ee90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 }.. /* RHS
1eea0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 is a blob */.
1eeb0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e else if( pRhs->
1eec0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 flags & MEM_Blob
1eed0 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 ){. getVar
1eee0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 int32(&aKey1[idx
1eef0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 1], serial_type)
1ef00 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 ;. testcase
1ef10 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 ( serial_type==1
1ef20 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 2 );. if( s
1ef30 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c erial_type<12 ||
1ef40 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 (serial_type &
1ef50 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 0x01) ){.
1ef60 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 rc = -1;.
1ef70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 }else{. i
1ef80 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 nt nStr = (seria
1ef90 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 l_type - 12) / 2
1efa0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1efb0 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 se( (d1+nStr)==(
1efc0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 unsigned)nKey1 )
1efd0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 ;. testca
1efe0 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d se( (d1+nStr+1)=
1eff0 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 =(unsigned)nKey1
1f000 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 );. if(
1f010 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 (d1+nStr) > (uns
1f020 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 igned)nKey1 ){.
1f030 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d pPKey2-
1f040 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 >errCode = (u8)S
1f050 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b QLITE_CORRUPT_BK
1f060 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 PT;. re
1f070 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 turn 0;
1f080 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 /* Corrup
1f090 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 tion */.
1f0a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
1f0b0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 int nCmp = MIN(
1f0c0 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a nStr, pRhs->n);.
1f0d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d rc = m
1f0e0 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d emcmp(&aKey1[d1]
1f0f0 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 , pRhs->z, nCmp)
1f100 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 ;. if(
1f110 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 rc==0 ) rc = nSt
1f120 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 r - pRhs->n;.
1f130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 }. }.
1f140 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 }.. /* RHS
1f150 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 is null */.
1f160 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 else{. seri
1f170 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b al_type = aKey1[
1f180 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 idx1];. rc
1f190 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d = (serial_type!=
1f1a0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 0);. }.. i
1f1b0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 f( rc!=0 ){.
1f1c0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e if( pKeyInfo->
1f1d0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b aSortOrder[i] ){
1f1e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 . rc = -r
1f1f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 c;. }.
1f200 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63 assert( vdbeRec
1f210 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 ordCompareDebug(
1f220 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 nKey1, pKey1, pP
1f230 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 Key2, rc) );.
1f240 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e assert( mem1.
1f250 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 szMalloc==0 );
1f260 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 /* See comment b
1f270 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 elow */. re
1f280 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a turn rc;. }..
1f290 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 i++;. pRh
1f2a0 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 s++;. d1 += s
1f2b0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
1f2c0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 TypeLen(serial_t
1f2d0 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b ype);. idx1 +
1f2e0 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c = sqlite3VarintL
1f2f0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b en(serial_type);
1f300 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c . }while( idx1<
1f310 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 (unsigned)szHdr1
1f320 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 && i<pPKey2->nF
1f330 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 ield && d1<=(uns
1f340 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a igned)nKey1 );..
1f350 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 /* No memory a
1f360 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 llocation is eve
1f370 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 r used on mem1.
1f380 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e Prove this usin
1f390 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f g. ** the follo
1f3a0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 wing assert().
1f3b0 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 If the assert()
1f3c0 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 fails, it indica
1f3d0 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 tes a. ** memor
1f3e0 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 y leak and a nee
1f3f0 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 d to call sqlite
1f400 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
1f410 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 &mem1). */. as
1f420 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c sert( mem1.szMal
1f430 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 loc==0 );.. /*
1f440 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 rc==0 here means
1f450 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 that one or bot
1f460 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 h of the keys ra
1f470 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 n out of fields
1f480 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 and. ** all the
1f490 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 fields up to th
1f4a0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 at point were eq
1f4b0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 ual. Return the
1f4c0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 default_rc. **
1f4d0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 value. */. ass
1f4e0 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 ert( CORRUPT_DB
1f4f0 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 . || vdbeR
1f500 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 ecordCompareDebu
1f510 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 g(nKey1, pKey1,
1f520 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e pPKey2, pPKey2->
1f530 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 default_rc) .
1f540 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d || pKeyInfo-
1f550 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 >db->mallocFaile
1f560 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d d. );. pPKey2-
1f570 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 >eqSeen = 1;. r
1f580 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 eturn pPKey2->de
1f590 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 fault_rc;.}.int
1f5a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 sqlite3VdbeRecor
1f5b0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 dCompare(. int
1f5c0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 nKey1, const voi
1f5d0 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c d *pKey1, /* L
1f5e0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 eft key */. Unp
1f5f0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b ackedRecord *pPK
1f600 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 ey2 /*
1f610 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a Right key */.){.
1f620 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 return sqlite3
1f630 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 VdbeRecordCompar
1f640 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c eWithSkip(nKey1,
1f650 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 pKey1, pPKey2,
1f660 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 0);.}.../*.** Th
1f670 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 is function is a
1f680 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 n optimized vers
1f690 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 ion of sqlite3Vd
1f6a0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
1f6b0 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 ) .** that (a) t
1f6c0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f he first field o
1f6d0 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 f pPKey2 is an i
1f6e0 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 nteger, and (b)
1f6f0 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d the .** size-of-
1f700 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 header varint at
1f710 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 the start of (p
1f720 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 Key1/nKey1) fits
1f730 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 in a single.**
1f740 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 byte (i.e. is le
1f750 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a ss than 128)..**
1f760 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e .** To avoid con
1f770 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 cerns about buff
1f780 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 er overreads, th
1f790 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e is routine is on
1f7a0 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 ly used.** on sc
1f7b0 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 hemas where the
1f7c0 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 maximum valid he
1f7d0 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 ader size is 63
1f7e0 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a bytes or less..*
1f7f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 /.static int vdb
1f800 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e eRecordCompareIn
1f810 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 t(. int nKey1,
1f820 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 const void *pKey
1f830 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 1, /* Left key *
1f840 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f /. UnpackedReco
1f850 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 rd *pPKey2
1f860 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a /* Right key *
1f870 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 /.){. const u8
1f880 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 *aKey = &((const
1f890 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f u8*)pKey1)[*(co
1f8a0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 nst u8*)pKey1 &
1f8b0 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 0x3F];. int ser
1f8c0 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e ial_type = ((con
1f8d0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d st u8*)pKey1)[1]
1f8e0 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 ;. int res;. u
1f8f0 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 32 y;. u64 x;.
1f900 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d i64 v = pPKey2-
1f910 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 >aMem[0].u.i;.
1f920 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 i64 lhs;.. vdbe
1f930 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 AssertFieldCount
1f940 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 WithinLimits(nKe
1f950 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 y1, pKey1, pPKey
1f960 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 2->pKeyInfo);.
1f970 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 assert( (*(u8*)p
1f980 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 Key1)<=0x3F || C
1f990 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 ORRUPT_DB );. s
1f9a0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 witch( serial_ty
1f9b0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 pe ){. case 1
1f9c0 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 : { /* 1-byte si
1f9d0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a gned integer */.
1f9e0 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f lhs = ONE_
1f9f0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a BYTE_INT(aKey);.
1fa00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1fa10 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 lhs<0 );. b
1fa20 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
1fa30 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 case 2: { /* 2-b
1fa40 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
1fa50 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 er */. lhs
1fa60 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 = TWO_BYTE_INT(a
1fa70 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 Key);. test
1fa80 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 case( lhs<0 );.
1fa90 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
1faa0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 }. case 3: {
1fab0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 /* 3-byte signed
1fac0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 integer */.
1fad0 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 lhs = THREE_BY
1fae0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 TE_INT(aKey);.
1faf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 testcase( lh
1fb00 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 s<0 );. bre
1fb10 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
1fb20 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 se 4: { /* 4-byt
1fb30 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 e signed integer
1fb40 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f */. y = FO
1fb50 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 UR_BYTE_UINT(aKe
1fb60 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 y);. lhs =
1fb70 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a (i64)*(int*)&y;.
1fb80 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 testcase(
1fb90 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 lhs<0 );. b
1fba0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 reak;. }.
1fbb0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 case 5: { /* 6-b
1fbc0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 yte signed integ
1fbd0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 er */. lhs
1fbe0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 = FOUR_BYTE_UINT
1fbf0 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 (aKey+2) + (((i6
1fc00 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 4)1)<<32)*TWO_BY
1fc10 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 TE_INT(aKey);.
1fc20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 testcase( lh
1fc30 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 s<0 );. bre
1fc40 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 ak;. }. ca
1fc50 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 se 6: { /* 8-byt
1fc60 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 e signed integer
1fc70 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f */. x = FO
1fc80 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 UR_BYTE_UINT(aKe
1fc90 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 y);. x = (x
1fca0 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 <<32) | FOUR_BYT
1fcb0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a E_UINT(aKey+4);.
1fcc0 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 lhs = *(i6
1fcd0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 4*)&x;. tes
1fce0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a tcase( lhs<0 );.
1fcf0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
1fd00 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a }. case 8: .
1fd10 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 lhs = 0;.
1fd20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
1fd30 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 case 9:. lh
1fd40 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 s = 1;. bre
1fd50 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 ak;.. /* This
1fd60 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 case could be r
1fd70 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 emoved without c
1fd80 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 hanging the resu
1fd90 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 lts of running.
1fda0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e ** this code.
1fdb0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 Including it ca
1fdc0 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 uses gcc to gene
1fdd0 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 rate a faster sw
1fde0 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 itch . ** sta
1fdf0 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 tement (since th
1fe00 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 e range of switc
1fe10 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 h targets now st
1fe20 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 arts at zero and
1fe30 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 . ** is conti
1fe40 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 guous) but does
1fe50 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 not cause any du
1fe60 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 plicate code to
1fe70 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 be generated.
1fe80 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 ** (as gcc is c
1fe90 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 lever enough to
1fea0 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 combine the two
1feb0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 like cases). Oth
1fec0 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 er . ** compi
1fed0 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 lers might be si
1fee0 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 milar. */ .
1fef0 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a case 0: case 7:.
1ff00 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c return sql
1ff10 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
1ff20 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 mpare(nKey1, pKe
1ff30 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 y1, pPKey2);..
1ff40 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 default:.
1ff50 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 return sqlite3V
1ff60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 dbeRecordCompare
1ff70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 (nKey1, pKey1, p
1ff80 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 PKey2);. }.. i
1ff90 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 f( v>lhs ){.
1ffa0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 res = pPKey2->r1
1ffb0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c ;. }else if( v<
1ffc0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d lhs ){. res =
1ffd0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d pPKey2->r2;. }
1ffe0 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d else if( pPKey2-
1fff0 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 >nField>1 ){.
20000 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 /* The first fi
20010 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 elds of the two
20020 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 keys are equal.
20030 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 Compare the trai
20040 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 ling . ** fie
20050 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 lds. */. res
20060 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 = sqlite3VdbeRe
20070 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 cordCompareWithS
20080 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 kip(nKey1, pKey1
20090 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 , pPKey2, 1);.
200a0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 }else{. /* Th
200b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f e first fields o
200c0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 f the two keys a
200d0 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 re equal and the
200e0 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 re are no traili
200f0 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 ng. ** fields
20100 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d . Return pPKey2-
20110 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 >default_rc in t
20120 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 his case. */.
20130 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 res = pPKey2->d
20140 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 efault_rc;. p
20150 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 PKey2->eqSeen =
20160 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 1;. }.. assert
20170 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 ( vdbeRecordComp
20180 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 areDebug(nKey1,
20190 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 pKey1, pPKey2, r
201a0 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 es) );. return
201b0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 res;.}../*.** Th
201c0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 is function is a
201d0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 n optimized vers
201e0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 ion of sqlite3Vd
201f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
20200 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 ) .** that (a) t
20210 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f he first field o
20220 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 f pPKey2 is a st
20230 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 ring, that (b) t
20240 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a he first field.*
20250 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 * uses the colla
20260 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 tion sequence BI
20270 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 NARY and (c) tha
20280 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 t the size-of-he
20290 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 ader varint .**
202a0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 at the start of
202b0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 (pKey1/nKey1) fi
202c0 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 ts in a single b
202d0 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 yte..*/.static i
202e0 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d nt vdbeRecordCom
202f0 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e pareString(. in
20300 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 t nKey1, const v
20310 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c oid *pKey1, /* L
20320 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 eft key */. Unp
20330 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b ackedRecord *pPK
20340 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 ey2 /* Ri
20350 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 ght key */.){.
20360 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 const u8 *aKey1
20370 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 = (const u8*)pKe
20380 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c y1;. int serial
20390 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 _type;. int res
203a0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b ;.. assert( pPK
203b0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 ey2->aMem[0].fla
203c0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a gs & MEM_Str );.
203d0 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c vdbeAssertFiel
203e0 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 dCountWithinLimi
203f0 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c ts(nKey1, pKey1,
20400 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 pPKey2->pKeyInf
20410 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 o);. getVarint3
20420 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 2(&aKey1[1], ser
20430 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 ial_type);. if(
20440 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 serial_type<12
20450 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b ){. res = pPK
20460 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a ey2->r1; /*
20470 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 (pKey1/nKey1) i
20480 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 s a number or a
20490 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 null */. }else
204a0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 if( !(serial_typ
204b0 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 e & 0x01) ){ .
204c0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e res = pPKey2->
204d0 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 r2; /* (pKe
204e0 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 y1/nKey1) is a b
204f0 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a lob */. }else{.
20500 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 int nCmp;.
20510 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 int nStr;.
20520 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 int szHdr = aKey
20530 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 1[0];.. nStr
20540 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 = (serial_type-1
20550 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 2) / 2;. if(
20560 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e (szHdr + nStr) >
20570 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 nKey1 ){.
20580 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 pPKey2->errCode
20590 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 = (u8)SQLITE_COR
205a0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 RUPT_BKPT;.
205b0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a return 0; /*
205c0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 Corruption */.
205d0 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 }. nCmp =
205e0 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 MIN( pPKey2->aMe
205f0 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a m[0].n, nStr );.
20600 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 res = memcmp
20610 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 (&aKey1[szHdr],
20620 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e pPKey2->aMem[0].
20630 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 z, nCmp);.. i
20640 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 f( res==0 ){.
20650 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 res = nStr -
20660 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e pPKey2->aMem[0].
20670 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 n;. if( res
20680 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 ==0 ){. i
20690 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c f( pPKey2->nFiel
206a0 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 d>1 ){.
206b0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 res = sqlite3Vd
206c0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 beRecordCompareW
206d0 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 ithSkip(nKey1, p
206e0 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 Key1, pPKey2, 1)
206f0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b ;. }else{
20700 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d . res =
20710 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 pPKey2->default
20720 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 _rc;. p
20730 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 PKey2->eqSeen =
20740 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 1;. }.
20750 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 }else if( res
20760 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 >0 ){. re
20770 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a s = pPKey2->r2;.
20780 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
20790 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 res = pPKey
207a0 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 2->r1;. }.
207b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 }else if( res
207c0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 >0 ){. res
207d0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 = pPKey2->r2;.
207e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 }else{. r
207f0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b es = pPKey2->r1;
20800 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 . }. }.. as
20810 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 sert( vdbeRecord
20820 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 CompareDebug(nKe
20830 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 y1, pKey1, pPKey
20840 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 2, res). |
20850 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 | CORRUPT_DB.
20860 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 || pPKey2->p
20870 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c KeyInfo->db->mal
20880 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 locFailed. );.
20890 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a return res;.}..
208a0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 /*.** Return a p
208b0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c ointer to an sql
208c0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f ite3VdbeRecordCo
208d0 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 mpare() compatib
208e0 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 le function.** s
208f0 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 uitable for comp
20900 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 aring serialized
20910 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 records to the
20920 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 unpacked record
20930 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 passed.** as the
20940 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a only argument..
20950 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 */.RecordCompare
20960 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 sqlite3VdbeFind
20970 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 Compare(Unpacked
20980 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a Record *p){. /*
20990 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d varintRecordCom
209a0 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 pareInt() and va
209b0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 rintRecordCompar
209c0 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 eString() both a
209d0 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 ssume. ** that
209e0 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 the size-of-head
209f0 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f er varint that o
20a00 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61 ccurs at the sta
20a10 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 rt of each recor
20a20 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 d. ** fits in a
20a30 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e single byte (i.
20a40 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 e. is 127 or les
20a50 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 s). varintRecord
20a60 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a CompareInt(). *
20a70 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 * also assumes t
20a80 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74 hat it is safe t
20a90 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 o overread a buf
20aa0 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 fer by at least
20ab0 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 the . ** maximu
20ac0 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c m possible legal
20ad0 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 header size plu
20ae0 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 s 8 bytes. Becau
20af0 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a se there is. **
20b00 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 guaranteed to b
20b10 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 e at least 74 (b
20b20 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 ut not 136) byte
20b30 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c s of padding fol
20b40 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a lowing each. **
20b50 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74 buffer passed t
20b60 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f o varintRecordCo
20b70 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 mpareInt() this
20b80 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 makes it conveni
20b90 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 ent to. ** limi
20ba0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 t the size of th
20bb0 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 e header to 64 b
20bc0 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 ytes in cases wh
20bd0 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69 ere the first fi
20be0 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 eld. ** is an i
20bf0 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a nteger.. **. *
20c00 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61 * The easiest wa
20c10 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 y to enforce thi
20c20 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f s limit is to co
20c30 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f nsider only reco
20c40 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 rds with. ** 13
20c50 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e fields or less.
20c60 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69 If the first fi
20c70 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 eld is an intege
20c80 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c r, the maximum l
20c90 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 egal. ** header
20ca0 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b size is (12*5 +
20cb0 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 1 + 1) bytes.
20cc0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 */. if( (p->pKe
20cd0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 yInfo->nField +
20ce0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 p->pKeyInfo->nXF
20cf0 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 ield)<=13 ){.
20d00 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e int flags = p->
20d10 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 aMem[0].flags;.
20d20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e if( p->pKeyIn
20d30 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 fo->aSortOrder[0
20d40 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 ] ){. p->r1
20d50 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 = 1;. p->r
20d60 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 2 = -1;. }els
20d70 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d e{. p->r1 =
20d80 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 -1;. p->r2
20d90 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 = 1;. }.
20da0 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d if( (flags & MEM
20db0 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 _Int) ){. r
20dc0 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 eturn vdbeRecord
20dd0 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 CompareInt;.
20de0 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 }. testcase(
20df0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c flags & MEM_Real
20e00 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 );. testcase
20e10 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 ( flags & MEM_Nu
20e20 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 ll );. testca
20e30 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f se( flags & MEM_
20e40 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 Blob );. if(
20e50 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 (flags & (MEM_Re
20e60 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f al|MEM_Null|MEM_
20e70 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e Blob))==0 && p->
20e80 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b pKeyInfo->aColl[
20e90 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 0]==0 ){. a
20ea0 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d ssert( flags & M
20eb0 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 EM_Str );.
20ec0 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 return vdbeRecor
20ed0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a dCompareString;.
20ee0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 }. }.. ret
20ef0 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 urn sqlite3VdbeR
20f00 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a ecordCompare;.}.
20f10 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e ./*.** pCur poin
20f20 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 ts at an index e
20f30 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69 ntry created usi
20f40 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 ng the OP_MakeRe
20f50 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 cord opcode..**
20f60 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 Read the rowid (
20f70 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 the last field i
20f80 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e n the record) an
20f90 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 d store it in *r
20fa0 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 owid..** Return
20fb0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 SQLITE_OK if eve
20fc0 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f rything works, o
20fd0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 r an error code
20fe0 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a otherwise..**.**
20ff0 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 pCur might be p
21000 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 ointing to text
21010 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 obtained from a
21020 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 corrupt database
21030 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 file..** So the
21040 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 content cannot
21050 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 be trusted. Do
21060 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 appropriate chec
21070 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e ks on the conten
21080 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 t..*/.int sqlite
21090 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 3VdbeIdxRowid(sq
210a0 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 lite3 *db, BtCur
210b0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a sor *pCur, i64 *
210c0 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 rowid){. i64 nC
210d0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e ellKey = 0;. in
210e0 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 t rc;. u32 szHd
210f0 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a r; /* Siz
21100 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 e of the header
21110 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 */. u32 typeRow
21120 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c id; /* Serial
21130 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 type of the row
21140 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 id */. u32 lenR
21150 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a owid; /* Siz
21160 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a e of the rowid *
21170 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 /. Mem m, v;..
21180 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 /* Get the size
21190 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e of the index en
211a0 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 try. Only indic
211b0 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 es entries of le
211c0 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 ss. ** than 2Gi
211d0 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 B are support -
211e0 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d anything large m
211f0 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20 ust be database
21200 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a corruption.. **
21210 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 Any corruption
21220 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 is detected in s
21230 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 qlite3BtreeParse
21240 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 CellPtr(), thoug
21250 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 h, so. ** this
21260 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 code can safely
21270 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c assume that nCel
21280 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 lKey is 32-bits
21290 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 . */. assert(
212a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 sqlite3BtreeCur
212b0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 sorIsValid(pCur)
212c0 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 );. VVA_ONLY(r
212d0 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 c =) sqlite3Btre
212e0 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 eKeySize(pCur, &
212f0 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 nCellKey);. ass
21300 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f ert( rc==SQLITE_
21310 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 OK ); /* pCu
21320 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 r is always vali
21330 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e d so KeySize can
21340 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 not fail */. as
21350 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 sert( (nCellKey
21360 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 & SQLITE_MAX_U32
21370 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 )==(u64)nCellKey
21380 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 );.. /* Read i
21390 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 n the complete c
213a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e ontent of the in
213b0 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 dex entry */. s
213c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 qlite3VdbeMemIni
213d0 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 t(&m, db, 0);.
213e0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 rc = sqlite3Vdbe
213f0 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 MemFromBtree(pCu
21400 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c r, 0, (u32)nCell
21410 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 Key, 1, &m);. i
21420 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 f( rc ){. ret
21430 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f urn rc;. }.. /
21440 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 * The index entr
21450 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 y must begin wit
21460 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 h a header size
21470 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 */. (void)getVa
21480 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c rint32((u8*)m.z,
21490 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 szHdr);. testc
214a0 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b ase( szHdr==3 );
214b0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 . testcase( szH
214c0 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 dr==m.n );. if(
214d0 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c unlikely(szHdr<
214e0 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 3 || (int)szHdr>
214f0 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f m.n) ){. goto
21500 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 idx_rowid_corru
21510 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a ption;. }.. /*
21520 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 The last field
21530 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f of the index sho
21540 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 uld be an intege
21550 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 r - the ROWID..
21560 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 ** Verify that
21570 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 the last entry r
21580 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 eally is an inte
21590 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 ger. */. (void)
215a0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a getVarint32((u8*
215b0 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 )&m.z[szHdr-1],
215c0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 typeRowid);. te
215d0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
215e0 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 d==1 );. testca
215f0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 se( typeRowid==2
21600 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
21610 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a typeRowid==3 );.
21620 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
21630 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 Rowid==4 );. te
21640 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 stcase( typeRowi
21650 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 d==5 );. testca
21660 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 se( typeRowid==6
21670 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 );. testcase(
21680 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a typeRowid==8 );.
21690 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 testcase( type
216a0 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 Rowid==9 );. if
216b0 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 ( unlikely(typeR
216c0 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f owid<1 || typeRo
216d0 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 wid>9 || typeRow
216e0 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f id==7) ){. go
216f0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 to idx_rowid_cor
21700 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c ruption;. }. l
21710 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 enRowid = sqlite
21720 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 3SmallTypeSizes[
21730 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 typeRowid];. te
21740 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e stcase( (u32)m.n
21750 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 ==szHdr+lenRowid
21760 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 );. if( unlike
21770 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 ly((u32)m.n<szHd
21780 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 r+lenRowid) ){.
21790 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 goto idx_rowi
217a0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 d_corruption;.
217b0 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 }.. /* Fetch th
217c0 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 e integer off th
217d0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 e end of the ind
217e0 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 ex record */. s
217f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c qlite3VdbeSerial
21800 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e Get((u8*)&m.z[m.
21810 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 n-lenRowid], typ
21820 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a eRowid, &v);. *
21830 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 rowid = v.u.i;.
21840 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 sqlite3VdbeMemR
21850 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 elease(&m);. re
21860 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a turn SQLITE_OK;.
21870 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 . /* Jump here
21880 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 if database corr
21890 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 uption is detect
218a0 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 ed after m has b
218b0 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 een. ** allocat
218c0 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 ed. Free the m
218d0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 object and retur
218e0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 n SQLITE_CORRUPT
218f0 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 . */.idx_rowid_c
21900 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 orruption:. tes
21910 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f tcase( m.szMallo
21920 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 c!=0 );. sqlite
21930 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 3VdbeMemRelease(
21940 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 &m);. return SQ
21950 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 LITE_CORRUPT_BKP
21960 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 T;.}../*.** Comp
21970 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 are the key of t
21980 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 he index entry t
21990 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 hat cursor pC is
219a0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 pointing to aga
219b0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 inst.** the key
219c0 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 string in pUnpac
219d0 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f ked. Write into
219e0 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a *pRes a number.
219f0 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 ** that is negat
21a00 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f ive, zero, or po
21a10 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 sitive if pC is
21a20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c less than, equal
21a30 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 to,.** or great
21a40 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 er than pUnpacke
21a50 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 d. Return SQLIT
21a60 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e E_OK on success.
21a70 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 .**.** pUnpacked
21a80 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 is either creat
21a90 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 ed without a row
21aa0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 id or is truncat
21ab0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a ed so that it.**
21ac0 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 omits the rowid
21ad0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 at the end. Th
21ae0 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 e rowid at the e
21af0 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 nd of the index
21b00 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f entry.** is igno
21b10 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 red as well. He
21b20 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e nce, this routin
21b30 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 e only compares
21b40 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a the prefixes .**
21b50 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 of the keys pri
21b60 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 or to the final
21b70 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 rowid, not the e
21b80 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e ntire key..*/.in
21b90 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 t sqlite3VdbeIdx
21ba0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 KeyCompare(. sq
21bb0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 lite3 *db,
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
21bd0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 * Database conne
21be0 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 ction */. VdbeC
21bf0 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 ursor *pC,
21c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 /* T
21c10 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d he cursor to com
21c20 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a pare against */.
21c30 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 UnpackedRecord
21c40 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 *pUnpacked,
21c50 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 /* Unpacked v
21c60 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f ersion of key */
21c70 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 . int *res
21c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21c90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 /* Write the
21ca0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 comparison resu
21cb0 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 lt here */.){.
21cc0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 i64 nCellKey = 0
21cd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 ;. int rc;. Bt
21ce0 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 Cursor *pCur;.
21cf0 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 Mem m;.. assert
21d00 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d ( pC->eCurType==
21d10 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b CURTYPE_BTREE );
21d20 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 . pCur = pC->uc
21d30 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 .pCursor;. asse
21d40 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 rt( sqlite3Btree
21d50 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 CursorIsValid(pC
21d60 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c ur) );. VVA_ONL
21d70 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 Y(rc =) sqlite3B
21d80 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 treeKeySize(pCur
21d90 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 , &nCellKey);.
21da0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 assert( rc==SQLI
21db0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 TE_OK ); /* p
21dc0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 Cur is always va
21dd0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 lid so KeySize c
21de0 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 annot fail */.
21df0 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c /* nCellKey will
21e00 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 always be betwe
21e10 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 en 0 and 0xfffff
21e20 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 fff because of t
21e30 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 he way. ** that
21e40 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 btreeParseCellP
21e50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 tr() and sqlite3
21e60 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 GetVarint32() ar
21e70 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f e implemented */
21e80 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c . if( nCellKey<
21e90 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 =0 || nCellKey>0
21ea0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 x7fffffff ){.
21eb0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 *res = 0;. r
21ec0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 eturn SQLITE_COR
21ed0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 RUPT_BKPT;. }.
21ee0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 sqlite3VdbeMemI
21ef0 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a nit(&m, db, 0);.
21f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 rc = sqlite3Vd
21f10 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 beMemFromBtree(p
21f20 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 Cur, 0, (u32)nCe
21f30 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 llKey, 1, &m);.
21f40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 if( rc ){. r
21f50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 eturn rc;. }.
21f60 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 *res = sqlite3Vd
21f70 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 beRecordCompare(
21f80 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 m.n, m.z, pUnpac
21f90 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 ked);. sqlite3V
21fa0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d dbeMemRelease(&m
21fb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 );. return SQLI
21fc0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 TE_OK;.}../*.**
21fd0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 This routine set
21fe0 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 s the value to b
21ff0 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 e returned by su
22000 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 bsequent calls t
22010 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 o.** sqlite3_cha
22020 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 nges() on the da
22030 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 tabase handle 'd
22040 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c b'. .*/.void sql
22050 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 ite3VdbeSetChang
22060 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 es(sqlite3 *db,
22070 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 int nChange){.
22080 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f assert( sqlite3_
22090 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d mutex_held(db->m
220a0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e utex) );. db->n
220b0 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 Change = nChange
220c0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 ;. db->nTotalCh
220d0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b ange += nChange;
220e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 .}../*.** Set a
220f0 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 flag in the vdbe
22100 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 to update the c
22110 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 hange counter wh
22120 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 en it is finalis
22130 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a ed.** or reset..
22140 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 */.void sqlite3V
22150 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 dbeCountChanges(
22160 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 Vdbe *v){. v->c
22170 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a hangeCntOn = 1;.
22180 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 }../*.** Mark ev
22190 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61 ery prepared sta
221a0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 tement associate
221b0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 d with a databas
221c0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 e connection.**
221d0 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a as expired..**.*
221e0 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 * An expired sta
221f0 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 tement means tha
22200 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 t recompilation
22210 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 of the statement
22220 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 is.** recommend
22230 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 . Statements ex
22240 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 pire when things
22250 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b happen that mak
22260 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 e their.** progr
22270 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 ams obsolete. R
22280 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 emoving user-def
22290 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f ined functions o
222a0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 r collating.** s
222b0 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 equences, or cha
222c0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 nging an authori
222d0 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 zation function
222e0 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 are the types of
222f0 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 .** things that
22300 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 make prepared st
22310 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 atements obsolet
22320 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 e..*/.void sqlit
22330 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 e3ExpirePrepared
22340 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 Statements(sqlit
22350 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 e3 *db){. Vdbe
22360 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 *p;. for(p = db
22370 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d ->pVdbe; p; p=p-
22380 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e >pNext){. p->
22390 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d expired = 1;. }
223a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
223b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 the database as
223c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 sociated with th
223d0 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 e Vdbe..*/.sqlit
223e0 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 e3 *sqlite3VdbeD
223f0 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 b(Vdbe *v){. re
22400 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f turn v->db;.}../
22410 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f *.** Return a po
22420 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 inter to an sqli
22430 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 te3_value struct
22440 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 ure containing t
22450 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a he value bound.*
22460 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 * parameter iVar
22470 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 of VM v. Except
22480 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 , if the value i
22490 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 s an SQL NULL, r
224a0 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 eturn .** 0 inst
224b0 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 ead. Unless it i
224c0 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 s NULL, apply af
224d0 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 finity aff (one
224e0 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 of the SQLITE_AF
224f0 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 F_*.** constants
22500 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 ) to the value b
22510 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 efore returning
22520 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 it..**.** The re
22530 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 turned value mus
22540 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 t be freed by th
22550 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 e caller using s
22560 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 qlite3ValueFree(
22570 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 )..*/.sqlite3_va
22580 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 lue *sqlite3Vdbe
22590 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 GetBoundValue(Vd
225a0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c be *v, int iVar,
225b0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 u8 aff){. asse
225c0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 rt( iVar>0 );.
225d0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d if( v ){. Mem
225e0 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 *pMem = &v->aVa
225f0 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 r[iVar-1];. i
22600 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 f( 0==(pMem->fla
22610 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 gs & MEM_Null) )
22620 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
22630 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 value *pRet = sq
22640 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d lite3ValueNew(v-
22650 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 >db);. if(
22660 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 pRet ){.
22670 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f sqlite3VdbeMemCo
22680 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 py((Mem *)pRet,
22690 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 pMem);. s
226a0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 qlite3ValueApply
226b0 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 Affinity(pRet, a
226c0 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 ff, SQLITE_UTF8)
226d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
226e0 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 return pRet;.
226f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 }. }. return
22700 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 0;.}../*.** Conf
22710 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 igure SQL variab
22720 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 le iVar so that
22730 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 binding a new va
22740 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c lue to it signal
22750 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f s.** to sqlite3_
22760 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 reoptimize() tha
22770 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 t re-preparing t
22780 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 he statement may
22790 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 result.** in a
227a0 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 better query pla
227b0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 n..*/.void sqlit
227c0 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b e3VdbeSetVarmask
227d0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 (Vdbe *v, int iV
227e0 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 ar){. assert( i
227f0 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 Var>0 );. if( i
22800 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d Var>32 ){. v-
22810 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 >expmask = 0xfff
22820 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a fffff;. }else{.
22830 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c v->expmask |
22840 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 = ((u32)1 << (iV
22850 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 ar-1));. }.}..#
22860 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d ifndef SQLITE_OM
22870 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a IT_VIRTUALTABLE.
22880 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 /*.** Transfer e
22890 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 rror message tex
228a0 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 t from an sqlite
228b0 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 3_vtab.zErrMsg (
228c0 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 text stored.** i
228d0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 n memory obtaine
228e0 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d d from sqlite3_m
228f0 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 alloc) into a Vd
22900 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 be.zErrMsg (text
22910 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 stored.** in me
22920 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 mory obtained fr
22930 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c om sqlite3DbMall
22940 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c oc)..*/.void sql
22950 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 ite3VtabImportEr
22960 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 rmsg(Vdbe *p, sq
22970 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 lite3_vtab *pVta
22980 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 b){. sqlite3 *d
22990 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c b = p->db;. sql
229a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 ite3DbFree(db, p
229b0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d ->zErrMsg);. p-
229c0 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 >zErrMsg = sqlit
229d0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 e3DbStrDup(db, p
229e0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a Vtab->zErrMsg);.
229f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 sqlite3_free(p
22a00 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a Vtab->zErrMsg);.
22a10 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 pVtab->zErrMsg
22a20 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f = 0;.}.#endif /
22a30 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 * SQLITE_OMIT_VI
22a40 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a RTUALTABLE */.